Gettext w aplikacjach cpp dla Windows i Debiana.
We wcześniejszym wpisie przedstawiłem wprowadzenie do Gettext i jak używać tego narzędzia do tworzenie wielojęzycznych treści w php. Jak się za moment okaże, analogicznie można tworzyć aplikacje w cpp, które mogą nawet korzystać z tych samych plików *.mo.
Idąc za ciosem, w tym wpisie przedstawię jak można bardzo łatwo stworzyć aplikację dla Windows i Debian’a w cpp, korzystającą z Gettext’a.
@Debian
Jeśli mamy zainstalowany pakiet gettext to nie musimy niczego ściągać, wszystkie potrzebne biblioteki znajdują się już w systemie.
@Windows
Potrzebne nam będą te same archiwa gettext’a, które użyliśmy we wcześniejszym wpisie. Tym razem będziemy dodatkowo potrzebować katalogów lib\ i include\, więc proponuję je umieścić w katalogu z innymi bibliotekami (jeśli taki posiadamy) lub rozpakować gdziekolwiek z zastrzeżeniem, żeby ścieżka do katalogów lib\ i include\ nie zawierała w sobie spacji. U mnie pliki te znajdują się w katalogach I:\PRO\LIBS\Gettex\lib\ i I:\PRO\LIBS\Gettext\include\ odpowiednio.
Ponieważ pliki bibliotek są “Windowsowe”, możemy (lecz nie musimy) przekonwertować je do plików bibliotek *.a – służy do tego polecenie:
reimp -c intl.lib
i jest ono dostępne w pakiecie MinGW o nazwie bin-utils, a który znaleźć można na stronie www.mingw.org/download.shtml.
To tyle jeśli chodzi o różnice w instalacji wymaganych bibliotek dla Windows i Debian’a.
Do stworzenia aplikacji wykorzystam Eclipse + MinGW. Jeśli nie wiemy jak kompilować cpp w Eclipse to zapraszam do tego wpisu.
Tworzymy nowy pusty projekt C++ (New/C++ Project, Empty Project) w Eclipse (aktywna perspektywa cpp) i po utworzeniu folderu projektu, przechodzimy do jego właściwości. Musimy tam ustawić ścieżki do powyższych katalogów:


Zasada tworzenia aplikacji dla Visual Studio jest analogiczna (aplikacja konsolowa, dodanie powyższych katalogów lib i include, kompilacja).
A tak może wyglądać przykładowy kod:
#include <libintl.h> #include <locale.h> #include <stdio.h> #include <stdlib.h> int main(void) { setlocale( LC_ALL, "pl_PL" ); bindtextdomain( "wiadomosci", "./locale" ); textdomain( "wiadomosci" ); printf( gettext( "A message to translate" ) ); exit(0); }
Nie ma tu nic niezwykłego w porównaniu do kodu w php z poprzedniego wpisu. Ponieważ chciałem wykorzystać gotowe pliki *.mo (stworzone w poprzednim wpisie), dlatego użyłem tutaj domeny “wiadomosci”, oraz tekstu do tłumaczenia który został wtedy również stworzony. Oczywiście ścieżka podana w bindtextdomain może być podana w sposób absolutny, np. tak:
“E:/cpp/gettext_test/locale”
zamiast
“./locale”
Musimy jeszcze utworzyć katalog \locale i całą ścieżkę językową do pliku *.mo, a więc dla języka polskiego pl_PL będzie to: \locale\pl_PL\LC_MESSAGES\, gdzie kopiujemy plik wiadomosci.mo (stworzony w poprzednim wpisie).
Kompilujemy projekt w eclipse lub jeśli chcemy to zrobić ręcznie podając następujące polecenia:
(wersja Release dla Windows):
g++ -II:\PRO\LIBS\Gettext\include\ -O3 -Wall -c -fmessage-length=0 -omain.o main.cpp
g++ -LI:\PRO\LIBS\Gettext\lib\ -ogettext_test.exe main.o -lintl
(wersja Release dla Debian’a):
g++ -O3 -Wall -c -fmessage-length=0 -omain.o main.cpp
g++ -ogettext_test main.o
W rezultacie po uruchomieniu dostaniemy w konsoli przetłumaczony tekst.
Brak komentarzy.