GNU gettext

gettext – pakiet oprogramowania, stworzony w ramach projektu GNU, służący do internacjonalizacji programów komputerowych na uniksopodobnych systemach operacyjnych. Najpopularniejsza implementacja gettext jest rozwijana przez Projekt GNU w ramach wolnego oprogramowania.

Historia 
gettext został stworzony w Sun Microsystems na początku lat 90. XX w. Wersja stworzona przez Projekt GNU została wydana w 1995 roku.

Zastosowanie

Kod programu 
W większości języków programowania, aby dany ciąg został przetłumaczony, należy go otoczyć funkcją gettext, która w celu skrócenia inwokacji i liczby potrzebnych do wpisania znaków, jest aliasowana do _, więc w kodzie C zamiast:

printf(gettext("My name is %s.\n"), my_name);

uzyskamy

printf(_("My name is %s.\n"), my_name);

Komentarze umieszczone zaraz po /// umieszczone tuż przed tłumaczeniem są potem dostępne jako wskazówki dla tłumaczy.

gettext używa podanego ciągu znaków (tradycyjnie w języku angielskim) jako odnośnika do znalezienia alternatywnego tłumaczenia i zwraca oryginalny ciąg, jeśli takiego tłumaczenia nie znajdzie. Jest to alternatywa dla działań takich funkcji jak POSIX-owa catgets, GetString z AmigaOS, czy LoadString w Microsoft Windows, gdzie używany jest identyfikator ciągu, często będący liczbą naturalną.

Program xgettext służy do ekstrakcji tłumaczeń z kodu źródłowego i tworzenia z nich plików .pot, których zawartość jest szablonem dla tłumacza.

Przykład 
Przykładowy kod do tłumaczenia:
/// TRANSLATORS: Please leave %s as it is, because it is needed by the program.
/// Thank you for contributing to this project.
printf(_("My name is %s.\n"), my_name);

Po uruchomieniu xgettext:
xgettext --add-comments=/ file.c

Wynikowy plik szablonowy .pot będzie wyglądał mniej więcej tak:
#. TRANSLATORS: Please leave %s as it is, because it is needed by the program.
#. Thank you for contributing to this project.
#: src/name.c:36
msgid "My name is %s.\n"
msgstr ""

Tłumaczenie 
Tłumacz tworzy plik .po (zawierający tłumaczenie) z szablonu używając programu msginit, gdzie uzupełnia tłumaczenia. Przykładowo dla języka polskiego będzie to:
msginit --locale=pl --input=name.pot

Tworzenie plików z tłumaczeniem 
Pliki z tłumaczeniem - .po lub .pot (pusty szablon) mogą zostać stworzone ręcznie lub przez narzędzie xgettext dostarczane z pakietem. Opis programu otrzymamy pisząc:
$ xgettext --help
Jeśli korzystamy w swym projekcie z programów autoconf/automake, to stworzenie pliku .pot wykonamy przez wydanie polecenia:
cd po/
make <nazwa_projektu>.pot
Program ten utworzy plik pl.po, który tłumacz edytuje ręcznie lub przy użyciu narzędzi takich jak Poedit, Emacs lub Vim, które posiadają tryb edycji plików tłumaczeń gettext. Przetłumaczony wpis może wyglądać tak:
#. TRANSLATORS: Please leave %s as it is, because it is needed by the program.
#. Thank you for contributing to this project.
#: src/name.c:36
msgid "My name is %s.\n"
msgstr "Mam na imię %s.\n"

W finałowym stadium pliki .po zamieniane są na binarny format .mo przy użyciu programu msgfmt. Tak przygotowane pliki są gotowe do dystrybucji w paczce.

Liczby mnogie wyrazów 

W przypadku słów, które zmieniają się w zależności od liczebności np. 1 tydzień, 2 tygodnie, można użyć składni liczb mnogich.
Aby uzyskać tłumaczenia z liczebnikami należy:

1. Dodać odpowiednie wyrażenie w nagłówku pliku .po, dla języka polskiego może wyglądać tak:

"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"

2. Należy dodać tłumaczenie „liczebnikowe”:

msgid "week"
msgid_plural "weeks"
msgstr[0] "tydzień"
msgstr[1] "tygodnie"
msgstr[2] "tygodni"

3. Teraz możemy użyć funkcji ngettext, do której należy podać liczbę pojedynczą, liczbę mnogą oraz licznik, na przykład dla języka PHP:

echo "minęły 4 " . ngettext("week", "weeks", 4);
// minęły 4 tygodnie

Działanie 
W większości uniksowych systemów operacyjnych, po ustawieniu zmiennej środowiskowej LC_MESSAGES, użytkownik uzyska tłumaczenie jakiegoś programu pod warunkiem, że istnieje plik .mo dla jego lokalizacji.

Implementacje 
Oprócz standardowej biblioteki dla języka C istnieją również bindingi dla języków programowania takich jak:
 C++
 Objective-C
 Pascal/Object Pascal
 sh – jako program gettext (również dla bash, zsh i innych powłok)
 Python
 GNU CLISP
 GNU Smalltalk
 Java
 GNU AWK
 Haskell
 wxWidgets - poprzez użycie klasy wxLocale
 Tcl
 Perl
 PHP
 Pike
 Ruby
 R

Zobacz też 
 Poedit

Linki zewnętrzne 
 Oficjalna strona projektu

GNU
Biblioteki programistyczne