在 main函数中使用 installTranslator,即可让程序在启动时自动判断语言环境,加载相应语言。
至此,静态语言切换已经完成,下面要做的是动态切换(即不需要重启软件)。
基本步骤:
参考:qt 语言家的使用https://www.cnblogs.com/mzy-google/p/5162118.html
参考教程1:Qt翻译文件结合VS实现语言切换(多语言国际化)https://blog.csdn.net/u012043391/article/details/76684727
参考教程2:在使用Qt5.8完成程序动态语言切换时遇到的问题
一般步骤:
1、创建新的.ts文件
(1)在vs中的工程右键——Creat new translation File
(2)选择要创建的翻译文件,即完成.ts文件的创建
2、lupdate .ts文件即可获取需要翻译的文本,格式如下:
<message>
<location filename="guiforuser.cpp" line="1125"/>
<location filename="guiforuser.cpp" line="1126"/>
<source>上颌牙可见与否</source>
<translation type="unfinished">Upper visible or not</translation>
</message>
source:保存源字符文本,translation 中放入自己的翻译
几个问题:
(1)如何自动识别程序中的文本,需要在qstring前加tr(),才会自动更新在.ts文件中
(2).ts文件乱码问题:vs的字符集要与.ts字符集一致,一般vs中自动生成的.ts字符集为utf-8,那么也需要将相关的源文件字符集设置为utf-8:
设置方式为:选中相应文件——File——Advanced Save Options(高级保存选项)——带符号utf-8(据有些教程说带符号的编码更不容易出错),这里注意需要选中相应源文件(.cpp,.h等),否则找不到这个选项,如下所示:
这里注意每个源文件要单独设置(我没有找到同一设置的方法),否则设置一个对其他源文件无效,可能还是有乱码问题。
编码一致后,就没有乱码的问题了
(3)翻译文本的写入:a\可以直接用文本方式打开.ts文件直接在相应位置写入,b\也可以用Qt Linguist打开进行编辑
3、lrelease,生成.qm文件后加载即可
(1).qm文件的加载代码如下所示:
- QTranslator* translator = NULL;
- //qm文件的加载:
- translator = new QTranslator;
- if (translator->load("test_zh.qm"))
- qApp->installTranslator(translator);
- }
- ui.retranslateUi(this);
(2).qm文件的删除
- //qm文件的删除:
- QTranslator* translator = NULL;
- translator = new QTranslator;
- if (translator->load("test_zh.qm"))
- if (translator != NULL)
- {
- qApp->removeTranslator(translator);
- delete translator;
- translator = NULL;
- }
- ui.retranslateUi(this);
(3)注意:如果源文件语言为中文,加载.qm文件,设置为英文后,想要换为中文的两种方式:
a\创建一个中文的qm文件后加载
b\删除加载的英文文件,但是删除时需要注意translator要是同一个,将其设为类的私有变量,需要删除时删除,否则,重新定义一个变量,加载同一个.qm文件,也删除不成功(原因??)
几个问题:
1、动态切换与静态切换问题
参考:qt多国语言及其动态切换的学习笔记 https://blog.csdn.net/prompty/article/details/51442130
(1)静态切换:
在main函数中写上加载翻译文件语句(在设计文件中也可以,但是要比与ui设计相关的语句先运行)
- QTranslator *translator = new QTranslator;
- if (translator->load("E:/GuiForUser/GuiForUser/guiforuser_en.qm"))
- {
- qApp->installTranslator(translator);
- }
(2)动态切换的问题:
在动态切换中,纯代码设计的语句,比如settext语句,加载翻译文件切换语言之后,settext设计的ui并没有改变,需要重写函数,再加载一次。