Typografické úpravy textu – jazykové lokalizácie dialógov, práca so zoznamom

programovani.png Na portáli OpenOffice.cz začíname so seriálom o programovaní makier a rozšírení v OpenOffice.org. Tento seriál je pokračovaním a náhradou seriálu „Makrá v OpenOffice.org“, ktorý doteraz vychádzal na portáli inet.sk, a preto naň plynule nadviažeme a budeme pokračovať s typografickými makrami.  

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
(Jako ve škole) Průměr: 1.00 | Hodnotilo: 2
 

Přidat názor

 

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích najdete v nápovědě. Diskuzi můžete sledovat pomocí RSS kanálu.

 
 
 
woo jaw demo hz