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

GNU gettext
Выява лагатыпа
Тып лакалізацыя праграмнага забеспячэння
Аўтар Ульрых Дрэпэр
Распрацоўшчыкі суполка
Напісана на C
Інтэрфейс камандны радок
Аперацыйная сістэма Linux і іншыя UNIX-падобныя, Windows
Першы выпуск 1995
Апошняя версія 0.20.1 (12 мая 2019[1])
Стан актыўны
Ліцэнзія бібліятэка — LGPL
інструменты — GPL
дакументацыя — GFDL/GPL
Сайт gnu.org/software/gettext/
Лагатып Вікісховішча Медыяфайлы на Вікісховішчы

Апісанне правіць

 

Асноўным адрозненнем ад іншых падобных інструментаў з’яўляецца тое, што ў 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 ці падобную ёй для фарміравання патрэбнага радка з лікам.

Для перакладчыка правіць

Простыя радкі правіць

Перакладчык дадае адпаведныя радкі з перакладам у .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… дзён

Выбар адной з гэтых трох форм у залежнасці ад ліку ажыццяўляецца наступнай формулай[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. а б в Дапаможнік GNU gettext (англ.)
  3. Так выглядае радок у .po-файле перакладу. Знак \n пад канец радка значыць перанос радка.

Спасылкі правіць