Next Previous Contents

9. Lokalizaciya i Internacionalizaciya

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.

9.1 Locale

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.

Locale s tochki zreniya pol'zovatelya

Kazhdaya locale - eto special'naya baza dannyh, opredelyayushchaya po krajnej mere sleduyushchie pravila i soglasheniya:

  1. Klassifikaciya simvolov i preobrazovanij
  2. Predstavlenie valyuty
  3. Predstavlenie chisel (to est'. Desyatichnye simvoly)
  4. Format daty / vremeni

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

Locale zavisimoe programmirovanie

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, vyzyvaya setlocale(LC_ALL, "" ) posle inicializacii programmy, ispol'zuya znacheniya, vozvrashchennye iz localeconv() zapros dlya locale - zavisimoj informacii i ispol'zuya strcoll() ili strxfrm() dlya sravneniya strok.

Dovol'no legko opredelit' chetyre urovnya programmnoj lokalizacii:

  1. CHisto 8mi bitnoe programmnoe obespechenie. To est' programma vyzyvaet 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.
    
  2. Formaty, metody sortirovki, razmery lista bumagi. Programma ispol'zuet 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.
  3. Vidimyj tekst skladyvaetsya v katalogi soobshchenij/. Programma dolzhna lokalizovat' ves' vidimyj tekst v special'nyh katalogah soobshchenij. Oni soderzhat sootvetstviya strok na anglijskom i ih perevody na drugie yazyki. Vybor soobshchenij sootvetstvuyushchih yazyku okruzheniya vypolnen tak, chto polnost'yu prozrachen i dlya programmy i dlya pol'zovatelya. CHtoby ispol'zovat' eti sredstva, programma dolzhna vyzvat' gettext() (Sun/POSIX standart), ili catgets() (X/Open standart). Podrobnee sm. razdel i18n .
  4. EUC/Unicode podderzhka. Na etom urovne, programma ne ispol'zuet tip 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 ).

9.2 internacionalizaciya

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


Next Previous Contents