A:Qt界面文字国际化
界面文字国际化又分为静态国际化与动态国际化。
静态国际化即启动软件时判断当前语言,在main函数或继承自qappliation的类中,加载qm文件。
1、将代码中手动设置的文字包上,比如:ui.label->setText(tr("文字"));
2、利用creator或者vs的qt插件创建ts文件,通过Qt Linguist打开文件,可以看到所有ui以及代码中使用tr包含的带翻译字符都在这边,手动翻译即可。(ts文件其实可以是xml格式的,可以写个程序把对应的翻译填进去,手动填翻译还是比较痛苦的)
3、保存+发布,发布后生成qm文件。
4、代码中根据当前语言,安装translator。
QTranslator *translator = new QTranslator(this);
if (translator->load(QString("c:/folder.../xxxx.qm"), QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
installTranslator(translator);
动态国际化比较繁琐:
1、创建一个全局或静态的QTranslator变量(通过translator->load去修改加载的qm文件,而不是通过多次installTranslator(translator)修改translator!)。
2、将所有代码中手动设置的文字放到同一个函数下,方便更换语言包时手动调用,调用方式如下:
viod Translation::translatorUi(){
ui.label->setText(tr("文字"));
}
void Translation::changeEvent(QEvent* event) {
if (QEvent::LanguageChange == event->type()) {
translatorUi();
}
return QWidget::changeEvent(event);
}
3、更换完语言包,并调用了步骤2的函数后,还需要在有ui的界面调用ui.retranslateUi(this);(Qt更换语言包不会自动刷新并翻译界面)
总的来说动态国际化很不方便,首先有些代码中的文字时动态加载的,不容易放在同一个函数下,步骤2实现的效果就很差。其次,需要一个容易记录当前所有的ui界面指针,这样操作起来更加复杂了。
参考了微信、飞书等软件,基本都是更换后提示需要重启,然后切换语言。
B:Qt图片国际化
Qt软件基本都会用到带文字的图片,需要翻译图片的基本只能选择静态国际化.
这一类图片也需要在软件启动时加载资源文件。
1、添加多个qrc文件,专门存放不同语言对应的图片,不同语言对应的图片使用相同的别名即Alias:(不需要手动切换图片名)
2、找到qt中rcc.exe目录,运行 rcc.exe -binary xxxx_zh.qrc -o xxx_zh.rcc,生成rcc文件。(rcc放在程序运行目录中)
3、main函数或继承自qappliation的类中,判断当前语言,得出对应的rcc名称及目录。
运行QResource::registerResource(qrcFileName)
提示:生成rcc之后,要从项目中排除qrc,不然没有翻译效果,因为会自动加载第一个qrc中的图片。