Podpora miestnych nastavení je dnes mimoriadne doležitým faktorom, ktorý charakterizuje jednotlivé operačne systémy. Časy, keď boli ľudia štastní, že to niečo píše, sú nenávratne preč a používatelia vyžadujú podporu svojich miestnych nastavení. V GNU systémoch je táto podpora implementovaná priamo do štandardnej knižnice jazyka C -- GNU libc. Táto podpora je navrhnutá tak, aby zohľadňovala všetky požiadavky kladené na nastavenia pre akúkoľvek krajinu a akýkoľvek jazyk.
Rôzne krajiny a kultúry majú odlišné pravidlá komunikácie. Tieto pravidlá môžu byť malého rozsahu, napr. formát dátumu a času, až po veľmi koplexné ako je jazyk, ktorým hovoria.
Internacionalizácia softvéru znamená programovať ho tak, aby bol schopný pracovať s použivateľovými miestnymi nastaveniami. V ISO C pracuje internacionalizácia v zmysle locales. Každé locale (miestne nastavenia) špecifikuje skupinu pravidiel, jedno pravidlo pre každý učel. Užívateľ si zvolí skupinu pravidiel špecifikovaním locale (pomocou systémových premenných).
Všetky programy dedia nastavené locale v rámci ich prostredia. Pod podmienkou, že programy sú napísané tak, že akceptujú nastavené locales, môžu sa riadiť pravidlami, ktoré uprednostňuje používateľ.
Táto časť popisuje jednotlivé premenné, ktoré ovplyvňujú miestne nastavenia a ktorými sa riadia aj funkcie knižnice glibc. Nastavenie premennej sa robí pomocou príkazu
export LC_XXX=sk
kde LC_XXX
je jedna z nasledujúcich:
LC_COLLATE
--- Triedenie reťazcov. Nastavením tejto premennej možno
prinútiť aplikácie, napr. sort, ls a iné, aby pri porovnávaní reťazcov
brali do úvahy miestne rozloženie jednotlivých písmen v abecede. Slovenčina
má napríklad hneď niekoľko znakov, ktoré by pri triedení podľa číselnej
hodnoty znaku spôsobovali problémy. Slovenské nastavenia triedenia povedia
funkciam strcoll a strxfrm, že napríklad ch je jedno písmeno a nasleduje
hneď za h a nie za c, že široké a nasleduje za dlhým `a' a to zase za
obyčajným `a'. Skúste si to na príkaze sort. Zadajte písmená cc, ch, hh,
potom zmeňte LC_COLLATE
(príkazom export LC_COLLATE=sk
), skúste
to so sort znovu a porovnajte výsledok...
LC_CTYPE
--- Klasifikácia a prevod znakov, multibyte. Správne
nastavenie tejto premennej je nutné pre korektné rozlišovanie znakov abecedy
jednotlivých jazykov, určenie číslic, bielych znakov, prevod malých písmen
na veľké, atď. Najvhodnejšie je túto premennú nenastavovať a tým umožniť,
aby bola jej hodnota prebratá od premenných LC_ALL
alebo LANG
(viď ďalej). Ak ale nechcete používať slovenské nastavenia, len mať správne
zobrazené slovenské fonty a funkčnú slovenskú klavesnicu pod iXami, nastavte
iba túto premennú.
LC_MONETARY, LC_NUMERIC
--- Formát peňažných a číselných hodnôt.
Umožňuje meniť skupinu nastavení, ktoré sa použijú pri formátovaní peňažných
hodnôt alebo všetkých ostatných číselných hodnôt. Sú to desatinná čiarka,
oddeľovač tisícov, zoskupovanie číslic, znamienka pre kladné a zaporné
hodnoty atď.
LC_TIME
--- Formátovanie dátumu a času. Nastavenia oddeľovačov medzi
hodinami, minútami a sekundami, názvy dní, poradie rok, mesiac a deň v
dátume, ...
LC_MESSAGES
--- Výber jazyka, použitého užívateľským rozhraním na
preklad hlášok programov. Toto je presne tá premenná, ktorá prinúti aplikácie
hovoriť po slovensky. Viď ďalšie kapitoly.S prekladom hlásení programov, hlavne s umiestnením súborov s preloženými
reťazcami, súvisí premenná NLSPATH
. Mala by obsahovať dvojbodkami
oddelený zoznam adresárov, v ktorých sa budú hľadať .mo súbory pre miestne
nastavenia dané premennou LC_MESSAGES
. Premennú NLSPATH
je však
potrebné nastavovať len vo výnimočných prípadoch, pretože aplikácie hľadajú
preklady svojich hlásení v štandardných adresároch pre tieto súbory.
LC_ALL
--- Ak je táto premenná nastavená, použije sa jej hodnota
pre všetky vyššie spomenuté premenné bez ohľadu na ich hodnotu.
LANG
--- Nastavenie tejto premennej sa použije len pre tie premenné,
ktoré nemajú priradenú žiadnu hodnotu.
LANGUAGE
--- Alternatívne miestne nastavenia. Táto premenná môže
obsahovať usporiadaný zoznam kódov miestnych nastavení oddelených dvojbodkami.
Súbory s prekladmi hlášok programov sa budú hľadať v poradí, v akom sú určené v
tomto zozname. Ak sa nepodarí nájsť súbor s preloženými hláškami programu v
jednom jazyku, použije sa súbor pre nasledujúci jazyk v zozname LANGUAGE
.
Navyše, ak sa súbor pre prvý jazyk aj nájde, ale niektorý reťazec z neho
nie je preložený, nepoužije sa pôvodný (anglický), ale najskôr sa pokúsi
nájsť preklad daného reťazca v súbore pre ďalší jazyk v zozname LANGUAGE
.
To je maximálne výhodné pre ľudí, ktorí okrem svojho jazyka ovládajú
nejaký iný lepšie ako angličtinu, v ktorej sú zvyčajne programy originálne
napísané. Napríklad Slovák by mohol mať nastavené LANGUAGE="sk:cz"
a
Szolvák z juhu zase LANGUAGE="hu:sk"
.
Pozor! Premenná LANGUAGE
ovplyvňuje len premennú LC_MESSAGES
, preto
je pre správnu funkciu nutné nastaviť aj ostatné premenné (minimálne
LC_CTYPE
).
LINGUAS
- Táto premenná nemá špeciálny význam, ale zvykne sa
používať pri inštalácii programov (zo zdrojákov). Medzerami oddelený zoznam
kódov miestnych nastavení určuje jazyky, pre ktoré si užívateľ želá inštalovať
preklady reťazcov aplikácie. Príklad:
export LINGUAS="sk cz"
./configure
make install
skompiluje a nainštaluje aplikáciu s podporou slovenčiny a češtiny. Inštalačné
skripty zvyknú tiež kontrolovať obsah premenných LANG
a LC_ALL
, ale
tieto mozu obsahovať len jeden kód miestnych nastavení.
Miestne nastavenia sa určujú zo spomenutých premenných, pričom tieto sa vyhodnocujú v tomto poradí:
LANGUAGE
--- ovplyvňuje len LC_MESSAGES
LC_ALL
LC_*
LANG
To znamená asi toľko, že keď raz nastavíte LC_ALL
, jednotlive premenné
LC_*
sa už neberú do úvahy, ale ak mate napriklad nastavené len niektoré z
LC_*
, ostatné sa nastavia na hodnotu premennej LANG.
Premenné, ktoré ovplyvňujú miestne nastavenia, sa napĺňajú kódmi miestnych nastavení. Kódy miestnych nastavení sú reťazce, ktorých formát sa riadi niekoľkými pravidlami. Všeobecný tvar je:
jazyk[_územie[.kódovanie]][@modifikátor]kde jazyk je napr.
sk
pre slovenčinu, cs
pre češtinu, hu
pre
maďarčinu, územie je SK
pre Slovensko, CZ
pre Českú republiku,
HU
pre Maďarsko, kódovanie je ISO-8859-2
pre všetky stredoeurópske
jazyky (je možne použiť niekoľko formátov na zadanie kódovania) a modifikátor
služi na povolenie alebo zakázanie niektorých funkcií. Tie sú dané v
definíciach miestnych nastavení. Napríklad, pre Veľkú Britániu je
modifikátorom reťazec euro
a pri jeho použití sa ako peňažná mena bude
používať euro namiesto libry. To znamená, že sa musí použiť kódovanie
iso-8859-15
, ktoré definuje znaky euro a cent.
Priklady kódov miestnych nastavení (každý z týchto reťazcov je možné priradiť premenným miestnych nastavení, ale najčastejšie sa používajú len dvojpísmenkové skratky v poslednom stĺpci):
sk_SK.ISO-8859-2 sk_SK sk
cs_CZ.ISO-8859-2 cs_CZ@-ch cs@-ch cs
en_GB.iso8859 en_GB en@euro en
ja_JP.ujis ja_JP.EUC ja_JP ja
Tiež by sme si mali spomenúť dve štandardné locales, ktoré sa použijú, ak nie sú systémové premenné nastavené a programy ich používajú do doby, kým sa inicializuje lokalizacia (hovorím, že sa použijú obe, pretože momentálne sú totožné, ale v buducnosti sa môžu štandardy ISO C a POSIX odlišovať a potom to bude záležať na konfigurácii systému):
C
--- nastavenia podľa štandardu ISO C.
POSIX
--- nastavenia podľa štandardu POSIX. V súčasnosti je to
alias pre nastavenia C.
V prvom rade treba nainštalovať balík s podporou miestnych nastavení, ktorý má názov locales a tiež balík s podporou priamo pre Slovensko --- locales-sk. Ak máte záujem používať aj podporu pre nejaký iný jazyk (na našom území je aktuálna najmä čeština a maďarčina), musíte tiež nainštalovať balíky pre tieto jazyky.
V druhom rade si musíte nainštalovať balíky s podporou miestnych nastavení a priamo slovenčiny (sú to locales a locales-sk).
V ďalšom kroku si nezabudnite nainštalovať balíky locales a locales-sk. Takisto, pre každý jazyk, ktorý sa chystáte používať, si nainštalujte balík s podporou miestnych nastavení.
V prípade problémov s miestnymi nastaveniami sa držte predchádzajäcich troch krokov. Bez týchto balíkov vám to totiž šlapať nebude!!!
Prejdime sa teraz trochu po našich adresároch. Prvý navštívime
/usr/share/locale/sk.
Na prvý pohľad vidno, že adresár a súbory v
tomto adresári majú mená totožné s premennými, o ktorých sme si hovorili.
Je to preto, lebo práve z týchto súborov sa načítajú nastavenia, keď je daná
premenná nastavená na hodnotu sk
. Okrem nich tu môže byť ešte súbor
charset
, ktorý obsahuje len jeden riadok s reťazcom iso-8859-2.
Ten
hovorí, aké kódovanie znakov sa má použiť pre dané miestne nastavenia.
Všetky súbory v tomto adresári sú binárne dáta a adresár LC_MESSAGES
obsahuje súbory, ktorých mená sú mená niektorých balíkov nainštalovaných na
vašom systéme, s príponou mo. Sú to preklady reťazcov z jednotlivých
aplikácií. O nich si povieme neskôr. Teraz by sme mohli zistiť, čo vlastne
obsahujú súbory LC_*.
Presuňme sa do adresára /usr/share/i18n.
Tu, v textovom súbore
sk_SK
v podadresari locales/
sa konečne nachádzajú slovenské
miestne nastavenia v čitateľnej (a editovateľnej) forme. Súbory v tomto
adresári majú presne danú štruktúru, ktorá je popísaná v manuálovej stránke
locale(5). Pre bežného používateľa nemá zmysel meniť nastavenia v tomto
súbore, keďže ide o štandardné nastavenia, ktoré sa používajú na celom
Slovensku. Ale, proti Gustovi žiadna putika! Ak sa teda rozhodnete zmeniť
niečo v tomto súbore, musíte aktualizovať súbory v prvom spomínanom adresári
/usr/share/locales/sk
príkazom, ktorý údaje v súbore sk_SK
skompiluje a uloží do súborov LC_COLLATE
, LC_CTYPE
, ...
localedef -i sk_SK -f ISO-8859-2 sk_SK
V podadresári /usr/share/i18n/charmaps
sa nachádzajú súbory s popismi
jednotlivých kódovani znakov. Pre Slovensko je aktuálny ISO-8859-2
(čo je
aj obsah spomínaneho súboru charset
).
V adresári /usr/share/locale
sa nachádza súbor locale.alias
,
ktorý definuje tzv. aliasy pre kódy miestnych nastavení. Pre správnu
funkciu slovenských miestnych nastavení by mal obsahovať tieto dva riadky:
sk sk_SK.ISO-8859-2
slovak sk_SK.ISO-8859-2
To zabezpečí, že aj keď nezadáte kódovanie znakov, bude použité iso-8859-2. Druhý riadok má na svedomí to, že miesto sk možno zadať slovak.
Nastavenia internacionalizácie sa (v RedHate a Mandraku) nachádzajú v
súbore /etc/sysconfig/i18n.
Je to veľmi užitočný súbor, v ktorom možno
nastaviť všetko, čo sa kedy týkalo internacionalizácie, národných fontov a
rozložení kláves. Tento súbor však len definuje systémové premenné a zvykne
sa vkladať (. /etc/sysconfig/i18n
) do inicializačných skriptov.
Exportovanie premenných (odovzdanie ostatným aplikáciám) má na starosti
skript /etc/profile.d/lang.sh
, ktorý sa vykoná pri štarte shellu
(je volaný z /etc/profile
).
Súbor /etc/sysconfig/i18n
definuje nastavenia pre celý systém. Tieto
sa použijú ak sa nenájde súbor s užívateľovými nastaveniami. Každý užívateľ si
môže určiť svoje vlastné nastavenia v súbore .i18n
v jeho domovskom
adresári. Nastavenia sa vždy čítajú len z jedného z týchto súborov, teda ak
má užívateľ svoj vlastný súbor ~/.i18n
, nastavenia zo súboru
/etc/sysconfig/i18n
sa čítať nebudú.
Užívateľ si môže zmeniť nastavenia aj ručne, kedykoľvek sa mu zachce, zadaním príkazu
export LC_MESSAGES=C LANG=sk
atď.
Vypnúť nejaké nastavenie je možné príkazom
unset LC_MESSAGES LANG
atď, čím sa zrušia nastavenia daných premenných (a použije sa štandardné
locale C
alebo POSIX
). Pozor! Ak máte napríklad nastavené premenné
LC_ALL=sk
a LC_MESSAGES=cz
, tak po príkaze unset LC_ALL
nebudete
mať hlásenia programov v angličtine, ale češtine. Preto, ak chcete vypnúť
nejaké nastavenia, vždy musíte príkazom unset zrušiť nastavenia všetkých
premenných, ktoré môžu ovplyvňovať dané miestne nastavenia.
Neodpustím si malú poznámku k príkazu export. Je to vstavaná funkcia
všetkých shellov kompatibilných s klasickým sh (teda aj bash). Je dôležité
uvedomiť si, čo presne tento príkaz robí s premennými. (V skutočnosti robi
to isté, čo príkaz declare -x
.) V dokumentácii k bashu sa hovorí, že
export
označí premennú, aby bola odovzdaná detským (child) procesom v
rámci prostredia (environment). To znamená asi toľko, že keď spustíte napr.
iXy z materského procesu bash, ktorý pri štarte exportoval premennú
LANG=sk
, všetky aplikácie v prostredí X Window System budú dediť toto
nastavenie a teda (ak to sami podporujú) budú fungovať po slovensky. Ak budete
chcieť spustiť aplikáciu bez slovenských nastavení, musíte v xterme zadať
príkaz unset LANG
, čím pre všetky detské procesy xtermu (presnejšie
shellu, ktory je v ňom spustený), zrušíte nastavenie premennej LANG
. Potom
aplikácie spustené priamo z tohto xtermu budú fungovať bez podpory
slovenčiny. Trochu sa s tým pohrajte.
S miestnymi nastaveniami úzko súvisí aj nastavenie časovej zóny. Vedel by som o tom rozprávať celé hodiny, ale ono by to muselo byť zložitejšie ako len nastavenie jednej premennej... A to takto:
export TZ="Europe/Bratislava"
Toto nastavenie ovplyvňuje len časový posun oproti hardverovým hodinám.
(Mimochodom, odporúčam hardverové hodiny nastavené na greenwichsky svetový
čas, čím tiež odpadajú problémy s prechodom medzi letným a zimným časom
atď. ale o tom sú popísané iné súbory.) Toto celé je dosť dobrá vec,
hlavne ak mate prístup k počítaču v inej časovej zóne, ale chcete
zobrazovanie času (príkaz date) v stredoeurópskej zóne. Do svojho súboru
.bash_profile
vložte vyššie uvedený riadok a choďte na kofolu...
LC_CTYPE=sk
LANGUAGE=sk:cs
LANG=sk
LANGUAGE=hu:sk:cs
LC_COLLATE=sk
LC_TIME=cs
LANG=hu
LINGUAS="hu cs sk"