Linux/Lokalizace a internacionalizace

Odkaz na stránky které sem odkazují

Kódování znaků

editovat

Vývoj od 7bitového amerického ASCII přes 8bitové kódové stránky jednotlivých abeced k 16bitovému Unicode (UCS-2)

UTF-8 jako odvozenina UCS-2: odstraňuje nevýhody UCS-2

ISO 10646: definuje Universal Character Set (UCS) obsahující všechny znaky všech kódování znakových sad. UCS je 31bitová znaková sada (tzv. UCS-4), ale dnes se z ní používá pouze prvních 65534 kódů (0x0000 to 0xfffd), označovaných jako UCS-2 UTF-8 zajišťuje: Kompatibilitu se staršími souborovými systémy (zpravidla nepovolují v názvech souboru nulový byte ani (zpětné) lomítko). Kompatibilitu s existujícími programy: zápis jakéhokoli znaku neobsahuje ASCII, pokud znak původně v ASCII nebyl. Snadnost konverzí z/do UCS. První byte určuje počet bytů, které ve vícebytovém zápisu znaků následují. Transformační formát by neměl být zbytečně rozmařilý co do počtu bytů, použitých pro zápis. Z kterékoli pozice v proudu dat by mělo být možné najít začátek další znakové jednotky. UTF-8 zvládá zápis UCS hodnot v rozmezí 0-0x7ffffff za použití 1-6 bytů. Úvodní byte vždy prozrazuje počet použitých bytů a následující členy vícebytové posloupnosti mají nastaven nejvyšší bit. je nastaven. Jakýkoli byte, který nezačíná na 10xxxxxx je začátek zápisu dalšího znaku.

NLS, i18n, l10n

editovat

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

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

Některé programy (autoconf, bison, ..) mohou produkovat jiné programy či skripty. 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.

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

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

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žívají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 internacionalizaci 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ě internacionalizace 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:

Znaky a kódové stránky - kódová stránka užívaná v USA a většině anglicky mluvících částech světa je ASCII sada. Pro různé locale je ale potřeba mnoho znaků, které v této sadě nejsou. 8bytová kódová stránka ISO 8859-1 má většinu speciálních znaků obsažených v hlavních evropských jazycích. Přesto v mnoha případech nejsou ani ISO 8859-1 fonty dostačující. Proto každé locale musí specifikovat kterou kódovou stránku chce použít a musí mít odpovídající rutiny pro zpracování této kódové sady. Pozn.- některé častěji se vyskytující kódové stránky :

DOS CP852 - kódová stránka s latin znaky pro střední a východní Evropu

DOS CP437 - kódová stránka s latin znaky pro USA a Kanadu. Nemá diakritické znaky

ISO 8859-2 - standardizovaná kódová stránka s latin znaky pro střední a východní Evropu

ISO 8859-15 - v podstatě stejná jako ISO 8859-1, ale obsahuje znak Euro (€) cp1250, Mac OS Central European (MacCE) - nestandardizované kódové stránky používané v OS Windos (Microsoft) a MAC (Apple) KOI8-CS a čeština Bří Kamenických jsou

Měna - používané symboly se liší mezi jednotlivými zeměmi včetně pozice na kterých jsou užívány. Programy musí být schopny transparentně zobrazovat měnové výstupy v přirozeném modu pro každé locale.

Datumy - také formát datumu se liší pro jednotlivé lokality.Například vánoce v roce 1999 se píší jako 12/24/1999 v USA, 24/12/1999 v Austrálii a 24.12.1999 v ČR. Jiné země mohou používat ISO 8061 tvary datumu atd. Čas může být zapisován jako hh:mm, hh.mm, nebo jinak. Někde je čas specifikován v 24 hodinovém módu, někde jako AM, PM. Dále se může lišit rozšířením o korekci letního času mezi jednotlivými zeměmi.

Čísla - nejpoužívanější oblast v jazykové podpoře. Tady GNU gettext umožňuje návrhářům a uživatelům snadnou změnu jazyka, který SW používá pro komunikaci s uživateli.

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

LC_MESSAGES - jazyk pro textové zprávy.

LC_COLLATE - informace pro třídění a porovnávání textu tj. jak se různé znaky a/nebo skupiny znaků třídí v daném jazyce.

LC_CTYPE - informace o typu znaků (písmena, číslice,malá nebo velká písmena atd.). Tato informace ]je přístupná přes třídy znaků POSIX v regulárních výrazech jako např. [[:alnum:]].

LC_MONETARY - informace o měně jako je symbol měny a zda se píše před anebo za číslem.

LC_NUMERIC - číselné informace jako je znak pro desetinou tečku (čárku) a oddělovač tisíců.

LC_RESPONSE -informace o odpovědi např. výrazy pro ano a ne v místním jazyce, případně další informace.

LC_TIME - informace o čase a datumu jako dvanácti nebo čtyřiadvacetihodinové hodiny, měsíc tištěný před nebo za dnem datumu, místní zkratky měsíců atd.

LC_ALL - souhrn všeho opsaného výše.


Nastavení NLS v systému

editovat

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/Fedora 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.utf-8

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

Cíle GNU "gettext", přehled, soubory zařizující překlad, pohled ze strany uživatele, instalátora, programátora, překladatele a správce

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živateli - 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živateli 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 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 vyhrazen 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 program 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 souborem, 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

editovat
  • Uživatele - je (měl by být!) nejjednodušší - normální uživatel by měl vidět, že aplikace s ním komunikuje jeho přirozeným jazykem. Ostatní SW inženýři - programátoři, překladatelé a správci by měli spolupracovat, aby to tak skutečně bylo. Pro uživatele by mělo být postačující nastavení proměnné LANG.
  • Instalátora (nebo snad instalatéra ?) - balíky užívající GNU gettext se sami instalují tak, že povolují překlad zpráv. Při konfiguraci vlastností balíku před jeho překladem by měl konfigurační skript (standardně má název "configure") sám zjistit, zda aktuální systém poskytuje gettext nebo catgets funkce. Pokud ne, měla by být automaticky vybrána GNU gettext knihovna. Instalátor může její použití vnutit - typicky volbou ./configure --with-gnu-gettext obejde použití systémových gettext/catgets a vnutí použití GNU gettext. Naopak příkazem ./configure --disable-nls se balík nakonfiguruje tak, že není schopen vůbec překládat zprávy.

Lokalizované balíky mají obecně mnoho ".po" souborů, každý pro jedno locale. Pokud není překlad potlačen, nainstalují se všechny. Nastavením (před konfigurací) proměnné LINGUAS je možné omezit instalaci .po souborů jen pro některé jazyky. proměnná LINGUAS by měla obsahovat mezerou oddělené dvoupísmenné kódy požadovaných jazyků.

  • Programátora - měl by znát stávající možnosti překladu zpráv: catgets od X/OPEN a gettext od organizace Uniforum. A jejich programové interface. Také by měl určit umístění příslušných katalogů zpráv. Podrobnější popis viz GNU gettext.
  • Překladatel - sada nástrojů v GNU gettext umožňuje vytváření, údržbu a správu lokalizovaných zpráv. Jsou použitelné i pro týmovou práci (což je nejčastější případ - viz "GNU translation project"). Další info lze získat na http://www.li.org/.
  • Správce - má řadu odpovědností - jedna z hlavních je, aby bylo možné balík instalovat na celé řadě platforem. Vytváření a správa konfiguračních souborů balíku je důležitým prvkem.