Qt - 使用内置翻译

时尚先生

我正在使用 Qt 并希望翻译 Qt 小部件显示的“本机”文本。例如,通过“本地显示的文本”,我指的是上下文菜单中显示的文本编辑(复制、粘贴……)。

这是我已经完成的:

#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();
}

qt_fr.qm文件位于path_to_qt / Qt5.6.2 / 5.6 / mingw49_32 /翻译为Qt5.6.2和MinGW用户。我将上述文件复制到正在运行的软件目录中,但翻译器总是无法加载它。但是当我使用我自己的 qm 文件(使用 Qt lupdate 和 lrelease 工具从 .ts 文件构建)时,qm 文件被正确加载和安装。

我有什么遗漏或做错了吗?

托比·斯佩特

我认为问题可能是您没有复制完整的消息目录。以下在 Debian 系统上对我有用,在其标准位置使用 QM 文件:

#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");
    }
}

输出是

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

(我.qm从文件名中删除了,因为 Qt 将首先尝试这样做,并且我还展示了如何从特定的语言环境对象组成文件名)。

如果我们qt_fr.qm使用 来检查文件lconvert -of ts /usr/share/qt5/translations/qt_fr.qm,我们可以看到它只是一个非常小的文件,通过引用合并了其他文件:

<?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>

我认为导致您出现症状的最可能原因是无法加载一个或多个依赖项文件。您应该确保所有这些文件都在您复制qt_fr.qm的同一位置可用- 或者,如果您只需要“基本”翻译,只需复制qtbase_fr.qmtranslator.load()适当更改您的电话。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章