Dal╣φ P°edchozφ Obsah

5. Locales aneb lokalizace knihovny libc

Vladimφr Michl michlv@risc.upol.cz, Petr Kolß° Petr.Kolar@vslib.cz: 5. 1. 1999

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.

5.1 ┌Φel locales a jejich kategorie

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 locales.

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().

5.2 Zp∙sob nastavovßnφ locales

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.

5.3 KterΘ kategorie locales pou╛φ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).

5.4 SoftwarovΘ po╛adavky

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'.

5.5 Instalace

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

5.6 Jak to funguje

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.

5.7 Katalogy zprßv aneb programy komunikujφcφ Φesky

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.

PoΦe╣╗ovßnφ

Nejprve je t°eba zjistit, zda je aplikace napsanß internacionßln∞. To lze n∞kolika zp∙soby:

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:

  1. funkce knihovny libc (catopen, catclose, catgets)
  2. GNU gettext (integrovßn do GNU libc 2.xx (libc-6))

Funkce knihovny libc

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:

  1. Napφ╣eme program test.c
    #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;
    }
    
  2. Napφ╣eme soubor zprßv test.m:
    $set 10 #Testlist
    $ #Welcome
    # Vφtejte v testovacφm programu
    $ #Autor
    # Autor: Vladimir Michl
    
  3. Zkompilujeme soubor zprßv do katalogu:
    gencat -new -lang C test.cat test.m -h test-cat.h
    
  4. Program p°elo╛φme:
    gcc -o test test.c
    
  5. Umφstφme katalog do adresß°e s Φesk²mi katalogy a nastavφme prom∞nnou 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
    
  6. Nastavφme prom∞nnou LC_ALL a spustφme test
    LC_ALL=C test
    LC_ALL=cs_CZ.ISO-8859-2 test
    

GNU gettext

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:

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φ:

  1. Napφ╣eme program test.c
    #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;
    }
    
  2. Vytvo°φme katalog zprßv pou╛itφm p°φkazu xgettext
    xgettext test.c
    
  3. P°elo╛φme zprßvy a vyplnφme hlaviΦku v souboru messages.po. V²sledek bude vypadat takto:
    # 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"
    
  4. Katalog p°elo╛φme
    msgfmt -v -o test.mo messages.po
    
  5. P°elo╛φme zdrojßk
    gcc -o test test.c -lintl
    
  6. P°elo╛en² katalog umφstφme do adresß°e s katalogy a spustφme program
    mv test.mo /usr/share/locale/cs_CZ.iso88592/LC_MESSAGES
    LC_ALL=C test
    LC_ALL=cs_CZ.ISO-8859-2 test
    

Zdroje informacφ

ManußlovΘ strßnky: catopen(3), catclose(3), catgets(3), locale(7), setlocale(3) Info strßnky: gettext

DostupnΘ katalogy

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/.

P°φlohy

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'.


Dal╣φ P°edchozφ Obsah