Aplikacja po polsku
Transkrypt
Aplikacja po polsku
Aplikacja po polsku Bogdan Kreczmer ZPCiR ICT PWr pokój 307 budynek C3 [email protected] c 2004 Bogdan Kreczmer? Copyright ? Niniejszy dokument zawiera materiały do wykładu na temat wizualizacji danych sensorycznych. Jest on udostepiony ˛ 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. ˛ Kodowanie znaków narodowych int main( int argc, char ∗∗ argv ) { QApplication a( argc, argv ); QTextCodec ∗wKodowanieLatin2 = QTextCodec::codecForName(”ISO 8859-2”); if (wKodowanieLatin2) { QTextCodec::setCodecForTr(wKodowanieLatin2); ”!!! Brak kodowania: ISO 8859-2” endl; } else cerr << << 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˛e˛ ćłńóśźż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˛e˛ ćłńóśźż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 Kodowanie znaków narodowych int main( int argc, char ∗∗ argv ) { QApplication a( 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; 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˛e˛ ćłńóśźż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˛e˛ ćłńóśźż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 Kodowanie znaków narodowych int main( int argc, char ∗∗ argv ) { QApplication a( 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; QMessageBox Info(NULL); Info.about(NULL,QObject::tr(”Informacja z tłumaczeniem”), QObject::tr(”Polskie znaki diakrytyczne:\n a˛e˛ ćłńóśźż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˛e˛ ćłńóśźż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 sie˛ standardowe opcje jakie każda aplikacja pracujaca ˛ 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 – dostepne ˛ 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); ”!!! Brak kodowania: ISO 8859-2” endl; } else cerr ... 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˛ćeł ˛ ńóśźż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); ”!!! Brak kodowania: ISO 8859-2” endl; } else cerr ... 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˛ćeł ˛ ńóśźżA˛ĆEŁ ˛ ŃÓŚŹŻ” ); } return Aplik.exec(); Przyjecie ˛ odpowiedniego kodowania domyślnego nie gwarantuje jeszcze, że operacje wprowadzania znaków z klawiatury bed ˛ a˛ 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ć ˛ eł ˛ ńóśźż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 klawiature. ˛ 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 sie˛ 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 angielskojezyczne, ˛ 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 2. linguist skromny_edytor_pl.ts 3. lrelease -verbose skromny_edytor.pro −→ skromny_edytor_pl.ts −→ skromny_edytor_pl.ts −→ 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