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"
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.
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
Copyright © 2002 - 2013 inet.sk, s. r. o. | Všetky práva vyhradené | Neprešlo jazykovou úpravou | ISSN 1336-1899
Využívame kvalitný webhosting za rozumnú cenu od Inet.sk