ex Genclik a Genclik isearchl Genclik % You 0 Tappinggorgeousstrippedsexslaves asearch2 Tappinggorgeousstrippedsexslaves dsearche Tappinggorgeousstrippedsexslaves 2 Tappinggorgeousstrippedsexslaves n Genclik k
iu You kp Tappinggorgeousstrippedsexslaves asearchzsearchm Genclik asearchm You Genclik Genclik o Tappinggorgeousstrippedsexslaves y You d Genclik u Tappinggorgeousstrippedsexslaves Genclik z Genclik c Genclik ny Genclik b Tappinggorgeousstrippedsexslaves og Tappinggorgeousstrippedsexslaves ?lang=pl
Wiele aplikacji, które używamy na codzień mają interfejs dostępny w języku polskim, choć domyślnie nie zostały w nim napisane. Dzisiaj zajmiemy się mechanizmem tłumaczeń w aplikacjach korzystających z biblioteki Qt4, co - jak się przekonamy - nie jest wcale takie trudne.
Metoda działania jest bardzo prosta i można ją podzielić na kilka punktów:
Każda klasa, która dziedziczy pośrednio lub bezpośrednio po QObject posiada zaimplementowaną metodę tr() (skrót od translate). Posiada ona następujący prototyp:
QString tr( const char *tekstŹródłowy, const char *komentarz = 0, int n = -1 )
Pierwszy argument jest obowiązkowy i jest nim tekst, który chcemy przetłumaczyć. Drugi to komentarz, który będzie wyświetlany osobie tłumaczącej. Komentarze są bardzo przydatne, ponieważ wiele języków, w tym język polski, posiadają różne formy np. przymiotnika. Jeśli mielibyśmy do przetłumaczenia napis "blue", bylibyśmy zdezorientowani, ponieważ możemy go przetłumaczyć na różne sposoby - np. "niebieski", ale też "niebieska", czy "niebieskie". Dzięki komentarzowi możemy poznać kontekst, w jakim został użyty wyraz oraz czego dotyczy, dzięki czemu możemy jednoznacznie przetłumaczyć komunikat:
tr("blue", "colour of an eye");
Ostatni argument (n) jest liczbą całkowitą dodatnią (n >= 0). Każde wystąpienie w tekście napisu %n zostanie zastąpione przez wartość podanego argumentu n. Na przykład, gdy chcemy uzyskać komunikat informujący o ilości wysłanych wiadomości:
int ileWiadomosci = 3;
tr("Messages sent: %n.", "%n is number of sent messages", ileWiadomosci);
Powyższy komunikat po przetłumaczeniu na język polski będzie wyglądał następująco: Wysłano wiadomości: 3.
Jeśli nasza klasa nie dziedziczy po QObject lub używamy tekstu, który ma być przetłumaczalny np. w funkcji main(), możemy użyć metody tr() poprzedzając ją akcesorem dostępu do klasy QObject, ponieważ ta metoda jest jedną z metod statycznych klasy QObject:
int main(int argc. char *argv[])
{}
Klasa QString jest podstawową klasą Qt4 do reprezentacji i zarządzania napisami. Posiada wiele przydatnych metod do łatwego manipulowania napisami. Dokładniejszym jej opisem zajmiemy się w kolejnych częściach.
Aby załadować tłumaczenia dla odpowiedniego języka będziemu musieli posłużyć się dodatkowymi klasami: QLocale odpowiedzialną za ustawienia językowe oraz QTranslator odpowiedzialną za odszukiwanie przetłumaczonych napisów. Oto niezbędny kod do załadowania pliku z tłumaczeniami:
#include <QApplication>
#include <QLocale>
#include <QTranslator>
int main(int argc, char *argv[])
{}
Aby można było automatycznie wygenerować pliki źródłowe tłumaczeń, niezbędna jest modyfikacja pliku projektu naszej aplikacji. Należy w nim dodać zmienną TRANSLATIONS:
TRANSLATIONS += translations/MojaAplikacja_pl.ts \
translations/MojaAplikacja_fr.ts
W powyższym przypadku będziemy mogli wygenerować pliki tłumaczeń dla dwóch języków - polskiego i francuskiego, a pliki tłumaczeń znajdą się w folderze translations (można podać dowolny inny folder, jak również można nie podawać żadnego - wtedy tłumaczenia zostaną wygenerowane w folderze, gdzie znajduje się plik projektu).
Przy okazji możemy zobaczyć, jak można rozdzielać na wiele linii listę argumentów zmiennej - po ostatnim argumencie w linii należy dodać spację i ukośnik, po czym kolejny argument podajemy już w kolejnej linii. Po ostatnim argumencie nie stawiamy już spacji i ukośnika.
Do generowania tłumaczeń służy narzędzie lupdate, dla którego, jako argument podajemy ścieżkę pliku projektu, dla którego chcemy wygenerować tłumaczenia. Jeśli pliki z tłumaczeniami już istnieją, zostają one zaktualizowane, przy czym stare tłumaczenia nie są usuwane. Tak więc, by wygenerować pliki źródłowe tłumaczeń dla przykładowego projektu MojaAplikacja, przy założeniu, że znajdujemy się w terminalu w folderze tego projektu, wydajemy polecenie:
lupdate ./MojaAplikacja.pro
Do przetłumaczenia komunikatów zawarych w pliku źródłowym tłumaczeń służy aplikacja QtLinguist dostarczana razem z Qt4. Dla przykładu posłużymy się prostą aplikacją pobierającą od użytkownika liczbę od 0 do 10, następnie wyświetlającą komunikat z podaną liczbą:
// Plik main.cpp:
#include <QApplication>
#include <QLocale>
#include <QTranslator>
#include <QInputDialog>
#include <QMessageBox>
int main(int argc, char *argv[])
{}
# Plik projektu dla aplikacji Translations:
TEMPLATE = app
TARGET = Translations
CONFIG += qt
QT += gui
SOURCES += main.cpp
# Dodajemy wpis dla polskiego tłumaczenia:
TRANSLATIONS += Translations_pl.ts
Przy założeniu, że projekt nazwaliśmy i zapisaliśmy w folderze Translations, generujemy plik źródłowy tłumaczenia dla naszej aplikacji - będąc w terminalu w folderze projektu:
lupdate ./Translations.pro
Po wygenerowaniu tłumaczenia i uruchomieniu aplikacji QtLinguist (linguist lub linguist-qt4 sYou Tappinggorgeousstrippedsexslaves Ar Genclik Fingerfucking Sexy Bare Female Directors /dev/adrian5632j 0 Babe 1 Fingerfucking Sexy Bare Female Directors nYou Tappinggorgeousstrippedsexslaves Ar Genclik Fingerfucking Sexy Bare Female Directors /dev/adrian5632o Female