Laboratorium Komputerowe Progmar
Marcin Załęczny

Na stronie używamy cookies. Korzystając z witryny wyrażasz zgodę na ich wykorzystywanie.      Zamknij

Wykorzystanie gettexta w C++

Załóżmy, że mamy następujący program hello.cpp:
#include <libintl.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>

#define _(STRING) gettext(STRING)

int main(void)
{
setlocale(LC_ALL, "");
bindtextdomain("hello", "./locale");
textdomain("hello");

printf("%s\n", _("Hello, world!"));

return 0;
}

W powyższym kodzie, zainkludowane pliki nagłówkowe są minimum jakie jest konieczne do poprawnego działania gettexta. Linijka w której definiujemy makrodefinicję _ ma na celu wygodniejsze korzystanie z gettexta: możemy pisać _("Tekst do przetłumaczenia") zamiast gettext("Tekst do przetłumaczenia"). Na samym początku programu wywołujemy następujące funkcje w celu zainicjalizowania gettexta:
    * setlocale dla ustawienia języka i kodowania w którym wyświetlane są teksty (w powyższym przykładzie jest to domyślne ustawienie systemowe)
    * bindtextdomain wskazuje katalog, w którym znajdują się teksty z tłumaczeniami
    * textdomain dla wczytania tłumaczenia
Od tego momentu wszystkie teskty do przetłumaczenia umieszczamy w wywołaniach _("string").

Jak przygotować pliki z tłumaczeniami

xgettext -d hello -s -o hello.pot hello.cpp -k_ Pobiera z pliku hello.cpp wszystkie teksty w wywołaniach gettext("")/_("") i generuje plik hello.pot który posiada gettextową składnię. Plik ten na samym początku zawiera wstawki pozwalające określić: nazwę pakietu, datę wygenerowania tłumaczenia, nazwę tłumacza, język i kodowanie znaków.
Parametr -s odpowiada za posortowanie wszystkich tekstów w wygenerowanym pliku a po parametrze -d podajemy nazwę domeny (tę samą, która została podana w wywołaniu funkcji bindtextdomain). Natomiast parametr -k wyszczególnia, że funkcja gettext jest dostępna pod makrem _. Musimy jeszcze w wygenerowanym pliku zastąpić wstawkę CHARSET poprawną nazwą kodowania znaków (np. UTF-8, które jest domyślne w systemie Ubuntu i w innych systemach z rodziny Linux) oraz wstawkę PACKAGE VERSION zastąpić numerem wersji tłumaczenia.

msginit -l pl_PL -o hello.po -i hello.pot Komenda ta najpierw zapyta o adres email tłumacza a następnie wygeneruje plik z tłumaczeniem dla podanego języka (tutaj pl_PL). W pliku tym tłumaczymy wszystkie teksty po słowie kluczowym msgid. Tłumaczenia podajemy w linijkach następnych po słowie kluczowym msgstr.

msgfmt -c -v -o hello.mo hello.po Kompiluje plik tłumaczeń (hello.po) do postaci binarnej, która może być zrozumiana przez napisany program. Na koniec wygenerowany plik hello.mo kopiujemy do katalogu ./locale/pl/LC_MESSAGES.

W tym momencie działający program wyświetli przetłumaczony tekst.