Lokalizace programu v jazyce C: Porovnání verzí

Z Milan Kerslager
Přejít na: navigace, hledání
(Rozšíření)
m (Popis národních odlišností: fix)
Řádka 3: Řádka 3:
 
== Popis národních odlišností ==
 
== Popis národních odlišností ==
  
Popis národních odlišností je umístěn do adresáře <CODE>/usr/share/locale/STÁT</CODE>. V případě, že ve státě je více oficiálních jazyků, používá se adresář <CODE>/usr/share/locale/JAZYK_STÁT</CODE>. Dvoupísmenný kód jazyka je určen normou [ISO-639 http://www.w3.org/WAI/ER/IG/ert/iso639.htm] a kód státu je určen normou [http://www.iso.ch/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html ISO-3166].
+
Popis národních odlišností je umístěn do adresáře <CODE>/usr/share/locale/STÁT</CODE>. V případě, že ve státě je více oficiálních jazyků, používá se adresář <CODE>/usr/share/locale/JAZYK_STÁT</CODE>. Dvoupísmenný kód jazyka je určen normou [http://www.w3.org/WAI/ER/IG/ert/iso639.htm ISO-639] a kód státu je určen normou [http://www.iso.ch/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html ISO-3166].
  
 
=== I18N ===
 
=== I18N ===

Verze z 3. 4. 2008, 16:05

Lokalizace do národního prostředí má za úkol nahradit chování programu a anglická hlášení jejich českými ekvivalenty. Některé části jsou společně definované pro celý systém (například tvar zápisu datumu, rozměr používaného papíru, používaná měna a podobně), překlad hlášení programu je pak specifické pro každý program zvlášť.

Popis národních odlišností

Popis národních odlišností je umístěn do adresáře /usr/share/locale/STÁT. V případě, že ve státě je více oficiálních jazyků, používá se adresář /usr/share/locale/JAZYK_STÁT. Dvoupísmenný kód jazyka je určen normou ISO-639 a kód státu je určen normou ISO-3166.

I18N

Zkratka I18N odkazuje na slovo internationalisation (první a poslední písmeno a 18 znaků mezi nimi). Označuje postup, který zajistí, že program je ve tvaru, který lze lokalizovat (jde tedy o programátorskou část).

L10N

Zkratka L10N odkazuje na slovo localisation (první a poslední písmeno a 10 znaků mezi nimi). Označuje postup, který změní chování programu tak, aby vyhovoval národním zvyklostem (překlad hlášení programu, použití správných jednotek atp).

Nastavení prostředí

Nastavené prostředí lze zjistit spuštěním příkazu locale. Tento příkaz vypíše sadu proměnných prostředí, které se dědí na další spouštěné programy a ty se pak podle nich mohou zachovat. Prohlédněte si příklad výstupu tohoto programu:

    1  LANG=cs_CZ.UTF-8
    2  LC_CTYPE="cs_CZ.UTF-8"
    3  LC_NUMERIC="cs_CZ.UTF-8"
    4  LC_TIME="cs_CZ.UTF-8"
    5  LC_COLLATE="cs_CZ.UTF-8"
    6  LC_MONETARY="cs_CZ.UTF-8"
    7  LC_MESSAGES="cs_CZ.UTF-8"
    8  LC_PAPER="cs_CZ.UTF-8"
    9  LC_NAME="cs_CZ.UTF-8"
   10  LC_ADDRESS="cs_CZ.UTF-8"
   11  LC_TELEPHONE="cs_CZ.UTF-8"
   12  LC_MEASUREMENT="cs_CZ.UTF-8"
   13  LC_IDENTIFICATION="cs_CZ.UTF-8"
   14  LC_ALL=

Čím dříve je proměnná vypsána, tím má nižší váhu a proměnné umístěné níže mohou její nastavení změnit. Proto se obvykle národní prostředí celého počítače nastavuje pomocí proměnné LANG. Uživatel pak má možnost jednoduchým způsobem ovlivnit zbývající nastavení (zápis čísel, měny, používaný rozměr papíru atd) – jen nastaví další proměnnou prostředí. Tímto způsobem si můžeme nechat psát program česky, ale čísla například vypisovat s desetinnou tečkou, jako v některých západních státech. Logicky nastavení proměnné LC_ALL překryje všechna ostatní nastavení.

V proměnné je nejprve kód jazyka, za podtržítkem může být upřesněn kód státu a za tečkou pak eventuálně i kódování (zde UTF-8). Implicitní kódování pro nastavení cs a cs_CZ je ISO-8859-2. Avšak pro současné systémy je výhodnější používat unikód, protože pak lze používat všechna písmena nejrůznějších jazyků zároveň (tj. např. v poštovním programu můžeme snadno číst francouzské, ruské i čínské texty – samozřejmě pokud používáme unikódový font, který požadované znaky obsahuje).

Lokalizace programu

Příklad lokalizovaného programu si můžete prohlédnout níže. Na začátku je potřeba zavolat trojici knihovních funkcí: setlocale (přebírá nastavení proměnných prostředí na dané locale), bindtextdomain (určuje adresář, kde se nacházejí katalogy s přeloženými zprávami) a textdomain (určuje název souboru s katalogem, ve kterém se budou nacházet přeložená hlášení).

    1  #include <locale.h>
    2  #include <stdio.h>
    3  main ()
    4  {
    5    setlocale(LC_ALL, "");
    6    bindtextdomain("priklad", "");
    7    textdomain("priklad");
    8    printf("%s\n", gettext("Hello world!"));
    9  }

Řetězec, který má program vytisknout, je obalen voláním knihovní funkce gettext. Za normálních okolností (tj. není-li locale nastaveno nebo v případě, že katalogy na disku chybí), bude funkce vracet stejný řetězec, který dostala jako parametr. V případě, že je nastaveno locale a je nalezen katalog a v katalogu bude příslušný řetězec přeložen, vrátí funkce gettext příslušný překlad. Proto program s českými locale může vypsat Nazdar světe! místo Hello world!.

Katalog hlášení

pro vytvoření katalogu hlášení použijeme nástroj, který vyrobí soubor pro překlad tak, že vyzobe ze zdrojového textu všechna hlášení připravená k lokalizaci:

    xgettext --default-domain=priklad --output-dir=. --add-comments --keyword=_ priklad.c

V aktuálním adresáři nám vznikne soubor priklad.po, do kterého doplníme chybějící údaje a smažeme případné slovo fuzzy (označuje nepřesný překlad, např. když se v anglickém vzoru opraví překlep).

    1  # Czech translation for our priklad.
    2  # Copyright (C) 2007
    3  # This file is distributed under the same license as the priklad package.
    4  # Milan Kerslager <milan.kerslager@tul.cz>, 2007.
    5  #
    6  msgid ""
    7  msgstr ""
    8  "Project-Id-Version: priklad 1\n"
    9  "Report-Msgid-Bugs-To: \n"
   10  "POT-Creation-Date: 2007-04-11 18:29+0200\n"
   11  "PO-Revision-Date: 2007-04-11 18:31+0200\n"
   12  "Last-Translator: Milan Kerslager <milan.kerslager@tul.cz>\n"
   13  "Language-Team: Czech <cs@li.org>\n"
   14  "MIME-Version: 1.0\n"
   15  "Content-Type: text/plain; charset=ISO-8859-2\n"
   16  "Content-Transfer-Encoding: 8bit\n"
   
   17  #: priklad.c:9
   18  msgid "Hello world!"
   19  msgstr "Nazdar světe!"


Umístění katalogu v systému

Katalogy s překlady jsou pro češtinu soustředěny obvykle do adresáře /usr/share/locale/cs/LC_MESSAGES. Ostatní jazyky mají dle výše zmíněné normy své vlastní adresáře. Protože se v některých státech mluví více jazyky, je možné jazyk upřesnit, např. cs_CZ (čeština v České republice), pt_BR (portugalština v Brazílii) a pt_PT (portugalština v Portugalsku).

Soubor s překlady je potřeba překompilovat do kompaktního formátu, ze kterého si už knihovní funkce gettext bude umět český ekvivalent převzít a umístit jej do adresáře cs/LC_MESSAGES. V programu je u funkce bindtextdomain použit prázdný řetězec, takže se hlášení budou hledat v aktuálním adresáři (obvykle je to adresář /usr/share/locale, ale tam nemůžeme v rámci experimentů jen tak zapisovat).

    mkdir -p cs/LC_MESSAGES
    msgfmt -v -o cs/LC_MESSAGES/priklad.mo priklad.po

Po nastavení locale by měl program po spuštění vypsat české hlášení převzaté z katalogu. Použijte nastavení vhodné pro vaše prostředí (jeden z uvedených řádků):

     1  LANG=cs_CZ.UTF-8
     2  LANG=cs
     3  LC_ALL=cs_CZ.UTF-8
     4  LC_ALL=cs

Speciality v PO souborech

TODO

Externí odkazy