QT-使用内置翻译

Qt - Use builtin translations

本文关键字:翻译 内置 QT-      更新时间:2023-10-16

我正在使用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_to_qt/qt5.6.2/5.6/5.6/mingw49_32/translations for 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将首先尝试,并且我还展示了如何从特定语言环境对象中撰写文件名(。

如果我们使用lconvert -of ts /usr/share/qt5/translations/qt_fr.qm检查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.qm,然后更改translator.load()调用。