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

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

V dnešnom pokračovaní návodov o jazykovo lokalizovaných makrách si ukážeme, ako dokážeme nastavovať jazyk nadpisov v dialógových oknách programovo, t. j. priamo v makrách.

V minulom dieli sme si ukázali spôsob, ako sa lokalizujú dialógové okná. Niekedy však potrebujete meniť ich obsah aj v makre, preto si dnes ukážeme, ako sa to dá naprogramovať. Samozrejme, tento postup sa dá aplikovať aj na iné jazykové lokalizácie, napríklad aj na správy vypisované pomocou príkazu msgbox a pod.

Ako príklad môžeme použiť zobrazovanie počtu znakov počas písania s tým, že budeme chcieť skloňovať vypisované slová znak/znaky/znakov a slovo/slová/slov.

Návrh dialógu

Prvý spôsob takejto lokalizácie, ktorý si ukážeme, bude spočívať v tom, že podľa jazyka pracovného rozhrania OpenOffice.org budeme pomocou prepínača (príkaz select case) nastavovať vlastné texty. Toto riešenie je jednoduché a postačuje pre menšie makrá, prípadne pre malý počet jazykov a vypisovaných textov. Akonáhle však v makre potrebujete jazykovo lokalizovať viac textov a to do pomerne veľkého množstva jazykov, programový kód sa zbytočne predlžuje (pre každý jazyk musíte vždy pridávať ďalšie a ďalšie voľby v príslušných prepínačoch), čím stráca aj na prehľadnosti.

Vlastný dialógTeraz si však ukážme makro, kde je lokalizácia prevedená priamo v ňom. Minule ukázané dialógové okno pre zobrazovanie počtu znakov a slov mierne upravíme – stačí, ak v ňom ponecháme dva textové oznamy, pretože počet znakov a slov môžeme pridávať priamo ku skloňovaným slovám znak/znaky/znakov a slovo/slová/slov. Makro je jazykovo lokalizované do slovenčiny, češtiny a angličtiny s tým, že pokiaľ bude mať OpenOffice.org nastavený iný jazyk pracovného rozhrania, použije sa angličtina.

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 jazyk as string
 
 jazyk = Jazyk_OOo '"sk", "cs", ...
 
 select case jazyk ' Názov tlačidla Odkry/Vymaž budeme meniť podľa jazyka
  case "sk" ' Slovenčina
   txt_znak0="znak"
   txt_znak1="znaky"
   txt_znak2="znakov"
   txt_slovo0="slovo"
   txt_slovo1="slová"
   txt_slovo2="slov"
  case "cs" ' Čeština
   txt_znak0="znak"
   txt_znak1="znaky"
   txt_znak2="znaků"
   txt_slovo0="slovo"
   txt_slovo1="slova"
   txt_slovo2="slov"
  case else ' Ostatné jazyky budú anglicky
   txt_znak0="char"
   txt_znak1="chars"
   txt_znak2="chars"
   txt_slovo0="word"
   txt_slovo1="words"
   txt_slovo2="words"
 end select
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: