Gettext

gettext — бібліятэка праекта GNU для інтэрнацыяналізацыі, якая шырока ўжываецца ў свабодным ПЗ.

 Апісанне 
right
Асноўным адрозненнем ад іншых падобных інструментаў з’яўляецца тое, што ў gettext для пазначэння перакладаных радкоў у тэксце праграмы ўжываюцца іх англійскія арыгіналы, а не адмысловыя ідэнтыфікатары. Такім чынам, для адлюстравання інтэрфейсу на англійскай мове праграме не патрэбныя файлы перакладу. Гэта, як правіла, зручна, таму што большасць праграм і так маюць інтэрфейс на англійскай мове.

У gettext ёсць падтрымка множнага ліку. Для гэтага ў зыходным кодзе праграмы ўжываецца адмысловая функцыя, і прыкладаюцца два радкі — у адзіночным і множным ліку. Пры падстаноўцы перакладу на іншую мову ўжываецца столькі форм радкоў-перакладаў, колькі патрэбна для гэтай мовы. Для гэтага ў загалоўку файла перакладу мае быць спецыфічны для гэтай мовы выраз для выбару праз лік нумара радка-перакладу.

Бібліятэка gettext прапануе захоўваць пераклады ў файлах з пашырэннямі .mo (, бінарны файл, зручны для чытання праграмай і спецыфічны для платформы), ці .gmo (GNU .mo), .po (, чытэльны для чалавека файл перакладу, не залежны ад платформы) і .pot ( — каталог, загатоўка .po-файла для перакладу на новую мову).Дапаможнік GNU gettext Акрамя саміх радкоў перакладу, .po-файлы могуць змяшчаць каментарыі перакладчыка і разнастайныя службовыя нататкі.

Для фарміравання і абнаўлення гэтых файлаў пры змяненні праграмы прапануецца ўжываць шэраг утыліт.

Першапачаткова радкі з зыходнага тэксту праграмы збіраюцца з дапамогай праграмы xgettext у .pot-файл (каталог). Абнаўленне гэтага файла і файлаў перакладаў з ужываннем новых і змененых радкоў, якія з’явіліся ў зыходным кодзе, ажыццяўляецца праграмай msgmerge. Пры гэтым захоўваюцца ўсе ўжо перакладзеныя радкі, а тыя, якія змяніліся, пазначаюцца як недакладныя (). Прадвызначана, што такія радкі не будуць выкарыстоўваюцца праграмай. Яны патрэбны для зручнасці перакладчыка: часта прасцей грунтавацца на існуючым, хоць і састарэлым, перакладзе, чым перакладаць усю фразу наноў.

Для перакладу праграмы на пэўную мову перакладчык стварае .po-файл: капіруе .pot-файл у патрэбнае месца і змяняе ў ім загаловак. Для гэтага можна выкарыстоўваць праграму msginit. Гатовы файл перакладу канвертуецца ў .mo-файлы ўтылітай msgfmt..

Таксама існуюць утыліты для перакладчыкаў, якія палягчаюць рэдагаванне перакладу, напрыклад:
 Poedit, кросплатформавы. Ужывае wxWidgets (пры захаванні .po-файла перазбірае і адпаведны .mo-файл).
 Lokalize (раней kBabel) для KDE.
 Gtranslator для GNOME.
 Pootle  — машынны пераклад у анлайне і інструмент кіравання перакладамі.
 gted — плагін для Eclipse IDE.
 На крайні выпадак можна карыстацца простым тэкставым рэдактарам.

Акрамя базавай рэалізацыі gettext для стандартнай C, існуюць рэалізацыі аналагічнага падыходу для моў C++, Objective-C, сцэнарыі sh/bash, Python, Perl, PHP, GNU CLISP, Emacs Lisp, librep, GNU Smalltalk, Java, GNU awk, Паскаль, wxWidgets (з ужываннем класу wxLocale), YCP (мова YaST2), Tcl, Pike и R, моў платформы Mono (прастора імёнаў Mono.Unix), а таксама для фрэймворку Qt. Некаторыя з гэтых моў непасрэдна падтрымліваюцца вышэйзгаданымі ўтылітамі..

Ужыванне ў большасці моў праграмавання падобна да ўжывання у C.

 Ужыванне 

 Для праграміста 

 Простыя радкі 
Радкі, якія пры рабоце праграмы паказваюцца карыстальніку і адпаведна патрабуюць перакладу, у зыходным кодзе праграмы пішуцца па-англійску і пазначаюцца выклікам функцыі gettext, ngettext або падобнай.
 printf(gettext("Hello! My name is %s.\n"), name);

Звычайна для памяншэння памеру зыходнага кода і паляпшэння чытэльнасці аб’яўляюць і ўжываюць кароткі сінонім функцыі gettext — _ (сімвал падкрэслівання). Такім чынам, выклік пераўтвараецца ў
 printf(_("Hello! My name is %s.\n"), name);

Для вышэйзгаданага радка ў каталогу з’явіцца запіс накшталт такога:

 #: src/name.c:36
 msgid "Hello! My name is %s.\n"
 msgstr ""

 Множны лік 
Для перакладу множнага ліку ўжываецца функцыя ngettext, якая прымае ў якасці параметраў два англамоўныя радкі (для адзіночнага і множнага ліку адпаведна) і цэлы лік. У PHP выклік ngettext для вываду радка з лікам выглядае наступным чынам:
printf(ngettext("%d day ago", "%d days ago", $daysAgo), $daysAgo);
Функцыя ngettext сама па сабе не здзяйсняе падстаноўку лікавага значэння замест %d, таму праграмісту трэба выклікаць функцыю printf ці падобную ёй для фарміравання патрэбнага радка з лікам.

 Для перакладчыка 

 Простыя радкі 
Перакладчык дадае адпаведныя радкі з перакладам у .po-файл:

 #: src/name.c:36
 msgid "Hello! My name is %s.\n"
 msgstr "Вітаю! Маё імя %s.\n"

 Множны лік 
Для перакладу множных лікаў патрэбна, каб у загалоўку (там, дзе пазначаюцца такія звесткі, як Project-Id-Version і PO-Revision-Date) .po-файла было ўказана правіла фарміравання множных лікаў для дадзенай мовы. Напрыклад, у беларускай мове існуюць тры формы множных лікаў:
 1, 21, 31… дзень
 2, 3, 4, 22, 23, 24, 32, 33, 34… дні
 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 26, 27, 28, 29, 30, 35, 36… дзён
Выбар адной з гэтых трох форм у залежнасці ад ліку ажыццяўляецца наступнай формулайТак выглядае радок у .po-файле перакладу. Знак \n пад канец радка значыць перанос радка.:
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"

Выраз для plural тут пішацца з ужываннем сінтаксісу мовы C і можа апірацца толькі на пераменную n, якая пазначае выводны лік.

Пасля такога аб’яўлення формы набываюць нумары 0, 1 і 2, і пераклад фразы ажыццяўляецца наступным чынам:

 msgid "%d day ago"
 msgid_plural "%d days ago"
 msgstr[0] "%d дзень таму"
 msgstr[1] "%d дні таму"
 msgstr[2] "%d дзён таму"

 Для карыстальніка 
Звычайна карыстальніку ў UNIX-падобных аперацыйных сістэмах не патрэбна прадпрымаць дадатковых дзеянняў для выбару пэўнага перакладу. Пераклад вызначаецца сістэмнай пераменнай LANG, якая звычайна ўжо мае пэўнае значэнне.

 Гл. таксама 
 Інтэрнацыяналізацыя
 Памяць перакладаў

 Спасылкі 




Катэгорыя:GNU
Катэгорыя:Свабодныя бібліятэкі праграм