Poka, ya opisyval, kak zastavit' razlichnye programmy ponyat' kirillicu. Obychno, kazhdaya programma trebovala, chtoby eto byl ee sobstvennyj metod, kak pravilo, chrezvychajno otlichnyj ot drugih. Krome togo, u nekotoryh programm byla nezavershennaya podderzhka yazykov otlichnyh ot anglijskogo. Ne govorya uzh ob ih nesposobnosti vzaimodejstvovat', ispol'zuya rodnoj yazyk pol'zovatelya vmesto anglijskogo.
Problemy, perechislennye vyshe sil'no podavlyayut, tak kak programmnoe obespechenie redko sozdaetsya tol'ko dlya mestnogo rynka. Pererabotka sushchestvennyh chastej programmnogo obespecheniya kazhdyj raz pri vhode na novyj mezhdunarodnomu rynok, ochen' neeffektivna; i internacional'naya podderzhka, osushchestvlyaemaya sobstvennymi sredstvami programmy unikal'nym i prisushchim tol'ko ej sposobom, v terminah dolgosrochnogo planirovaniya tak zhe ne blestyashchaya ideya.
Sledovatel'no, voznikaet potrebnost' v standartizacii. I standart est'.
Vse svyazannoe s vysheperechislennymi problemami razdeleno v sootvetstvii c dvumya bazisnymi koncepciyami: localization i internationalization. Pod lokalizaciej my imeem v vidu sozdanie programm, sposobnyh obrabatyvat' razlichnye yazykovye soglasheniya dlya razlichnyh stran. Pozvol'te privesti primer. Format daty vydannyj v Soedinennyh SHtatah - imeet vid MM/DD/GG. Odnako v Rossii, naibolee populyarnyj format - DD.MM.GG. Drugie problemy vklyuchayut v sebya predstavlenie vremeni, formaty chisla i predstavleniya valyuty. Krome etogo, odin iz naibolee vazhnyh aspektov lokalizacii - eto opredelenie sootvetstvuyushchih klassov simvolov, to est' opredelenie: kakie simvoly v nabore simvolov yavlyayutsya "kirpichikami" yazyka (bukvami) i kak oni uporyadochivayutsya. S drugoj storony, lokalizaciya ne rabotaet so shriftami.
Internacionalizaciya (ili i18n dlya kratkosti), kak predpolagaetsya, reshaet problemy, svyazannye so sposobnost'yu programmy, vzaimodejstvuyut s pol'zovatelem na ego rodnom yazyke.
Obe eti koncepcii dolzhny byt' standartizovany, davaya programmistam neprotivorechivyj put' sozdaniya programm, rabotayushchih v nacional'noj srede.
Hotya standartizaciya eshche v processe, no mnogo ee chastej uzhe fakticheski yavlyayutsya standartom; tak chto oni mogut ispol'zovat'sya bez osobyh problemy.
YA opishu obshchuyu shema sozdaniya programm ispol'zuyushchih opisannye vyshe vozmozhnosti standartnym sposobom. Tak kak eto zasluzhivaet otdel'nogo dokumenta, ya budu davat' tol'ko ochen' obshchee opisanie i ukazateli na bolee polnye istochniki.
Odno iz osnovnyh ponyatij lokalizacii - locale. Pod locale podrazumevaetsya nabor soglashenij, specificheskih dlya otdel'no vzyatogo yazyka v otdel'no vzyatoj strane. V obshchem sluchae govorit', chto locale opredelyaetsya tol'ko stranoj nepravil'no. Naprimer, v Kanade mogut byt' opredeleny dva locale- yazyk Kanada / Anglijskij i yazyk Kanada / Francuzskij. Bolee togo, yazyk Kanada / Anglijskij - ne yavlyaetsya ekvivalentom yazyku Velikobritaniya / Anglijskij ili Amerikanskij / Anglijskij, tochno tak zhe Kanada / Francuzskij yazyk - ne ekvivalent yazyku Franciya / Francuzskij ili yazyku SHvejcariya / Francuzskij.
Kazhdaya locale - eto special'naya baza dannyh, opredelyayushchaya po krajnej mere sleduyushchie pravila i soglasheniya:
V RedHat Linux (kak veroyatno i vo mnogih drugih distributivah Linux),
imeyutsya fakticheski dve  bazy
dannyh locale: odna dlya  biblioteki  C  (libc),  a drugaya  dlya  X
bibliotek.  V ideal'nom sluchae dolzhna imet'sya  tol'ko  odna  baza
dannyh locale dlya vsego.
CHtoby izmenit'  znachenie  locale  po  umolchaniyu,  obychno
dostatochno ustanovit' sistemnuyu peremennuyu LANG.  Naprimer,  kak
eto delaetsya v sh:
LANG=ru_SU export LANG
Vy mozhete proverit' dejstvie etoj komandy srazu zhe, esli zapustite
komandu date. Rezul'tatom dolzhen byt' vyvod dnya, nedeli i mesyaca na
russkom yazyke.
RedHat 5.x opredelyaet KOI8-R locale kak  ru_SU, po etoj prichine
ya i ispol'zuyu ego. Bolee ochevidnoe nazvanie  ru_RU ispol'zuetsya
dlya locale osnovannogo na iso-8859-5 kodirovki.
Inogda, vy mozhete zahotet' izmenit' tol'ko odin  aspekt  locale
bez izmeneniya drugih.  Naprimer,  vy  mozhete  zahotet'  (Bog  znaet
pochemu) pol'zovat'sya s ru_SU locale, no pechataemye chisla  dolzhny
budut sootvetstvovat' standartu POSIX odin.  V podobnyh  sluchayah,
imeetsya nabor sistemnyh  peremennyh,  kotorye  Vy  mozhete  zadat'
chtoby skonfigurirovat' sootvetstvuyushchie chasti locale.  Naprimer  v
nashem sluchae eto by vyglyadelo tak:
LANG=ru_SU LC_NUMERIC=POSIX export LANG LC_NUMERIC
Podrobnee , sm. locale(7).
Teper'  davajte  derzhat'sya  poblizhe  k  specifike   Linux.    K
sozhaleniyu, v Linux  libc versii  5.3.12,  vhodyashchej  v  distributiv
RedHat 4.1 otsutstvuet russkaya locale.  V dannom sluchae  ee  nado
skachat' iz Interneta (ya, odnako, ne znayu tochnogo adresa).
CHtoby proverit', dlya kakih yazykov u vas est' locale,  vypolnite
'locale -a'.  |to vyvedet  spisok  vseh  locale  iz  baz  dannyh
dostupnyh libc.
CHto kasaetsya bibliotek X, to oni imeyut  svoyu  sobstvennuyu  bazu
dannyh locale.  V versii kotoruyu ya ispol'zuyu (XFree86 3.3),  uzhe
imeetsya rossijskaya baza dannyh locale.  YA ne uveren est' li ona v
predydushchej versii.  V lyubom  sluchae,  vy  mozhete  proverit'  eto,
izuchiv direktoriyu /usr/lib/X11/locale/ (v bol'shinstve  sistem).  V
moem sluchae, uzhe est'  podkatalogi,  imenovannye  koi8-r  i  dazhe
iso8859-5..
S locale programma ne dolzhna znat' o razlichnyh simvol'nyh preobrazovaniyah i pravilah sravneniya, opisannyh vyshe. Vmesto etogo, oni ispol'zuyut special'nyj API, kotoryj dejstvuet po pravilam, opredelennym locale. Krome togo, net neobhodimosti dlya programmy, pol'zovat'sya tol'ko odnoj locale dlya soblyudeniya vseh pravil- vozmozhno pol'zovat'sya drugimi pravilami, opisannyh v drugih locale (hotya takoj metod ne ochen' horosh).
Iz man setlocale(3):
Programma mozhet byt' sdelana perenosimoj dlya vseh locale, vyzyvayasetlocale(LC_ALL, "" )posle inicializacii programmy, ispol'zuya znacheniya, vozvrashchennye izlocaleconv()zapros dlya locale - zavisimoj informacii i ispol'zuyastrcoll()ilistrxfrm()dlya sravneniya strok.
Dovol'no legko opredelit' chetyre urovnya programmnoj lokalizacii:
setlocale(). Ona  ne  delaet  kakih-libo  predpolozhenij
otnositel'no  8-ogo   bita    kazhdogo    simvola, ispol'zuet
pol'zovatel'skie funkcii iz ctype.h i ogranicheniya iz limits.h,  i
zabotitsya otnositel'no signed/unsigned rezul'tata.
Ochen' vazhno, chtoby programma ne  delala  kakih-libo  predpolozhenij
otnositel'no haraktera nabora simvolov i ih uporyadocheniya. To est'
sleduet  vozderzhat'sya  ot  sleduyushchih  konstrukcij    pri
programmirovanii:
    if (c >= 'A' && c <= 'Z') {
        ...
Vzamen vo vseh takih sluchayah dolzhny ispol'zovat'sya, makrokomandy iz locale zavisimogo fajla zagolovka
ctype.h.
strcoll() i strxfrm() vmesto strcmp()  dlya  strok,
ispol'zuet time(), localtime(), i strftime() dlya  raboty  so
vremenem,  i  v  zaklyuchenie,  ispol'zuet localeconv()     dlya
pravil'nogo predstavleniya chisel i valyuty.
gettext() (Sun/POSIX standart),  ili  catgets()
(X/Open standart). Podrobnee sm. razdel 
i18n
.
char.  Vzamen eto ona ispol'zuet wchar_t,  kotoryj
opredelyaet ob®ekty, dostatochno bol'shie, chtoby  soderzhat'  simvoly
Unicode. ANSI C opredelyaet etot tip dannyh i sootvetstvuyushchij API.
Dlya vyyasneniya podrobnostej, smotrite naprimer ( Voropay1 ) ili ( SingleUnix ).
V to vremya kak lokalizaciya opisyvaet, kak adaptirovat' programmu k inostrannomu okruzheniyu, internacionalizaciya (ili i18n dlya kratkosti) detaliziruet sposoby obshcheniya programmy s ne-anglogovoryashchim pol'zovatelem.
Prezhde, eto delalos' s pomoshch'yu sozdaniya abstrakcij soobshchenij, dlya vyvoda ih iz koda programmy. Teper', takoj mehanizm (bolee ili menee) standartizirovan. I, konechno, est' ego free realizacii!
Proekt    GNU    nakonec    stal    na     put'        sozdaniya
internacionalizirovannyh  prikladnyh  programm.  Ulrich   Drepper
(drepper@ipd.info.uni-karlsruhe.de)  razrabotal  paket  gettext.
|tot paket lezhit vo vseh GNU arhivah, naprimer v 
prep.ai.mit.edu.
On pozvolyaet vam razrabatyvat' programmy v napravlenii,  dvigayas'
v kotorom vy  mozhete  legko  zastavit'  ih  podderzhivat'  bol'shee
kolichestvo  yazykov.  YA  i  ne  predpolagayu    opisyvat'    metody
programmirovaniya, eshche i potomu, chto gettext paket  postavlyaetsya  s
prevoshodnym rukovodstvom.
Pros'ba o sotrudnichestve: Esli vy hotite izuchit' gettext  paket
i sdelat' svoj vklad v proekt GNU ili prosto sdelat'  vklad  bez
vsyakogo  izucheniya,  to  vy  mozhete sdelat'  eto!  GNU  stanovitsya
mezhdunarodnym, tak chto vse utility  delayutsya  locale  zavisimymi.
Problema sostoit v tom, chtoby perevodit' soobshcheniya ot Anglijskogo
yazyka na Russkogo (i drugie  yazyki,  konechno  esli  zahotite).  V
obshchem, chto sleduet sdelat': vy dolzhny  poluchit'  special'nyj .po
fajl, sostoyashchij iz  Anglijskih  soobshchenij  dlya  nekih  utilit,  i
svyazat' kazhdoe soobshchenie s ego ekvivalentom na russkom. V konechnom
schete, eto zastavit govorit' sistemu Russkij,  esli  pol'zovatel'
zahochet etogo! Dlya dlya podrobnostej vojdite v  kontakt  s  Ulrich
Drepper (
drepper@ipd.info.uni-karlsruhe.de).