Makrá v OpenOffice.org – programovo lokalizované dialógové okná (2)

Július Pastierik  /  28. 04. 2010, 00:00

V ďalšom pokračovaní návodov o jazykovo lokalizovaných makrách si ukážeme, ako dokážeme jazykovo lokalizovať makro zo súborov, ktoré obsahuje definíciu príslušných textov.

 

Minule sme si ukázali, ako dokážeme jazykovo lokalizovať makro priamo v programovom kóde, pričom definícia príslušných jazykovo lokalizovaných textov bola súčasťou tohto makra. Iný spôsob jazykovej lokalizácie spočíva v tom, že príslušné preklady budeme mať v súboroch. Pokiaľ dodržíme rovnakú špecifikáciu názvov týchto súborov podľa jazyka, riešenie môže byť absolútne univerzálne s tým, že vopred nemusíme vôbec počítať s tým, aký preklad sa kedy urobí – pokiaľ bude existovať, načíta sa príslušný súbor, inak sa použije štandardný, povedzme anglický text.

Predpokladajme, že v adresári, kde máme makro sú (alebo budú) zároveň uložené súbory „jp_znaky_xx.txt“, pričom „xx“ označuje príslušný jazyk pracovného rozhrania. Pokiaľ súbor pre príslušný jazyk nebude existovať, nastavíme text priamo v makre. A aby sme makro dotiahli do čo najväčšej dokonalosti, budme predpokladať, že preklad nemusí byť úplný a preto v súbore budeme požadovať definíciu prekladu v tvare podobnom, ako je zápis v programe, t. j. ak niektorý zápis bude chýbať alebo bude nesprávny, ponecháme pri príslušnom texte štandardný text. Súbor „jp_znaky_sk.txt“ by mal v tomto prípade obsahovať nasledujúce záznamy:

txt_znak0=znak
txt_znak1=znaky
txt_znak2=znakov
txt_slovo0=slovo
txt_slovo1=slová
txt_slovo2=slov


Vlastné makro potom môže vyzerať nasledovne:

dim dlg as object ' Dialóg pre on-line zobrazovanie počtu znakov
dim txt_znak0, txt_znak1, txt_znak2, txt_slovo0, txt_slovo1, txt_slovo2 as string ' Pre jazykovo lokalizované vypisovanie

function Jazyk_OOo as string
 dim ConfigProvider, MasterKey as object
 dim NodePath(0) as new com.sun.star.beans.PropertyValue
 dim jazyk as string
 
 NodePath(0).Name = "nodepath"
 NodePath(0).Value = "org.openoffice.Setup/L10N/"
 
 ConfigProvider = createUnoService("com.sun.star.configuration.ConfigurationProvider")
 MasterKey = ConfigProvider.createInstanceWithArguments("com.sun.star.configuration.ConfigurationAccess", NodePath())
 Jazyk_OOo = MasterKey.getByName("ooLocale") '"sk", "cs", ...
end function

sub Nastav_jazyk_text

 ' dim cesta as object
 dim kde, nazov as string
 dim subor, rovna as integer
 dim riadok, premenna, definicia as string
  
 txt_znak0="char"
 txt_znak1="chars"
 txt_znak2="chars"
 txt_slovo0="word"
 txt_slovo1="words"
 txt_slovo2="words"
 
 ' cesta=CreateUnoService("com.sun.star.util.PathSettings") ' Pokiaľ by sme mali súbor v adresári používateľských nastavení OO.o
 ' nazov=cesty.UserConfig+"/"+"jp_znaky_"+Jazyk_OOo+".txt"
 
 kde=basiclibraries.getLibraryLinkURL("JP_znaky") ' Pokiaľ máme makro nainštalované ako rozšírenie
 nazov=left(kde,len(kde)-10)+"jp_znaky_"+Jazyk_OOo+".txt"
  
 if fileexists(nazov) then ' Ak súbor existuje, tak načítame definície do premenných
  subor = Freefile
  open nazov for Input as #subor
  While not eof(subor)
   Line Input #subor, riadok
   rovna=instr(riadok,"=")
   if rovna<>0 then
    premenna=trim(left(riadok,rovna-1)) ' Budeme ignorovať medzery
    definicia=trim(right(riadok,len(riadok)-rovna))
    select case premenna
     case "txt_znak0"
      txt_znak0=definicia
     case "txt_znak1"
      txt_znak1=definicia
     case "txt_znak2"
      txt_znak2=definicia
     case "txt_slovo0"
      txt_slovo0=definicia
     case "txt_slovo1"
      txt_slovo1=definicia
     case "txt_slovo2"
      txt_slovo2=definicia
    end select
   end if
  wend
  close #subor
 end if
end sub

function daj_text(cislo, i as long) as string
 dim pom as string
 select case cislo
  case 1
   select case i
    case 1
     pom=txt_znak0
    case else
     pom=txt_slovo0
   end select
  case 2, 3, 4
   select case i
    case 1
     pom=txt_znak1
    case else
     pom=txt_slovo1
   end select
  case else
   select case i
    case 1
     pom=txt_znak2
    case else
     pom=txt_slovo2
   end select
 end select
 daj_text=str(cislo)+" "+pom
end function

Sub Pocitanie_online
 rem Procedura priebežbe zobrazuje počet znakov a slov
 
 Nastav_jazyk_text ' Nastavenie textov podľa jazyka pracovného rozhrania
 
 DialogLibraries.LoadLibrary("JP_znaky")
 
 dlg=CreateUnoDialog(DialogLibraries.JP_znaky.Znaky_online)
 
 ' Počiatočné nastavenie zobrazovaného počtu
 
 dlg.model.Label1.Label=daj_text(ThisComponent.CharacterCount, 1) ' počet znakov
 dlg.model.Label2.Label=daj_text(ThisComponent.WordCount, 2) ' počet slov
 
 dlg.setVisible(true) ' zviditeľnenie dialógu – namiesto dlg.Execute(), aby sa dalo paralelne pracovať s textom
 
 on error goto Zatvoreny_dokument ' Ak počas behu makra zatvoríme dokument, vedie to ku chybe – skočíme na zatvorenie dialógu
 
 while dlg.isVisible() ' Cyklus, ktorý čaká na stlačenie klávesy "Koniec" v dialógu (kým je dialóg viditeľný)
  wait 500 ' Časová medzera 500 milisekúnd (0,5 sec) na to, aby sa dalo paralelne pracovať s dokumentom
  ' Výpis zmeneného počtu každú 0,5 sec
  dlg.model.Label1.Label=daj_text(ThisComponent.CharacterCount, 1) ' počet znakov
  dlg.model.Label2.Label=daj_text(ThisComponent.WordCount, 2) ' počet slov
 wend
 Zatvoreny_dokument:
 dlg.dispose() ' Zatvorenie dialógu
end sub

 

Neprehliadnite: