GNU gettext

narzędzia internacjonalizacji GNU

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.

Workflow

Historia

edytuj

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

edytuj

Kod programu

edytuj

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

edytuj

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

edytuj

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

edytuj

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

edytuj

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

edytuj

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

edytuj

Oprócz standardowej biblioteki dla języka C istnieją również bindingi dla języków programowania takich jak:

Zobacz też

edytuj

Linki zewnętrzne

edytuj