gettext
gettext — бібліятэка праекта GNU для інтэрнацыяналізацыі, шырока ўжываная ў вольным ПЗ.
Асноўным адрозненнем ад іншых падобных інструментаў з’яўляецца тое, што ў gettext для пазначэння перакладаных радкоў у тэксце праграмы ўжываецца іх англійскія арыгіналы, а не адмысловыя ідэнтыфікатары. Такім чынам атрымліваецца, што для адлюстравання інтэрфейсу на англійскай мове праграме не патрэбныя файлы перакладу. Гэта як правіла зручна, таму што большасць праграм і так маюць інтэрфейс на англійскай мове.
У gettext ёсць падтрымка множнага ліку. Для гэтага ў крынічным кодзе праграмы ўжываецца адмысловая функцыя, і прыкладаюцца два радкі — у адзіночным і множным ліку. Пры падстаноўцы пераклада на іншую мову ўжываецца столькі форм радкоў-перакладаў, колькі патрэбна для гэтай мовы. Для гэтага ў загалоўку файла пераклада мае быць спецыфічны для гэтай мовы выраз для выбару праз лік нумара радка-пераклада.
Бібліятэка gettext прапануе захоўванне пераклада ў файлах з пашырэннямі .mo (англ.: Machine Object, бінарны файл, зручны для чытання праграмай і спецыфічны для платформы), ці .gmo (GNU .mo) .po (англ.: Portable Object, чалавека-чытальны файл пераклада, не залежны ад платформы) і .pot (англ.: PO template — каталог, заготоўка файла .po для пераклада на новую мову).[2] Акрамя саміх радкоў перакладу, .po файлы могуць змяшчаць каментары перакладчыка і разнастайныя службовыя нататкі.
Для фармавання і абнаўлення гэтых файлаў пры змяненні праграмы прапануецца ўжыванне шэрага ўтылітаў.
Першапачаткова радкі з крынічнага тэкста праграмы збіраюцца з дапамогай праграмы xgettext
у .pot-файл (каталог). Абнаўленне гэтага файла і файлаў перакладаў з ужываннем новых і змененых радкоў, якія з’явіліся ў крынічным кодзе, ажыццяўляецца праграмай msgmerge
. Пры гэтым захоўваюцца ўсе ўжо перакладзеныя радкі, а тыя, якія змяніліся, пазначаюцца як недакладныя (англ.: fuzzy). Па змоўчванню, такія радкі не будуць выкарыстоўваюцца праграмай. Яны патрэбны для зручнасці перакладчыку: часта прасцей грунтавацца на існуючым, хоць і састарэлым, перакладзе, чым перакладаць усю фразу наноў.
Для перакладу програмы на пэўную мову перакладчык стварае .po
-файл: капіюе .pot
-файл у патрэбнае месца і змяняе ў ім загаловак. Для гэтага можна выкарыстоўваць праграму msginit
. Гатовы файл пераклада канвертуецца ў .mo-файлы утылітай msgfmt
.[2].
Таксама існуюць утыліты для перакладчыкаў, якія палягчаюць рэдагаванне перакладу, напрыклад:
Акрамя базавай рэалізацыі 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. Частка гэтых моў падтрымліваюцца непасрэдна вышэй згаданымі ўтілітамі.[2].
Ужыванне ў большасці моў праграмавання падобна з ужываннем у 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](/Printf "Printf")
ці падобную ёй для фармавання патрэбнага радка з лікам.
Перакладчык дадае адпаведныя радкі у .po
-файл, пэўным перакладам:
#: src/name.c:36
msgid "Hello! My name is %s.\n"
msgstr "Вітаю! Маё імя %s.\n"
Для перакладу множных лікаў патрэбна, каб у загалоўку (там, дзе пазначаюцца такія звесткі, як Project-Id-Version
і PO-Revision-Date
) .po
-файла было ўказана правіла фармавання множных лікаў для дадзенай мовы. Напрыклад, у беларускай мове існуюць тры формы множных лікаў:
Выбар адной з гэтых трох форм у залежнасці ад ліку ажыццяўляецца наступнай формулай[3]:
"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
, якая звычайна ўжо ўсталявана пэўным значэннем.