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

Z Milan Kerslager
Přejít na: navigace, hledání
(Založení stránky)
 
(Odkaz na gettext návod)
Řádka 70: Řádka 70:
 
       3  LC_ALL=cs_CZ.UTF-8
 
       3  LC_ALL=cs_CZ.UTF-8
 
       4  LC_ALL=cs
 
       4  LC_ALL=cs
 +
 +
== Externí odkazy ==
 +
* [http://www.gnu.org/software/gettext/manual/gettext.html Návod pro gettext] (anglicky)

Verze z 1. 4. 2008, 10:03

Lokalizace do národního prostředí má za úkol nahradit typicky anglická hlášení nejrůznějších programů jejich českými ekvivalenty. Za tímto účelem jsou vytvářeny speciální soubory, které obsahují vždy pro jeden program (nebo více malých podobných programů) a jeden jazyk příslušné ekvivalenty. Soubory s českými překlady jsou typicky uloženy v adresáři /usr/share/locale/cs/LC_MESSAGES a podobně je tomu i pro ostatní jazyky. Jednotlivé jazyky jsou odlišeny jejich mezinárodní zkratkou (zde cs). 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). Nakonec lze předepsat i kódování (cs_CZ.UTF-8). Kromě překladů hláášení mají státy i další rozdíly, např. implicitní kódování, národní měna, způsob zápisu datumu, pravidla třídění podle abecedy atd. Proto jsou pro celou skupinu vždy definována společná pravidla a navíc lze tyto jednotlivá pravidla samostatně ovlivňovat.

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) – prostě 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ápaních státech. Logicky nastavení proměnné LC_ALL překryje všechna ostatní nastavení. Poznámka: čeština má jako implicitní kódování nastaveno ISO-8859-2, ale pro práci v grafickém prostředí je výhodnější používat kódování UTF-8, protože pak lze v jakémkoliv programu zobrazit jakýkoliv znak (tj. např. v poštovním programu můžeme snadno číst francouzské, ruské i čínské texty – samozřejmě pokud máme fonty, které rozsypaný čaj obsahují).

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 je však nejprve potřeba vyrobit. Použijeme utilitu, 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!"

Tento soubor 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

Externí odkazy