Development/Tutorials/Localization/Language Change (de): Difference between revisions
No edit summary |
Neverendingo (talk | contribs) m (Text replace - "<code>" to "<syntaxhighlight lang="text">") |
||
Line 14: | Line 14: | ||
Verändern Sie diese einfach, damit sie folgendes beinhaltet: | Verändern Sie diese einfach, damit sie folgendes beinhaltet: | ||
< | <syntaxhighlight lang="text"> | ||
<Menu name="help"> | <Menu name="help"> | ||
<Action name="switch_application_language"/> | <Action name="switch_application_language"/> | ||
Line 34: | Line 34: | ||
Fügen Sie in ihrer von KXmlGuiWindow abgeleiteten Klasse einfach in die Header-Datei ein: | Fügen Sie in ihrer von KXmlGuiWindow abgeleiteten Klasse einfach in die Header-Datei ein: | ||
< | <syntaxhighlight lang="text"> | ||
class MyWindow { | class MyWindow { | ||
... | ... | ||
Line 46: | Line 46: | ||
und in die Quelldatei: | und in die Quelldatei: | ||
< | <syntaxhighlight lang="text"> | ||
MyWindow::MyWindow() : KXmlGuiWindow( 0 ) | MyWindow::MyWindow() : KXmlGuiWindow( 0 ) | ||
{ | { |
Revision as of 20:44, 29 June 2011
Development/Tutorials/Localization/Language Change
Languages: عربي | Asturianu | Català | Česky | Kaszëbsczi | Dansk | Deutsch | English | Esperanto | Español | Eesti | فارسی | Suomi | Français | Galego | Italiano | 日本語 | 한국어 | Norwegian | Polski | Português Brasileiro | Română | Русский | Svenska | Slovenčina | Slovenščina | српски | Türkçe | Tiếng Việt | Українська | 简体中文 | 繁體中文
Anleitungsserie | Lokalisation |
Voriges Kapitel | Beim Schreiben von Applikationen an die Lokalisation denken |
Nächstes Kapitel | n/a |
Weiterführende Texte | n/a |
Navigation | Deutsche Startseite |
Eine Option zum Ändern der Sprache hinzufügen
Für einen Benutzer kann es nützlich sein, die Sprache einer bestimmten Applikation zu ändern. Es ist glücklicherweise sehr einfach, eine solche Funktionalität zum eigenen Programm hinzuzufügen:
Wenn Sie als Hauptfenster eine von KXmlGuiWindow abgeleitete Klasse benutzen, haben Sie bereits eine entsprechende programname.rc Datei bereitgestellt.
Verändern Sie diese einfach, damit sie folgendes beinhaltet:
<syntaxhighlight lang="text"> <Menu name="help">
<Action name="switch_application_language"/>
</Menu>
Das ist alles. Jetzt haben Sie im "Help" Menü einen Eintrag "Switch Application Language" mit dem Sie die Sprache ändern können.
Der Benutzer muß jedoch die Applikation neu starten, damit der Sprachwechsel wirksam wird.
Die GUI dynamisch ändern
Einen Schritt weiter geht die Option, die Sprache zur Laufzeit zu ändern, sobald der Benutzer dieses wünscht.
Das scheint ein sehr mühsames Unternehmen zu sein, da ein typisches Programm mehrere hundert übersetzbare Zeichenketten beinhalten kann, die neu übersetzt werden müssten doch glücklicherweise ist eine Menge Arbeit bereits erledigt, es muss nur noch richtig verknüpft werden.
Wenn die Sprache einer Applikation geändert wird, wird ein LanguageChanged QEvent ausgelöst und an jedes einzelne Widget gesendet. Die Idee ist, dass das Hauptfenster auf dieses Ereignis lauscht und der GUI und allen weiteren beteiligten Elementen mitteilt, sich neu zu übersetzen.
Fügen Sie in ihrer von KXmlGuiWindow abgeleiteten Klasse einfach in die Header-Datei ein:
<syntaxhighlight lang="text">
class MyWindow { ... protected: void changeEvent( QEvent * event ); void retranslateUi(); KAction *mSomeAction; KAction *mQuitAction; }
und in die Quelldatei: <syntaxhighlight lang="text"> MyWindow::MyWindow() : KXmlGuiWindow( 0 ) {
//setup the GUI. There should be no i18n calls here, but instead //these calls should be in the retranslateUi() function //Set up the actions in the GUI mSomeAction = actionCollection()->addAction("something"); mSomeAction->setIcon(KIcon("some-action")); connect(mSomeAction, SIGNAL(triggered(bool)), mWorkSpace, SLOT(newWorkSheet() ));
//KStandardActions need to be handled careful. mQuitAction = NULL retranslateUi(); // Use the KXmlGuiWindow class to setup the GUI setupGUI(ToolBar | Keys | StatusBar | Create);
}
void MyWindow::changeEvent( QEvent * event ) {
if (event->type() == QEvent::LanguageChange) { // This will setup the menu, toolbars etc again, using the new language setupGUI(ToolBar | Keys | StatusBar | Create); retranslateUi(); } KXmlGuiWindow::changeEvent(event);
}
void MyWindow::retranslateUi() {
// Set the window title setPlainCaption( i18n( "My Window" ) ); // For custom actions, just set the text again mMyAction->setText(i18n( "&Do Something..." )); if(mQuitAction) { //If we have already set this up before, create a new dummy action // and grab what info we need from it KAction *tmpQuitAction = KStandardAction::quit( NULL, NULL, NULL ); mQuitAction->setText(tmpQuitAction->text()); mQuitAction->setWhatsThis(tmpQuitAction->whatsThis()); mQuitAction->setToolTip(tmpQuitAction->toolTip()); delete tmpQuitAction; } else mQuitAction = KStandardAction::quit( this, SLOT( close() ), actionCollection() );
}
Auch wenn dies ziemlich kompliziert ist, ist das alles was getan werden muss. Stellen Sie nur sicher, dass wann immer Sie eine neue Zeichenkette hinzufügen diese auch übersetzt werden kann.
Das Ganze funktioniert indem Qt dann diesen Anweisungen folgend die Funktion retranslateUi() sowohl vom Konstruktor als auch von einem LanguageChange Ereignis aufruft.