Skočiť na obsah Skočiť na menu

Inet.sk - internetový denník

internetový denník

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

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

 

Je Vaša doména voľná?

Platená reklama

Textová reklama

Ako začať podnikať na internete? Nechajte si poradiť. Aký má byť obsah kvalitne www stránky? Tvorba www stránok, Tvorba webu, Redakčný systém - CMS, Prieskumy o nakupovaní na internete, Pôžičky
Kompletné informácie o Kika Banská Bystrica | Čo takto navštíviť Viedeň? | Zaujímavé informácie priamo od zdroja

Newsletter


Copyright © 2002 - 2012 Inet.sk, s. r. o.Všetky práva vyhradenéNeprešlo jazykovou úpravouISSN 1336-1899

Využívame kvalitný webhosting za rozumnú cenu od Webhosting Inet.sk


Bilancia skrývky Fotokniha Fotografie Osobnosti.sk