Dynamischer Sprachwechsel
Dynamischer Sprachwechsel
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?
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.
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
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
speack português italiano deutsch english castellà qt
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:
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.
Sprich:
Code: Alles auswählen
qtTranslator.load("qt_" + locale, qmPath);
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.
-
- Beiträge: 1213
- Registriert: 2. Dezember 2004 10:54
- Kontaktdaten:
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?
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?
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.
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.
-
- Beiträge: 1213
- Registriert: 2. Dezember 2004 10:54
- Kontaktdaten:
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.
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.
-
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
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.
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
'Funktioniert nicht' ist keine Fehlerbeschreibung
Sprachumschaltung mit Actions an ComboBox?
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:(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
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();
}
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