未加载 Qt Linguist QM 文件
Qt Linguist QM file not being loaded
我在 Windows 10.
上使用 QT Linguist 5.13.2
该项目有许多翻译文件,除了意大利语的翻译文件外,都可以使用。
这是相关代码的片段,其中选项映射到 qm
文件:
void Stg::initTranslators()
{
_translatorEn = new QTranslator(this);
_translatorPl = new QTranslator(this);
_translatorFr = new QTranslator(this);
_translatorDe = new QTranslator(this);
_translatorNl = new QTranslator(this);
_translatorEs = new QTranslator(this);
_translatorIt = new QTranslator(this);
_translatorPt = new QTranslator(this);
_translatorAr = new QTranslator(this);
_translatorZh = new QTranslator(this);
_translatorEn->load(QStringLiteral(":/translation/translation/trn_en.qm"));
_translatorPl->load(QStringLiteral(":/translation/translation/trn_pl.qm"));
_translatorFr->load(QStringLiteral(":/translation/translation/trn_fr.qm"));
_translatorDe->load(QStringLiteral(":/translation/translation/trn_de.qm"));
_translatorNl->load(QStringLiteral(":/translation/translation/trn_nl.qm"));
_translatorEs->load(QStringLiteral(":/translation/translation/trn_es.qm"));
_translatorIt->load(QStringLiteral(":/translation/translation/trn_it.qm")); // Italian
_translatorPt->load(QStringLiteral(":/translation/translation/trn_pt.qm"));
_translatorAr->load(QStringLiteral(":/translation/translation/trn_ar.qm"));
_translatorZh->load(QStringLiteral(":/translation/translation/trn_zh.qm"));
}
在选择语言时的代码中执行此代码以设置语言:
switch (_appLanguage) {
case LANG_EN : { qApp->installTranslator(_translatorEn); } break;
case LANG_PL : { qApp->installTranslator(_translatorPl); } break;
case LANG_FR : { qApp->installTranslator(_translatorFr); } break;
case LANG_DE : { qApp->installTranslator(_translatorDe); } break;
case LANG_NL : { qApp->installTranslator(_translatorNl); } break;
case LANG_ES : { qApp->installTranslator(_translatorEs); } break;
case LANG_IT : { qApp->installTranslator(_translatorIt); } break; // Italian
case LANG_PT : { qApp->installTranslator(_translatorPt); } break;
case LANG_AR : { qApp->installTranslator(_translatorAr); } break;
case LANG_ZH : { qApp->installTranslator(_translatorZh); } break;
default : { } break;
}
除意大利语外,所有语言均可正确切换。
为了确定问题是出在翻译文件还是切换代码,我将意大利语选项的映射更改为阿拉伯语:
_translatorIt->load(QStringLiteral(":/translation/translation/trn_ar.qm")); // Italian
选择意大利语时,语言设置会切换为阿拉伯语,这表明问题出在 trn_it.ts
and/or 生成的 trn_it.qm
.
当我将 trn_it.ts
文件加载到 Qt Linguist 时,它没有报告任何错误,并且生成的 trn_it.qm
文件(通过文件 -> 发布)大小合适(作为其他语言 qm
个文件)。
在 trn_it.ts
和 trn_de.ts
文件之间执行 diff
显示唯一的区别是预期的 <translation>
元素。其他都一样。
这是一个片段:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="en_US">
<context>
<name>AboutDialog</name>
<message>
<location filename="ui/aboutdialog.cpp" line="90"/>
<location filename="ui/aboutdialog.cpp" line="98"/>
<source>Unregistered</source>
<translation>Non registrato</translation>
</message>
我无法解释这一点,以及如何进一步调试它。
经过反复试验,我发现意大利语翻译不起作用的原因是 trn_it.qm
文件(新文件)没有作为资源添加(例如通过 Qt Creator)项目。
一旦完成,清理和重建就可以了。
我在 Windows 10.
上使用 QT Linguist 5.13.2该项目有许多翻译文件,除了意大利语的翻译文件外,都可以使用。
这是相关代码的片段,其中选项映射到 qm
文件:
void Stg::initTranslators()
{
_translatorEn = new QTranslator(this);
_translatorPl = new QTranslator(this);
_translatorFr = new QTranslator(this);
_translatorDe = new QTranslator(this);
_translatorNl = new QTranslator(this);
_translatorEs = new QTranslator(this);
_translatorIt = new QTranslator(this);
_translatorPt = new QTranslator(this);
_translatorAr = new QTranslator(this);
_translatorZh = new QTranslator(this);
_translatorEn->load(QStringLiteral(":/translation/translation/trn_en.qm"));
_translatorPl->load(QStringLiteral(":/translation/translation/trn_pl.qm"));
_translatorFr->load(QStringLiteral(":/translation/translation/trn_fr.qm"));
_translatorDe->load(QStringLiteral(":/translation/translation/trn_de.qm"));
_translatorNl->load(QStringLiteral(":/translation/translation/trn_nl.qm"));
_translatorEs->load(QStringLiteral(":/translation/translation/trn_es.qm"));
_translatorIt->load(QStringLiteral(":/translation/translation/trn_it.qm")); // Italian
_translatorPt->load(QStringLiteral(":/translation/translation/trn_pt.qm"));
_translatorAr->load(QStringLiteral(":/translation/translation/trn_ar.qm"));
_translatorZh->load(QStringLiteral(":/translation/translation/trn_zh.qm"));
}
在选择语言时的代码中执行此代码以设置语言:
switch (_appLanguage) {
case LANG_EN : { qApp->installTranslator(_translatorEn); } break;
case LANG_PL : { qApp->installTranslator(_translatorPl); } break;
case LANG_FR : { qApp->installTranslator(_translatorFr); } break;
case LANG_DE : { qApp->installTranslator(_translatorDe); } break;
case LANG_NL : { qApp->installTranslator(_translatorNl); } break;
case LANG_ES : { qApp->installTranslator(_translatorEs); } break;
case LANG_IT : { qApp->installTranslator(_translatorIt); } break; // Italian
case LANG_PT : { qApp->installTranslator(_translatorPt); } break;
case LANG_AR : { qApp->installTranslator(_translatorAr); } break;
case LANG_ZH : { qApp->installTranslator(_translatorZh); } break;
default : { } break;
}
除意大利语外,所有语言均可正确切换。
为了确定问题是出在翻译文件还是切换代码,我将意大利语选项的映射更改为阿拉伯语:
_translatorIt->load(QStringLiteral(":/translation/translation/trn_ar.qm")); // Italian
选择意大利语时,语言设置会切换为阿拉伯语,这表明问题出在 trn_it.ts
and/or 生成的 trn_it.qm
.
当我将 trn_it.ts
文件加载到 Qt Linguist 时,它没有报告任何错误,并且生成的 trn_it.qm
文件(通过文件 -> 发布)大小合适(作为其他语言 qm
个文件)。
在 trn_it.ts
和 trn_de.ts
文件之间执行 diff
显示唯一的区别是预期的 <translation>
元素。其他都一样。
这是一个片段:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="en_US">
<context>
<name>AboutDialog</name>
<message>
<location filename="ui/aboutdialog.cpp" line="90"/>
<location filename="ui/aboutdialog.cpp" line="98"/>
<source>Unregistered</source>
<translation>Non registrato</translation>
</message>
我无法解释这一点,以及如何进一步调试它。
经过反复试验,我发现意大利语翻译不起作用的原因是 trn_it.qm
文件(新文件)没有作为资源添加(例如通过 Qt Creator)项目。
一旦完成,清理和重建就可以了。