Przejdź do zawartości

GNU gettext

Z Wikipedii, wolnej encyklopedii
Workflow

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

[edytuj | edytuj kod]

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 | edytuj kod]

Kod programu

[edytuj | edytuj kod]

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 | edytuj kod]

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 | edytuj kod]

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 | edytuj kod]

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 | edytuj kod]

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 | edytuj kod]

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 | edytuj kod]

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

Zobacz też

[edytuj | edytuj kod]

Linki zewnętrzne

[edytuj | edytuj kod]