gettext
GNU gettext | |
---|---|
Тып | лакалізацыя праграмнага забеспячэння |
Аўтар | Ульрых Дрэпэр |
Распрацоўшчыкі | суполка |
Напісана на | C |
Інтэрфейс | камандны радок |
Аперацыйная сістэма | Linux і іншыя UNIX-падобныя, Windows |
Першы выпуск | 1990[1] |
Апошняя версія | 0.20.1 (12 мая 2019[2]) |
Стан | актыўны |
Ліцэнзія |
бібліятэка — LGPL інструменты — GPL дакументацыя — GFDL/GPL |
Сайт | gnu.org/software/gettext/ |
Медыяфайлы на Вікісховішчы |
gettext — бібліятэка праекта GNU для інтэрнацыяналізацыі, якая шырока ўжываецца ў свабодным ПЗ.
Апісанне
[правіць | правіць зыходнік]Асноўным адрозненнем ад іншых падобных інструментаў з’яўляецца тое, што ў gettext для пазначэння перакладаных радкоў у тэксце праграмы ўжываюцца іх англійскія арыгіналы, а не адмысловыя ідэнтыфікатары. Такім чынам, для адлюстравання інтэрфейсу на англійскай мове праграме не патрэбныя файлы перакладу. Гэта, як правіла, зручна, таму што большасць праграм і так маюць інтэрфейс на англійскай мове.
У gettext ёсць падтрымка множнага ліку. Для гэтага ў зыходным кодзе праграмы ўжываецца адмысловая функцыя, і прыкладаюцца два радкі — у адзіночным і множным ліку. Пры падстаноўцы перакладу на іншую мову ўжываецца столькі форм радкоў-перакладаў, колькі патрэбна для гэтай мовы. Для гэтага ў загалоўку файла перакладу мае быць спецыфічны для гэтай мовы выраз для выбару праз лік нумара радка-перакладу.
Бібліятэка gettext прапануе захоўваць пераклады ў файлах з пашырэннямі .mo (англ.: Machine Object, бінарны файл, зручны для чытання праграмай і спецыфічны для платформы), ці .gmo (GNU .mo), .po (англ.: Portable Object, чытэльны для чалавека файл перакладу, не залежны ад платформы) і .pot (англ.: PO template — каталог, загатоўка .po-файла для перакладу на новую мову).[3] Акрамя саміх радкоў перакладу, .po-файлы могуць змяшчаць каментарыі перакладчыка і разнастайныя службовыя нататкі.
Для фарміравання і абнаўлення гэтых файлаў пры змяненні праграмы прапануецца ўжываць шэраг утыліт.
Першапачаткова радкі з зыходнага тэксту праграмы збіраюцца з дапамогай праграмы xgettext
у .pot-файл (каталог). Абнаўленне гэтага файла і файлаў перакладаў з ужываннем новых і змененых радкоў, якія з’явіліся ў зыходным кодзе, ажыццяўляецца праграмай msgmerge
. Пры гэтым захоўваюцца ўсе ўжо перакладзеныя радкі, а тыя, якія змяніліся, пазначаюцца як недакладныя (англ.: fuzzy). Прадвызначана, што такія радкі не будуць выкарыстоўваюцца праграмай. Яны патрэбны для зручнасці перакладчыка: часта прасцей грунтавацца на існуючым, хоць і састарэлым, перакладзе, чым перакладаць усю фразу наноў.
Для перакладу праграмы на пэўную мову перакладчык стварае .po-файл: капіруе .pot-файл у патрэбнае месца і змяняе ў ім загаловак. Для гэтага можна выкарыстоўваць праграму msginit
. Гатовы файл перакладу канвертуецца ў .mo-файлы ўтылітай msgfmt
.[3].
Таксама існуюць утыліты для перакладчыкаў, якія палягчаюць рэдагаванне перакладу, напрыклад:
- Poedit, кросплатформавы. Ужывае wxWidgets (пры захаванні .po-файла перазбірае і адпаведны .mo-файл).
- Lokalize (раней kBabel) для KDE.
- Gtranslator для GNOME.
- Pootle Архівавана 12 сакавіка 2009. — машынны пераклад у анлайне і інструмент кіравання перакладамі.
- 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. Некаторыя з гэтых моў непасрэдна падтрымліваюцца вышэйзгаданымі ўтылітамі.[3].
Ужыванне ў большасці моў праграмавання падобна да ўжывання у 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… дзён
Выбар адной з гэтых трох форм у залежнасці ад ліку ажыццяўляецца наступнай формулай[4]:
"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
, якая звычайна ўжо мае пэўнае значэнне.
Гл. таксама
[правіць | правіць зыходнік]Зноскі
- ↑ https://web.archive.org/web/20120323032211/http://compgroups.net/comp.unix.solaris/History-of-gettext-et-al Праверана 1 снежня 2024.
- ↑ Афіцыйны рэпазіторый gettext
- ↑ а б в Дапаможнік GNU gettext (англ.)
- ↑ Так выглядае радок у .po-файле перакладу. Знак \n пад канец радка значыць перанос радка.
Спасылкі
[правіць | правіць зыходнік]- Сайт GNU gettext (англ.)(недаступная спасылка). Архівавана з першакрыніцы 17 лютага 2012. Праверана 23 лістапада 2009.
- Практическое применение gettext для локализации и интернационализации приложений (руск.)(недаступная спасылка). Архівавана з першакрыніцы 17 лютага 2012. Праверана 23 лістапада 2009.
- Gettext для .NET и Mono (англ.)(недаступная спасылка). Архівавана з першакрыніцы 13 красавіка 2013. Праверана 12 верасня 2014.