Július Pastierik / 24. 02. 2010, 00:00
Potrebujete jazykovo lokalizovať svoje makro? V prvom dieli článkov o makrách, ktoré budú venované jazykovým lokalizáciám, si ukážeme, ako zistíte aktuálny jazyk znaku v textovom dokumente či jazyk bunky v module Calc v makre pre vkladanie dátumu a času.
Pri programovaní makier sa stretávate s problematikou, že vaše makro potrebujete z ľubovoľného dôvodu jazykovo lokalizovať. Jazyková lokalizácia sa môže týkať viacerých oblastí – dialógových panelov, vypisovaných oznámení, jazyka dokumentu či iba aktuálneho jazyka práve vkladaného textu v textovom procesore či bunky v zošite tabuľkového procesora.
V dnešnom dieli si pre začiatok zoberieme iba jednu problematiku – jazyk práve vkladaného textu v module Writer a jazyk aktuálnej bunky v module Calc. Tieto údaje následne použijeme pri vkladaní názvu mesiaca v dátume, ktorý budeme automaticky nastavovať podľa jazyka. Pravdaže, nebudeme tu riešiť všetky jazyky, ale obmedzíme sa iba na tri – slovenčinu, češtinu a angličtinu.
Jazyk je v OpenOffice.org určený znakmi (napr. „sk“) podľa normy ISO 639-1, pričom je k dispozícii aj kódové označenie štátu (napr. „SK“) podľa normy ISO 3166-1 alpha-2. Označenie štátu využijete vtedy, ak potrebujete urobiť inú lokalizáciu napríklad pre americkú a inú pre britskú angličtinu (v dnešnom príklade túto možnosť nevyužijeme). V textovom dokumente zistíte jazyk a štát znaku, na ktorom sa nachádzate, pomocou nasledovných príkazov:
ThisComponent.currentcontroller.getViewCursor().CharLocale.Language
ThisComponent.currentcontroller.getViewCursor().CharLocale.Country
V zošite tabuľkového procesora zistíte jazyk a štát bunky, na ktorej sa nachádzate, pomocou nasledovných príkazov:
ThisComponent.getCurrentSelection().getCellByPosition(0,0).CharLocale.Language
ThisComponent.getCurrentSelection().getCellByPosition(0,0).CharLocale.Country
A teraz nasleduje, ako obvykle, vlastné makro s komentármi.
REM Makro pre vloženie aktuálneho dátumu na bunku (Calc) alebo pozíciu (Writer), kde sa nachádzame
sub Vloz_Datum
dim dokument, bunka as object
dim teraz, datum, cas as string
dim i as integer
teraz=now ' Aktuálny dátum a čas vo formáte "dd.mm.rrrr hh:mm:ss"
i=instr(teraz," ") ' Pozícia, kde je oddelený dátum a čas
datum=left(teraz,i-1) ' Dátum
if ThisComponent.supportsService("com.sun.star.sheet.SpreadsheetDocument") then ' Ak sme v tabuľkovom procesore
' Funkcia vloží dátum do aktuálnej bunky zošitu v Calcu
dokument=ThisComponent.getCurrentSelection() ' Aktuálny výber
bunka=dokument.getCellByPosition(0,0) ' Aktuálna bunka
bunka.value=datevalue(datum) ' Vloženie dátumu ako hodnoty
endif
if ThisComponent.supportsService("com.sun.star.text.TextDocument") then ' Ak sme v textovom dokumente
' Funkcia vloží dátum na aktuálnu pozíciu vo Writeri
dokument=ThisComponent.currentcontroller.getViewCursor() ' Aktuálna pozícia kurzora
dokument.collapseToEnd() ' Presun na koniec a zrušenie označenia, ak je označený text
teraz=dokument.getstring() ' Text na konci kurzora
dokument.setstring(teraz+datum) ' K textu pridáme dátum
dokument.collapseToEnd() ' Presun na koniec vloženého dátumu
endif
end sub
REM Makro pre vloženie aktuálneho dátumu ako text s medzerami na bunku (Calc) alebo pozíciu (Writer), kde sa nachádzame
sub Vloz_Datum_text
dim dokument, bunka as object
dim teraz, datum, cas as string
dim dd, mm, rr as string
dim i as integer
teraz=now ' Aktuálny dátum a čas vo formáte "dd.mm.rrrr hh:mm:ss"
i=instr(teraz," ") ' Pozícia, kde je oddelený dátum a čas
datum=left(teraz,i-1) ' Dátum
' Dátum je v tvare dd.mm.rrrr, z toho vytvoríme dd. mm. rrrr – medzi čísla vložíme nezalomiteľné medzery
dd=left(datum,3)
mm=mid(datum,4,3)
rr=right(datum,len(datum)-6)
datum=dd+chr$(&HA0)+mm+chr$(&HA0)+rr
if ThisComponent.supportsService("com.sun.star.sheet.SpreadsheetDocument") then ' Ak sme v tabuľkovom procesore
' Funkcia vloží dátum do aktuálnej bunky zošitu v Calcu
dokument=ThisComponent.getCurrentSelection() ' Aktuálny výber
bunka=dokument.getCellByPosition(0,0) ' Aktuálna bunka
bunka.string=datum ' Vloženie dátumu ako reťazca
endif
if ThisComponent.supportsService("com.sun.star.text.TextDocument") then ' Ak sme v textovom dokumente
' Funkcia vloží dátum na aktuálnu pozíciu vo Writeri
dokument=ThisComponent.currentcontroller.getViewCursor() ' Aktuálna pozícia kurzora
dokument.collapseToEnd() ' Presun na koniec a zrušenie označenia, ak je označený text
teraz=dokument.getstring() ' Text na konci kurzora
dokument.setstring(teraz+datum) ' K textu pridáme dátum
dokument.collapseToEnd() ' Presun na koniec vloženého dátumu
endif
end sub
REM Makro pre vloženie aktuálneho času na bunku (Calc) alebo pozíciu (Writer), kde sa nachádzame
sub Vloz_Cas
dim dokument, bunka as object
dim teraz, datum, cas as string
dim i as integer
teraz=now ' Aktuálny dátum a čas vo formáte "dd.mm.rrrr hh:mm:ss"
i=instr(teraz," ") ' Pozícia, kde je oddelený dátum a čas
cas=right(teraz,len(teraz)-i) ' Čas
if ThisComponent.supportsService("com.sun.star.sheet.SpreadsheetDocument") then
' Funkcia vloží čas do aktuálnej bunky zošitu v Calcu
dokument=ThisComponent.getCurrentSelection() ' Aktuálny výber
bunka=dokument.getCellByPosition(0,0) ' Aktuálna bunka
bunka.value=timevalue(cas) ' Vloženie času ako hodnoty
endif
if ThisComponent.supportsService("com.sun.star.text.TextDocument") then
' Funkcia vloží čas na aktuálnu pozíciu vo Writeri
dokument=ThisComponent.currentcontroller.getViewCursor() ' Aktuálna pozícia kurzora
dokument.collapseToEnd() ' Presun na koniec a zrušenie označenia, ak je označený text
teraz=dokument.getstring() ' Text na konci kurzora
dokument.setstring(teraz+cas) ' K textu pridáme čas
dokument.collapseToEnd() ' Presun na koniec vloženého dátumu
endif
end sub
REM Funkcia pre konverziu mesiaca dátumu na jeho názov
function Datum2Text(datum as string, zaklad_tvar as boolean, jazyk as string) as string
' Význam parametrov:
' datum – dátum ako reťazec dd.mm.rrrr
' zaklad_tvar – ak true, názov mesiaca nebude skloňovaný (január), inak bude skloňovaný (januára)
' jazyk – označenie jazyka (sk, cs, en, ...)
dim mesiac(12), mesiaca(12) as string
dim dd, mm, rr as string
dim mmc as integer
select case jazyk
case "sk" ' Slovenčina
mesiac(1)="január"
mesiac(2)="február"
mesiac(3)="marec"
mesiac(4)="apríl"
mesiac(5)="máj"
mesiac(6)="jún"
mesiac(7)="júl"
mesiac(8)="august"
mesiac(9)="september"
mesiac(10)="okóber"
mesiac(11)="november"
mesiac(12)="december"
mesiaca(1)="januára"
mesiaca(2)="februára"
mesiaca(3)="marca"
mesiaca(4)="apríla"
mesiaca(5)="mája"
mesiaca(6)="júna"
mesiaca(7)="júla"
mesiaca(8)="augusta"
mesiaca(9)="septembra"
mesiaca(10)="októbra"
mesiaca(11)="novembra"
mesiaca(12)="decembra"
case "cs" ' Čeština
mesiac(1)="leden"
mesiac(2)="únor"
mesiac(3)="březen"
mesiac(4)="duben"
mesiac(5)="květen"
mesiac(6)="červen"
mesiac(7)="červenec"
mesiac(8)="srpen"
mesiac(9)="září"
mesiac(10)="říjen"
mesiac(11)="listopad"
mesiac(12)="prosinec"
mesiaca(1)="ledna"
mesiaca(2)="února"
mesiaca(3)="března"
mesiaca(4)="dubna"
mesiaca(5)="května"
mesiaca(6)="června"
mesiaca(7)="července"
mesiaca(8)="srpna"
mesiaca(9)="září"
mesiaca(10)="října"
mesiaca(11)="listopadu"
mesiaca(12)="prosince"
case else ' V ostatných prípadoch bude angličtina
mesiac(1)="january"
mesiac(2)="february"
mesiac(3)="march"
mesiac(4)="april"
mesiac(5)="may"
mesiac(6)="june"
mesiac(7)="july"
mesiac(8)="august"
mesiac(9)="september"
mesiac(10)="october "
mesiac(11)="november"
mesiac(12)="december"
mesiaca(1)="January"
mesiaca(2)="February"
mesiaca(3)="March"
mesiaca(4)="April"
mesiaca(5)="May"
mesiaca(6)="June"
mesiaca(7)="July"
mesiaca(8)="August"
mesiaca(9)="September"
mesiaca(10)="October "
mesiaca(11)="November"
mesiaca(12)="December"
end select
' Dátum je v tvare dd.mm.rrrr a z toho dostaneme dd. mesiac rrrr alebo dd. mesiaca rrrr (v dátume sú za dňom nezalomiteľné medzery)
dd=left(datum,3)
if left(dd,1)="0" then
dd=right(dd,2)
endif
mmc=val(mid(datum,4,2))
rr=right(datum,len(datum)-6)
if zaklad_tvar then
mm=mesiac(mmc)
else
mm=mesiaca(mmc)
endif
Datum2Text=dd+chr$(&HA0)+mm+" "+rr
end function
REM Makro pre vloženie aktuálneho dátumu v tvare dd. mesiac rrrr ako reťazec na bunku (Calc) alebo pozíciu (Writer), kde sa nachádzame
sub Vloz_Datum_text_zaklad
dim dokument, bunka as object
dim teraz, datum, cas, jazyk as string
dim i as integer
teraz=now ' Aktuálny dátum a čas vo formáte "dd.mm.rrrr hh:mm:ss"
i=instr(teraz," ") ' Pozícia, kde je oddelený dátum a čas
datum=left(teraz,i-1) ' Dátum
if ThisComponent.supportsService("com.sun.star.sheet.SpreadsheetDocument") then
' Funkcia vloží dátum do aktuálnej bunky zošitu v Calcu
dokument=ThisComponent.getCurrentSelection() ' Aktuálny výber
bunka=dokument.getCellByPosition(0,0) ' Aktuálna bunka
jazyk=bunka.CharLocale.Language ' Jazyk bunky (sk, cs, ...)
bunka.string=Datum2Text(datum,true,jazyk) ' Vloženie dátumu ako reťazca
endif
if ThisComponent.supportsService("com.sun.star.text.TextDocument") then
' Funkcia vloží dátum na aktuálnu pozíciu vo Writeri
dokument=ThisComponent.currentcontroller.getViewCursor() ' Viditeľný kurzor
dokument.collapseToEnd() ' Skočíme na koniec prípadne označeného textu a zrušíme označenie
jazyk=dokument.CharLocale.Language ' Jazyk znaku, na ktorom sa nachádzame (sk, cs, ...)
teraz=dokument.getstring() ' Aktuálny reťazec
dokument.setstring(teraz+Datum2Text(datum,true,jazyk)) ' Vložíme aktuálny reťazec + dátum
dokument.collapseToEnd() ' Skočíme na koniec vloženého dátumu
endif
end sub
REM Makro pre vloženie aktuálneho dátumu v tvare dd. mesiaca rrrr ako reťazec na bunku (Calc) alebo pozíciu (Writer), kde sa nachádzame
sub Vloz_Datum_text_tvar
dim dokument, bunka as object
dim teraz, datum, cas, jazyk as string
dim i as integer
teraz=now ' Aktuálny dátum a čas vo formáte "dd.mm.rrrr hh:mm:ss"
i=instr(teraz," ") ' Pozícia, kde je oddelený dátum a čas
datum=left(teraz,i-1) ' Dátum
if ThisComponent.supportsService("com.sun.star.sheet.SpreadsheetDocument") then
' Funkcia vloží dátum do aktuálnej bunky zošitu v Calcu
dokument=ThisComponent.getCurrentSelection() ' Aktuálny výber
bunka=dokument.getCellByPosition(0,0) ' Aktuálna bunka
jazyk=bunka.CharLocale.Language ' Jazyk bunky (sk, cs, ...)
bunka.string=Datum2Text(datum,false,jazyk) ' Vloženie dátumu ako reťazca
endif
if ThisComponent.supportsService("com.sun.star.text.TextDocument") then
' Funkcia vloží dátum na aktuálnu pozíciu vo Writeri
dokument=ThisComponent.currentcontroller.getViewCursor() ' Viditeľný kurzor
dokument.collapseToEnd() ' Skočíme na koniec prípadne označeného textu a zrušíme označenie
jazyk=dokument.CharLocale.Language ' Jazyk znaku, na ktorom sa nachádzame (sk, cs, ...)
teraz=dokument.getstring() ' Aktuálny reťazec
dokument.setstring(teraz+Datum2Text(datum,false,jazyk)) ' Vložíme aktuálny reťazec + dátum
dokument.collapseToEnd() ' Skočíme na koniec vloženého dátumu
endif
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