C++ Qt-使用内置翻译

C++ Qt-使用内置翻译,c++,qt,translation,qtranslator,C++,Qt,Translation,Qtranslator,我正在使用Qt,希望翻译Qt小部件显示的“本机”文本。例如,通过“文本本机显示”,我指的是上下文菜单中显示的文本编辑(复制、粘贴等) 以下是我已经做过的: #include <QApplication> #include <QDebug> #include <QTranslator> #include <QFile> int main(int argc, char *argv[]) { QApplication a(argc, argv

我正在使用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();
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
翻译;
if(translator.load(“qt_fr.qm”,QApplication::applicationDirPath())){

qDebug()我认为问题可能在于您没有复制完整的消息目录。以下内容适用于我在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");
    }
}
(我从文件名中删除了
.qm
,因为Qt将首先尝试,并且我还展示了如何从特定的语言环境对象组合文件名)

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



我认为您出现症状的最可能原因是无法加载一个或多个依赖项文件。您应该确保所有这些文件都位于您复制到的同一位置,或者,如果您只需要“基本”文件翻译,只需复制
qtbase\u fr.qm
,并适当更改您的
translator.load()
调用。

我认为问题可能是您没有复制完整的消息目录。以下内容适用于我在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");
    }
}
(我从文件名中删除了
.qm
,因为Qt将首先尝试,并且我还展示了如何从特定的语言环境对象组合文件名)

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



我认为您出现症状的最可能原因是无法加载一个或多个依赖项文件。您应该确保所有这些文件都位于您复制到的同一位置,或者,如果您只需要“基本”文件翻译,只需复制
qtbase\u fr.qm
,并适当更改
translator.load()
调用。

Qt将附加后缀(默认值
.qm
)首先,我建议将其从filename参数中删除。请注意,文档建议使用重载,该重载也接受
QLocale
作为第一个参数。例如,
translator.load(QLocale::French,“qt”,QApplication::applicationDirPath())
。的确,你是对的:如果没有向文件名添加扩展名,则加载过程很简单。但是由于加载失败时Qt会回溯并重试,因此添加.qm扩展名不应导致失败。我也尝试了使用QLocale的版本,但仍然不起作用。欢迎任何其他建议。此外,使用QLocale假设我们加载的qm文件与运行我们软件的操作系统上安装的语言相匹配。但我们可以选择英语,而不是德语(例如)。当我使用自己的.qm文件(lupdate&lrelease)时,上面提供的我的代码片段可以正常工作但是当加载Qt builtin.qm文件时,加载过程失败。我的注释只是一个“最佳实践”,而不是一个解决方案(这就是为什么它是注释而不是答案)。但它肯定允许使用操作系统不支持的区域设置-因此我使用了
QLocale::French
(隐式地说,是接受
QLocale::Language
)而不是简单地接受
QLocale{}的构造函数
。至于解决这个问题,我有兴趣阅读一些实际的答案,并为自己学习更多有关Qt翻译的知识。你肯定是对的。文档中甚至有这样一句话:真丢脸。无论如何,希望有人能为我提供一个解决方案,因为Qt内置.qm文件的部署方式似乎与我会自己创建(使用lupdate和lrelease),但我没有使用各种版本的Qt。Qt会附加一个后缀(默认值
.qm
)首先,我建议将其从filename参数中删除。请注意,文档建议使用重载,该重载也接受
QLocale
作为第一个参数。例如,
translator.load(QLocale::French,“qt”,QApplication::applicationDirPath())
。的确,你是对的:如果没有向文件名添加扩展名,则加载过程很简单。但是由于加载失败时Qt会回溯并重试,因此添加.qm扩展名不应导致失败。我也尝试了使用QLocale的版本,但仍然不起作用。欢迎任何其他建议。此外,使用QLocale假设我们加载的qm文件与运行我们软件的操作系统上安装的语言相匹配。但我们可以选择英语,而不是德语(例如)。当我使用自己的.qm文件(lupdate&lrelease)时,上面提供的我的代码片段可以正常工作但是当加载Qt builtin.qm文件时,加载过程失败。我的注释只是一个“最佳实践”,而不是一个解决方案(这就是为什么它是注释而不是答案)。但它肯定允许使用操作系统不支持的区域设置-因此我使用了
QLocale::French
(隐式地说,是接受
QLocale::Language
)而不是简单地接受
QLocale{}的构造函数
。至于解决这个问题,我有兴趣阅读一些实际的答案,并为自己学习更多有关Qt翻译的知识。你肯定是对的。文档中甚至有这样一句话:真丢脸。无论如何,希望有人能为我提供一个解决方案,因为Qt内置.qm文件的部署方式似乎与我要创造的