以Qt中i18n示例为参照,解读Qt实现国际化的方法和步骤。
1、修改.pro文件,添加翻译文件配置:
TRANSLATIONS += translations/i18n_zh.ts \
translations/i18n_en.ts
说明:
翻译文件名:项目名_地区名.ts,示例中i18n应随着实际项目修改。
地区名缩写:
zh 中国
en 英国
2、生成翻译文件
交互模式:QtCreator菜单/工具/外部/Qt语言家/更新翻译
命令行:
$ lupdate -verbose i18n.pro
翻译文件格式:
…
范围名称
内容
…
3、编辑翻译文件
启动linguist语言翻译工具,命令行:
$ linguist
打开翻译文件,逐一配置翻译内容
4、生成.qm文件
交互模式:QtCreator菜单/工具/外部/Qt语言家/发布翻译
命令行:
$ lrelease -verbose i18n.pro
1、添加资源文件
打开菜单文件/新建文件,选择Qt项目/Qt Resource File模板添加资源文件。
示例中资源文件为i18n.qrc,可随着实际项目修改。
2、在资源文件中添加翻译文件,注意是发布后的.qm文件
/translations/i18n_zh.qm
/translations/i18n_en.qm
注意:可以同时使用多个翻译文件,使用时按后装优先的原则从最后安装的翻译文件找起。
三、关键代码
1、装配翻译文件
QTranslator translator;
//加载翻译文件的几种方法:
translator.load(":/translations/i18n_zh.qm");
translator.load("i18n",":/translations","_"/ _zh.qm");
translator.load(QLocale(),"i18n","_",":/translations",".qm"));
//安装翻译器
QCoreApplication::installTranslator(&translator);
2、使用翻译的几种方法:
QCoreApplication::translate(const char *context, const char *sourceText, \
const char *disambiguation = nullptr, int n = -1)
参数说明:
Context: 范围标识。对应翻译文件的范围名称
sourceText: 文本标识。对应翻译文件中的标识名称,翻译文件中未找对应的翻译内容时则返回sourceText的值
disambiguation 消歧标识,可选项。用以处理同一范围内同一文本标识有多处不同用途的情况
QObject::tr(const char *sourceText, const char *disambiguation = nullptr, int n = -1)
参数说明:
对象类名: 对应翻译文件的范围名称。
sourceText: 文本标识。对应翻译文件中的标识名称,翻译文件中未找对应的翻译内容时则返回sourceText的值
disambiguation 消歧标识,可选项。应对同一范围内同一文本标识有多处不同用途的情况
注意:在非QObject类中使用tr()函数,需在类定义中增加宏
Q_DECLARE_TR_FUNCTIONS(类名)
3、卸载翻译文件
removeTranslator(":/translations/i18n_zh.qm")
四、参考:
1、qt中制作添加 .ts 翻译文件
https://blog.csdn.net/peter_huang1987/article/details/67633633
2、Qt 国际化 | Qt 6.3
https://doc.qt.io/qt-6/internationalization.html