Termφnem "locale" nebo "locales" se rozumφ lokalizace funkcφ poskytovan²ch knihovnou libc nebo glibc. Vzhledem k tomu, ╛e slu╛by tΘto knihovny pou╛φvß v∞t╣ina program∙, ovlivnφ se tφm chovßnφ tΘm∞° celΘho systΘmu.
Locales umo╛≥ujφ, aby se jednotlivΘ programy chovaly podle nßrodnφch zvyklostφ: aby sprßvn∞ fungovalo rozli╣ovßnφ znak∙ na pφsmena, Φφslice a ostatnφ znaky, pφsmen na velkß a malß, p°evody mezi mal²mi a velk²mi pφsmeny (to jsou spφ╣e zßle╛itosti znakovΘ sady ne╛ nßrodnφch zvyklostφ, ale i to je zahrnuto v locales), °azenφ (t°φd∞nφ) znak∙ a °et∞zc∙, aby programy pou╛φvaly v danΘ zemi a jazyce obvykl² zp∙sob zßpisu pen∞╛nφch ·daj∙, v²pis∙ Φφsel, data a Φasu, nßzv∙ m∞sφc∙ a dn∙ v t²dnu. Locales ·zce souvisφ s katalogy zprßv, kterΘ umo╛≥ujφ, aby programy vypisovaly svß hlß╣enφ ve zvolenΘm jazyce. V╣e je p°itom mo╛nΘ m∞nit, ani╛ by bylo nutnΘ programy rekompilovat!
Lokalizaci libc je mo╛nΘ nastavit bu∩ kompletnφ, nebo pouze pro vybranΘ kategorie. Kategorie locales jsou uvedeny v tabulce.
Kategorie | V²znam |
LC_COLLATE | Popisuje v╣echny znaky abecedy a urΦuje jejich po°adφ p°i lexikografickΘm t°φd∞nφ. |
LC_CTYPE | Pou╛φvßna pro d∞lenφ znak∙ do t°φd jako: malß, velkß pφsmena, odd∞lovaΦe, apod.. |
LC_MESSAGES | Pou╛φvßna pro zprßvy zobrazovanΘ programy, tzv. katalogy zprßv. |
LC_MONETARY | Definuje formßtovßnφ v²pis∙ pen∞╛nφch informacφ. |
LC_NUMERIC | Definuje formßtovßnφ v²pis∙ Φφsel. |
LC_TIME | Formßt v²pisu Φasu a data, nßzvy a zkratky m∞sφc∙ a dn∙ v t²dnu. |
Kategorie LC_COLLATE
ovliv≥uje chovßnφ funkcφ strcoll()
a strxfrm()
pro porovnßvßnφ °et∞zc∙.
Kategorie LC_CTYPE
ovliv≥uje chovßnφ funkcφ deklarovan²ch
v souboru ctype.h
jako jsou isupper()
, toupper()
,
... a funkcφ pro prßci s vφcebajtov²mi znaky jako jsou mblen()
,
wctomb()
.
Kategorie LC_MONETARY
a LC_NUMERIC
ovliv≥ujφ chovßnφ
funkce localeconv()
, na n∞kter²ch systΘmech bohu╛el i funkce ze
skupiny printf()
.
Kategorie LC_TIME
ovliv≥uje chovßnφ funkce strftime()
.
P°evß╛nß v∞t╣ina program∙ volß funkci setlocale(LC_ALL, "")
,
kterß inicializuje locales podle hodnot prom∞nn²ch prost°edφ,
jejich╛ nßzvy jsou stejnΘ jako kategorie locales, a podle prom∞nn²ch
LC_ALL
a LANG
.
V knihovn∞ libc/glibc je vestav∞n mechanismus, dφky kterΘmu se
vyhodnocovßnφ, jakß lokalizace se mß pou╛φt pro urΦitou kategorii,
provßdφ nßsledovn∞: Je-li nastavena prom∞nnß LC_ALL
, pou╛ije se
jejφ hodnota. Pokud nastavena nenφ, pak se zkoumß nastavenφ prom∞nn²ch
LC_kategorie
. Pokud nenφ nastavena ani prom∞nnß pro p°φslu╣nou
kategorii, rozhoduje nastavenφ prom∞nnΘ LANG
. Nenφ-li nastavena
ani prom∞nnß LANG
, pou╛ije se implicitnφ hodnota "C". N∞kterΘ
programy (nap°φklad man 1.x) nastavenφ prom∞nn²ch LC_*
ignorujφ
a °φdφ se pouze podle prom∞nnΘ LANG
.
Zmφn∞nΘ prom∞nnΘ se nastavujφ na hodnoty tvaru:
jazyk[_ZEM╠[.k≤dovßnφ]]
nebo lΘpe na n∞kterou z p°ezdφvek definovan²ch v souboru
locale.alias
--- to je czech
pro Φe╣tinu,
slovak
pro sloven╣tinu. Dφky p°ezdφvce se hodnota p°evede na
cs_CZ.ISO-8859-2
nebo sk_SK.ISO-8859-2
, co╛ udßvß jak
k≤dovßnφ, tak jazyk a zemi. Locale soubory se dφky mechanismu zabudovanΘmu
do knihovny libc hledajφ postupn∞ v adresß°φch cs_CZ.ISO-8859-2
,
cs_CZ.iso88592
, cs_CZ
, cs.ISO-8859-2
,
cs.iso88592
a nakonec v cs
.
Zkratky jazyk∙ stanovuje norma ISO 639, zkratky zemφ norma
ISO 3166 (viz kapitola
p°φloha).
K≤d Φe╣tiny je cs
, sloven╣tiny sk
, k≤d ╚eskΘ
republiky CZ
, Slovenska SK
. Zem∞ se uvßdφ
z toho d∙vodu, ╛e n∞kter²mi jazyky se mluvφ ve vφce zemφch,
ve kter²ch se nap°φklad pou╛φvß jinΘ m∞na.
Pon∞kud matoucφ je fakt, ╛e k≤d Φe╣tiny se li╣φ od k≤du ╚eskΘ republiky. Ale i mezi jazyky, kterΘ se pou╛φvajφ v jedinΘ zemi to nenφ ojedin∞l² p°φpad: podobn∞ je to u da_DK (dßn╣tina, Dßnsko), ja_JP (japon╣tina, Japonsko). V p°φpad∞ cs_CZ je v╣ak o d∙vod ke zmatenφ vφce, proto╛e k≤d Φe╣tiny je shodn² s ISO k≤dem b²valΘho ╚eskoslovenska.
P°φpona .k≤dovßnφ
by m∞la slou╛it k v²b∞ru sprßvn²ch
locale informacφ na poΦφtaΦφch, kterΘ pro urΦit² jazyk podporujφ
n∞kolik k≤dovßnφ (v Evropsk²ch podmφnkßch asi pouze ISO-8858-x a
Unicode), nebo naopak urΦitΘ k≤dovßnφ nepodporujφ (nap°φklad
ISO-8859-2). Bohu╛el v r∙zn²ch systΘmech se pro k≤dovßnφ pou╛φvajφ
r∙znΘ °et∞zce, tak╛e je mo╛nΘ se setkat se zßpisy ISO-8859-2
,
ISO_8859-2
, ISO8859-2
, iso88592
, za kter²mi
je╣t∞ n∞kdy b²vß dvojteΦka a rok p°ijetφ standardu k≤dovßnφ ISO-8859-2.
Pokud nemusφte, je lep╣φ p°φponu .k≤dovßnφ
v∙bec nepou╛φvat.
P°esto╛e v mnoha nßvodech je lakonickΘ sd∞lenφ "nastavte prom∞nnou
LANG
na cs_CZ
" (nebo cs
, n∞kde dokonce je╣t∞
chybn∞ cz
), je u╛iteΦnΘ se zamyslet, jestli skuteΦn∞ chcete
nastavovat v╣echny kategorie. Nemusφ se vßm nap°φklad lφbit lokalizovan²
v²pis p°φkazu ls -l
, v n∞m╛ mohou b²t rozhozeny sloupce kv∙li
r∙znΘ dΘlce zkratek nßzv∙ m∞sφc∙, n∞kterΘ programy nebo skripty mohou
dokonce p°i nastavenφ LC_ALL
nebo LANG
╣patn∞ fungovat
(zejmΘna kdy╛ na n∞kter²ch systΘmech nastavenφ locales ovliv≥uje i takovΘ
funkce jako je printf()
).
Navφc auto°i program∙ ne v╛dy dob°e rozli╣ujφ (pokud u╛ v∙bec
pou╛φvajφ locales), kdy program produkuje v²pisy pro u╛ivatele a kdy
v²pisy pro dal╣φ zpracovßnφ n∞jak²m programem (nap°φklad zßpis do
konfiguraΦnφho souboru). Ve druhΘm p°φpad∞ by se lokalizovanΘ funkce
nem∞ly pou╛φvat. Bohu╛el u mnoha program∙ to lze t∞╛ko odli╣it (typick²m
p°φkladem jsou °ßdkovΘ p°φkazy jako p°φkaz ls -l
, kter² m∙╛e
b²t jak vyvolßn u╛ivatelem, tak pou╛it v jinΘm programu nebo skriptu).
P°i psanφ skript∙ by m∞lo b²t v╛dy zaji╣t∞no, ╛e skripty budou fungovat i p°i rozliΦn∞ nastavenΘ lokalizaci. Pokud se ve skriptech oΦekßvß, ╛e v²stupy program∙ budou v nelokalizovanΘ form∞, musφ b²t na zaΦßtku skriptu uvedeny p°φkazy
LC_ALL=C; export LC_ALL
LANG=C; export LANG
Nastavenφ prom∞nnΘ LC_ALL
by m∞lo b²t postaΦujφcφ; prom∞nnß
LANG
se nastavuje, aby sprßvn∞ fungovaly i programy, kterΘ
nesprßvn∞ pou╛φvajφ pouze tuto prom∞nnou.
Pro prßci se znakovou sadou ISO-8859-2 je velice vhodnΘ mφt nastavenΘ
p°inejmen╣φm LC_CTYPE
. Bez n∞j nebudou fungovat n∞kterΘ
klßvesnice v X, v textov²ch editorech nebudou sprßvn∞ rozeznßvßny hranice
slov (tak╛e nap°φklad slovo u╛ovka nep∙jde v editoru vi smazat p°φkazem
dw
, ale bude nutnΘ pou╛φt 3dw, jako by se jednalo o t°i slova).
Knihovna glibc (alias libc6 nebo libc2) funguje s locales vcelku bez problΘm∙ (od verze 2.0.7 obsahuje i ΦeskΘ locales). To se v╣ak nedß °φci o knihovn∞ libc5. Ve v Linuxu pom∞rn∞ roz╣φ°enΘ verzi libc-5.3.12 jsou prßv∞ v oblasti locales chyby, kterΘ p°i nevhodn²ch hodnotßch v sekci LC_TIME zp∙sobφ pßd programu localedef. Obvykle se doporuΦuje libc verze alespo≥ 5.4.17.
Na systΘmech, kterΘ majφ libc i glibc je nutnΘ u ji╛ p°elo╛en²ch
program∙ zjistit, s jakou variantou knihovny libc pracujφ. Bohu╛el
nap°φklad v systΘmu Red Hat 5.x p°φkaz ldd `which program`
zcela bezosty╣n∞ l╛e.
Dßle je t°eba mφt odpovφdajφcφ utility `localedef' a `locale', a pokud chcete p°eklßdat katalogy zprßv, tak takΘ utility `gencat' a `msgfmt'.
Nejd°φve zjist∞te v jakΘm stavu mß vß╣ systΘm locales: P°φkazem
localedef --help
zjistφte (podle °ßdku s textem System's directory for character
maps:
), v jakΘm adresß°i jsou oΦekßvßny mapy znak∙. U systΘm∙
s libc5 to b²vß /usr/share/nls/charmap
, u systΘm∙ s glibc
/usr/share/i18n/charmaps
. Dal╣φ popis je psßn pro systΘmy
s libc5, proto╛e u╛ivatelΘ glibc systΘm∙ pravd∞podobn∞ u╛ budou mφt
locales nainstalovanΘ. Pokud ne, musφ si v nßsledujφcφm popisu
upravit cesty v p°φkazech podle vlastnφho systΘmu. Pozor na 's',
kterΘ ve jmΘnech adresß°∙ locale(s) a charmap(s) n∞kde je a n∞kde
nenφ!
Pokud v tomto adresß°i chybφ soubor s popisem znakovΘ sady ISO-8859-2
(zkuste ╛olφkov² zßpis ISO*8859-2*), budete si muset stßhnout soubor
http://www.inf.upol.cz/~michlv/ftp/WG15-collection.tar.gz
rozbalit jej do libovolnΘho adresß°e a z rozbalenΘho adresß°e
WG15-collection
zkopφrovat adresß°e charmaps
a
locales
vΦetn∞ obsahu do adresß°e, ve kterΘm se oΦekßvß
adresß° s mapami znak∙:
cp -r WG15-collection/charmaps /usr/share/nls/charmap
cp -r WG15-collection/locales /usr/share/nls/locale
Pokud u╛ na va╣em systΘmu zmφn∞nΘ soubory jsou, bude staΦit nainstalovat
pouze ΦeskΘ nebo slovenskΘ locales. Alespo≥ ΦeskΘ by u╛ m∞ly b²t v glibc
2.0.7; a pokud jste instalovali Φeskou klßvesnici do X11 z balφku
XKB-czsk-forcedIM*
, mßte ΦeskΘ a slovenskΘ locales u╛ takΘ
nainstalovanΘ. O tom je mo╛nΘ se p°esv∞dΦit p°φkazem
locale -a | grep ^cs
V╛dy je v╣ak vhodnΘ stßhnout zdrojov² soubor s Φesk²mi locales
ftp://ftp.fi.muni.cz/pub/localization/locale/cs_CZ
a umφstit jej do adresß°e /usr/share/nls/locale
. V mnoha
balφcφch je toti╛ starß verze tohoto souboru, ve kterΘ mimo jinΘ
nemusφ fungovat sprßvn∞ t°φd∞nφ.
Zdrojov² soubor s Φesk²mi locales je nutnΘ p°elo╛it do binßrnφ podoby pro libc p°φkazy
cd /usr/share/locale
mkdir -p cs_CZ/LC_MESSAGES
localedef -c -i /usr/share/nls/locale/cs_CZ \
-f /usr/share/nls/charmap/ISO*8859-2* ./cs_CZ
pro glibc p°φkazy
mkdir -p /usr/share/locale/cs_CZ/LC_MESSAGES
localedef -c -i /usr/share/i18n/locales/cs_CZ \
-f /usr/share/i18n/charmaps/ISO-8859-2 /usr/share/locale/cs_CZ
V²sledkem bude adresß° /usr/share/locale/cs_CZ
obsahujφcφ sadu
soubor∙ se jmΘny LC_*
a adresß° LC_MESSAGES
.
V²╣e uvedenΘ p°φkazy m∙╛ete takΘ pou╛φt, pokud se vßm nelφbφ, ╛e
v dodßvan²ch Φesk²ch locales jsou na mφst∞ zkratek jmen m∞sφc∙ pou╛ity
plnΘ nßzvy, co╛ zp∙sobuje rozhßzenφ v²pisu produkovanΘho p°φkazem ls
-l
. StaΦφ opravit nßzvy uvedenΘ v sekci abmon
ve zdrojovΘm
souboru /usr/share/i18n/locales/cs_CZ
a locales znovu p°elo╛it.
Pak u╛ m∙╛ete nastavovat prom∞nnΘ LC_CTYPE
, LC_COLLATE
nebo LC_ALL
a LANG
a kochat se, jak to funguje.
Nap°φklad aby sprßvn∞ fungovala klasifikace znak∙, je t°eba nastavit
prom∞nnou prost°edφ LC_CTYPE
. V shellech bash a ksh se to
provede p°φkazem
export LC_CTYPE=cs_CZ
v csh a tcsh p°φkazem
setenv LC_CTYPE cs_CZ
a ve star╣φch shellech vychßzejφcφch z Bourne shellu, sh, a jsh p°φkazem
LC_CTYPE=cs_CZ
export LC_CTYPE
Pro nastavenφ v╣ech kategoriφ locales je t°eba nastavit prom∞nnou
prost°edφ LANG
nebo LC_ALL
.
Pokud chcete, aby Φesky byly pouze zprßvy vypisovanΘ programy,
nastavte prom∞nnou LC_MESSAGES
:
export LC_MESSAGES=cs_CZ
P°i nastavenφ n∞kterΘ z prom∞nn²ch prost°edφ ovlßdajφcφch locales
se najde v souboru /usr/share/locale/locale.alias
odpovφdajφcφ
hodnota, podle kterΘ se vybere adresß° z /usr/share/locale
(nebo se tento adresß° vybere p°φmo). V adresß°i odpovφdajφcφm vybranΘmu
jazyku jsou binßrnφ soubory vygenerovanΘ p°φkazem localedef
z textov²ch locales. JmΘna soubor∙ jsou nßsledujφcφ:
LC_COLLATE, LC_MESSAGES, LC_NUMERIC, LC_CTYPE, LC_MONETARY, LC_TIME.
Pokud n∞kter² soubor sma╛ete a vytvo°φte mφsto n∞j adresß° se stejn²m jmΘnem, pak se po novΘm vygenerovßnφ soubor∙ utilitou `localedef' soubor umφstφ do tohoto adresß°e se jmΘnem zaΦφnajφcφm p°edponou SYS_.
Tohoto se nejΦast∞ji vyu╛φvß u LC_MESSAGES
, kdy jsou do tohoto
adresß°e umφs╗ovßny katalogy zprßv pro r∙znΘ programy. Katalog zprßv je
soubor, v n∞m╛ jsou umφst∞ny v╣echny zprßvy vypisovanΘ programem nebo
skupinou program∙ a jeho╛ zßm∞nou lze docφlit zm∞ny jazyka, kter²m
program komunikuje.
V p°φpad∞ katalog∙ zprßv lze p°edepsat, kde se tyto katalogy majφ hledat,
pomocφ prom∞nnΘ prost°edφ
NLSPATH
.
Nap°: export NLSPATH=/usr/share/locale/%L/LC_MESSAGES/%N.cat kde %N znamenß jmΘno katalogu. %L znamenß jmΘno lokalizace (kategorie LC_MESSAGES).
Za oba tyto atributy si program dosadφ sprßvnΘ hodnoty, kdy╛ pot°ebuje informace o zvyklostech zem∞.
Pokud je t°eba v NLSPATH
zadat vφce adresß°∙, odd∞lujφ se
dvojteΦkou.
Jednφm z cφl∙ lokalizace je umo╛nit, aby si u╛ivatel mohl vybrat, v jakΘm jazyce budou jednotlivΘ programy vypisovat svß hlß╣enφ, menu, apod., a to bez rekompilace program∙. Aby to bylo mo╛nΘ, musφ b²t texty v╣ech zprßv, kterΘ program produkuje, z n∞j vyta╛eny a umφst∞ny v n∞jakΘm externφm souboru (katalogu zprßv). Jeho zßm∞nou za jin² se dosßhne zm∞ny v╣ech zprßv. V souΦasnΘ dob∞ se pou╛φvajφ dva zp∙soby jak to provΘst:
ad a) Star╣φ a takΘ p°i programovßnφ pracn∞j╣φ °e╣enφ. Paraleln∞ s programem je t°eba vytvß°et textov² katalog zprßv, ze kterΘho se nakonec pomocφ `gencat' vytvo°φ katalog v binßrnφm tvary (kter² mφvß p°φponu .cat). Pro p°φstup do katalogu se v programu pou╛φvajφ funkce catopen, catclose, catgets (popis viz man).
ad b) Nov∞j╣φ °e╣enφ, jednodu╣╣φ pro tvorbu a ·dr╛bu program∙. Pro jeho pou╛itφ je nutn² balφk gettext. V programu se pak ka╛dß zprßva, kterou vypisuje, napφ╣e jako argument funkce gettext. Po zm∞n∞ programu pak staΦφ vygenerovat seznam v╣ech zprßv, kterΘ jsou v programu, a tyto zprßvy p°elo╛it. Nov² katalog lze takΘ spojit se star²m, ji╛ p°elo╛en²m. Zdrojov² tvar katalogu se pro pou╛itφ programem p°evßdφ do binßrnφho tvaru tzv. objektu zprßv (soubor mφvß p°φponu .mo nebo .gmo) utilitou `msgfmt'.
P°i obou postupech se v²sledn² katalog zprßv umφstφ do adresß°e
/usr/share/locale/cs_CZ.*/LC_MESSAGES
.
Nejprve je t°eba zjistit, zda je aplikace napsanß internacionßln∞. To lze n∞kolika zp∙soby:
LANG
nebo LC_ALL
na p°φslu╣n² jazyk ---
nap°: export LC_ALL=cs_CZ
.
Pokud aplikace internacionßln∞ napsanß nenφ, pak mßme sm∙lu, nebo ji m∙╛eme upravit.
Je-li internacionßln∞ napsanß, je t°eba zjistit, kter² ze dvou v²╣e popsan²ch, pak m∙╛e pou╛φvat jeden ze dvou mn∞ znßm²ch zp∙sob∙ a to:
Tento zp∙sob je star╣φ a pravd∞podobn∞ p°enositeln∞j╣φ na jinΘ operaΦnφ systΘmy. V╣echny zprßvy z programu jsou vyta╛eny do katalogu (mφvß p°φponu .msg, .m), kter² m∙╛e b²t rozd∞len na n∞kolik Φßstφ. Katalog vypadß nßsledovn∞:
$set cislo #Nazev $ #Jmeno_zpravy1 dßle poznßmky, t°eba originßlnφ zprßva # Vlastnφ zprßva 1 $ #Jmeno_zpravy2 dßle poznßmky, t°eba originßlnφ zprßva # Vlastnφ zprßva 2 ...
╪ßdky kterΘ zaΦφnajφ znakem '$', nejsou umφst∞ny do v²slednΘho katalogu. '$set cislo #Nazev' je p°φkaz, kter² udßvß Φφslo mno╛iny a jejφ symbolick² nßzev. Tφmto musφ zaΦφnat ka╛d² katalog. Dßle pokraΦujeme v╛dy po dvou °ßdcφch, p°itom prvnφ °ßdek je nepovinn², pouze definuje symbolickΘ jmΘno zprßvy.
$ #Jmeno_zpravy1 dßle poznßmky, t°eba originßlnφ zprßva # Vlastnφ zprßva 1
Tak╛e pokud mßme napsßn katalog, m∙╛eme jej zkompilovat p°φkazem gencat, jeho╛ syntaxe je:
gencat [-new] [-or] [-lang C|C++|ANSIC] catfile msgfile [-h <header-file>]... -new generuje nov² katalog -lang pro jak² jazyk mß b²t vytvo°en hlaviΦkov² soubor catfile jak se mß jmenovat katalog msgfile soubor zprßv -h hlaviΦkov²_soubor generovat hlaviΦkov² soubor tohoto jmΘna
Po kompilaci ji╛ mßme v²sledn² katalog, kter² pak staΦφ umφstit do adresß°e s ostatnφmi katalogy.
!!!POZOR!!! Pokud p°eklßdßme katalog z jinΘho jazyka, je t°eba zachovat po°adφ i poΦet zprßv.
P°φklad:
Ud∞lßme mal² p°φklad pou╛itφ tohoto zp∙sobu:
#include <locale.h> #include <stdio.h> #include <features.h> #include <nl_types.h> #include "test-cat.h" char main() { nl_catd cfd; setlocale(LC_MESSAGES, ""); cfd = catopen("test", MCLoadBySet); printf("%s\n", catgets(cfd, TestlistSet, TestlistWelcome, "Welcome in test program")); /* "Welcome in test program" se vypφ╣e v~p°φpad∞, ╛e zprßva nenφ v~katalogu nalezena, nebo katalog nebyl nalezen */ printf("%s\n", catgets(cfd, TestlistSet, TestlistAuthor, "Author: Vladimir Michl")); catclose(cfd); return 0; }
$set 10 #Testlist $ #Welcome # Vφtejte v testovacφm programu $ #Autor # Autor: Vladimir Michl
gencat -new -lang C test.cat test.m -h test-cat.h
gcc -o test test.c
NLSPATH
do tohoto adresß°e
mv test.cat /usr/share/locale/cs_CZ.iso88592/LC_MESSAGES export NLSPATH=/usr/share/locale/%L/LC_MESSAGES/%N.cat
LC_ALL
a spustφme test
LC_ALL=C test LC_ALL=cs_CZ.ISO-8859-2 test
K tomuto zp∙sobu je t°eba si stßhnout GNU gettext z n∞jakΘho FTP. Jß osobn∞ pova╛uji tento zp∙sob za daleko lep╣φ ne╛ prvnφ.
Katalogy zprßv b²vajφ ve dvou tvarech a to s p°φponou .pot a .po. S p°φponou .pot jsou to pouze zprßvy vyta╛enΘ ze zdrojßk∙, kde╛to soubory s p°φponou .po jsou soubory, kterΘ ji╛ majφ alespo≥ n∞kterΘ zprßvy p°elo╛enΘ. .po soubor mß nßsledujφcφ strukturu:
#
jsou komentß°em.#:
jsou odkazy, kde se
°et∞zec vyskytuje ve zdrojovΘm k≤du.msgid "xxxxxx"
nebo msgid ""
zaΦφnß
p∙vodnφ °et∞zec uveden² ve zdrojovΘm k≤du.msgstr "xxxxxx"
nebo msgstr ""
zaΦφnß
p°elo╛en² °et∞zec.#,
informujφ o stavu p°ekladu
nebo formßtu.
V²jimku tvo°φ prvnφ dvojice msgid
a msgstr
, kde se
uvßdφ informace o konkrΘtnφm katalogu.
P°φklad .po souboru:
# Czech translations for the GNU gettext messages # Copyright (C) 1996 Free Software Foundation, Inc. # Vladimir Michl <Vladimir.Michl@upol.cz>, 1997. # Version: 1.1 # msgid "" msgstr "" "Project-Id-Version: fileutils 3.15a\n" "POT-Creation-Date: 1997-01-26 00:26-0600\n" "PO-Revision-Date: 1997-04-23 20:21+0200\n" "Last-Translator: Vladimir Michl <Vladimir.Michl@upol.cz>\n" "Language-Team: Czech <cs@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-2\n" "Content-Transfer-Encoding: 8-bit\n" #: src/chgrp.c:144 msgid "group number" msgstr "Φφslo skupiny" #: src/chgrp.c:290 src/chmod.c:234 src/chown.c:254 src/cp-aux.c:86 #: src/dd.c:1121 src/df.c:576 src/dircolors.c:121 src/du.c:238 #: src/install.c:625 src/ln.c:347 src/ls.c:2805 src/mkdir.c:70 src/mkfifo.c:68 #: src/mknod.c:79 src/mv.c:407 src/rm.c:543 src/rmdir.c:94 src/sync.c:46 #: src/touch.c:262 msgid "" "\n" "Report bugs to fileutils-bugs@gnu.ai.mit.edu" msgstr "" "\n" "Popis chyb zasφlejte na adresu fileutils-bugs@gnu.ai.mit.edu (pouze " "anglicky),\n" "popis chyb v~p°ekladu zasφlejte na adresu cs@li.org" Pokud se t∞sn∞ p°ed msgid vyskytne °ßdek #, fuzzy, pak je tento °et∞zec pova╛ovßn za ne·pln∞ p°elo╛en². Nap°: #, fuzzy msgid "OK" msgstr "xxx"
Pro prßci s katalogem existuje n∞kolik utilit:
ZkompilovanΘ katalogy musφ mφt p°φponu .mo.
P°φklad pou╛itφ:
#include <locale.h> #include <stdio.h> #include <libintl.h> #define PACKAGE "test" #define LOCALEDIR "/usr/share/locale" char main() { setlocale(LC_MESSAGES, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); printf("%s\n", gettext("Welcome in test program")); printf("%s\n", gettext("Author: Vladimir Michl")); return 0; }
xgettext test.c
# Czech translation of test. # Vladimir Michl <Vladimir.Michl@upol.cz>, 1997. # msgid "" msgstr "" "Project-Id-Version: test 1.0\n" "POT-Creation-Date: 1997-05-02 16:28+0000\n" "PO-Revision-Date: 1997-05-02 18:00+0200\n" "Last-Translator: Vladimir Michl <Vladimir.Michl@upol.cz>\n" "Language-Team: Czech <cs@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-2\n" "Content-Transfer-Encoding: 8bit\n" #: test.c:13 msgid "Welcome in test program" msgstr "Vφtejte v~testovacφm programu" #: test.c:14 msgid "Author: Vladimir Michl" msgstr "Autor: Vladimφr Michl"
msgfmt -v -o test.mo messages.po
gcc -o test test.c -lintl
mv test.mo /usr/share/locale/cs_CZ.iso88592/LC_MESSAGES LC_ALL=C test LC_ALL=cs_CZ.ISO-8859-2 test
ManußlovΘ strßnky: catopen(3), catclose(3), catgets(3), locale(7), setlocale(3) Info strßnky: gettext
P°ehled programov²ch balφk∙, kterΘ jsou lokalizovßny i kterΘ na lokalizaci teprve Φekajφ naleznete na http://www.inf.upol.cz/~michlv/gnu-loc.shtml.
Katalogy je mo╛nΘ zφskat na
http://www.inf.upol.cz/~michlv/ftp/catalogs/
nebo
ftp://ftp.fi.muni.cz/pub/localization/locale/catalogs/.
Katalogy pro LyX jsou na
ftp://merkur.econ.muni.cz/pub/lyx.cz/.
Pro KDE jsou ΦeskΘ a slovenskΘ katalogy k dispozici v podadresß°φch
po/cs/
a po/sk/
jednotliv²ch adresß°∙ na
ftp://ftp.ujep.cz/pub/OS/Linux/terezka.ujep.cz/kde/src/.
N∞kterΘ k≤dy jazyk∙ podle normy ISO 639:
arab╣tina `ar', Φφn╣tina `zh', Φe╣tina `cs', dßn╣tina `da', holand╣tina `nl', angliΦtina `en', Esperanto `eo', fin╣tina `fi', francouz╣tina `fr', hebrej╣tina `he', n∞mΦina `de', °eΦtina `el', ma∩ar╣tina `hu', ir╣tina `ga', ital╣tina `it', indonΘ╣tina `id', japon╣tina `ja', korej╣tina `ko', latina `la', nor╣tina `no', per╣tina `fa', pol╣tina `pl', portugal╣tina `pt', ru╣tina `ru', sloven╣tina `sk', slovin╣tina `sl', ╣pan∞l╣tina `es', ╣vΘd╣tina `sv', tureΦtina `tr', ukrajin╣tina `uk'.
N∞kterΘ k≤dy zemφ podle normy ISO 3166:
╚eskß republika `CZ', Slovensko `SK', N∞mecko `DE', Francie `FR', Polsko `PL', Rakousko `AT', SpojenΘ stßty `US'.