1 首先所有需要翻译的文本都必须用tr包裹。
如果是在继承了某个QOjbect类里面使用比如 QWidget 等。可以直接使用tr。例如setText(tr("StopCapture"));
如果没有继承自QObject就必须带上QObject 例如 setText(QObject::tr("StopCapture"));
这里的 StopCapture就是 SourceText
2
生成一个TS文件
在VS当中,点击QT->Create NewTranslate File 选择语言 (假设中文 )会生成一个zh.ts文件。
在QCreator中 linux下要先安装一些tools。sudo apt-get install qttools5-dev-tools
在
xxx.pro文件中
添加
TRANSLATIONS = hm_en.ts hm_zh.ts
填几个最后就有几个
然后点击tools->external->linguist->update translation files 产生ts文件
命令行中输入linguist 打开ts文件进行编辑
TS文件描述了 这个需要被翻译的SourceText的位置,信息 等等。并不是真正编译时需要的文件。
双击这个Ts文件会用Qt语言家打开这个文件。
可以看到上下文 原文以及位置
下面的输入框可以输入你的 译文。输入完毕后。字符串原文前面带有的疑问号会 变色 表明已经有译文了。可以为空也没关系
3将ts文件生成程序需要的 qm文件。qm文件是真正编译时需要的文件资源
QT语言家中点击文件->发布 会在当前目录中生成zh.qm文件。这个文件就是我们需要的资源文件。通过qrc可以导入这个资源文件。
如果需要产生多个语言。可以再生成一个ts文件。按照前面的步骤生成qm文件。再用qrc导入。
4在代码中需要实现的语句。
QApplication app(argc, argv);
QTranslator tr; 产生一个翻译对象
加载翻译文件
tr.load(":/xxx/zh.qm");
整个程序加载翻译文件。
app.installTranslator(&tr)
加载后再调用包含tr的语句。每次动态切换或者Load的时候都需要调用 包含tr的地方。使其生效。
setText(QObject::tr("StopCapture"));
installTranslator可以调用多次。安装多个翻译文件。翻译的时候查找是按照安装的逆顺序。就是先安装的后查找。只要一找到某个符合的翻译就返回
要保证指针的有效性。installTranslator不会复制这个数据。而是只使用指针。所以创建完毕不要删除这个指针。。如果删除了,不会崩溃。只是app就没有这个翻译文件了。
QTranslator析构时会调用app的removeTranslator移除自己哟
installTranslator(zhtr);
installTranslator(entr);
先安装 zhtr 再entr 查找时先查找entr 如果没有找到再查找zhtr.在没有就使用sourceText.
假设 sourceText 也就是源码中的是 SSS zh翻译是ZZZ en翻译是 EEE
查找的顺序是 EEE--->ZZZZ---->SSSS 找到任意一个符合的就返回,不再继续查找。
zh AAA 0 BBB 0
en 0 CCC 0 0
src 0 0 0 DDD
那么最终翻译结果是 AAA CCC BBB DDD
removeTranslator会移除某个翻译文件。但是不从系统中删除他。也就是指针不删除,你要自己删除。