这篇文章展示了集成Qt Linguist 的功能。
但是有时候Qt的翻译功能比较繁琐,我们简单项目只需要使用本地化功能,将中文字符串导入到项目中,避免编码格式问题导致的乱码。
只需要使用一个简单的json或者其他格式的本地文件作为映射的key/value.
当完全需要自定义翻译文件,或者只是简单的避免将中文写入cpp文件导致显示在ui上乱码时可以使用
创建 派生类,并实现翻译方法。
class JBTranslator : public QTranslator {
public:
//保存自己的翻译
QHash<QString, QString> m_texts;
//override 基类虚函数,当需要翻译的时候会自动调用
QString translate(const char *context, const char *sourceText, const char *disambiguation = nullptr, int n = -1) const override
{
if (m_texts.contains(sourceText)) {
return m_texts.value(sourceText);
}
return sourceText;
}
};
在 app 初始化后立即注册调用
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 申明自定义类的实例
JBTranslator translator;
//用自定义的翻译实例替换系统默认的
QApplication::installTranslator(&translator);
/* :/tran.json 文件的内容,该文件也可以放在其他位置或其他类型的文件,只需要最终读取出来放入translator.m_texts变量即可
{
"Hello_key": "你好,这是value",
"Hello_key2": "中文测试文字2"
}
*/
QFile file(":/tran.json");
if (!file.open(QFile::ReadOnly)) {
qWarning() << "Cannot open translation file for reading.";
return -1;
}
QJsonDocument doc = QJsonDocument::fromJson(file.readAll(), nullptr);
QJsonObject jsonObj = doc.object();
for (auto it = jsonObj.begin(); it != jsonObj.end(); ++it) {
//将自定义的json文件的翻译字段,加载到我们类的变量中
translator.m_texts.insert(it.key(), it.value().toString());
}
//这里调用后,会在 JBTranslator::translate(...) 方法中查找,并返回翻译好的字符串
//手动调用tr(), 或者ui文件中自动调用翻译功能
QString t = QObject::tr("Hello_key");
//localized string: "你好,这是value"
qDebug() << "localized string: " << t;
MainWindow w;
w.show();
return a.exec();
}
验证结果
调用代码:
QString t = QObject::tr("Hello_key");
qDebug() << "localized string: " << t;
打印结果: localized string: "你好,这是value"
全局代码
#include "mainwindow.h"
#include <QApplication>
#include <QTranslator>
#include <QFile>
#include <QJsonDocument>
#include <QJsonObject>
#include <QTextStream>
#include <QHash>
#include <QDebug>
class JBTranslator : public QTranslator {
public:
//保存自己的翻译
QHash<QString, QString> m_texts;
//override 基类虚函数,当需要翻译的时候会自动调用
QString translate(const char *context, const char *sourceText, const char *disambiguation = nullptr, int n = -1) const override
{
if (m_texts.contains(sourceText)) {
return m_texts.value(sourceText);
}
return sourceText;
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 申明自定义类的实例
JBTranslator translator;
//用自带的翻译实例替换系统默认的
QApplication::installTranslator(&translator);
/*
{
"Hello_key": "你好,这是value",
"Hello_key2": "中文测试文字2"
}
*/
QFile file(":/tran.json");
if (!file.open(QFile::ReadOnly)) {
qWarning() << "Cannot open translation file for reading.";
return -1;
}
QJsonDocument doc = QJsonDocument::fromJson(file.readAll(), nullptr);
QJsonObject jsonObj = doc.object();
for (auto it = jsonObj.begin(); it != jsonObj.end(); ++it) {
//将自定义的json文件的翻译字段,加载到我们类的变量中
translator.m_texts.insert(it.key(), it.value().toString());
}
//这里调用后,会在 JBTranslator::translate(...) 方法中查找,并返回翻译好的字符串
QString t = QObject::tr("Hello_key");
//localized string: "你好,这是value"
qDebug() << "localized string: " << t;
MainWindow w;
w.show();
return a.exec();
}