QML语言国际化

Qt,QML翻译,语言国际化,大概的操作过程与代码的编写,就是书写需要翻译的字符串加上翻译标识,通过配置工程文件生成需要的ts文件,修改ts文件,发布生成需要的qm文件,然后在CPP 上加载设置需要的翻译文件。具体下面说明

一,在工程文件上添加

TRANSLATIONS += \
internationalization/os_language_English.ts \
    internationalization/os_language_German.ts \
internationalization/os_language_ChineseTraditional.ts \
    internationalization/os_language_ChineseSimpilifed.ts \

//表示在更新翻译时生出的ts文件,注意路径


二,在工程文件上添加
lupdate_only{
    SOURCES += \
*.qml\
setting/*.qml\
}

//表示添加需要翻译的文件

三,工程文件配置后,运行lupdate,点击(工具->外部->Qt语言家->更新翻译(lupdate));
这时候就从运用程序中,工程文件上(lupdate_only)添加的翻译文件,提取所有经过qsTr()标识过的字符串(qsTr("hello")),生成后缀为.ts文件,文件的命名和路径工程文件配置。

四,使用Qt Linguist打开翻译需要翻译的.ts文件,然后在Linguist 发布生成相应的qm文件(文件->发布);或者使用QT(工具->外部->Qt语言家->更新翻译(lrelease))发布生成相应的qm文件。

注意的在电脑上调试运行,不需要添加入qrc资源文件也是可以的,如果不是,我们需要将qm文件添加到qrc资源文件上。(好像也不能这么说,重点是能够让程序找的到qm的位置)


五,上面四个步骤只是提供了翻译的基础,上面已经制作出我们翻译需要的qm文件,现在我们需要加载我们所需要的翻译文件,这时候我们需要用到Qt的一个语言类QTranslator,需要包含头文件#include <QTranslator>。

QTranslator translator;
ret = translator.load(("internationalization/os_language_English.qm"), ".");

if(ret)qApp->installTranslator(&translator); 

如果不成功,注意的是上面的三步操作是在,窗口创建之前,app创建之后操作 。


六,上述的操作虽然能够满足我们加载不同的翻译,但是注意的是得在窗口创建之前加载,这个条件和我们所需要的在窗口加载后进行多种语言切换不相符合。所以我们需要加载后进行刷新语言显示,根据qt的一个信号触发刷新机制,我们需要在翻译的字符串后面加上一个类型为字符串的变量,并且这个变量值的读取函数返回空字符,这样就不会影响我们的文本显示。但是这个变量的定义方式和之前有区别。

public: Q_PROPERTY(QString emptyString READ getEmptyString NOTIFY languageChanged)
QString getEmptyString() {//languageChanged触发,刷新
    return "";
}
qml写法:text: qsTr("oven_status:") + myovenbar.emptyString;

主意:languageChanged需要定义,在需要切换语言后触发该信号,刷新界面显示。
需要详细了解宏Q_PROPERTY:http://blog.csdn.net/dreamsongo/article/details/77585470



七,总结
1.Qt,QML的翻译原理其实就是根据我们上述第五点所设置的选中的翻译文件进行相应的替换操作。所有是根据每一个文件来进行进行翻译。意思是说当同一个单词在a.qml上翻译了,b.qml上同样的一个单词不显示翻译,当然,如果你重新执行翻译发布可能qt会自动帮你在b.qml上根据a.qml上的内容给出翻译。

2.上面有说过更新翻译生成ts文件是根据字符串有没被qsTr()标识,但这不是唯一一种标识,在qml中Listview的数据模式ListModel的ListElement中可以使用QT_TR_NOOP()来标识。

 ListElement {menuName: QT_TR_NOOP("NONE");}

在QML中可以使用qsTr(), qsTranslate(), QT_TR_NOOP()和QT_TRANSLATE_NOOP等函数将字符串标记为可翻译的(2,4没有验证)


3,还没有说到的一点是,但我们不想要使用加载的翻译文件时,我们可以使用
 qApp->removeTranslator(translator);来移除掉。

4,还有一个值得注意的是,在帮助文档中关于QTranslator::load有这样一句话
The data is not copied. The caller must be able to guarantee that data will not be deleted or modifiled
  这段话明确的说明了,QTranslator在load以后,并没有把qm文件中的数据拷贝一份,而是在需要的时候去查询字符串。如果qm在这期间被删除或修改,对程序都是有影响的。扩展开来,QTranslator必须保证要一直有效,如果在函数中定义的局部变量,函数结束后就自动释放掉了,那么翻译工作就不能正常进行。所以建议在private中定义个成员变量 QTranslator* app_translator;来确保整个翻译工作的正确性(这个观点没有经过验证)


Linguist打开ts文件效果图:







猜你喜欢

转载自blog.csdn.net/DreamSonGO/article/details/77586631