Dynamischer Sprachwechsel

Alles rund um die Programmierung mit Qt
Antworten
Barade
Beiträge: 5
Registriert: 20. April 2008 18:57

Dynamischer Sprachwechsel

Beitrag von Barade »

Hallo,
ich habe in meiner kleinen Anwendung einen dynamischen Sprachwechsel eingebaut.
Jetzt habe ich allerdings das Problem, dass die Standard-Qt-Fenster wie z.B. das Über-Qt-Fenster oder das Drucken-Fenster sich nicht an die gewechselte Sprache sondern vermutlich an die eingestellte Sprache meines Systems anpassen.
Wie kann ich das ändern?
Jesus lebt.
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

du musst nur alles uebersetzen und das richtige file laden...

am einfachsten beim QApplication wie in
http://www.qtforum.de/forum/viewtopic.php?t=6059

Code: Alles auswählen

void Load_Language( const QString lang )
{
current_language = lang;
#if defined Q_WS_MAC
localedirfile = QString("%1/locale/main_%2.qm").arg(QDir::currentPath()).arg(lang);
#endif
#if defined Q_WS_WIN
localedirfile = QString("%1/locale/main_%2.qm").arg(QCoreApplication::applicationDirPath()).arg(lang);
#endif
#if defined Q_WS_X11
localedirfile = QString("%1/locale/main_%2.qm").arg(QDir::currentPath()).arg(lang);
#endif
QTranslator *translator = new QTranslator(qApp);
translator->load(localedirfile);
qApp->installTranslator(translator);
} 

.........................
speack português italiano deutsch english castellà qt
Barade
Beiträge: 5
Registriert: 20. April 2008 18:57

Beitrag von Barade »

Also ich habe mich bei dem Sprachwechsel an einem Beispiel aus einem Qt-Buch orientiert. Da wird die entsprechende Sprachdatei mit einem qt_-Präfix geladen.
Sprich:

Code: Alles auswählen

qtTranslator.load("qt_" + locale, qmPath);
locale entspricht dabei dem Namen der Sprache. Also dem richtigen Namen nicht einem Kürzel.
Deutsch heißt also auch Deutsch und nicht de.
Jetzt habe ich gesehen, dass es bei Qt auch Standardübersetzungsdateien gibt. Dann habe ich die Datei qt_de.qm mal in das Translations-Verzeichnis verschoben und sie zu qt_Deutsch.qm umbenannt. Jetzt wird auch das Drucken-Fenster angepasst aber das Über-Qt-Fenster bleibt immer Englisch.

Danke für die Hilfe aber ich denke, du sprichst das Problem eher zu allgemein an da mir schon bewusst ist, wie ich eine Übersetzung lade.
Jesus lebt.
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Also, zum Theme dynamischer Übersetzung gibt es in der Dokumentation folgendes:
http://doc.trolltech.com/4.4/i18n.html# ... ranslation

Ich habe hier aber irgendwie den Eindruck, dass du versucht eine Übersetzung überhaupt einmal zu laden? Oder vermischen wir hier zwei Themen?

- Laden von Übersetzungen?
- Dynamisches nachträgliches Laden von Übersetzungen?
Barade
Beiträge: 5
Registriert: 20. April 2008 18:57

Beitrag von Barade »

Also unter dynamischem Sprachwechsel habe ich jetzt verstanden, dass man zur Laufzeit des Programms die Sprache über ein Menü wechseln kann. Das Menü liest dann aus dem translations-Verzeichnis die vorhandenen Übersetzungsdateien aus und erstellt dafür Aktionen.
In der Dokumentation steht ja etwas von diesem QEvent::LanguageChange aber ich verstehe das so, dass das nur ausgelöst wird wenn man die System-Sprache wechselt.
Das wäre dann nochmals eine zusätzliche Implementierung.
Aber eigentlich hast du schon recht weil es jetzt ja nur noch darum geht, die Übersetzung des Über-Qt-Fensters von irgendwo her zu laden.
Jesus lebt.
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Es ist dafür da, während deine Anwendung läuft deine Sprache zu ändern.

Du möchtest einfach nur eine Sprache beim starten des Programms laden.

Das was patrik dort gemacht hat, geht normalerweise auch mit einer Zeile.

Ich bin ehr ein wenig überfragt, wo das genaue Problem liegt....

Es wäre vielleicht gut, einmal zu testen, was so Programme wie strace sagen, welche Datei er denn zu laden versucht.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Da der Drucken-Dialog und File-Öffnen usw. Systemdialoge sind kann Qt an dieser Stelle nichts machen. Sie werden mit der Sprache, die in Windows eingestellt ist, angezeigt.
Die qt-Übersetzung muss nicht zwangsläufig komplett sein - dies würde das About-Qt - Fenster erklären.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
s-valve
Beiträge: 87
Registriert: 1. April 2007 15:03
Kontaktdaten:

Sprachumschaltung mit Actions an ComboBox?

Beitrag von s-valve »

Hallo,

ich hänge mich mal hier mit rein. Meine Fragestellung ist allerdings leicht anders. Meine Lösung (ein wenig bei J. Blanchette und M. Summerfiled geluschert) für eine dyn. Sprachumschaltung sieht folgendermaßen aus:

Code: Alles auswählen

PrefDialog::PrefDialog(MainWindow *parent, PageCtrl *pageCtrl, SessionManager *sessionManager, ImportExport *importExport, PrintPrepare *printPrepare, POUInfoDialog *pouInfoDialog, FileViewDialog *fileViewDialog, FindDialog *findDialog, FcnDialog *fcnDialog)
    : m_MainWindow(parent), m_PageCtrl(pageCtrl), m_SessionManager(sessionManager), m_ImportExport(importExport), m_PrintPrepare(printPrepare), m_POUInfoDialog(pouInfoDialog), m_FileViewDialog(fileViewDialog), m_FindDialog(findDialog), m_FcnDialog(fcnDialog) //member VAR of PrefDialog
{
  setupUi(this);
...
  qApp->installTranslator(&appTranslator);
  getLanguages();
 
}


void PrefDialog::getLanguages()
{ //get language files

  QDir dir(langDir);
  QStringList fileNames = dir.entryList(QStringList("PLCE_*.qm"));
 
  for (int i=0; i<fileNames.size(); i++)
  {
    QTranslator translator;
    translator.load(fileNames[i], langDir);
    Pref_comboBox_Lang->addItem(translator.translate("tansl. language", "LANG"));
  }
}


void PrefDialog::switchLang()
{ //switch interface language
 
  QString langFile;
  QString language = Pref_comboBox_Lang->itemText(Pref_comboBox_Lang->currentIndex());
   
    if (language == "English")
      langFile = "PLCE_EN";  
    if (language == "Deutsch")
      langFile = "PLCE_DE";
    if (language == "French")
      langFile = "PLCE_FR";
    if (language == "Español")
      langFile = "PLCE_ES";
    
  appTranslator.load(langFile, langDir);
  m_MainWindow->retranslateUi();
  m_PageCtrl->retranslateUi();
  m_FileViewDialog->retranslateUi();
  m_FindDialog->retranslateUi();
  m_SessionManager->retranslateUi();
  m_POUInfoDialog->retranslateUi();
  m_FcnDialog->retranslateUi(); 
  retranslateUi();	 
}
(switchlang(); wird vom "Apply-Button" des Einstellungsdialog ausgelöst.)

Mein Hauptproblem ist die ComboBox des Einstellungsdialogs. Dieser wurde mit dem Designer erstellt. Wenn ich nun den Sprachdateien Aktionen zuweisen wollte, blieb die ComboBox leer. Aktionen hätten ja den Vorteil des data-Elements, über welches ich den Pfad wieder herstellen könnte und mir den obigen " if (language == "English")..."-Unsinn ersparen könnte. Der ComboBox ein item zuzuweise funktioniert ja, kann ich dem vlt. eine Aktion zuweisen? Kann mir da jemand vlt. auf die Sprünge helfen?

In getLanguages() erstelle ich jeweils eine neue translator Variable. Kann das zu erhöhtem Speicherverbrauch führen, oder sollte ich besser die translatoren per new erstellen und bei verlassen von getLanguages() löschen?

Gruß,
M
Antworten