Qt国际化,我们通常都知道,字符串包上tr,然后翻译源文件,然后加载一个翻译文件即可实现翻译。
但是大家仍然会很疑问,我这样做了:
QTranslator translator;
qApp.installTranslator(&translator);
translator.load("myChinese.qm");
但是为什么我的界面上的文字不变呢?
加载是应该的,没有显示也是正常的,关键在于,这时候我们需要重新给我们的界面设置一下文本。
比如,我们接着上面的代码:
button->setText(tr("Hello"));
这时候我们发现,我们的button是能够在重新加载翻译文件之后改变其显示内容为加载的翻译文件的语言的。
所以说,仅仅加载翻译文件是不够的,还需要对我们所有控件上显示的文字重新set一下。加载了新的翻译文件之后再set的界面上的文字,采用的才是我们翻译文件中对应的文本内容。
从本质上讲,Qt的国际化,或者所谓的“动态翻译”,也没有什么高深的地方,不过就是以文件的形式提供了两种语言的unicode码的映射关系。它不会在你加载了新的翻译文件后让所有的控件都能获知这件事情的发生,当然也不会在你加载了新的翻译文件后主动变换你显示的内容,只会在你重新调用相关的函数设置你的控件的文本的时候才会选择去从你的翻译文件中查找对应的翻译过的字符串。
当然,如果我们按照比较标准的设计手段,使用设计器设计界面,代码中实现逻辑功能,那么这个动态翻译工作还是比较简单的,因为ui生成的文件自动就有一个retranslate函数,我们在加载完新的翻译文件之后,再次调用该函数,就能够实现界面语言的切换了。当然,如果那些没有在设计器中设计的控件,我们就需要另外再去调用它的设置文本函数了。