2017-06-15 19 views
4

Nach mehreren Wochen von On-und-off Forschung, ich habe noch nicht eine gründliche Anleitung, wie man gefunden Übersetzung/Lokalisierung in QtQuick durchzuführen (wie in die QML-Sprache, nicht C++ oder Python).Lokalisierung in QtQuick von oben nach unten

Im Allgemeinen frage ich, was sind die Schritte, um ein Projekt so viel in QtQuick wie möglich zu lokalisieren, mit minimal oder vorzugsweise ohne C++.

Genauer gesagt, gibt es eine gute Anzahl von Löchern, die ich in meinem Verständnis davon füllen muss, wie QtQuick Lokalisierung handhabt.

Bisher habe ich:

  • Appended QT_TR_NOOP(), um alle meine übersetzbaren Strings für die Übersetzung zur Laufzeit

  • hinzugefügt meine Datei alle Strings in meine .pro-Datei mit lupdate_only mit {QUELLEN + = LanguageStrings.qml}

  • Badische Dateien mit QtLinguist

jedoch beabsichtige ich, für die dynamische Änderung der Sprache eine Option zu implementieren, und das einzige Beispiel, das ich in Bezug auf Übersetzung gesehen habe, die nicht vollständig in C++ war im Wesentlichen eine Instanz des Projekts für jede Sprache erstellt, anstatt die Saiten zu ändern zur Laufzeit. So

, wie ändere ich die Sprache zur Laufzeit? Gibt es eine Variable, die ich einstellen kann? Wird es aus dem Systemgebietsschema gezogen? Ich habe dazu keine solide Antwort gefunden.

Irgendwelche Ideen?

Antwort

2

Sie können dies mit minimalen C++ (zumindest ich denke, das ist minimal). Ich habe dies in der Vergangenheit getan, um das Gebietsschema des Systems mit der App auf wie diese installiert ist (direkt in main()):

QGuiApplication app(argc, argv); 

QTranslator translator; 

if(translator.load(":/translations/myapp_" + QLocale::system().name())) { 
    app.installTranslator(&translator); 
} else { 
    qDebug() << "Unable to load translation"; 
} 

Die Übersetzungen müssen in dem Ressource-System für die oben sein zu arbeiten, . Sie können das oben genannte natürlich basierend auf Benutzereingaben von QML (z. B. in den Einstellungen Ihrer App) zur Laufzeit auslösen. Hier ist ein Beispielcode, um dies zu tun(). Mir ist keine QML-einzige Möglichkeit bekannt, dies zu tun.

habe ich versucht, etwas anderes, was auch funktioniert. Sie können Ihre Benutzeroberfläche in einem Loader-Element haben und einfach die setSource-Funktionen dieses Elements verwenden, nachdem der Übersetzer geändert wurde. Ich habe schnell ein kleines Beispiel zusammengestellt, das auch ein Beispiel enthält, wie Benutzeroberflächenelemente außerhalb des Loaders geändert werden können, falls dies erforderlich ist (https://github.com/Conntac/qtExamples).

+0

Danke! Das sieht so aus, wie ich es brauche, und Ihre C++ - Implementierung sieht viel sauberer aus als die im Wiki, die leider nicht auf der neuesten Version von QtQuick2 funktioniert. Dass gesagt wird, wie würden Sie empfehlen ich „... die oben basierend auf Benutzereingaben von QML auslösen zur Laufzeit“? Was wäre der Code dafür? – NGXII

+0

Schauen Sie sich den Link an. Es enthält den QML- und den C++ - Code, aber auch eine Projektdatei und die notwendigen Schritte, um alles zusammen zu bündeln. Die allgemeine Idee ist, ein Objekt von C++ über setContextProperty in QML zu exportieren. Das Objekt ist dann unter dem angegebenen Namen in QML verfügbar. Der Rest ist wirklich einfach. Im Beispiel haben sie drei Buttons und innerhalb des onClicked-Slots rufen Sie einfach eine Funktion dieses Objekts auf. Vergessen Sie nicht, vor der Funktion, die Sie von QML aufrufen möchten, das Makro Q_INVOKABLE hinzuzufügen (http: //doc.qt.io/qt-5/qtqml-cppintegration-exposedcppattributes.html). –

Verwandte Themen