用Qt编写dll时的多语言实现

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文件大概推测可能和模块名称、标记信息有关。


参考【qt不同模块使用多语言】

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值