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

Апісанне
--------

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

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

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

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

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

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

Таксама існуюць утыліты для перакладчыкаў, якія палягчаюць рэдагаванне перакладу, напрыклад:

* 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. Частка гэтых моў падтрымліваюцца непасрэдна вышэй згаданымі ўтілітамі..

Ужыванне ў большасці моў праграмавання падобна з ужываннем у 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… **дзён**

Выбар адной з гэтых трох форм у залежнасці ад ліку ажыццяўляецца наступнай формулай:

```
"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** пад канец радка значыць перанос радка.

Спасылкі
--------

* Сайт GNU gettext (англ.)(недаступная спасылка). Архівавана з першакрыніцы 17 лютага 2012. Праверана 23 лістапада 2009.
* Практическое применение gettext для локализации и интернационализации приложений (руск.)(недаступная спасылка). Архівавана з першакрыніцы 17 лютага 2012. Праверана 23 лістапада 2009.
* Gettext для .NET и Mono (англ.)(недаступная спасылка). Архівавана з першакрыніцы 13 красавіка 2013. Праверана 12 верасня 2014.