>问题
我需要翻译一个在BeagleBone Black上运行的Qt 4.8.6应用程序。这是我无法运行的简单测试的代码:
主.cpp
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QTranslator translator;
QString file(a.applicationDirPath() + "/test_pt_BR.qm");
qDebug() << "Translation file:" << file;
qDebug() << "File exists: " << QFile::exists(file);
qDebug() << "translator.load: " << translator.load(file);
qDebug() << translator.translate("global", "Testing translation functionality in Qt.");
return a.exec();
}
在我的 .pro 文件中包含TRANSLATIONS += test_pt_BR.ts
后,我能够成功运行lupdate工具。在生成的文件中,我只手动编辑了<translation>
标签。
test_pt_BR.ts
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="pt_BR">
<context>
<name>global</name>
<message>
<location filename="main.cpp" line="15"/>
<source>Testing translation functionality in Qt.</source>
<translation>Testando a funcionalidade de tradução no Qt.</translation>
</message>
</context>
</TS>
我也能够成功运行lrelease工具。test_pt_BR.qm
文件将部署到与应用程序可执行文件相同的文件夹中。以下是打印的输出:
Translation file: "/root/TranslationTest/test_pt_BR.qm"
File exists: true
translator.load: false
""
在我看来,翻译文件位于正确的位置,但Qt无法正确加载。QTranslator::load()
方法只返回一个布尔值,所以我看不出到底出了什么问题。
另一种方法
为了确保问题不在于查找或打开正确的文件,我尝试使用QTranslator的另一个重载::load()。
主.cpp
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QTranslator translator;
QFile file(a.applicationDirPath() + "/test_pt_BR.qm");
QByteArray data;
qDebug() << "Translation file:" << file.fileName();
qDebug() << "File open: " << file.open(QFile::ReadOnly);
data = file.readAll();
qDebug() << "File size: " << data.size();
qDebug() << "translator.load: " << translator.load((uchar*) data.data(), data.size());
qDebug() << translator.translate("global", "Testing translation functionality in Qt.");
return a.exec();
}
似乎会出现相同的问题:
Translation file: "/root/TranslationTest/test_pt_BR.qm"
File open: true
File size: 196
translator.load: false
""
一个可能相关的细节是:当我在 Ubuntu 环境中安装 Qt 框架时,除了lrelease,我无法编译语言学家工具。我可以获得lupdate的唯一方法是运行没有-embedded arm
选项的配置脚本,我使用它来开发在 BeagleBone Black 上运行的应用程序。因此,即使lupdate工具正常运行,我也不确定它是否与嵌入的 Qt "兼容"。
>我仍然无法QTranslator::load()
工作,所以我使用了另一种策略:我编写了一个从QTranslator
派生的CustomTranslator
类。QTranslator::translate()
方法是虚拟的,因此我能够重写它以返回我放入类中的硬编码字符串。
这不是完美的解决方案,但我非常满意我可以在我的应用程序中安装这个CustomTranslator
,以便设计器中的可翻译文本自动翻译。如果我将来能够解决QTranslator::load()
问题,我只需要交换翻译器即可使其工作。