Bądź: Wyszukaj na stronie z użyciem Google
reklama:

niedziela, 28 grudnia 2008

Programy i wiele języków

Autor: , 22:49, niedziela, 28 grudnia 2008


Niektóre programy mają wbudowane "w sobie" teksty w wielu językach lub są rozpowszechniane w wielu wersjach językowych (jedna wersja - jeden język). Dotyczy to szczególnie wielu aplikacji dla systemu Windows. Inne programy mają "wbudowane" jedynie teksty angielskie, a żeby program mógł komunikować się z nami w innych językach, odpowiednie pliki należy doinstalować. Właściwość ta dotyczy m.in. przeglądarki Mozilla Firefox. Takie mechanizmy - spolszczania (w przypadku języka polskiego) poprzez instalację odpowiednich "pakietów językowych" są przyjęte w systemie Linux globalnie - większość programów nie ma swojego, odrębnego algorytmu, który się tym zajmuje, lecz używają najczęściej pakietu GNU gettext (jest jeszcze mniej znany POSIX-owy catgets).

Chciałbym z grubsza przedstawić, jak to działa. Przy okazji pokażę pewną ciekawą właściwość, która się z tym wiąże.

Jak to działa? Program, który korzysta z mechanizmu gettext najpierw musi ustalić pewne parametry, z których najważniejsze jest ustawienie dotyczące zmiennych językowych. Gdy program chce wyświetlić przetłumaczony tekst, wywołuje odpowiednią funkcję, która powoduje "zamianę" oryginalnego tekstu programu na przetłumaczony (w C/C++ zwraca tzw. wskaźnik do łańcucha). Skąd bierze się przetłumaczony tekst? Na przykład dla programu wget pobierany jest z pliku /usr/share/locale-langpack/pl/LC_MESSAGES/wget.mo. Ten plik zawiera w sobie angielskie teksty i ich polskie odpowiedniki. W jakich katalogach aplikacja wyszukuje plików językowych można sprawdzić, korzystając z narzędzia strace. Na przykład, strace wget wypisze tekst (fragmenty):
open("/usr/share/locale/pl_PL.UTF-8/LC_MESSAGES/wget.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/pl_PL.utf8/LC_MESSAGES/wget.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/pl_PL/LC_MESSAGES/wget.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/pl.UTF-8/LC_MESSAGES/wget.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/pl/LC_MESSAGES/wget.mo", O_RDONLY) = 3

między innymi w tych kalogach poszukiwany jest plik (w tym przypadku) wget.mo.
Co ciekawe, autorzy programu, którzy chcą wykorzystać taką funkcjonalność nie muszą utworzyć funkcji wyszukującej odpowiedni plik - wszystko jest już zaimplementowane w specjalnych bibliotekach programistycznych, w Linuksie nazywanych obiektami współdzielonymi (shared object - pliki z rozszerzeniem so lub so.NUMER, w Windowsie są to pliki DLL). Tak więc cała zabawa polega na tym, żeby używać funkcji w nich udostępnianych.
Gtk i Qt są przykładem takich bibliotek. Dzięki nim programiści nie muszą wynajdywać koła no nowo.

Więcej informacji, jak zawsze, w Wikipedii (http://pl.wikipedia.org/wiki/Gettext, http://en.wikipedia.org/wiki/Gettext).
Użyteczne rzeczy można też znaleźć w stronach man, na przykład po wpisaniu
man 3 gettext
(na dole będą wypisane nazwy powiązanych strony man, gdzie można szukać więcej informacji).

Aby przetłumaczyć program obsługujący ten mechanizm, wystarczy wygenerować (narzędziem xgettext - jest w paczce gettext) plik zawierającej takie linie:
#: nazwa-pliku.c:31
#, c-format
msgid "Debug mode was set.\n"
msgstr "antybłędowe ustawienie pozostawało w stanie włączonym\n"

Ale czy wiecie, że Launchpad pozwala na tłumaczenie programów (tych, których twórcy chcą tego) bezpośrednio z poziomu witryny? Na przykład tutaj.
Tak naprawdę, zwykli zarejestrowani użytkownicy mogą wysyłać jedynie "propozycje tłumaczenia" - czy będą one uwzględnione, zadecydują starsi bracia. Dzięki temu unika się tłumaczeń takich, jak to podane wyżej (fikcyjne) - ale z drugiej strony szkoda, byłoby śmiesznie. :)
Strona umożliwia też pobranie (w formacie PO lub MO) pliku z tłumaczeniami.



Napisałem wcześniej: "Przy okazji pokażę pewną ciekawą właściwość, która się z tym wiąże." i słowa dotrzymam.
Po wpisaniu w konsoli:
env LC_MESSAGES=C gedit ukaże się wam Gedit w "czystym" angielskim!
Komentarze 5 comments
sim_thomas96 pisze...

Wyprzedam wasze komentarze: Po uruchomieniu polecenia z końca artykułu (nie musimy uruchamiać go jako root), zwykły gedit, którego mamy w menu nadal będzie po Polsku.

rytmisk pisze...

dziwne u mnie uruchamia się wersja angielska ...

Dariusz pisze...

Fajny artykuł. Dzięki!!!
@sim_thomas96 u mnie też wersja angielska???

Michal pisze...

w koncu coś ciekawego :) właśnie miałem szukać jak sie tłumaczy programy w linuksie. chciałbym sobie przetłumaczyć program easystroke, jednak za chiny nie moge znaleźć ani stworzyć pliku *.po tego programu. szukam już z 2 godziny i mam tego dosyć. może ktoś wie o co sie rozchodzi? gdzie szukać tego pliku po? na launchpad nie ma, starałem sie też go wygenerować za pomocą xgettext, ale bezskutecznie, nigdzie nie moge znaleźć gotowego polecenia, a takie kombinowanie godzine czasu z helpem mnie już nie bawi. pomocy

Enlik pisze...

Jakoś myślałem, że mi się dostanie, a tu proszę...
@Michał
Znalazłem ciekawy artykuł, może coś pomoże.

Takimi rzeczami powinien chyba zajmować się make - w tekście odnajdziesz przykład użycia.
PS A jak co, to pytaj raczej na forum. :]

Prześlij komentarz


Popularne posty

Etykiety