作者:billy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
简介
Qt 中提供了多种将字符串标记为可翻译的方法,我们将之称为国际化翻译。在帮助文档中搜索 installTranslatorFunctions
就可以看到下图所示的这些函数:
在 QML 中最常用的就是 qsTr(),例如:
Text { text: qsTr("Hello") }
使用流程
1. 使用 qsTr 标识需要翻译的内容
在程序中把需要动态显示文本信息的地方使用 qsTr(“sourceText”),如果没有合适的翻译字符串可用,则返回 QString::fromUtf8(sourceText)
2. pro 文件中添加路径
这里可能会有点误导,因为 pro 文件中添加路径一般都是已经存在的文件,而 TRANSLATIONS 添加的路径是等等会生成 ts 文件的路径,文件名和路径按照自己情况修改
TRANSLATIONS += \
../config/language/language_zh_CN.ts \
../config/language/language_en_US.ts
3. 使用 Qt 语言家中的 lupdate 生成 ts 文件
调用 lupdate工具会自动扫描项目并生成 pro 中设置的 ts 文件,ts 文件是 xml 格式的,是未经过翻译的,需要人为的去配置文本内容
4. 使用 linguist 工具编辑 ts 文件
使用 Qt 语言家工具打开刚才生成的 ts 文件,可以多个文件同时进行配置,效率更高
5. 使用 Qt 语言家中的 lrelease 生成 qm 文件
ts 文件配置完成后,可以使用 lrelease 生成 qm 文件。qm 文件就是把 xml 压缩成了二进制,在切换语言时,使用 QTranslater 加载不同的 qm 文件
6. 在程序中切换语言,加载 qm 文件
qm 文件的路径一定要正确,否则界面上就只显示 souceText 的内容,不会翻译成 ts 中的内容
另外,retranslate() 函数是 Qt 5.10 版本才有的接口。在 Qt 5.10 以前的版本中是不能直接动态切换语言的,只能重新启动程序才生效,或者一个一个的更新文本信息
#include <QObject>
#include <QTranslator>
#include <QQmlApplicationEngine>
class TranslateCtrl : public QObject
{
Q_OBJECT
public:
explicit TranslateCtrl(QQmlEngine *engine, QObject *parent = nullptr);
// 加载语言 1-中文 2-英文
Q_INVOKABLE void loadLanguage(int type);
private:
QQmlEngine *m_engine = nullptr;
QTranslator *m_translator = nullptr;
};
#include "translatectrl.h"
#include <QCoreApplication>
TranslateCtrl::TranslateCtrl(QQmlEngine *engine, QObject *parent) : QObject{parent}
{
m_engine = engine;
m_translator = new QTranslator(this);
QCoreApplication::installTranslator(m_translator);
}
void TranslateCtrl::loadLanguage(int type)
{
switch (type)
{
case 1: m_translator->load("config/language/language_zh_CN.qm"); break;
case 2: m_translator->load("config/language/language_en_US.qm"); break;
default: break;
}
m_engine->retranslate();
}