Makrá v OpenOffice.org – jazykovo lokalizované vkladanie dátumu a času

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

 

Neprehliadnite: