Lokalizace, internacionalizace, GNU gettext

Základní pojmy:

NLS (Native Language Support = podpora přirozeného jazyka): v podstaě zahrnuje internacionalizaci i lokalizaci (viz níže). Některé aspekty NLS:

  1. Ačkoliv pro programy v C je dá se říci GNU gettext kompletní sada nástrojů pro podporu NLS, scriptovací jazyky (perl, shell, awk aj.) nejsou tak dobře podporované, i když je NLS možná

  2. Některé programy (autoconf, bison, ..) mohou produkovat jiné programy či scripty. Ačkoliv je generující program sám internacionalizován, nemusí produkovat internacionalizovaný program (nepřímá internacionalizace). Může se stát, že vygenerovaný program bude nutné nezávisle internacionalizovat.

  3. Volby a přepínače programů jsou často poplatné angličtině - je možné lokalizovat i toto.

  4. Mnoho programů čte, překládá, interpretuje či je nějak řízeno vstupními soubory (může být i vstup z klávesnice). Ty jsou často textem obsahujícím klíčová slova, identifikátory nebo odpovědi které by mohly být překladatelné. Např. "rm -i {}" se dotazuje před smazáním, po internacionalizaci by mohlo očekávat něco jiného než "y"/"n".

  5. Manuály přicházející s programovými balíky a soubory dokumentace by měly být také překládány. S tím úzce souvisí i otázky pozdějších update dokumentace, která se stejně jako doprovázené programy také vyvíjí.

Internacionalizace (internationalization = i18n): stručně řečeno, operace, po které jsou možné následné další lokalizace. Je to operace (jednorázová!), po které program nebo množina programů začleněná do jednoho balíku je schopna podporovat více jazyků. Je to zevšeobecnění při kterém programy uživající pouze řetězce v jedné řeči (většinou v angličtině), jsou spojeny do obecných cest, jak provést to samé v jiných jazycích. Návrháři programů mohou užít pro interancionalizaci svých programů různé techniky, některé z nich byli standardizovány. Jeden z příkladů těchto standardů je GNU gettext.

Lokalizace je operace při které v již internacionalizovaných programech jsou poskytnuty informace takové, že mohou provádět své vstupy a výstupy ve tvaru, který je správný pro přirozené jazyky a kulturní zvyky. V podstatě intarnacionalizace je oblastí spíše programátorskou a lokalizace spíše překladatelskou.

Programátorské prostředí zavádí některé funkce pro použití dovolující konfiguraci za běhu. Vnější popis specifické množiny kulturních zvyklostí dané země spolu se všemi přiřazenými překlady do stejného přirozeného jazyka se nazývá "locale" pro tento jazyk nebo zemi.
Uživatelé dosáhnou lokalizace programů nastavením správných hodnot pro speciální proměnné prostředí, před spuštěním těchto programů. Tyto proměnné určují, které "locale" by měli být programy užity. Je několik hlavních oblastí, které se mohou lišit podle země a tyto odlišnosti musí locale také popsat. Následující seznam může pomoci dát vícejazyčné zprávy do správné souvislosti s jinými úkoly staženými k locales:


Proměnné prostředí ovlivňující nastavení locale:



Nastavení NLS v systému

Nastavení na požadované locale (za předpokladu, že máme nainstalovány internacionalizované a lokalizované balíky/programy) se provede nastavením výše uvedených proměnných prostředí. Globální systémové nastavení je u GNU/Linux distribucí RedHat v souboru "/etc/sysconfig/i18n". Typicky tento soubor obsahuje nastavení proměnných pro systémové locales, podporované další locales, použitý systémový font a znakovou sadu. Příklad souboru "/etc/sysconfig/i18n":

#
# /etc/sysconfig/i18n
#
# localization == l, 10 znaku, n == l10n
# l \__  __/ n
#      \/
#      10 znaku
#
# internationalization == "i" + 18 znaku + "n" ==> i18n
# i \______  ______/ n
#          \/
#          18 znaku
#
#Used by the /sbin/setsysfont command (which is run by rc.sysinit at boot time):
# SYSFONT= any font that is legal when used as consolechars -f $SYSFONT ...
SYSFONT="lat2-sun16"
# SYSFONTACM= any ACM (application charset map - viz prg "consolechars")
SYSFONTACM="iso02"
#  LANG - default value for all LC_* variables. Sets all the categories,
# but can be overridden by the individual locale categories.
# It is ISO 639 two-letter code identifying the  language.  Language codes
# are NOT the same as the country codes given in ISO 3166 :
LANG=cs_CZ
#  LC_CTYPE - character types and encoding :
#LC_CTYPE=
#  LC_COLLATE - sorting rules :
#LC_COLLATE=
#  LC_MESSAGES - natural language messages:
LC_MESSAGES=en
#  LC_NUMERIC - number formatting :
#LC_NUMERIC=
#  LC_MONETARY - money amount formatting :
#LC_MONETARY=
#  LC_TIME - date and time display :
#LC_TIME=

#  LC_ALL - override for all other LC_* variables :
# Nebudu nastavovat - mc pak spatne tridi jmena souboru (ignoruje tecky,
#  nerozlisuje mala a velka pismena ap):
#LC_ALL=cs_CZ.ISO8859-2

#  LANGUAGE - override for LC_MESSAGES, used by GNU gettext only; can be
# a : separated list of ISO language codes.
# This is a GNU extension that has higher priority for setting the message
# catalog than LANG or LC_ALL :
#LANGUAGE=cs
#  LINGUAS - can be a ' ' separated list of ISO language codes :
#LINGUAS="cs en"
CHARSET="8859-2"
SUPPORTED="cs_CZ:cs:fr_FR@euro:fr_FR:fr:de_DE@euro:de_DE:de:ru_RU.koi8r:ru_RU:ru:es_ES@euro:es_ES:es"

Konkrétní nastavení individuálních uživatelů je asi nejjednodušší provést v jejich přihlašovacích souborech - např. "~/.profile" (shelly sh/bash/ksh), "~/.bash_profile" (bash), "~/.tcshrc"/"~/.cshrc" (tcsh/csh) podle druhu uživatelova shellu.

Pozn.: GNU gettext rozeznává následující proměnné prostředí, od největší po nejmenší prioritu: LANGUAGE, LC_ALL, LC_xxx, LANG.

GNU "gettext"

Cíle GNU "gettext"

Programy jsou obvykle psány a dokumentovány v angličtině a užívají angličtinu v době provádění pro interakci s uživately - nejen v GNU, ale také ve velké části komerčního a volného software. Užití společného jazyka je vhodné pro komunikaci mezi vývojáři, správci a uživately ze všech zemí. Na druhou stranu ale většina lidí je spokojená méně s angličtinou než se svým vlastním přirozeným jazykem, a bude spíše preferovat užití svého mateřského jazyka pro každodenní práci.

GNU projekt překladu je zobecnění těchto snah do fungující struktury, a má dobré vyhlídky přinést dosažení skutečně vícejazykové sady programů.

GNU gettext je důležitý krok pro GNU Translation Projekt, protože je to věc na které lze stavět mnoho jiných kroků. Tento balík poskytuje programátorům, překladatelům i uživatelům komplexní množinu nářadí a dokumentace. GNU gettext utility jsou souborem nářadí - programů, který poskytuje pracovní rámec pomáhající jiným GNU balíkům vytvářet vícejazyčné zprávy. Tyto nářadí zahrnují množinu konvencí jak by měly být programy psány, aby podporovaly katalogy zpráv, organizaci adresářů a pojmenovávání souborů pro katalogy zpráv samotné, runtime knihovnu podporující vracení přeložených zpráv a několik programů pro práci s již přeloženými a překládanými řetězci.

GNU gettext je navržen tak, aby minimalizoval dopady internacionalizace ve zdrojích programů. Internacionalizace má větší šance na úspěch jestliže je to ve zdrojích co nejméně nápadná, tak aby byl zdrojový kód co nejsrozumitelnější.

Soubory zařizující překlad

Písmena PO v `.po' souborech znamenají "Portable Object", pro odlišení od `.mo' souborů, kde MO znamená Machine Object. Tento přístup i PO formát souboru, je inspirován NLS standardem navrženým skupinou Uniforum, a implementovaným firmou Sun v jejich operačním systému Solaris.

PO soubory jsou navrženy tak, aby byly čitelné a editovatelné lidmi, a přiřazují každý původní přeložitelný řetězec daného balíku s jeho překladem v jednotlivém cílovém jazyce. Jeden PO soubor je vyhražen pro jeden cílový jazyk. Jestliže balík podporuje více jazyků, je v něm jeden takový PO soubor pro každý podporovaný jazyk a každý balík má jeho vlastní množinu PO souborů. Tyto PO soubory je nejlepší vytvářet programem xgettext, a jejich pozdější úpravy programem tupdate. Program xgettext extrahuje všechny označené zprávy z množiny C souborů a inicializuje PO soubor s prázdnými překlady. Program tupdate hlídá obsahy PO souborů mezi verzemi odpovídajících zdrojů, okomentuje zastaralé položky, inicializuje nové a aktualizuje všechny odkazy ve zdrojových řádcích.

MO soubory jsou navrženy tak, aby byly čitelné programy, takže jsou binární. Několik systémů má také nářadí pro vytváření a práci s MO soubory jako část NLS (Native Language Support) systému, ale tvar těchto MO souborů je často odlišný od systému k systému a není přenositelný.

Přehled GNU gettext-u

Následující diagram shrnuje vztah mezi soubory obsluhovanými GNU gettext-em a nástroji pracujícími nad těmito soubory. Dobré pochopení těchto vazeb je důležité a pomůže programátorům, překladatelům i správcům.

Původní C zdroje ---> PO mód ---> označené C zdroje -----.
                                                         |
              .---------<--- GNU gettext knihovna        |
.--- make <---+                                          |
|             `---------<--------------------+-----------'
|                                            |
|   .-----<--- PACKAGE.pot <--- xgettext <---'   .---<--- PO souhrn
|   |                                            |             ^
|   |                                            `---.         |
|   `---.                                            +---> PO mód ----.
|       +----> tupdate -------> LANG.pox --->--------'                |
|   .---'                                                             |
|   |                                                                 |
|   `-------------<---------------.                                   |
|                                 +--- LANG.po <--- nový LANG.pox <---'
|   .--- LANG.gmo <--- msgfmt <---'
|   |
|   `---> install ---> /.../LANG/PACKAGE.mo ---.
|                                              +---> "Hello world!"
`-------> install ---> /.../bin/PROGRAM -------'

Označení `PO mód' na dvou místech tohoto diagramu znamená "ruční editaci" za užití jakéhokoli editoru (kdo zná GNU Emacs - ten má speciální PO mód pro editaci nebo modifikaci PO souborů. Během editace PO souboru PO mód dovoluje snadné prohlížení pomocných a souhrnného PO souborů, tak i následných odkazů do množiny C programových zdrojů z kterých byly PO soubory odvozeny. Má i jiné zvláštní vlastnosti - interaktivní označení řetězců programu jako překladatelné, ověřování platnosti PO souborů se snadným přemístěním na řádky PO souboru vykazující chyby aj.

Pro programátora je první krok pro zařazení GNU gettext-u do jeho balíku identifikace, které řetězce v jeho C zdrojích by měly být přeložitelné a které přeložitelné nejsou. Tato únavná práce může být usnadněna užitím PO módu, ale pro modifikaci C zdrojů je možné použít kterýkoliv oblíbený editor. Dále je nutno provést ještě jednoduché, standardní úpravy pro správnou inicializaci překladové knihovny.

Po modifikaci C zdrojů je použit program xgettext k nalezení a extrakci všech přeložitelných řetězců, a ten z nich vytvoří počáteční PO soubor. Tento `balík.pot' soubor obsahuje všechny původní řetězce programu, má nastaveny ukazatele kde je přesně v C zdrojích každý řetězec použit, a všechny překlady jsou nastaveny na prázdné. Písmeno t v `.pot' značí, že je dočasný (Template) PO soubor, zatím neorientovaný na nějaký jednotlivý jazyk.

Úplně poprvé neexistuje žádný `lang.po', takže může být přeskočen krok tupdate a nahražen jen překopírováním `package.pot' do `lang.pox', kde lang reprezentuje cílový jazyk.

Pak nastáva počáteční překlad zpráv a jejich přidávání do `lang.pox'. Pokud se nepoužívá GNU Emacs, je nutné dodržovat formát PO souborů. Pokud již nějaké překlady byly uchovány v souhrnném PO souboru, překladatelé mohou užít PO mód pro inicializaci nepřeložených položek ze souhrnu a naopak do souhrnu uložit vybrané překlady. Souhrnné soubory jsou určeny k výměně mezi členy překladatelského týmu.

Programy nebo balíky programů jsou dynamické povahy: uživatelé napíší hlášení chyb a návrh vylepšení, správci reagují různou modifikací programů. To že balík již byl internacionalizován by nemělo správcům bránit v přidávání nových řetězců nebo modifikaci řetězců již přeložených. Ti dělají svou práci jak nejlépe mohou. Pro GNU Translation Project je důležité aby se správci nestarali o záležitosti překladu a překladatelé byli uchováni programátorských věcí. Jediná věc kterou by správci měli udělat je označení nových řetězců pro překlad (pokud by měly být přeloženy), ten ale nedělat. Následně, když jsou programy a jejich řetězce správci upraveny, by měl probram xgettext vytvořit soubory `package.pot', které už pak jsou dále udržovány, takže překlady v počátečních `lang.po' časem pomalu zastarávají.

Pro překladatele (a také správce) je důležité porozumět, že překlad balíku je nepřetržitý proces trvající celou dobu života balíku, ne něco co se udělá jednou provždy na počátku. Po prvotním překladu daného balíku jsou potřebné občasné zásahy, protože některé přeložené položky zastarají, nové nepřeložené se objeví a potřebují přeložit.

Program tupdate má za úkol obnovu již existujícího `lang.po' souboru. Provede to porovnáním s novějším `balík.pot' dočasným souborm, extrahovaným programem xgettext z nových C zdrojů. Obnovovací operace upraví všechny odkazy na řetězce do příslušných míst C zdrojů, protože se tyto tyto řetězce posunují, tak jak jsou programy modifikovány. tupdate také zakomentuje v `lang.pox' jako zastaralé již přeložené položky které již nadále nejsou použité ve zdrojích programů. Nakonec zjistí nové řetězce a vloží je do výsledného PO souboru jako nepřeložené položky. Cílem je získání aktualizovaného `lang.pox' souboru poskytujícího překlady pro všechny řetězce. Když je správně vytvořen, tento soubor `lang.pox' může nahradit předchozí `lang.po' soubor.

Doba změn nebo pohybu PO souborů je nedílnou součástí "hry" překladu a měla by být pochopena a akceptována. Lidé kteří to odmítají budou mít problémy s podílením se na GNU Translation Project-u.

Pokud je PO soubor úplný a spolehlivý, je PO soubor programem msgfmt převeden do strojově orientovaného (machine-oriented - MO) formátu, který poskytuje efektivní získání překladů programy z balíku, když to za běhu potřebují.

Nakonec jsou modifikované C zdroje přeloženy a sestaveny s GNU gettext knihovnou (většinou pomocí "make") a výsledný spustitelný program je instalován někam kde jej uživatelé najdou. Také MO soubory samotné by měly být korektně instalovány. Nastavením odpovídajících proměnných prostředí by se měl program lokalizovat sám automaticky, kdykoliv se provádí.

Pohled ze strany uživatele, instalátora, programátora, překladatele a správce