注意:如果不是CSDN网站显示本篇文章,请于底部点击“阅读原文”来阅读本篇文章!
Linguist
+
.ts
,来实现国际化的。但一般公司内部可能存在翻译部门使用其他格式的语言文件,或者自己搭建了一个翻译网站,你能下载到的肯定不会是ts文件,而是比较常见的文件格式,比如xml/json等等。
QObject::tr("key")
以及qml使用的
qsTr("key")
方法来使用翻译。
主要的方法也比较简单:
MyTranslator
继承自QTranslator
,然后重载QTranslator::translate
方法QApplication::instance()->installTranslator
注册MyTranslator
的实例QObject::tr("key")
方式实现国际化下面说下MyTranslator
的实现
主要是将JSON文件中的key-value,解析后存放在map表中,供后面的translate
使用
void MyTranslator::LoadLocalCachedInfo(QString langCode)
{
QString fileName = (QApplication::applicationDirPath() +
TRANS_DIR + "/" + LOCAL_TRANS_FILE_NAME).arg(langCode);
QFile langFile(fileName);
if(!langFile.exists()) {
return;
}
langFile.open(QIODevice::ReadOnly);
QByteArray byteInfo = langFile.readAll();
if (!LoadJsonTransInfo(byteInfo)) {
return;
}
emit LanguageChanged();
}
bool MyTranslator::LoadJsonTransInfo(QByteArray& byteinfo)
{
QJsonObject jsonObj;
QJsonParseError error;
QJsonDocument jsonDoc(QJsonDocument::fromJson(byteinfo, &error));
if (jsonDoc.isEmpty() || jsonDoc.isNull()) {
QString errorStr = error.errorString();
return false;
}
m_loadedTransInfo.clear();
for(auto& transKey : jsonDoc.object().keys()) {
m_loadedTransInfo[transKey.toStdString()] =
jsonDoc.object()[transKey].toString().toStdString();
}
return true;
}
按照[virtual] QString QTranslator::translate(const char *context, const char *sourceText, const char *disambiguation = nullptr, int n = -1) const
的原型,重载一个即可。主要是通过传入的sourceText
,在前面的map表中找到对应的value,即翻译字符串,返回即可。
QString MyTranslator::translate(const char *context,
const char *sourceText,
const char *disambiguation, int n) const
{
// if no result return original
if(m_loadedTransInfo.count(sourceText) <= 0) {
return sourceText;
}
// from loaded value
return QString::fromStdString(m_loadedTransInfo.at(std::string(sourceText)));
}
MyTranslator
实例注册实例,一定要在主线程,另一个是要在使用QObject::tr("key")
之前注册。
QApplication::instance()->installTranslator(&MyTranslator::getInstance());
中文JSON文件:
{
"button_name": "按钮名字",
"window_name": "主窗口名字"
}
完整实现可以微信搜索公众号:“上官宏竹”,关注并回复:“qt_language”,获取资源链接。有任何疑问也可以公众号里留言咨询。
微信公众号搜索:“上官宏竹”,关注并留言咨询,可接各类需求。