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