无法在嵌入式 Qt 中加载转换器



>问题

我需要翻译一个在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()问题,我只需要交换翻译器即可使其工作。

最新更新