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

Július Pastierik  /  12. 05. 2010, 00:00

V predposlednom pokračovaní návodov o jazykovo lokalizovaných makrách si ukážeme, ako musíme jazykovo lokalizovať makro zo súborov v rôznych operačných systémoch.

V predchádzajúcom dieli seriálu o jazykovo lokalizovaných makrách sme si ukázali základnú možnosť, ako je možné lokalizovať dialógové okná a makrá zo súboru. Pravdaže, v tomto prípade prichádza na rad aj ďalšie riešenie jazykových lokalizácií dialógových okien, pretože, pokiaľ ich lokalizujete priamo v prostredí OpenOffice.org je to časovo náročné, pričom všetko musíte robiť sami, môžete ľahko posunúť jednotlivé prvky dialógového okna, čím si pokazíte formátovanie atď.

Z uvedených dôvodov prichádza na um riešenie, ktoré poznáte aj z rôznych programov – kompletná lokalizácia do iných jazykov, okrem základného, bude v externých súboroch. V tomto prípade sa v makre nemusíte už vôbec zaoberať tým, aké budú jazykové lokalizácie, na ktorých môžu spolupracovať ľudia z celého sveta, pokiaľ dodržia určitý štandard. A práve preto, aby tento štandard dodržali, určíme si jednoduchý formát definičného textového súboru podobný tomu, aký sme uviedli minule:

Polozka_dialogu=Vlastný text bez úvodzoviek

V tomto prípade budeme nastavovať text v dialógu pomocou príkazu:

dlg.model.getByName("Polozka_dialogu").setpropertyvalue("Label","príslušný text")

a nadpis dialógu pomocou príkazu:

dlg.Title="vlastný nadpis"
Definícia dialógového okna

V makre zabezpečíme, že ak niekto niektorú položku nepreloží, tak nebude preložená a použije sa automaticky tá, ktorá je nastavená priamo v dialógu. Zároveň v makre nastavíme, že ak niektorá položka je definovaná chybne, budeme ju ignorovať.

Teraz však prichádza na rad ďalšia vec – OpenOffice.org pri textových súboroch v rôznych operačných systémoch používa rôzne kódovanie. V operačnom systéme Linux je to UTF-8, vo Windows je to CP1250. Preto, ak chcete, aby sa texty správne zobrazovali v rôznych systémoch, musíte pripraviť rôzne verzie (s rôznym kódovaním) textových súborov s jazykovou lokalizáciou a ich názov musí okrem jazyka obsahovať aj skratku operačného systému (napr. „jp_znaky_lin_en.txt“, „jp_znaky_win_cs.txt“). V tomto prípade súbor môžete otvárať takto:

if GetGUIType()=1 then ' 1-Windows, 4-Linux
 nazov="win_" ' ISO 8859-2
else
 nazov="lin_" ' UTF-8
endif

kde=basiclibraries.getLibraryLinkURL("JP_znaky") ' Adresár, kde je rozšírenie nainštalované
nazov=left(kde,len(kde)-10)+"jp_znaky_"+nazov+Jazyk_OOo+".txt" ' Súbor s jazykovou lokalizáciou

open nazov for Input as #subor


OpenOffice.org však poskytuje nástroje pre otváranie súborov s presným kódovaním. Preto je jednoduchšie, ak sa pripraví iba jeden lokalizačný súbor pre daný jazyk (povedzme v kódovaní UTF-8) a tento sa bude otvárať v makre.


Zobrazený počet znakov

Príklad s takouto jazykovou lokalizáciou si ukážeme na makre, ktoré spočíta všetky slová a znaky dokumentu s medzerami aj bez medzier a prepočíta ich na normostrany a autorské hárky. To isté urobí zároveň aj pre označenú (vybranú) časť textu. Makro zároveň zobrazí počet riadkov dokumentu.

Dnes si ukážeme iba procedúru pre jazykovú lokalizáciu, ostatné funkcie a procedúry budú uvedené v budúcom dieli tohto seriálu.

Rem Procedúra spočíta znaky a slová v dokumente a definovanom výbere
Sub Pocitanie_znakov

 dim vsetky_riadky, vsetky_znaky, vsetky_slova, vsetky_znaky_bez as long ' Statisticke udaje o celom dokumente
 dim vsetky_normo, vsetky_AH as single
 dim vyber_pocet, vyber_znaky, vyber_znaky_bez, vyber_slova as long ' Statisticke udaje o vybere
 dim vyber_normo, vyber_AH as single
 
 dim riadok as string
 dim vyber_ktory, dlzka_riadku, i as long
 dim slovo as boolean
 dim znak as string
 
 dim kde, nazov as string
 dim rovna as integer
 dim premenna, definicia as string
 
 dim sf, inStream, inFile ' Pre čítanie z lokalizačného súboru
 
 init_znaky
 
 vsetky_riadky=dokument.CurrentController.LineCount
 vsetky_znaky=dokument.CharacterCount ' pocet znakov
 vsetky_znaky_bez=vsetky_znaky-Spocitaj_Hladanim(medzery_regularne,true,false,false)
 vsetky_slova=dokument.WordCount ' pocet slov
 vsetky_normo=vsetky_znaky/normo_strana ' pocet normo stran celeho dokumentu
 vsetky_AH=vsetky_normo/autorsky_harok ' pocet autorskych harkov celeho dokumentu
 
 vyber_pocet=vyber.getCount() ' Pocet vyberov
 
 vyber_znaky=0 ' pocet znakov s medzerami
 vyber_znaky_bez=0 ' pocet znakov bez medzier
 vyber_slova=0 ' pocet slov
 
 for vyber_ktory=0 to vyber_pocet-1
  riadok = vyber.getByIndex(vyber_ktory).getString() ' riadok z vyberu
  dlzka_riadku=len(riadok)
  slovo=false ' slovo neobsahuje este ziadny znak
  
  rem pre vsetky znaky
  for i=1 to dlzka_riadku
   znak=mid(riadok,i,1) ' spracovavame i-ty znak z riadku
   if instr(oddelovac_slov,znak)=0 then ' znak nie je oddelovac slov, t.j. je castou slova
    slovo=true ' slovo obsahuje nejaky znak
   Elseif slovo then ' znak je oddelovac slova a slovo obsahovalo nejaky znak – zvysuje sa pocet slov
    vyber_slova=vyber_slova+1
    slovo=false
   endif
   if instr(nepocitane_znaky,znak)=0 then ' znak pocitame
    vyber_znaky=vyber_znaky+1
    if instr(medzery,znak)=0 then ' znak nie je medzera
     vyber_znaky_bez=vyber_znaky_bez+1
    endif
   endif
  next i
 next vyber_ktory
 rem ak sme na konci posledneho slova nemali oddelovac, tak toto slovo este nemame zapocitane
 if slovo then
  vyber_slova=vyber_slova+1
 endif
 vyber_normo=vyber_znaky/normo_strana
 vyber_AH=vyber_normo/autorsky_harok
 
 DialogLibraries.LoadLibrary("JP_znaky")
 dlg=CreateUnoDialog(DialogLibraries.JP_znaky.Dialog_znaky) ' Sprístupnenie dialógu
  
 ' Nastavenie číselných výstupov
 dlg.model.getByName("AHD").setpropertyvalue("Label",trim(single_2_string(vsetky_AH)))
 dlg.model.getByName("AHV").setpropertyvalue("Label",trim(single_2_string(vyber_AH)))
 dlg.model.getByName("NSD").setpropertyvalue("Label",trim(single_2_string(vsetky_normo)))
 dlg.model.getByName("NSV").setpropertyvalue("Label",trim(single_2_string(vyber_normo)))
 dlg.model.getByName("RIA").setpropertyvalue("Label",trim(str(vsetky_riadky)))
 dlg.model.getByName("SLD").setpropertyvalue("Label",trim(str(vsetky_slova)))
 dlg.model.getByName("SLV").setpropertyvalue("Label",trim(str(vyber_slova)))
 dlg.model.getByName("ZMD").setpropertyvalue("Label",trim(str(vsetky_znaky)))
 dlg.model.getByName("ZMV").setpropertyvalue("Label",trim(str(vyber_znaky)))
 dlg.model.getByName("ZBD").setpropertyvalue("Label",trim(str(vsetky_znaky_bez)))
 dlg.model.getByName("ZBV").setpropertyvalue("Label",trim(str(vyber_znaky_bez)))
 
 kde=basiclibraries.getLibraryLinkURL("JP_znaky") ' Adresár, kde je rozšírenie nainštalované
 nazov=left(kde,len(kde)-10)+"jp_znaky_"+Jazyk_OOo+".txt" ' Súbor s jazykovou lokalizáciou
 
 on error resume next
 
 if fileexists(nazov) then ' Ak lokalizačný súbor existuje, tak načítame definície do premenných
  ' Namiesto postupu, v ktorom sa nedá definovať kódová stránka:
  ' subor = Freefile
  ' open nazov for Input as #subor
  ' While not eof(subor)
  ' ...
  ' close #subor
  ' Použijeme postup s definovaním kódovej stránky TXT súboru:
  sf = createUnoService("com.sun.star.ucb.SimpleFileAccess")
  inStream = sf.openFileRead(nazov)
  inFile = createUnoService("com.sun.star.io.TextInputStream")
  inFile.InputStream = inStream
  inFile.Encoding = "UTF-8" ' lokalizačný súbor musí byť v UTF-8, inak nebude dobrá diakritika
  
  Do While not inFile.IsEOF
   riadok = inFile.readLine ' namiesto 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))
    if premenna="Dialog_znaky" then
     dlg.Title=definicia
    else
     dlg.model.getByName(premenna).setpropertyvalue("Label",definicia)
    endif
   end if
  loop
  ' Zatvorenie definičného súboru – namiesto close #subor
  inStream.closeInput
  inFile.closeInput
 end if
 
 dlg.Execute() ' Spustenie dialógu
 dlg.dispose() ' Zatvorenie dialógu
End Sub

Neprehliadnite: