Development/Tutorials/Localization/Language Change (de): Difference between revisions

From KDE TechBase
(Page created and first translations)
 
No edit summary
(7 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{Template:I18n/Language Navigation Bar|Development/Tutorials/Localization/Language Change}}
 


{{TutorialBrowser (de)|
{{TutorialBrowser (de)|
series=Localization|
series=Lokalisation|
name=Dealing with Language Changes|
name=Mit Sprachänderungen umgehen|
pre=[[../i18n|Writing Applications With Localization in Mind]]|
pre=[[../i18n (de)|Beim Schreiben von Applikationen an die Lokalisation denken]]|
}}
}}


== Eine Option zum Ändern der Sprache hinzufügen ==
== 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:


It can be extremely useful for a user to be able to change the language of a specific application.  It is fortunately extremely easy to add such functionality to your program.
Wenn Sie als Hauptfenster eine von KXmlGuiWindow abgeleitete Klasse benutzen, haben Sie bereits eine entsprechende programname.rc Datei bereitgestellt.  
 
If you are using the KXmlGuiWindow class for your main window, then you will already have an associated programname.rc file for it.


Simply modify this file to contain:
Verändern Sie diese einfach, damit sie folgendes beinhaltet:


<code>
<syntaxhighlight lang="text">
<Menu name="help">
<Menu name="help">
     <Action name="switch_application_language"/>
     <Action name="switch_application_language"/>
</Menu>
</Menu>
</code>
</syntaxhighlight>


And that is it!  You will now have a Switch Application Language option in the Help menu.
Das ist alles. Jetzt haben Sie im "Help" Menü einen Eintrag "Switch Application Language" mit dem Sie die Sprache ändern können.


However the user will need to restart the application for the changes to take effect.
Der Benutzer muß jedoch die Applikation neu starten, damit der Sprachwechsel wirksam wird.  


== Die GUI dynamisch ändern  ==
== Die GUI dynamisch ändern  ==


One step better is to change the language on the fly, as soon as the user has selected a new language.
Einen Schritt weiter geht die Option, die Sprache zur Laufzeit zu ändern, sobald der Benutzer dieses wünscht.  


This can seem a fairly daunting task, as a typical program can contain many hundreds of translatable strings that will need to be retranslated, but fortunately a lot of the work is already done for, and just needs to be connected together.
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.


When the language of an application is changed, a LanguageChanged QEvent is sent to every single widget. The idea is that in the top level window you will listen for this event, tell the GUI to retranslate, tell the toolbars to retranslate, and then let any custom widgets clean up themselves.
Wenn die Sprache einer Applikation geändert wird, wird ein LanguageChanged {{Qt|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.


So in your class that inherits from KXmlGuiWindow, add to the header file:
Fügen Sie in ihrer von KXmlGuiWindow abgeleiteten Klasse einfach in die Header-Datei ein:


<code>
<syntaxhighlight lang="text">
   class MyWindow {
   class MyWindow {
     ...
     ...
Line 44: Line 43:
     KAction *mQuitAction;
     KAction *mQuitAction;
   }
   }
</code>
</syntaxhighlight>


and to the source file:
und in die Quelldatei:
<code>
<syntaxhighlight lang="text">
MyWindow::MyWindow() : KXmlGuiWindow( 0 )
MyWindow::MyWindow() : KXmlGuiWindow( 0 )
{
{
Line 93: Line 92:
}
}


</code>
</syntaxhighlight>


Although these is fairly complicated, that's about all that's needed. Just be careful whenever you add a new string somewhere that it can be translated.
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.


The way it is done in Qt is to follow this pattern of having a retranslateUi() function that is called from both the constructor and from a LanguageChange event.
Das Ganze funktioniert indem Qt dann diesen Anweisungen folgend die Funktion retranslateUi() sowohl vom Konstruktor als auch von einem LanguageChange Ereignis aufruft.

Revision as of 15:40, 14 July 2012


Mit Sprachänderungen umgehen
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:

<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:

  class MyWindow {
    ...
   protected:
    void changeEvent( QEvent * event );
    void retranslateUi();
    KAction *mSomeAction;
    KAction *mQuitAction;
  }

und in die Quelldatei:

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.