Qt 国际化翻译,函数外部字符串Map 翻译(QT_TRANSLATE_NOOP)
Posted 火山上的企鹅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt 国际化翻译,函数外部字符串Map 翻译(QT_TRANSLATE_NOOP)相关的知识,希望对你有一定的参考价值。
文章目录
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 命令生成:
使用 lupdate TranslationsDemo.pro
生成了 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
显示:
以上是关于Qt 国际化翻译,函数外部字符串Map 翻译(QT_TRANSLATE_NOOP)的主要内容,如果未能解决你的问题,请参考以下文章
Qt 国际化翻译,函数外部字符串Map 翻译(QT_TRANSLATE_NOOP)