>>

Jazyková lokalizace

Tento text je výňatkem z připravované knihy o programování v otevřených systémech dle norem POSIX a X/Open XPG.

Systém Unix a jazyk C byl původně orientován pouze na anglické jazykové prostředí a sedmibitový kód ASCII. Mnohé programy využívaly interně osmý (nejvyšší) bit slabiky pro reprezentaci interních příznaků. Rovněž ovladače vstupních a výstupních periférií nebyly schopny zpracovávat jiný kód než ASCII. K problémům s kódem ASCII pak postupně přibývaly problémy s formáty čísel, časových informací, výpisy programů, atd. Programy lze samozřejmě jazykově lokalizovat, neboli upravit pro danou jazykovou oblast. Tyto úpravy by ale musely být specifické pro konkrétní jazykové prostředí, čímž by vzniklo obrovské množství různých verzí téhož programu. Přitom jediné, čím by se tyto programy lišily, by byla jazyková lokalizace. Východiskem je psát programy internacionálně a vyčlenit jazykově závislé části mimo program, například do konfiguračních souborů. Internacionálně navržený program nemůže předpokládat činnost v konkrétním znakovém kódu, ani konkrétní formátování jazykově závislých údajů. Všechny jazykově závislé informace musí být definovatelné jazykově lokalizovatelnými konfiguračními soubory. Základní jazykově lokalizovatelné informace byly postupně standardizivány a současná norma jazyka C definuje alespoň základní z nich. Podstatně bohatší repertoár prostředků pro vývoj internacionálních aplikací pak definuje standard XPG4.

Norma jazyka C definuje jazykově lokalizovatelné vlastnosti funkcí standardní knihovny jazyka C. Například funkce klasifikace znaků definované v hlavičkovém souboru <ctype.h> mohou pracovat podle kódů národních abeced, funkce pro formátování časových údajů může formátovat čas dle národních zvyklostí, funkce pro formátování číselných údajů mohou používat jiný oddělovač desetinné části čísla než tečku, atd. Norma jazyka C definuje také některé jazykově závislé informace, které nejsou přímo využívány standardní knihovnou jazyka C a jsou k dispozici programátoru pro usnadnění tvorby internacionálních aplikací. Jazykově závislé informace jsou definovány pro různé jazykové prostředí mimo program, obvykle v definičních souborech. Otázkou je, jak zjistí internacionálně navržený program, v jakém jazykovém prostředí má pracovat. Norma jazyka C zavedla pro tento účel funkci setlocale():

#include <locale.h>
char *setlocale(int category, const char *locale);
Parametr category určuje kategorií jazykově lokalizovaných informací, které se týká volání. Parametr locale obsahuje jméno požadovaného národního prostředí. Rozdělení jazykově závislých informací do několika kategorií umožňuje nezávisle nastavit jazykové prostředí pro různé funkce standardní knihovny. Kategorie se zadávají pomocí jednoho ze symbolů definovaného v hlavičkovém souboru <locale.h>:

LC_ALL Všechny kategorie jazykově lokalizovatelných rysů.
LC_COLLATE Řazení řetězců. Nastavení ovlivňuje funkce strcoll(), strxfrm(), fnmatch(), glob(), regcomp(), regexec(), wcscoll(), wcsxfrm() a wordexp().
LC_CTYPE Klasifikace znaků a převody malá - velká. Nastavení ovlivňuje funkce pro klasifikaci znaků, funkce atof(), atoi(), atol(), fprintf(), fscanf(), mblen(), mbstowcs(), mbtowc(), regcomp(), regexec(), strftime(), strptime(), strtod(), strtol(), strtoul(), wcstod(), wcstol(), wcstombs(), wcstoul() a wctomb().
LC_MESSAGES Formát a hodnoty odpovědí ANO/NE, chybové zprávy, texty výpisů standardních programů a příkazů (tato kategorie je definována pouze standardy POSIX 1003.2 a XPG). Ovlivňuje funkci perror(), strerror(), catopen() a catgets().
LC_MONETARY Formátování finančních údajů funkcí strfmon().
LC_NUMERIC Formátování numerických údajů funkcemi printf(), scanf(), strfmon(), strtod() a wcstod().
LC_TIME Formátování časových informací funkcemi strftime(), wcsftime() a strptime().
Tvar jména jazykového prostředí a vztah tohoto jména k externím datovým souborům, obsahujícím patřičné definice, není normou ISO jazyka C definován. Norma definuje pouze tyto tvary jmen:

"C"
"POSIX"
Žádná lokalizace, standardní knihovna bude pracovat v kódu ASCII v anglickém jazykovém prostředí, tak jako původní knihovna jazyka C. Toto prostředí je implicitním, pokud není funkce setlocale() použita.
"" Implementačně závislé nastavení na implicitní jazykové prostředí.
NULL Zjištění nastaveného jazykové prostředí.
Výsledkem úspěšného volání je adresa znakového řetězce, který obsahuje jméno nastaveného jazykového prostředí. Tento výsledek musí být dostatečný pro opětovné nastavení jazykově závislých informací do stejného stavu. Jelikož různé kategorie informací mohou být nastaveny na různé jazyky, musí tento výsledek obsahovat v implementačně závislém formátu popis nastavení jednotlivých kategorií informací. Pokud nelze nastavit požadované jazykové prostředí, je výsledkem hodnota volání NULL a aktuální nastavení není dotčeno.

Norma jazyka C definuje počáteční prostředí programu ekvivalentní volání:

	setlocale(LC_ALL, "C");
Norma ISO jazyka C, ani norma POSIX nedefinuje formát jmen jazykových prostředí, ani způsob definice, získávání a uložení potřebných informací. Standard XPG4 definuje formát definice národního prostředí a příkaz pro vytváření nových národních prostředí - localedef. Nedefinuje však formát a uložení vytvořených informací, který je implementačně závislý. Norma POSIX rozšiřuje definici normy ISO jazyka C pro volání ve tvaru setlocale(category, ""). Jméno nastaveného jazykového prostředí je v tomto případě získáno z proměné prostředí LC_ALL a platí pro všechny kategorie. Pokud tato proměnná neexistuje, pak jsou jednotlivé kategorie informací nastaveny podle proměnných prostředí LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC, resp. LC_TIME. Pokud není odpovídající proměnná prostředí definována, pak je nastaveno prostředí definované proměnnou prostředí LANG. Pokud ani tato proměnná neexistuje, je nastaveno prostředí "C", resp. "POSIX".

Standard XPG4 definuje navíc formát jmén jazykového prostředí:

jazyk[_oblast][.kód]

Jako jméno jazyka a oblasti je doporučeno používat zkratku názvu dané země dle ISO. Pokud jsou národní prostředí, používající stejný jazyk, odlišná, mohou být rozlišeny kódem oblasti. Například jméno německého jazykového prostředí pro Německo je "de_DE", pro Švýcarsko "de_CH", pro Rakousko "de_AT", apod. Jazykové prostředí bez určení oblasti je obvykle prostředí mateřské země. Jméno českého jazykového prostředí v tomto tvaru je "cz", resp. "cz_CZ.ISO8859-2".

Standard XPG4 a norma POSIX 1003.2 rovněž definují tvar definice jazykového prostředí a program pro zpracování této definice - localedef. Definice jazykové porstředí musí být předem připravena a nainstalována. Současné systémy Unix většinou používají odlišné programy pro překlad jednotlivých definic a formát zápisu těchto definic neodpovídá ani doporučení XPG, ani normě POSIX 1003.2.

Česká jazyková podpora pro některé systémy
Systém cílový adresář soubor
UnixWare 2.x /usr/lib/locale/cz_CZ.ISO8859-2 unixware.tar
FreeBSD 2.x /usr/lib/share/locale/cz_CZ.ISO8859-2 bsd.tar
Pokud chcete zveřejnit podporu pro další systémy, zašlete patřičný soubor na adresu lampa@fee.vutbr.cz.



>>
Poslední změna: 1. June 1998
Pokud máte námět na vylepšení této stránky nebo na ní naleznete chybu, zašlete dopis na adresu lampa@fee.vutbr.cz.