1.前言
一般我们在写一些大型的项目时,会将系统功能分为多个子功能模块进行实现。各个子功能可以单独由某个人来实现,然后将其导出为dll文件。主程序再导入这些dll,使用其功能。
而有多语言要求时,子模块的负责人除了提供dll外,还可以提供其模块对应的ts/qm翻译文件,以供主程序进行多语言切换处理。
2.例子
目前我们有两个工程:MainModule、subModule。
subModule是一个库工程,会生成subModule.dll动态库。
MainModule是一个主程序工程,会调用subModule.dll,从而使用其中的类、函数。
在subModule.pro添加一句代码,让其可以输出翻译文件subModule_en.ts,然后利用QtLinguist翻译出.qm文件。
subModule.pro
...
TRANSLATIONS += lang/subModule_en.ts
...
同时,在MainModules.pro中也加一句
subModule.pro
...
TRANSLATIONS += lang/mainModule_en.ts
...
如此一来,经过lupdate、Qt语言家翻译、发布之后,便可以分别得到subModule_en.qm、mainModule_en.qm
然后,就可以在mainModule中的main函数中,分别加载这两个翻译文件。
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTranslator trans1;
trans1.load("lang/mainModule_en.qm");
QCoreApplication::installTranslator(&trans1);
QTranslator trans2;
trans2.load("lang/subModule_en.qm", ".");
QCoreApplication::installTranslator(&trans2);
MainWindow w;
w.show();
return a.exec();
}
可以试一下分别注释trans1、trans2,看看有什么效果。
3.注意事项
3.1.在继承QObject的类中,一定一定不要忘记加上 Q_OBJECT
否则即使你在这个类中用tr包围了你想要翻译的文字、lupdate也导出、生成了qm文件、使用QTranslator加载了、也QCoreApplication::installTranslator了,程序运行时依然还是没有翻译。
3.1.假如子模块中有文字和主模块文字相同,Qt也会自动区分,不用担心冲突的问题
比如子模块中有 tr(“中文”),主模块中也有 tr(“中文”)。然后将子模块的 tr(“中文”)翻译为Chinese_subModule,主模块的翻译为Chinese_mainModule。效果如下:
这个有点神奇。具体原因不太明了,从qm文件大概推测可能和模块名称、标记信息有关。