2013-05-02 11 views
13

Ich habe eine mehrsprachige Qt-Anwendung, wo ich folgendes ProblemVerschiedene Sprachen in verschiedenen Teilen der Anwendung

  1. Der Großteil der Benutzeroberfläche übersetzt werden soll die Sprache des Systemgebietsschemas
  2. Die Anwendung anzupassen kann auch verschiedene Formulare drucken. Die Sprache dieser Formulare sollte unabhängig von der UI-Sprache auswählbar sein (die Formulare werden an Personen übergeben, die oft nicht die lokale Sprache sprechen)
  3. Wenn möglich, wäre es schön, die gleichen Fähigkeiten wie die vorherige zu haben Zeigen Sie auch auf einen Dialog in der Anwendung.

In welcher Weise kann ich dies erreichen? Alle Beispiele, die ich gefunden habe, befassen sich mit der Übersetzung der gesamten Anwendung, aber in meinem Fall brauche ich zwei unabhängige Übersetzungen (obwohl möglicherweise in der gleichen Sprache).

Müsste ich die Fallback-Mechanismen von QApplication::translate selbst replizieren und QTranslator::translate direkt verwenden, oder gibt es einen bequemeren Weg?

+0

Zum Zeitpunkt des Druckens können Sie das gewünschte Gebietsschema nicht laden und einstellen, den Druckvorgang ausführen und dann das Gebietsschema des Systems wiederherstellen? – TheDarkKnight

+0

@ Merlin069: Es könnte funktionieren, aber wird nicht schön aussehen, weil das würde auch Re-Übersetzung der gesamten Benutzeroberfläche (zweimal!) Auslösen, wenn Sie etwas drucken. –

Antwort

5

Angenommen, Sie benötigen eine Übersetzung für die gesamte App und eine weitere für einen Dialog. Was Sie tun müssen, ist zwei qm-Dateien zu erstellen: eine, die Übersetzungen von allem außer diesem Dialog enthält, und eine, die nur für diesen Dialog Übersetzungen enthält. Jetzt können Sie diese qm-Dateien separat laden/entladen.

Ich denke, Sie wissen, wie man die Übersetzung dynamisch ändert.

Update von Kommentar:

separate qm-Dateien erstellen Sie alle Hauptquellen in einem Verzeichnis setzen könnten, und alle Dialoge Quellen in eine anderen und rufen lupdate -no-obsolete -recursive ../src/Form -ts Form_ru.ts, wo ../src/Form Dialoge Verzeichnis ist. Oder rufen Sie einfach lupdate -no-obsolete ../src/Form.ui ../src/Form.cpp ../src/Form.h -ts Form_ru.ts auf Dateien.

wäre das Ergebnis Skript so etwas wie diese:

lupdate -no-obsolete -recursive ../test.pro -ts test_ru.ts 
lupdate -no-obsolete ../Form.ui ../Form.cpp ../Form.h -ts Form_ru.ts 
+0

Gibt es Hinweise, wie diese separaten .qm-Dateien (oder entsprechende .ts-Dateien) erstellt werden? –

+0

Sicher. Sie könnten alle Hauptquellen in ein Verzeichnis und alle Dialogquellen in ein anderes Verzeichnis einfügen und 'lupdate -no-obsolete -recursive ../src/Form -ts Form_ru.ts' aufrufen. wo '../ src/Form' das Dialogfeld dialogs ist. Oder rufen Sie 'lupdate -no-obsolet ../src/Form.ui ../src/Form.cpp ../src/Form.h -ts Form_ru.ts' für Dateien auf. Das Ergebnis-Skript wäre etwa so: 'lupdate -no-obsolete-rekursiv ../test.pro -ts test_ru.ts lupdate -no-veraltet ../Form.ui ../Form.cpp. ./Form.h -ts Form_ru.ts ' – Amartel

1

Da die QTranslator-Klasse eine virtuelle Funktion zum Übersetzen hat. Sie könnten von QTranslator erben und die Übersetzungsfunktion überladen, um die Sprachzeichenfolge für jedes gewünschte Gebietsschema zurückzugeben, abhängig von einem Flag, das Sie in Ihrer geerbten Klasse gesetzt haben.

Anschließend setzen Sie das Flag auf das Gebietsschema, das Sie verwenden möchten, unmittelbar bevor Sie die Seite zum Drucken erstellen und danach wieder festlegen.

+0

Meinen Sie, installieren Sie alle möglichen Übersetzungen in die Anwendung und lassen Sie dann die Klasse QTranslator (abgeleitet) entscheiden, ob sie in der Übersetzung aktiv sein soll oder nicht? –

+0

Nein, laden Sie die Übersetzung zu dem Zeitpunkt, zu dem das Gebietsschema zum Drucken ausgewählt wurde. Wenn Sie nur eine kleine Anzahl von Sprachen haben, können Sie sie alle in den Speicher laden. – TheDarkKnight

0

Ich bin sicher nicht, ob es eine Option, aber Sie können Ihre Anwendung in zwei Teile aufgeteilt:

  • eine Anwendung würde nur drucken die Formen
  • eine andere Anwendung ist die GUI mit Kontrollen

Auf diese Weise Es ist einfach, die Sprache unabhängig einzustellen und beide Anwendungen zu übersetzen.

Verwandte Themen