GNU gettext w encyklopedii
Z Wikipedii, wolnej encyklopedii Przejdź do nawigacji Przejdź do wyszukiwaniagettext
to 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.
Spis treści
- 1 Historia
- 2 Zastosowanie
- 3 Tworzenie plików z tłumaczeniem
- 4 Implementacje
- 5 Zobacz też
- 6 Linki zewnętrzne
Historia | 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 kod
Kod programu | 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 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 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 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 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 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] "tygodni" msgstr[1] "tydzień" msgstr[2] "tygodnie"
3. Teraz możemy użyć funkcji ngettext
, do której należy podać liczbę pojedynczą mnogą oraz licznik, np. dla języka php:
echo "minęły 4 " . ngettext("week", "weeks", 4); // minęły 4 tygodnie
Działanie | 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 kod
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