国际化

This commit is contained in:
mountcloud
2021-11-17 02:12:54 +08:00
parent 6da5bf4add
commit 69d6af121c
10 changed files with 635 additions and 0 deletions
+89
View File
@@ -0,0 +1,89 @@
#include "FireDogSwitchLanguage.h"
#include "Qss/Qss.h"
#include "gui18n.h"
using namespace Ui;
FireDogSwitchLanguageUi::FireDogSwitchLanguageUi(QWidget *parent) :
QssDialog(parent),
ui(new Ui::FireDogSwitchLanguageClass)
{
ui->setupUi(this);
//this->setWindowFlags(Qt::WindowCloseButtonHint | Qt::Dialog);
//this->setFixedSize(this->width(), this->height());
//this->setModal(true);
//i18n
QString i18nlanguagetitle = Gui18n::GetInstance()->GetConfig("switch-language-window-title", "Language");
QString i18nlablelanguage = Gui18n::GetInstance()->GetConfig("switch-language-lable-language", "Language:");
QString i18nlablenowlanguage = Gui18n::GetInstance()->GetConfig("switch-language-lable-now-language", "NowLanguage:");
QString i18nbuttonsetlanguage = Gui18n::GetInstance()->GetConfig("switch-language-button-set-language", "SetLanguage");
this->setWindowTitle(i18nlanguagetitle);
ui->labelLanguage->setText(i18nlablelanguage);
ui->pushButtonSetLanguage->setText(i18nbuttonsetlanguage);
ui->labelNowLanguageMsg->setText(i18nlablenowlanguage);
connect(ui->pushButtonSetLanguage, SIGNAL(clicked()), this, SLOT(slots_setbtnclick()));
this->hide();
}
void FireDogSwitchLanguageUi::showEvent(QShowEvent* event) {
ui->pushButtonSetLanguage->setEnabled(false);
int languageCount = reloadLanguages();
if (languageCount == 0) {
QString mbtitle = Gui18n::GetInstance()->GetConfig("text-message-box-title-warning", "Warning");
QString mbcontent = Gui18n::GetInstance()->GetConfig("switch-language-message-no-language-items", "The list of language options is empty.");
QssMessageBox::warn(mbcontent, this, mbtitle);
}
if (languageCount > 0) {
ui->pushButtonSetLanguage->setEnabled(true);
}
}
int FireDogSwitchLanguageUi::reloadLanguages() {
ui->comboBoxLanguage->clear();
QString nowLanguage = Gui18n::GetInstance()->GetNowLanguage();
ui->labelNowLanguage->setText(nowLanguage);
QVector<QString> languages = Gui18n::GetInstance()->GetLanguages();
int result = languages.size();
if (result > 0) {
for (int i = 0; i < result; i++) {
QString language = languages[i];
ui->comboBoxLanguage->addItem(language);
}
if (languages.contains(nowLanguage)) {
ui->comboBoxLanguage->setCurrentText(nowLanguage);
}
}
return result;
}
void FireDogSwitchLanguageUi::slots_setbtnclick() {
QString setlanguageStr = ui->comboBoxLanguage->currentText();
QString nowLanguage = Gui18n::GetInstance()->GetNowLanguage();
if (setlanguageStr == nowLanguage) {
QString mbtitle = Gui18n::GetInstance()->GetConfig("text-message-box-title-information", "Tips");
QString mbcontent = Gui18n::GetInstance()->GetConfig("switch-language-message-no-changed", "The set language has not changed from the current language.");
QssMessageBox::information(this, mbtitle, mbcontent);
return;
}
QString mbtitle = Gui18n::GetInstance()->GetConfig("text-message-box-title-information", "Tips");
QString mbcontent = Gui18n::GetInstance()->GetConfig("switch-language-message-update-language-tips", "Changing the language will restart the application.");
QssMessageBox::information(this, mbtitle, mbcontent);
this->hide();
Gui18n::GetInstance()->SetLanguage(setlanguageStr);
emit switchSuccess();
}
FireDogSwitchLanguageUi::~FireDogSwitchLanguageUi()
{
delete ui;
}
+30
View File
@@ -0,0 +1,30 @@
#ifndef FireDogSwitchLanguage_H
#define FireDogSwitchLanguage_H
#include <QWidget>
#include <QDialog>
#include "ui_FireDogSwitchLanguage.h"
#include "Qss/Qss.h"
namespace Ui {
class FireDogSwitchLanguageUi : public QssDialog
{
Q_OBJECT
signals:
void switchSuccess();
public:
explicit FireDogSwitchLanguageUi(QWidget* parent = nullptr);
~FireDogSwitchLanguageUi();
private:
Ui::FireDogSwitchLanguageClass* ui;
int reloadLanguages();
void showEvent(QShowEvent* event) override;
private slots:
void slots_setbtnclick();
};
}
#endif // FireDogSwitchLanguage_H
+99
View File
@@ -0,0 +1,99 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>FireDogSwitchLanguageClass</class>
<widget class="QDialog" name="FireDogSwitchLanguageClass">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>310</width>
<height>138</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>310</width>
<height>138</height>
</size>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<widget class="QLabel" name="labelLanguage">
<property name="geometry">
<rect>
<x>10</x>
<y>52</y>
<width>100</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>Language:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QComboBox" name="comboBoxLanguage">
<property name="geometry">
<rect>
<x>120</x>
<y>50</y>
<width>151</width>
<height>22</height>
</rect>
</property>
</widget>
<widget class="QPushButton" name="pushButtonSetLanguage">
<property name="geometry">
<rect>
<x>80</x>
<y>90</y>
<width>151</width>
<height>31</height>
</rect>
</property>
<property name="text">
<string>SetLanguage</string>
</property>
</widget>
<widget class="QLabel" name="labelNowLanguageMsg">
<property name="geometry">
<rect>
<x>10</x>
<y>20</y>
<width>100</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>NowLanguage:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QLabel" name="labelNowLanguage">
<property name="geometry">
<rect>
<x>120</x>
<y>20</y>
<width>151</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>None</string>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>
+166
View File
@@ -0,0 +1,166 @@
#include "gui18n.h"
#include <qdebug.h>
#include <qjsonobject.h>
#include <qjsondocument.h>
#include <qdir.h>
#include <qapplication.h>
Gui18n* Gui18n::instance = nullptr;
Gui18n::Gui18n() {
}
void Gui18n::init()
{
this->now_language = GetNowLanguage();
QString apppath = QApplication::applicationDirPath();
QString languagePath = apppath + GUI_18N_CONFIG_DIR_NAME + this->now_language + ".json";
QFile languageFile(languagePath);
if (languageFile.open(QIODevice::ReadOnly)) {
QByteArray allData = languageFile.readAll();
languageFile.close();
QJsonParseError jsonError;
QJsonDocument jsonDoc(QJsonDocument::fromJson(allData, &jsonError));
if (jsonError.error == QJsonParseError::NoError)
{
QJsonObject rootObj = jsonDoc.object();
QStringList qlist = rootObj.keys();
for (int i = 0; i < qlist.size(); i++) {
QString key = qlist[i];
QString value = rootObj.value(key).toString();
this->configs[key] = value;
}
}
else {
qDebug() << "language parse json fail." << jsonError.errorString();
}
}
else {
qDebug() << "language open file fail.";
}
}
Gui18n* Gui18n::GetInstance() {
if (instance == nullptr) {
instance = new Gui18n();
instance->init();
}
return instance;
}
QString Gui18n::GetConfig(QString name) {
return this->GetConfig(name,"");
}
QString Gui18n::GetConfig(QString name,QString defstr) {
if (this->configs.find(name) != this->configs.end()) {
return this->configs[name];
}
return defstr;
}
QString Gui18n::GetNowLanguage() {
QString apppath = QApplication::applicationDirPath();
QString languageConfigPath = apppath + "/" + GUI_18N_CONFIG_FILE_NAME;
QFile languageConfigFile(languageConfigPath);
if (!languageConfigFile.exists()) {
if (languageConfigFile.open(QIODevice::WriteOnly)) {
QJsonObject config;
config["language"] = "en-us";
QJsonDocument document;
document.setObject(config);
languageConfigFile.write(document.toJson());
languageConfigFile.flush();
languageConfigFile.close();
}
else {
qDebug() << "language config not exists,open file fail.";
}
return GUI_18N_DEFAULT_LANGUAGE;
}
else {
if (languageConfigFile.open(QIODevice::ReadOnly)) {
QByteArray allData = languageConfigFile.readAll();
languageConfigFile.close();
QJsonParseError jsonError;
QJsonDocument jsonDoc(QJsonDocument::fromJson(allData, &jsonError));
if (jsonError.error != QJsonParseError::NoError)
{
qDebug() << "json error!" << jsonError.errorString();
this->now_language = GUI_18N_DEFAULT_LANGUAGE;
return this->now_language;
}
QJsonObject rootObj = jsonDoc.object();
QString language = rootObj.value("language").toString();
if (language.isEmpty()) {
SetLanguage(GUI_18N_DEFAULT_LANGUAGE);
}
else {
return language;
}
}
else {
qDebug() << "language config open file fail.";
return GUI_18N_DEFAULT_LANGUAGE;
}
}
return GUI_18N_DEFAULT_LANGUAGE;
}
void Gui18n::SetLanguage(QString language) {
if (language==this->now_language) {
return;
}
this->now_language = language;
this->configs.clear();
QString apppath = QApplication::applicationDirPath();
QString languageConfigPath = apppath + "/" + GUI_18N_CONFIG_FILE_NAME;
QFile languageConfigFile(languageConfigPath);
if (languageConfigFile.open(QIODevice::WriteOnly)) {
QJsonObject config;
config["language"] = language;
QJsonDocument document;
document.setObject(config);
languageConfigFile.write(document.toJson());
languageConfigFile.flush();
languageConfigFile.close();
}
instance->init();
}
QVector<QString> Gui18n::GetLanguages() {
QVector<QString> result;
QString apppath = QApplication::applicationDirPath();
QString languageDirPath = apppath + GUI_18N_CONFIG_DIR_NAME;
QDir languageDir(languageDirPath);
if (languageDir.exists()) {
QFileInfoList fileInfoListInSplDir = languageDir.entryInfoList(QDir::Files);
QFileInfo tempFileInfo;
foreach(tempFileInfo, fileInfoListInSplDir) {
// absoluteFilePath() -- 截取到的是文件夹的路径
// absolutePath() -- 截取的是文件夹所在路径
//filePathNames << tempFileInfo.absoluteFilePath();
QString filename = tempFileInfo.fileName();
if (filename.endsWith(".json")) {
QString basefilename = tempFileInfo.baseName();
result.push_back(basefilename);
}
}
}
return result;
}
+28
View File
@@ -0,0 +1,28 @@
#ifndef __FIREKYLIN_GUI_I18N_H__
#define __FIREKYLIN_GUI_I18N_H__
#include <QHash>
#include <qstring.h>
#include <qvector.h>
#define GUI_18N_CONFIG_DIR_NAME "/fdlanguages/"
#define GUI_18N_CONFIG_FILE_NAME "firedog.i18n.config.json"
#define GUI_18N_DEFAULT_LANGUAGE "en-us"
class Gui18n
{
public:
static Gui18n* GetInstance();
QString GetNowLanguage();
//ËùÓеÄÓïÑÔ
QVector<QString> GetLanguages();
QString GetConfig(QString name);
QString GetConfig(QString name, QString defstr);
void SetLanguage(QString language);
private:
QString now_language;
QHash<QString, QString> configs;
Gui18n();
static Gui18n* instance;
void init();
};
#endif
+91
View File
@@ -0,0 +1,91 @@
#include "gui18nutil.h"
#include "gui18n.h"
QString Gui18nUtil::GetNowLanguage() {
return Gui18n::GetInstance()->GetNowLanguage();
}
void Gui18nUtil::SetText(QCheckBox* obj, QString name) {
Gui18n* gui18n = Gui18n::GetInstance();
QString text = gui18n->GetConfig(name);
if (!text.isEmpty()) {
obj->setText(text);
}
}
void Gui18nUtil::SetText(QRadioButton* obj, QString name) {
Gui18n* gui18n = Gui18n::GetInstance();
QString text = gui18n->GetConfig(name);
if (!text.isEmpty()) {
obj->setText(text);
}
}
void Gui18nUtil::SetText(QGroupBox* obj, QString name) {
Gui18n* gui18n = Gui18n::GetInstance();
QString text = gui18n->GetConfig(name);
if (!text.isEmpty()) {
obj->setTitle(text);
}
}
void Gui18nUtil::SetText(QMenu* obj, QString name) {
Gui18n* gui18n = Gui18n::GetInstance();
QString text = gui18n->GetConfig(name);
if (!text.isEmpty()) {
obj->setTitle(text);
}
}
void Gui18nUtil::SetText(QAction* obj, QString name) {
Gui18n* gui18n = Gui18n::GetInstance();
QString text = gui18n->GetConfig(name);
if (!text.isEmpty()) {
obj->setText(text);
}
}
void Gui18nUtil::SetText(QLabel* obj, QString name)
{
Gui18n* gui18n = Gui18n::GetInstance();
QString text = gui18n->GetConfig(name);
if (!text.isEmpty()) {
obj->setText(text);
}
}
void Gui18nUtil::SetText(QLineEdit* obj, QString name)
{
Gui18n* gui18n = Gui18n::GetInstance();
QString text = gui18n->GetConfig(name);
if (!text.isEmpty()) {
obj->setPlaceholderText(text);
}
}
void Gui18nUtil::SetText(QPushButton* obj, QString name)
{
Gui18n* gui18n = Gui18n::GetInstance();
QString text = gui18n->GetConfig(name);
if (!text.isEmpty()) {
obj->setText(text);
}
}
void Gui18nUtil::SetText(QTabWidget* obj,int index, QString name) {
Gui18n* gui18n = Gui18n::GetInstance();
QString text = gui18n->GetConfig(name);
if (!text.isEmpty()) {
obj->setTabText(index, text);
}
}
+29
View File
@@ -0,0 +1,29 @@
#ifndef __FIREKYLIN_GUI_I18NUTIL_H__
#define __FIREKYLIN_GUI_I18NUTIL_H__
#include <QGroupBox>
#include <QMenu>
#include <QTabWidget>
#include <QLabel>
#include <QCheckBox>
#include <QRadioButton>
#include <QLineEdit>
#include <QPushButton>
class Gui18nUtil
{
public:
static QString GetNowLanguage();
static void SetText(QCheckBox* obj, QString name);
static void SetText(QRadioButton* obj, QString name);
static void SetText(QGroupBox* obj,QString name);
static void SetText(QMenu* obj, QString name);
static void SetText(QAction* obj, QString name);
static void SetText(QLabel* obj, QString name);
static void SetText(QLineEdit* obj, QString name);
static void SetText(QPushButton* obj, QString name);
static void SetText(QTabWidget* obj,int index, QString name);
};
#endif
@@ -0,0 +1,50 @@
{
"menu-operation": "Operation",
"menu-operation-open": "Open",
"menu-operation-save": "Save",
"menu-operation-saveto": "Save To",
"menu-setting": "Setting",
"menu-setting-language": "Language",
"menu-help": "Help",
"menu-help-reportissue": "ReportIssue",
"menu-help-github": "Github",
"menu-help-about": "About",
"main-tab-feature-library": "Feature Library",
"main-tab-matching": "Matching",
"feature-search":"Search",
"feature-search-txt-tip":"Please enter",
"feature-search-btn":"Search",
"feature-librarys":"Librarays",
"feature-librarys-name":"Name",
"feature-librarys-describe":"Describe",
"feature-librarys-author":"Author",
"feature-info":"Info",
"feature-info-name":"Name",
"feature-info-author":"Author",
"feature-info-describe":"Describe",
"feature-info-features":"Features",
"feature-info-features-key":"Key",
"feature-info-features-type":"Type",
"feature-info-features-content":"Content",
"feature-info-rule":"Rule",
"feature-info-btn-add":"Add",
"feature-info-btn-update":"Update",
"text-message-box-title-question": "Confirm",
"text-message-box-title-information": "Tips",
"text-message-box-title-warning": "Warning",
"text-message-box-title-critical": "Critical",
"switch-language-window-title": "Language",
"switch-language-lable-language": "Language:",
"switch-language-lable-now-language": "NowLanguage:",
"switch-language-button-set-language": "SetLanguage",
"switch-language-message-no-changed": "The set language has not changed from the current language.",
"switch-language-message-no-language-items": "The list of language options is empty.",
"switch-language-message-update-language-tips": "Changing the language will restart the application."
}
@@ -0,0 +1,50 @@
{
"menu-operation": "操作",
"menu-operation-open": "打开",
"menu-operation-save": "保存",
"menu-operation-saveto": "保存到",
"menu-setting": "设置",
"menu-setting-language": "语言",
"menu-help": "帮助",
"menu-help-reportissue": "问题反馈",
"menu-help-github": "Github",
"menu-help-about": "关于",
"main-tab-feature-library": "特征库",
"main-tab-matching": "检测",
"feature-search":"搜索",
"feature-search-txt-tip":"请输入",
"feature-search-btn":"搜索",
"feature-librarys":"库",
"feature-librarys-name":"名称",
"feature-librarys-describe":"描述",
"feature-librarys-author":"作者",
"feature-info":"详情",
"feature-info-name":"名称",
"feature-info-author":"作者",
"feature-info-describe":"描述",
"feature-info-features":"特征",
"feature-info-features-key":"Key",
"feature-info-features-type":"类型",
"feature-info-features-content":"内容",
"feature-info-rule":"规则",
"feature-info-btn-add":"添加",
"feature-info-btn-update":"修改",
"text-message-box-title-question": "请确认",
"text-message-box-title-information": "提示",
"text-message-box-title-warning": "警告",
"text-message-box-title-critical": "错误",
"switch-language-window-title": "语言",
"switch-language-lable-language": "语言:",
"switch-language-lable-now-language": "当前语言:",
"switch-language-button-set-language": "设置语言",
"switch-language-message-no-changed": "设置的语言与当前语言一致未作出改变。",
"switch-language-message-no-language-items": "语言选项列表为空。",
"switch-language-message-update-language-tips": "修改语言将会重启应用程序。"
}
@@ -0,0 +1,3 @@
{
"language": "zh-cn"
}