栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

QT多语言,实现任意内容翻译

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

QT多语言,实现任意内容翻译

QT+VS实现多语言切换,不使用QT自带的ts文件翻译
先创建一个Language类
Language.h

namespace lang 
{
	class Language
	{
	public:
		static std::shared_ptr GetLanguage();
		void ChangeLanguage(const QString&);
		QString FindTextByName(const QString& key);
	private:
		Language(const QString& name);
		~Language();
	private:
		static std::shared_ptr m_Language;
		QHash* m_Language_Hash;
	private:
		static void DestoryLanguage(Language*);
		void _LoadLangFile(const QString& strFilePath);
	};
}

Language.cpp

std::shared_ptr lang::Language::m_Language(new lang::Language("EN"), lang::Language::DestoryLanguage);

std::shared_ptr lang::Language::GetLanguage()
{
	return m_Language;
}

lang::Language::Language(const QString& name)
{
	m_Language_Hash = new QHash();
	ChangeLanguage(name);
}

lang::Language::~Language()
{
}

void lang::Language::DestoryLanguage(Language* setlang)
{
	delete setlang->m_Language_Hash;
	setlang->m_Language_Hash = nullptr;
	delete setlang;
	setlang = nullptr;
}

void lang::Language::ChangeLanguage(const QString& name)
{
	m_Language_Hash->clear();

	// find ui resource
	QString FilePath = ".\language\" + name + ".json";
	if (!QFile(FilePath).exists())
	{
		qWarning() << "Can not open ui language file: " << FilePath;
		FilePath = ".\language\EN.json";
	}
	_LoadLangFile(FilePath);
}

void lang::Language::_LoadLangFile(const QString& strFilePath)
{
	QFile file(strFilePath);
	if (!file.open(QFile::Readonly | QFile::Text))
	{
		qWarning() << "Can not open file:" << strFilePath;
		return;
	}
	QString jsonstr = file.readAll();
	QJsonParseError parseJsonErr;
	QJsondocument document = QJsondocument::fromJson(jsonstr.toUtf8(), &parseJsonErr);
	if (parseJsonErr.error == QJsonParseError::NoError && !document.isNull())
	{
		if (document.isObject()) {
			QJsonObject jsonObject = document.object();
			QJsonObject::iterator iterator = jsonObject.begin();
			while (iterator != jsonObject.end()) {
				QJsonValue jsonValue = iterator.value();
				m_Language_Hash->insert(iterator.key(), jsonValue.toString());
				iterator++;
			}
		}
	}
}

QString lang::Language::FindTextByName(const QString& key)
{
	if (m_Language_Hash->contains(key))
	{
		return m_Language_Hash->value(key);
	}
	qWarning() << "Can not find ui language: " << key;
	return QString();
}

我这里使用的是json文件,使用XML也可以,读取解析XML就行。

翻译文件举例:
EN.json(这里不算是英文翻英文,只是用英文做key去找value显示)

{
    "MarkerReport": "MarkerReport",
    "DayReport": "DayReport",
    "WeekReport": "WeekReport",
    "MonthReport": "MonthReport",
    "YearReport": "YearReport"
}

CN.json

{
    "MarkerReport": "版图报表",
    "DayReport": "日报表",
    "WeekReport": "周报表",
    "MonthReport": "月报表",
    "YearReport": "年报表",
    "CustomReport": "自定义报表"
}

设置类中设置语言

QString language = "CN";
lang::Language::GetLanguage()->ChangeLanguage(language);

此时已经解析了翻译文件,等待查询显示即可。

显示翻译内容,先为对象增加属性,value值为翻译文件中key值。

	ui.pushButton_marker->setProperty("ts", "MarkerReport");
    ui.pushButton_day->setProperty("ts", "DayReport");
    ui.pushButton_week->setProperty("ts", "WeekReport");
    ui.pushButton_month->setProperty("ts", "MonthReport");
    ui.pushButton_year->setProperty("ts", "YearReport");
    ui.pushButton_custom->setProperty("ts", "CustomReport");

为对象配置翻译后的内容显示。

ui.pushButton_marker->setText(lang::Language::GetLanguage()->FindTextByName(ui.pushButton_marker->property("ts").value()));
ui.pushButton_day->setText(lang::Language::GetLanguage()->FindTextByName(ui.pushButton_day->property("ts").value()));
ui.pushButton_week->setText(lang::Language::GetLanguage()->FindTextByName(ui.pushButton_week->property("ts").value()));
ui.pushButton_month->setText(lang::Language::GetLanguage()->FindTextByName(ui.pushButton_month->property("ts").value()));
ui.pushButton_year->setText(lang::Language::GetLanguage()->FindTextByName(ui.pushButton_year->property("ts").value()));
ui.pushButton_custom->setText(lang::Language::GetLanguage()->FindTextByName(ui.pushButton_custom->property("ts").value()));

任意内容翻译,只需要传输翻译原文(标记值)即可。

QString originText = "原文";
QString translationText = lang::Language::GetLanguage()->FindTextByName(originText);

ps.这样翻译内容还可解决中文显示乱码问题,QT中文乱码一般是由于QString为4位引起的。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/317428.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号