源代码中经常会出现一些字符串,比如定义要显示在控件上的文本,在不同的语言环境下,可能会需要显示不同语言对应的文本。针对多语言切换的需求,Qt提供的解决方案是,在所有需要翻译的字符串处都使用QObject::tr()函数,Qt提取出所有QObject::tr()函数的参数,使用Qt语言家对其进行翻译后发布,Qt程序可以在运行时加载发布的翻译文件以更新文本字符串。
QT语言家就是解决字符串乱码和翻译的问题。
在QtCreator 中新建一个Demo项目,然后对工程文件中的pro文件进行编辑,在最后加上一行
TRANSLATIONS += demo2_zh_CN.ts
在菜单栏上选择“工具”-“外部”-“Qt语言家”-“更新翻译”
然后在你的项目路径下就会生成一个叫做“demo2_zh_CN.ts”的文件
点击所有程序”-“找到你自己安装的QT目录下找到“Linguist” 打开Qt语言家,“文件”-“打开” 选择项目路径下的Demo2_zh_CN.ts。如图:
左侧上下文面板中,选择MainWindow,在源文下选择”btn1”,在下方面板中,汉语 译文输入框中输入“按钮1”,然后点击上面绿色的勾号按钮,变为勾号,确认这一行已经翻译,最后点击保存退出。
添加翻译与未添加翻译的按钮控件 在ts 文件对比如下:
然后即可回到工程文件中,点击工具–外部–Qt语言家–发布翻译
然后在QtCreator中,编辑main.cpp 载入翻译文件
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// ------ 载入翻译 -------
QTranslator translator; // 新建翻译类
translator.load("Demo2_zh_CN.qm", "./"); // 导入生成的文件
a.installTranslator(&translator); //装入
// ------ 载入翻译 -------
MainWindow w;
w.show();
return a.exec();
}
translator.load("Demo2_zh_CN.qm", "../Demo2"); // 导入生成的文件
Demo2.pro文件
TRANSLATIONS += Demo2_zh_CN.ts
dtk_translations.path = /usr/share/$$TARGET/translations
dtk_translations.files = $$PWD/*.qm
INSTALLS += dtk_translations
main.cpp 需要修改为
translator.load("Demo2_zh_CN.qm", "/usr/share/Demo2/translations");
操作如下:
main.cpp 需要修改为
translator.load("Demo2_zh_CN.qm", ":/");
即可实现。
重要:讨论添加 == 开发人员注释 == 问题:
QString QObject::tr(const char *sourceText, const char *disambiguation = Q_OBJECT, int n = Q_OBJECT)
// disambiguation -- 消除歧义的意思,个人理解是"注释"
那么针对btn1 按钮的文案添加注释
QPushButton *btn1 = new QPushButton(this);
btn1->setText(tr("btn1", "button"));
将会在ts,以及Qt语言家(Qt Linguist)上产生一些变化,如下图:
在语言家可看出,新增了一个““开发人员注释” 一栏,即可根据这样类似的注释,有区别的去翻译相关空间文案及其信息