2017-04-26 6 views
0

Ich benutze Qt und möchte die Texte "nativ" übersetzen, die von Qt Widgets angezeigt werden. Unter "Texte nativ" verstehe ich zum Beispiel die, die in Kontextmenüs für Textänderungen (Kopieren, Einfügen, ...) angezeigt werden. HierQt - Gebaute Übersetzungen verwenden

ist, was ich bereits getan:

#include <QApplication> 
#include <QDebug> 
#include <QTranslator> 

#include <QFile> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QTranslator translator; 
    if(translator.load("qt_fr.qm", QApplication::applicationDirPath())) { 
     qDebug() << a.installTranslator(&translator); 
    } 

    qDebug() << QFile::exists(QApplication::applicationDirPath() + "/qt_fr.qm"); // just to debug file existence 

    // MainWindow w;  // not related to my question 
    // w.showMaximized(); // neither is this 

    return a.exec(); 
} 

Die qt_fr.qm Datei befindet sich auf path_to_qt gelegen/Qt5.6.2/5,6/mingw49_32/Übersetzungen für Qt5.6.2 und MinGW Benutzer . Ich kopiere die genannte Datei in das laufende Softwareverzeichnis, aber der Übersetzer lädt sie immer nicht. Aber wenn ich meine eigene qm-Datei verwende (die aus einer .ts-Datei mit den Qt lupdate- und lrelease-Tools erstellt wurde), wird die qm-Datei ordnungsgemäß geladen und installiert.

Gibt es etwas, das ich vermisse oder falsch mache?

+0

Qt wird zuerst ein Suffix (Standard '.qm') anhängen, also würde ich empfehlen, das aus dem Argument filename zu entfernen. Beachten Sie, dass in der Dokumentation empfohlen wird, die Überladung zu verwenden, die auch ein "QLocale" als erstes Argument akzeptiert. Zum Beispiel 'translator.load (QLocale :: French," qt ", QApplication :: applicationDirPath())'. –

+0

Tatsächlich haben Sie Recht: Der Ladeprozess ist einfach, wenn dem Dateinamen keine Erweiterung hinzugefügt wird. Aber seit Qt Backtracks und Wiederholungen bei fehlgeschlagenem Ladevorgang hat, sollte das Hinzufügen der Erweiterung .qm nicht zum Ausfall geführt haben. Ich habe auch versucht, die Version mit QLocale, aber es funktioniert immer noch nicht. Jeder andere Vorschlag wäre willkommen. – misterFad

+0

Darüber hinaus geht die Verwendung von QLocale davon aus, dass die zu ladende qm-Datei mit der Sprache übereinstimmt, die auf dem Betriebssystem installiert ist, auf dem unsere Software ausgeführt wird. Aber [manchmal] (https://camo.githubusercontent.com/8e48efe46e756e80f900584241c5c108ebc7fcef/68747470733a2f2f757365722e6f632d7374617469632e636f6d2f75706c6f61642f323031372f30312f32362f31343835343536393833393335385f696d6734372e706e67) können wir Englisch wählen, während Deutschsein (zum Beispiel). Das oben angegebene Snippet von mir funktioniert gut, wenn ich meine eigene .qm-Datei (lupdate & lrelease) verwende, aber wenn es darum geht, Qt-eingebaute .qm-Dateien zu laden, schlägt der Ladevorgang fehl. – misterFad

Antwort

1

Ich denke, das Problem kann sein, dass Sie nicht den vollständigen Nachrichtenkatalog kopiert haben. Die folgenden Werke für mich auf einem Debian-System der QM-Dateien in ihren Standard-Standorten mit:

#include <QApplication> 
#include <QDebug> 
#include <QLocale> 
#include <QTranslator> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QTranslator translator; 
    const QString dir = "/usr/share/qt5/translations"; 

    if (translator.load("qt_fr", dir)) { 
     qDebug() << "first load succeeded:" 
       << "'Open' =>" << translator.translate("QShortcut", "Open"); 
    } 

    if (translator.load(QLocale::French, "qt", "_", dir)) { 
     qDebug() << "second load succeeded:" 
       << "'Open' =>" << translator.translate("QShortcut", "Open"); 
    } 
} 

Ausgang ist

first load succeeded: 'Open' => "Ouvrir" 
second load succeeded: 'Open' => "Ouvrir" 

(Ich entfernte die .qm aus dem Dateinamen, wie Qt, die versucht, zuerst und ich habe auch gezeigt, wie man den Dateinamen aus einem bestimmten Gebietsschemaobjekt zusammensetzt.

Wenn wir die qt_fr.qm Datei mit lconvert -of ts /usr/share/qt5/translations/qt_fr.qm untersuchen, können wir es nur eine sehr kleine Datei, die anderen Dateien durch Bezugnahme beinhaltet:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE TS> 
<TS version="2.1" language="fr_FR"> 
<dependencies> 
<dependency catalog="qtbase_fr"/> 
<dependency catalog="qtscript_fr"/> 
<dependency catalog="qtquick1_fr"/> 
<dependency catalog="qtmultimedia_fr"/> 
<dependency catalog="qtxmlpatterns_fr"/> 
</dependencies> 
</TS> 

Ich denke, dass die wahrscheinlichste Ursache der Symptome ist, dass ein oder Weitere der Abhängigkeitsdateien konnten nicht geladen werden. Sie sollten sicherstellen, dass alle diese Dateien am selben Speicherort verfügbar sind, den Sie kopiert haben qt_fr.qm zu - oder, wenn Sie nur die "Basis" Übersetzungen benötigen, kopieren Sie einfach qtbase_fr.qm, und ändern Sie Ihren translator.load() Anruf entsprechend.

+0

In der Tat habe ich die Abhängigkeitsdateien nicht kopiert und deshalb konnte der Übersetzer die qm-Datei immer nicht laden. Ich merke jetzt auch, dass, da ich nur Kontextmenüs für die Textbearbeitung übersetzen möchte, das Laden von ** qtbase_fr ** perfekt zu meinen Bedürfnissen passt und keine Abhängigkeitsdatei benötigt wird. Vielen Dank, ich hätte 10 Stimmen bekommen, wenn ich könnte. :) Wie weißt du über das lconvert-Tool? Das heißt, ich habe noch nie davon gehört, ich bin nicht neu in Qt und es sei denn, jemand hat es mir gesagt, ich kenne keine Zaubertricks, die mir hätten helfen können. _ Sorry für die Zeiten, nicht ein englischer Muttersprachler hier. – misterFad

+1

LConvert scheint nicht sehr bekannt zu sein - es wird nur kurz in der Qt-Dokumentation erwähnt und kommt nicht mit einer Handbuchseite. Alles, was ich darüber weiß, habe ich mit 'lconvert -help' gelernt. Und ja, ich hätte vorschlagen sollen, dass du vielleicht nur die 'qtbase' Übersetzungen benötigst, aber du scheinst das ohne meine Hilfe geschafft zu haben! :-) Ich habe den letzten Absatz für zukünftige Leser etwas überarbeitet. –

+0

BTW, wenn du * wirklich * 10x Upvote geben willst, verdiene einfach ein wenig mehr Reputation, dann kannst du [bounty vergeben] (/ help/priviles/set-bounties). Ich bin aber glücklich ohne, also behalte, was du verdienst. –