wd wp Пошук:

Gettext

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, якая звычайна ўжо ўсталявана пэўным значэннем.

Гл. таксама

Зноскі

  1. Афіцыйны рэпазітар gettext.
  2. 1 2 3 Дапаможнік GNU gettext (англ.)
  3. Так выглядае радок в файле перакладу .po. Знак \n пад канец радка значыць перанос радка.

Спасылкі

Тэмы гэтай старонкі (7):
Катэгорыя·Вікіпедыя·Артыкулы з пераазначэннем значэння з Вікідадзеных
Катэгорыя·Свабодныя бібліятэкі праграм
Катэгорыя·Артыкулы без выяў (пазначана ў Вікідадзеных: P373)
Катэгорыя·GNU
Катэгорыя·Праграмнае забеспячэнне паводле алфавіта
Катэгорыя·Артыкулы без выяў (меней 21 аб’екта тыпу)
Катэгорыя·Вікіпедыя·Артыкулы са спасылкамі на элементы Вікідадзеных без беларускага подпісу