Aplikacja po polsku Bogdan Kreczmer ZPCiR ICT PWr pokój 307 budynek C3 kreczmer@ict.pwr.wroc.pl Copyright c 2004 Bogdan Kreczmer Niniejszy dokument zawiera materiały do wykładu na temat wizualizacji danych sensorycznych. Jest on udostępiony pod warunkiem wykorzystania wyłacznie do własnych prywatnych potrzeb i może on być kopiowany wyłacznie w całości, razem z ninijesza strona tytułowa.
int main( int argc, char argv ) QApplication a( argc, argv ); Kodowanie znaków narodowych QTextCodec wkodowanielatin2 = QTextCodec::codecForName( ISO 8859-2 ); if (wkodowanielatin2) QTextCodec::setCodecForTr(wKodowanieLatin2); else cerr <<!!! Brak kodowania: ISO 8859-2 << endl; QFont CzcionkaAplikacji(QApplication::font()); //Przekopiowujemy dotychczasowe ustawienia czcionki. CzcionkaAplikacji.setFamily( Fixed [Misc] ); CzcionkaAplikacji.setPointSize( 12 ); QApplication::setFont(CzcionkaAplikacji); QMessageBox Info(NULL); Info.about(NULL,QObject::tr( Informacja z tłumaczeniem ), QObject::tr( Polskie znaki diakrytyczne:\n aęćłńóśźż A EĆŁŃÓŚŹŻ )); Info.about(NULL,QObject::tr( Informacja ze zwykłym łańcuchem znaków ), Ale bajzel!!!\n Co z tymi znakami??!!\n Polskie znaki diakrytyczne:\n aęćłńóśźż A EĆŁŃÓŚŹŻ ); return 0; Ustalenia kodowania znaków umożliwia klasa QtTextCodec. Pozwala ona na ustalenie kodowanie dla napisów podlegajacych tłumaczeniu. Jednak aby polskie znaki diakrytyczne były widoczne konieczne jest wybranie odpowiedniej czcionki, w której znaki te sa zdefiniowane. 1
int main( int argc, char argv ) QApplication a( argc, argv ); Kodowanie znaków narodowych QTextCodec wkodowanielatin2 = QTextCodec::codecForName( ISO 8859-2 ); if (wkodowanielatin2) QTextCodec::setCodecForTr(wKodowanieLatin2); QTextCodec::setCodecForCStrings(wKodowanieLatin2); else cerr <<!!! Brak kodowania: ISO 8859-2 << endl; QFont CzcionkaAplikacji(QApplication::font()); CzcionkaAplikacji.setFamily( Fixed [Misc] ); CzcionkaAplikacji.setPointSize( 12 ); QApplication::setFont(CzcionkaAplikacji); QMessageBox Info(NULL); Info.about(NULL,QObject::tr( Informacja z tłumaczeniem ), QObject::tr( Polskie znaki diakrytyczne:\n aęćłńóśźż A EĆŁŃÓŚŹŻ )); Info.about(NULL,QObject::tr( Informacja ze zwykłym łańcuchem znaków ), Teraz jest już dobrze.\n Polskie znaki diakrytyczne:\n aęćłńóśźż A EĆŁŃÓŚŹŻ ); return 0; Kodowanie można ustalić niezależnie dla napisów podlegajacych tłumaczeniu oraz łańcuchów znaków, które podlegaja konwersji do obiektów klasy QString. 2
int main( int argc, char argv ) QApplication a( argc, argv ); Kodowanie znaków narodowych QTextCodec wkodowanielatin2 = QTextCodec::codecForName( ISO 8859-2 ); if (wkodowanielatin2) QTextCodec::setCodecForTr(wKodowanieLatin2); QTextCodec::setCodecForCStrings(wKodowanieLatin2); else cerr <<!!! Brak kodowania: ISO 8859-2 << endl; QMessageBox Info(NULL); Info.about(NULL,QObject::tr( Informacja z tłumaczeniem ), QObject::tr( Polskie znaki diakrytyczne:\n aęćłńóśźż A EĆŁŃÓŚŹŻ )); Info.about(NULL,QObject::tr( Informacja ze zwykłym łańcuchem znaków ), Teraz jest już dobrze.\n Polskie znaki diakrytyczne:\n aęćłńóśźż A EĆŁŃÓŚŹŻ ); return 0; Linia wywołania programu: rab 34:./skromny_edytor -fn -b&h-lucida-bold-i-normal-sans-18-180-75-75-p-119-iso8859-2 Rodzaj czcionki dla aplikacji można również ustawić z linii polecenia. W tym celu wykorzystuje się standardowe opcje jakie każda aplikacja pracuj aca w środowisku X Window powinna umieć zinterpretować. 3
Ustawianie czcionki aplikacji bool JestParametr(int argc, char const const argv, const char Param) for (int i = 0; i < argc; i++) if (!strcmp(param,argv[ i ])) return true; return false; int main( int argc, char argv ) bool JestParametrCzcionki = JestParametr(argc,argv, -fn ); QApplication Aplik( argc, argv ); if (! JestParametrCzcionki ) QFont CzcionkaAplikacji(QApplication::font()); CzcionkaAplikacji.setFamily( Fixed [Misc] ); CzcionkaAplikacji.setPointSize( 12 ); QApplication::setFont(CzcionkaAplikacji); Aplikacja musi pracować poprawnie, jeżeli użytkownik wywoła ja bez parametrów ustawiajacych czcionki. Musi ona zatem ustawiać swoje czcionki, tak aby ustawienia z linii polecenia mogły je zmodyfikować. 4
Obsługiwane opcje wywołania Opcje debugowania dostępne jeśli Qt zostało skompilowane ze zdefiniowanym symbolem QT_NO_DEBUG: -nograb, -dograb (tylko dla X11), -sync (tylko dla X11). Opcje Qt sa one rozpoznawane przez każdy program pisany z wykorzystaniem biblioteki Qt: -style, -session, -widgetcount. Opcje X11 tradycyjne opcje systemu X Window: -display, -geometry, -fn, -bg, -fg, -btn, -name, -title, -visual, -ncols, -cmap Przykład wywołania aplikacji: aplikacja -display rab:0 -geometry 600x480+10+20 5
Kodowanie znaków diakrytycznych int main( int argc, char argv ) bool JestParametrCzcionki = JestParametr(argc,argv, -fn ); QApplication Aplik( argc, argv ); QTextCodec wkodowanielatin2 = QTextCodec::codecForName( ISO 8859-2 ); if (wkodowanielatin2) QTextCodec::setCodecForTr(wKodowanieLatin2); else cerr <<!!! Brak kodowania: ISO 8859-2 << endl; SkromnyEdytor SEr; SEr.show(); Aplik.connect( &Aplik, SIGNAL( lastwindowclosed() ), &Aplik, SLOT( quit() ) ); wwinieta >finish(&ser); delete wwinieta; SEr. wedytor >insert(wkodowanielatin2 >tounicode( Polskie znaki diakrytyczne:\n aćęłńóśźż AĆ EŁŃÓŚŹŻ )); return Aplik.exec(); Jeżeli nie zostało ustawione domyślne kodowanie łańcuchów znakowych jako Latin2, to można to zawsze wymusić transformujac łańcuch do UNICODE za pomoca kodera Latin2 (napisy musza być pisane z zastosowaniem kodownia Latin2). 6
Kodowanie znaków diakrytycznych int main( int argc, char argv ) bool JestParametrCzcionki = JestParametr(argc,argv, -fn ); QApplication Aplik( argc, argv ); QTextCodec wkodowanielatin2 = QTextCodec::codecForName( ISO 8859-2 ); if (wkodowanielatin2) QTextCodec::setCodecForTr(wKodowanieLatin2); QTextCodec::setCodecForCStrings(wKodowanieLatin2); else cerr <<!!! Brak kodowania: ISO 8859-2 << endl; SkromnyEdytor SEr; SEr.show(); Aplik.connect( &Aplik, SIGNAL( lastwindowclosed() ), &Aplik, SLOT( quit() ) ); wwinieta >finish(&ser); delete wwinieta; SEr. wedytor >insert( Polskie znaki diakrytyczne:\n aćęłńóśźż AĆ EŁŃÓŚŹŻ ); return Aplik.exec(); Przyjęcie odpowiedniego kodowania domyślnego nie gwarantuje jeszcze, że operacje wprowadzania znaków z klawiatury będa realizowane właściwie. 7
Wprowadzanie znaków diakrytycznych class ProstyEdytorTekstuLat2: public QTextEdit // public : ProstyEdytorTekstuLat2(QWidget parent = 0L, const char name = 0L) QTextEdit(parent,name) ; // void keypressevent( QKeyEvent wzdarzenie ); void ProstyEdytorTekstuLat2::keyPressEvent( QKeyEvent wzdarzenie ) const char wznakpl, ZnakiPL = aćęłńóśźż AĆ EŁŃÓŚŹŻ ; QString Napis = ZnakiPL; QString LiteraPL; if (isprint(wzdarzenie->ascii())) if ( (wznakpl=strchr(znakipl, wzdarzenie->ascii())) ) LiteraPL = Napis[wZnakPL-ZnakiPL]; insert(literapl); else insert(wzdarzenie->text()); else QTextEdit::keyPressEvent(wZdarzenie); Konieczne jest odpowiednie przekodowanie znaków otrzymywanych z klawiatury. Można to wykonać poprzez przechwycenie obsługi zdarzeń generowanych przez klawiaturę. 8
Korzystanie z metod translacji Źle: const char wnapis = To należy przetłumaczyć ; QString TlumaczonyNapis = wnapis; Dobrze: QString TlumaczonyNapis = tr ( To należy przetłumaczyć ); Źle: QString NazwaPliku; statusbar() >message( tr( Nie znaleziono pliku: + NazwaPliku) ); Dobrze: statusbar() >message( tr( Nie znaleziono pliku: %1 ).arg(nazwapliku) ); Nie zaleca się podstawiania do zmiennych napisów, które maja być tłumaczone. Jeżeli jest to konieczne, należy to uczynić z zastosowaniem makr QT_TR_NOOP lub QT_TRANSLATION_NOOP, np. const char const TabNapis[ ] = QT_TR_NOOP( Napis tłumaczony 1 ), QT_TR_NOOP( Napis tłumaczony 2 ) ; 9
Tłumaczenie napisów w aplikacji 1. Uruchomienie lupdate w celu wydzielenia napisów podlegajacych tłumaczeniu. 2. Tłumaczenie napisów z zastosowanie aplikacji linguist (Qt Linguist). 3. Uruchomienie lrelease w celu generacji binarnej postaci pliku tłumaczeń (rozszerzenie.qm) ładowalnego przez obiekt klasy QTranslator. Przykład: 0. Jeżeli w aplikacji napisy sa po polsku z kodowaniem Latin2 i tworzymy tłumaczenie angielskojęzyczne, to dodajemy do projektu wpisy: TRANSLATIONS = skromny_edytor_en.ts DEFAULTCODEC = ISO-8859-2 Jeżeli tłumaczymy z angielskiego na polski, to wystarczy: TRANSLATIONS = skromny_edytor_pl.ts 1. lupdate -verbose skromny_edytor.pro skromny_edytor_pl.ts 2. linguist skromny_edytor_pl.ts skromny_edytor_pl.ts 3. lrelease -verbose skromny_edytor.pro skromny_edytor_pl.qm 10
Aplikacja po polsku int main(int argc, char argv) if (!JestParametrCzcionki) QApplication::setFont(CzcionkaAplikacji); QTranslator TlumaczPL; if ( TlumaczPL.load( skromny edytor pl.qm,. ) ) Aplik.installTranslator(&TlumaczPL); else cerr <<!!! Plik skromny edytor pl.qm nie zostal zaladowany. << endl; 11