Na portáli inet.sk bolo doteraz uverejnených prvých desať dielov seriálu o typografických makrách „Typografické úpravy textu“, ktoré vychádzajú z rozšírenia JP Typografia. V týchto dieloch sme vás zoznámili so všeobecnými funkciami, funkciou pre odstraňovanie viacnásobných a nadbytočných medzier, funkciami pre nahrádzanie zalomiteľných medzier za nezalomiteľné, funkciami pre vkladanie nezalomiteľných medzier priamo počas písania textu či funkciami pre úpravu kerningu a šírky znakov.
V dnešnom pokračovaní tohto seriálu sa zameriame na prácu s dialógmi – a to konkrétne na funkcie pre jazykovú lokalizáciu dialógov a funkcie, v ktorých budeme pracovať so zoznamom profilov, ktoré sú definované v dialógovom okne. Týmto sa zároveň čiastočne dotkneme problematiky práce s externými súbormi, do ktorých sa ukladajú používateľské nastavenia.
Lokalizačné súbory
Pre nastavovanie jazykových lokalizácií dialógov budeme používať externé súbory uložené v UTF-8 kódovaní. Toto riešenie má tú výhodu, že bez potreby akéhokoľvek ďalšieho programovania či zásahu do dialógov v makrách sa dokáže do rozšírenia pridať ďalšia jazyková lokalizácia – súbory stačí skopírovať a, spolu s ostatnými časťami rozšírenia, uložiť do výstupného OXT súboru.
Vlastný definičný súbor lokalizácie je definovaný nasledovným spôsobom:
Dialog_Formatovanie=Formátování dokumentů FrameControl1=Náhrada zalomitelných mezer za nezalomitelné OptionButton1=Nahradit mezery před a za předložkami, tituly, spojkami...
Pred znakom „rovná sa“ sa nachádza názov premennej dialógu, za znakom „rovná sa“ vlastný jazykovo lokalizovaný popis. Pozor, OpenOffice.org pri premenných v dialógoch rozoznáva veľké a malé písmená, a preto musí byť aj ich definícia v lokalizačnom súbore presná.
Toľko k úvodu a teraz už môžeme uviesť okomentované zdrojové texty makier, ktoré sú uložené v module Profily_funkcie.
Zistenie jazyka rozhrania OpenOffice.org
Aby ste mohli nastaviť jazyk dialógu, musíte najprv zistiť jazyk pracovného rozhrania OpenOffice.org, na čo je určená
funkcia Jazyk_OOo
. Pretože OpenOffice.org vracia jazyk rozhrania v rôznom tvare (napr. „cs“ pre češtinu,
ale „en-US“ pre americkú angličtinu), je vo funkcii tento reťazec skracovaný iba na prvé dve písmená, lebo vo väčšine
prípadov nie je potrebné uvažovať s rozdielnymi „angličtinami“ a pod. Niektoré funkcie, ktoré dnes uvedieme, pracujú
so spoločnými premennými, a preto musia makrá začať ich definíciou.
dim oDlg as object global JP_aktualny_profil as string ' Aktuálny profil (platí pre všetky funkcie vrátane on-line vkladania) dim oVstupy as object REM Funkcia pre zistenie jazyka OO.o function Jazyk_OOo as string dim ConfigProvider, MasterKey as object dim NodePath(0) as new com.sun.star.beans.PropertyValue 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 = left(trim(MasterKey.getByName("ooLocale")),2) '"sk", "cs", ... end function
Nastavenie jazyka dialógu
Z programátorského hľadiska je pri nastavovaní jazyka dialógu potrebné rozoznávať dve položky – nadpis dialógu a
vlastné prvky dialógu, pretože sa nastavujú rozdielne – nadpis sa nastavuje pomocou metódy Title
, kým
prvky pomocou metódy Label
. Zároveň je vo funkcii Set_jazyk_dialogu
ukázané, ako sa pracuje
s externými textovými súbormi v špecifikovanom formáte (v tomto prípade UTF-8). Funkcia je naprogramovaná tak, aby sa
pomocou nej dali jazykovo lokalizovať rôzne dialógy.
Aby ste mohli do lokalizačného súboru zadať napr. aj meno prekladateľa či pripraviť jeden lokalizačný súbor aj pre
viacero dialógov, musíte ošetriť chyby (zadaný prvok dialógu sa vo vlastnom dialógu nemusí nachádzať). Na tento účel
je vo funkcii použitý príkaz on error resume next
, ktorým sa určuje, že v prípade chyby ju
OpenOffice.org ignoruje a makro pokračuje ďalej tak, ako by chyba nevznikla.
Pretože pri programovaní nemôžete vedieť, do akého adresára OpenOffice.org rozšírenie nainštaluje, musíte programovo
zistiť aj cestu k príslušnému lokalizačnému súboru. Na tento účel je určená funkcia inicializacny_subor
.
Metóda getLibraryLinkURL
, ktorú je na to vhodné použiť, vracia cestu k súboru script.xlb
(ktorý je súčasťou makier rozšírenia) vrátane desaťznakového názvu tohto súboru, a preto sa musí pred použitím
vrátený reťazec skrátiť o desať znakov.
REM Procedúra pre nastavenie jazyka dialógu Sub Set_jazyk_dialogu(oDlgj, sNazov, sZahlavie) dim riadok, premenna, definicia as string dim rovna as integer dim sf, inStream, inFile ' Pre čítanie z lokalizačného súboru on error resume next if fileexists(sNazov) then ' Ak lokalizačný súbor existuje, tak načítame definície do premenných sf = createUnoService("com.sun.star.ucb.SimpleFileAccess") inStream = sf.openFileRead(sNazov) 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=sZahlavie then oDlgj.Title=definicia else oDlgj.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 end sub REM Funkcia, ktorá vráti cestu k pracovnému TXT súboru function inicializacny_subor (nazov_suboru as string) as string REM Funkcia vracia cestu s názvom inicializačného súboru kde=basiclibraries.getLibraryLinkURL("JP_typografia") ' Adresár, kde je rozšírenie nainštalované inicializacny_subor=left(kde,len(kde)-10)+nazov_suboru+".txt" ' Súbor s definíciou profilu, ... end function
Ukladanie a načítanie zoznamu profilov
Rozšírenie pre typografické úpravy ich prevádza na „jedno kliknutie“, pričom rôzne spôsoby úprav je možné definovať
do rôznych profilov. Z tohto hľadiska je potrebné programovo ukladať a zároveň načítavať ich zoznam pri definícii
profilov. Z programátorského hľadiska je vo funkciách zapis_nazvy_profilov
a
init_dialog_profily
dôležitá práca so zoznamom dialógu – získanie a pridávanie položiek zoznamu.
REM Procedúra pre uloženie zoznamu profilov z dialógu do pracovného súboru sub zapis_nazvy_profilov dim sf, outStream, outFile ' Pre zápis do súboru dim sNazov$, kde$ dim oZoznam: oZoznam=oDlg.getControl("Zoznam_Profilov") ' Zoznam profilov v dialógu sNazov=inicializacny_subor("Zoznam_Profilov_Formatovania_Dokumentov") sf = createUnoService("com.sun.star.ucb.SimpleFileAccess") outStream = sf.openFileWrite(sNazov) outFile = createUnoService("com.sun.star.io.TextOutputStream") outFile.OutputStream = outStream outFile.Encoding = "UTF-8" ' Súbor bude v UTF-8, aby bola dobrá diakritika outStream.truncate() ' Vymazanie predchádzajúceho obsahu for i=0 to oZoznam.ItemCount-1 ' Zapíšeme všetky záznamy kde=trim(oZoznam.Items(i)) if kde<>"" then if i"" then oZoznam.AddItem(riadok,oZoznam.ItemCount) ' Ak nie je záznam prázdny, pridáme ho do dialógu loop ' Zatvorenie definičného súboru - namiesto close #subor inStream.closeInput inFile.closeInput end if if JP_aktualny_profil="" then JP_aktualny_profil="Default" ' Ak nie je nastavený aktuálny profil, nastavíme ho na "Default" oZoznam.Text=JP_aktualny_profil ' V zozname profilov zobrazíme názov aktuálneho profilu end sub
Pridávanie a mazanie položiek zo zoznamu profilov
Pri vlastnej práci so zoznamom profilov je potrebné do nich pridávať, alebo z nich mazať jednotlivé položky. Na tento
účel sú určené funkcie Vloz_profil_Initiated
a Vymaz_profil_Initiated
. Pri tejto práci je
vhodné zoznam udržiavať utriedený, aby sa v ňom ľahšie orientovalo, a preto je vo funkcii
Vloz_profil_Initiated
naprogramovaný aj jednoduchý triediaci mechanizmus (cyklus for i=0 to
oZoznam.ItemCount-1 ' Zistíme, či záznam existuje a zároveň zistíme abecednú polohu nového záznamu.
). Okrem
toho sa vo funkcii Vymaz_profil_Initiated
zoznámite aj s ďalšou programátorskou funkciou pre prácu so
zoznamom – vymazanie položky.
REM Procedúra pre pridanie novej položky do zoznamu profilov sub Vloz_profil_Initiated dim oZoznam : oZoznam=oDlg.getControl("Zoznam_Profilov") ' Zoznam profilov v dialógu dim sNovy$ : sNovy=trim(oDlg.model.Novy_profil.Text) ' Nový záznam dim bExistuje as boolean : bExistuje=false dim iPoloha : iPoloha=0 if sNovy<>"" then ' Ak je zadaný názov for i=0 to oZoznam.ItemCount-1 ' Zistíme, či záznam existuje a zároveň zistíme abecednú polohu nového záznamu bExistuje=bExistuje or (lcase(sNovy))=lCase(trim(oZoznam.Items(i))) if lcase(sNovy)>lCase(trim(oZoznam.Items(i))) then iPoloha=i+1 ' Ak je nový záznam "väčší" ako starý, tak ho vložíme zaň next i if not bExistuje then oZoznam.AddItem(sNovy,iPoloha) oDlg.model.Novy_profil.Text="" zapis_nazvy_profilov KopirujSuboryProfilu(sNovy) ' Kopírovanie definičných súborov profilu Default do nového profilu else VypisSpravu(21, sNovy) end if else VypisSpravu(23, "") end if end sub REM Procedúra pre vymazanie aktuálnej položky zo zoznamu profilov sub Vymaz_profil_Initiated dim oZoznam : oZoznam=oDlg.getControl("Zoznam_Profilov") ' Zoznam profilov v dialógu dim sMazany$ : sMazany=trim(oZoznam.Text) if lcase(sMazany)<>"default" then for i=0 to oZoznam.ItemCount-1 if sMazany=trim(oZoznam.Items(i)) then if VypisSpravu(27,sMazany)=6 then oZoznam.removeItems(i,1) zapis_nazvy_profilov VymazSuboryProfilu(sMazany) ' Vymazanie definičných súborov profilu if JP_aktualny_profil=sMazany then JP_aktualny_profil="Default" ' Ak sme vymazali aktuálny profil, nastavíme aktuálny profil "Default" endif exit sub endif next i else VypisSpravu(24, "") endif end sub