GNU gettext
| Ten artykuł od 2021-01 zawiera treści, przy których brakuje odnośników do źródeł. Należy dodać przypisy do treści niemających odnośników do źródeł. Dodanie listy źródeł bibliograficznych jest problematyczne, ponieważ nie wiadomo, które treści one uźródławiają. Sprawdź w źródłach: Encyklopedia PWN • Google Books • Google Scholar • Federacja Bibliotek Cyfrowych • BazHum • BazTech • RCIN • Internet Archive (texts / inlibrary) Dokładniejsze informacje o tym, co należy poprawić, być może znajdują się w dyskusji tego artykułu. Po wyeliminowaniu niedoskonałości należy usunąć szablon {{Dopracować}} z tego artykułu. |
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ż
Linki zewnętrzne
- Oficjalna strona projektu