Qt - 使用内置翻译
Qt - Use builtin translations
我正在使用 Qt 并想翻译 Qt 小部件显示的文本 "natively"。 "texts natively shown" 例如,我指的是文本编辑(复制、粘贴等)上下文菜单中显示的内容。
这是我已经完成的:
#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/translations对于 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
复制到的相同位置可用 - 或者,如果您只需要 "base" 翻译,只需复制 qtbase_fr.qm
,然后更改您的 translator.load()
适当调用。
我正在使用 Qt 并想翻译 Qt 小部件显示的文本 "natively"。 "texts natively shown" 例如,我指的是文本编辑(复制、粘贴等)上下文菜单中显示的内容。
这是我已经完成的:
#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/translations对于 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
复制到的相同位置可用 - 或者,如果您只需要 "base" 翻译,只需复制 qtbase_fr.qm
,然后更改您的 translator.load()
适当调用。