diff --git a/FireDogEditor/FireDogSwitchLanguage.cpp b/FireDogEditor/FireDogSwitchLanguage.cpp new file mode 100644 index 0000000..4f6818c --- /dev/null +++ b/FireDogEditor/FireDogSwitchLanguage.cpp @@ -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 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; +} diff --git a/FireDogEditor/FireDogSwitchLanguage.h b/FireDogEditor/FireDogSwitchLanguage.h new file mode 100644 index 0000000..b03c8ef --- /dev/null +++ b/FireDogEditor/FireDogSwitchLanguage.h @@ -0,0 +1,30 @@ +#ifndef FireDogSwitchLanguage_H +#define FireDogSwitchLanguage_H + +#include +#include +#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 diff --git a/FireDogEditor/FireDogSwitchLanguage.ui b/FireDogEditor/FireDogSwitchLanguage.ui new file mode 100644 index 0000000..de73aea --- /dev/null +++ b/FireDogEditor/FireDogSwitchLanguage.ui @@ -0,0 +1,99 @@ + + + FireDogSwitchLanguageClass + + + + 0 + 0 + 310 + 138 + + + + + 0 + 0 + + + + + 310 + 138 + + + + Form + + + + + 10 + 52 + 100 + 16 + + + + Language: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 120 + 50 + 151 + 22 + + + + + + + 80 + 90 + 151 + 31 + + + + SetLanguage + + + + + + 10 + 20 + 100 + 16 + + + + NowLanguage: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 120 + 20 + 151 + 16 + + + + None + + + + + + diff --git a/FireDogEditor/gui18n.cpp b/FireDogEditor/gui18n.cpp new file mode 100644 index 0000000..71d3359 --- /dev/null +++ b/FireDogEditor/gui18n.cpp @@ -0,0 +1,166 @@ +#include "gui18n.h" + +#include +#include +#include +#include +#include + +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 Gui18n::GetLanguages() { + QVector 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; +} \ No newline at end of file diff --git a/FireDogEditor/gui18n.h b/FireDogEditor/gui18n.h new file mode 100644 index 0000000..d4c10ff --- /dev/null +++ b/FireDogEditor/gui18n.h @@ -0,0 +1,28 @@ +#ifndef __FIREKYLIN_GUI_I18N_H__ +#define __FIREKYLIN_GUI_I18N_H__ +#include +#include +#include + +#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 GetLanguages(); + QString GetConfig(QString name); + QString GetConfig(QString name, QString defstr); + void SetLanguage(QString language); +private: + QString now_language; + QHash configs; + Gui18n(); + static Gui18n* instance; + void init(); +}; +#endif \ No newline at end of file diff --git a/FireDogEditor/gui18nutil.cpp b/FireDogEditor/gui18nutil.cpp new file mode 100644 index 0000000..22b4b41 --- /dev/null +++ b/FireDogEditor/gui18nutil.cpp @@ -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); + } +} \ No newline at end of file diff --git a/FireDogEditor/gui18nutil.h b/FireDogEditor/gui18nutil.h new file mode 100644 index 0000000..b60ae0d --- /dev/null +++ b/FireDogEditor/gui18nutil.h @@ -0,0 +1,29 @@ +#ifndef __FIREKYLIN_GUI_I18NUTIL_H__ +#define __FIREKYLIN_GUI_I18NUTIL_H__ + +#include +#include +#include +#include +#include +#include +#include +#include + +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 \ No newline at end of file diff --git a/FireDogEditor/resources/fdlanguages/en-us.json b/FireDogEditor/resources/fdlanguages/en-us.json new file mode 100644 index 0000000..2e9007e --- /dev/null +++ b/FireDogEditor/resources/fdlanguages/en-us.json @@ -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." +} \ No newline at end of file diff --git a/FireDogEditor/resources/fdlanguages/zh-cn.json b/FireDogEditor/resources/fdlanguages/zh-cn.json new file mode 100644 index 0000000..e755cc3 --- /dev/null +++ b/FireDogEditor/resources/fdlanguages/zh-cn.json @@ -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": "修改语言将会重启应用程序。" +} \ No newline at end of file diff --git a/FireDogEditor/resources/firedog.i18n.config.json b/FireDogEditor/resources/firedog.i18n.config.json new file mode 100644 index 0000000..ea44f50 --- /dev/null +++ b/FireDogEditor/resources/firedog.i18n.config.json @@ -0,0 +1,3 @@ +{ + "language": "zh-cn" +} \ No newline at end of file