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
edytujgettext
został stworzony w Sun Microsystems na początku lat 90. XX w. Wersja stworzona przez Projekt GNU została wydana w 1995 roku.
Zastosowanie
edytujKod programu
edytujW 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
edytujPrzykł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
edytujTł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
edytujPliki 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
edytujW 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
edytujW 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
edytujOprócz standardowej biblioteki dla języka C istnieją również bindingi dla języków programowania takich jak: