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

Podobne dokumenty