GitHub 源码: QmlLearningPro ,选择子工程:TranslationsDemo.pro
QML 其它文章请点击这里: QT QUICK QML 学习笔记
1. Qt 的翻译流程
翻译流程:Qt Quick QML 实例之疯狂数字游戏(QML C++混合编程、翻译、QSetting ) 中的翻译部分:
1)准备要翻译的源代码
在 QML 中使用 qsTr() 来包裹,在 cpp 中使用 tr() 来包裹。用它包裹的文本会被 Qt Linguist(Qt 语言家)捕捉到从而进行翻译工作。
//main.qml
text: qsTr("Correct")
2)生成 xxx.ts 文件
先在 TranslationsDemo.pro 文件中添加如下代码:
TRANSLATIONS += $$PWD/Translations/zh_CN.ts
可以使用两种方法生成:
① 在 Qt Creator 的菜单栏中依次点击 工具->外部->Qt语言家->发布更新翻译(lrelease)(lupdate),就会在源代码文件所在的目录生成 ts 文件。
② 使用 CMD 命令生成:
常用指令:
① 切换硬盘目录,输入盘+冒号,如: c: 、d:、e:
② dir 列举目录(相当于ls)
③ cd 进入目录(一样)
④ table 补全命令(一样)
使用 lupdate TranslationsDemo.pro
生成了 ts 文件
第一次使用,生产翻译文档
lupdate -verbose TranslationsDemo.pro
lrelease -verbose zh_CN.ts
后续经常使用
更新翻译
lrelease -verbose zh_CN.ts
3) 可在 qml.qrc 中添加 zh_CN.ts
4)翻译并生成 qm 文件
方法一: 右键打开翻译文件 zh_CN.ts
翻译后发布:
生成了 zh_CN.qm 文件
方法二,执行指令:
lrelease -verbose zh_CN.ts
生成了 zh_CN.qm 文件
5)添加 zh_CN.qm 文件到 qml.qrc 中:
6)加载 qm 翻译文件
在 main.cpp 中加载生成的 qm 文件
void setLanguage(QGuiApplication *app) {
QLocale locale = QLocale::system();
if(locale.language() == QLocale::Chinese)
{
QTranslator *translator = new QTranslator(app);
///--以下三种方法都可以加载翻译文件
if(translator->load(":/translations/zh_CN.qm"))
// if(translator->load(locale, ":/translations/zh_CN.qm", "", ":/i18n"))
// if (translator->load(locale, "zh_CN", ".", ":/translations", ".qm"))
{
app->installTranslator(translator);
}
else {
qDebug() << "Error loading source localization ";
}
}
}
最后编译即可。
2. 利用 QT_TRANSLATE_NOOP 翻译
在 .cpp 文件中普通的翻译加入 tr() 字段包裹即可,这里不多介绍。
而利用 QT_TRANSLATE_NOOP 能翻译函数外的多个字符串段 和 map 中翻译
1)函数内的字符串,如 map 中:
如果直接用 tr() 包裹是行不通的,用 QT_TRANSLATE_NOOP 即可。
具体见源码,这里只摘取片段:
① TranslationTest.cpp
QStringList TranslationTest::GetQStringList() {
QStringList tmp;
QMap<uint32_t, QString> flightMode = {
{ STABILIZE, AppTranslate("Stabilize")}, //
{ ALT_HOLD, AppTranslate("Altitude Hold")},
{ POS_HOLD, AppTranslate("Position Hold")}
};
for(uint32_t i: flightMode.keys()) {
tmp.append(flightMode[i]); // tmp << enumToString[i];
}
return tmp;
}
QString TranslationTest::AppTranslate(const char* cchar)
{
const char* context = "ContextTest";
return _app->translate( context, QT_TRANSLATE_NOOP(context, cchar));
}
② TranslationTest.h
Q_PROPERTY(QStringList qStringListTest READ GetQStringList CONSTANT)
③ 翻译文件 zh_CN.ts
<context>
<name>ContextTest</name>
<message>
<location filename="../TranslationTest.cpp" line="63"/>
<source>Stabilize</source>
<translation>增稳</translation>
</message>
<message>
<location filename="../TranslationTest.cpp" line="50"/>
<source>Altitude Hold</source>
<translation>高度保持</translation>
</message>
<message>
<location filename="../TranslationTest.cpp" line="50"/>
<source>Position Hold</source>
<translation>位置保持</translation>
</message>
</context>
④ ui中:main.qml
Repeater {
id: repeater
model: TranslationTest.qStringListTest
Label {
text: modelData
font.pointSize: 15
font.bold: true //黑体
}
}
2)函数外的字符串
① TranslationTest.cpp:
const char *MathProblem::greeting_strings[] = {
QT_TRANSLATE_NOOP( "FriendlyConversation", "Hello"),
QT_TRANSLATE_NOOP( "FriendlyConversation", "Goodbye")
QT_TRANSLATE_NOOP( "FriendlyConversation", "How are you")
};
QString TranslationTest::globalGreeting(int type)
{
return _app->translate( "FriendlyConversation", greetingStrings[type]);
}
② TranslationTest.h:
Q_INVOKABLE QString globalGreeting(int type) ;
③ 翻译文件 zh_CN.ts
<context>
<name>FriendlyConversation</name>
<message>
<location filename="../TranslationTest.cpp" line="50"/>
<source>Hello</source>
<translation>你好</translation>
</message>
<message>
<location filename="../TranslationTest.cpp" line="50"/>
<source>Goodbye</source>
<translation>再见</translation>
</message>
<message>
<location filename="../TranslationTest.cpp" line="50"/>
<source>How are you?</source>
<translation>你好吗?</translation>
</message>
</context>
④ ui:main.qml:
Label {
text: TranslationTest.globalGreeting(0)
font.pointSize: 15
}
Label {
text: TranslationTest.globalGreeting(1)
font.pointSize: 15
}
显示: