QML 中实现国际化翻译

作者:billy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

简介

Qt 中提供了多种将字符串标记为可翻译的方法,我们将之称为国际化翻译。在帮助文档中搜索 installTranslatorFunctions就可以看到下图所示的这些函数:

QML 中实现国际化翻译_第1张图片
在 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 格式的,是未经过翻译的,需要人为的去配置文本内容
QML 中实现国际化翻译_第2张图片

4. 使用 linguist 工具编辑 ts 文件

使用 Qt 语言家工具打开刚才生成的 ts 文件,可以多个文件同时进行配置,效率更高

QML 中实现国际化翻译_第3张图片
QML 中实现国际化翻译_第4张图片

5. 使用 Qt 语言家中的 lrelease 生成 qm 文件

ts 文件配置完成后,可以使用 lrelease 生成 qm 文件。qm 文件就是把 xml 压缩成了二进制,在切换语言时,使用 QTranslater 加载不同的 qm 文件
QML 中实现国际化翻译_第5张图片
QML 中实现国际化翻译_第6张图片

6. 在程序中切换语言,加载 qm 文件

qm 文件的路径一定要正确,否则界面上就只显示 souceText 的内容,不会翻译成 ts 中的内容
另外,retranslate() 函数是 Qt 5.10 版本才有的接口。在 Qt 5.10 以前的版本中是不能直接动态切换语言的,只能重新启动程序才生效,或者一个一个的更新文本信息

#include 
#include 
#include 

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 

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();
}

你可能感兴趣的:(QML,qml,翻译,切换语言)