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

Z Milan Kerslager
Přejít na: navigace, hledání
(Odkaz na gettext návod)
(Rozšíření)
Řádka 1: Řádka 1:
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 <CODE>/usr/share/locale/cs/LC_MESSAGES</CODE> 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.
+
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 <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].
 +
 
 +
=== 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 <CODE>locale</CODE>. 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:
 
Nastavené prostředí lze zjistit spuštěním příkazu <CODE>locale</CODE>. 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:
Řádka 18: Řádka 32:
 
     14  LC_ALL=
 
     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é <CODE>LANG</CODE>. 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) &ndash; 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é <CODE>LC_ALL</CODE> 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 &ndash; samozřejmě pokud máme fonty, které rozsypaný čaj obsahují).
+
Čí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é <CODE>LANG</CODE>. 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) &ndash; 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é <CODE>LC_ALL</CODE> 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í <CODE>cs</CODE> a <CODE>cs_CZ</CODE> 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 &ndash; 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í).
 
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í).
Řádka 32: Řádka 50:
 
     9  }
 
     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:
+
Ř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
 
     xgettext --default-domain=priklad --output-dir=. --add-comments --keyword=_ priklad.c
Řádka 59: Řádka 81:
 
     19  msgstr "Nazdar světe!"
 
     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ář <CODE>/usr/share/locale</CODE>, ale tam nemůžeme v rámci experimentů jen tak zapisovat).
+
 
 +
=== Umístění katalogu v systému ===
 +
 
 +
Katalogy s překlady jsou pro češtinu soustředěny obvykle do adresáře <CODE>/usr/share/locale/cs/LC_MESSAGES</CODE>. 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ář <CODE>/usr/share/locale</CODE>, ale tam nemůžeme v rámci experimentů jen tak zapisovat).
  
 
     mkdir -p cs/LC_MESSAGES
 
     mkdir -p cs/LC_MESSAGES
Řádka 70: Řádka 97:
 
       3  LC_ALL=cs_CZ.UTF-8
 
       3  LC_ALL=cs_CZ.UTF-8
 
       4  LC_ALL=cs
 
       4  LC_ALL=cs
 +
 +
== Speciality v PO souborech ==
 +
 +
TODO
  
 
== Externí odkazy ==
 
== Externí odkazy ==
 
* [http://www.gnu.org/software/gettext/manual/gettext.html Návod pro gettext] (anglicky)
 
* [http://www.gnu.org/software/gettext/manual/gettext.html Návod pro gettext] (anglicky)
 +
* [http://developer.gnome.org/projects/gtp/l10n-guide/ L10N guide] pro GNOME (anglicky)

Verze z 3. 4. 2008, 16:04

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 http://www.w3.org/WAI/ER/IG/ert/iso639.htm] 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