From 6cb61bac766c3fc5bb9f4d64515731c4ea49978b Mon Sep 17 00:00:00 2001
From: Mentalflow <312902918@qq.com>
Date: Mon, 19 May 2025 23:18:53 +0800
Subject: [PATCH] Project: Improve multilingual support.
---
3rdparty/qwindowkit | 2 +-
example/i18n/RibbonUIAPP_en_US.ts | 406 ++++++++++++---------
example/i18n/RibbonUIAPP_zh_CN.ts | 194 ++++++----
example/qml/Qt5/pages/SettingsMenuPage.qml | 38 +-
example/qml/Qt6/pages/SettingsMenuPage.qml | 38 +-
lib_source/i18n/RibbonUI_en_US.ts | 141 ++++---
lib_source/i18n/RibbonUI_zh_CN.ts | 31 ++
lib_source/include/ribbonlocalization.h | 9 +-
lib_source/source/ribbonlocalization.cpp | 8 +
9 files changed, 510 insertions(+), 357 deletions(-)
diff --git a/3rdparty/qwindowkit b/3rdparty/qwindowkit
index 153e1f4..ac1a62b 160000
--- a/3rdparty/qwindowkit
+++ b/3rdparty/qwindowkit
@@ -1 +1 @@
-Subproject commit 153e1f4f2fb711f5ec7072e0e49346fc76901cc3
+Subproject commit ac1a62b2a76e4d15e412b9579b80da2dafbc6d6a
diff --git a/example/i18n/RibbonUIAPP_en_US.ts b/example/i18n/RibbonUIAPP_en_US.ts
index 25d70b7..756d582 100644
--- a/example/i18n/RibbonUIAPP_en_US.ts
+++ b/example/i18n/RibbonUIAPP_en_US.ts
@@ -7,19 +7,19 @@
Message List View Example
-
+
Add Message
-
+
Clear Message
-
+
@@ -28,292 +28,330 @@
Settings
-
+
Theme
-
+
Current Theme:
-
+
-
+
Current Style:
-
+
-
+
Style
-
+
-
+
Modern
-
+
-
+
Classic
-
+
-
+
Text Render
-
+
-
+
Current Text Render:
-
+
-
+
TitleBar
-
+
-
+
Show TitleBar Icon:
-
+
-
+
Language
-
+
-
+
Current Language:
-
+
+
+
+
+
+ Light
+
+
+
+
+
+ Dark
+
+
+
+
+
+ System
+
+
+
+
+ Native
+
+
+
+
+ Qt
+
+
+
+
+ Show
+
+
+
+
+ Hide
+
TabBar
-
+
Basic
-
+
-
+
Slider
-
+
-
+
Switch Button
-
+
-
+
CheckBox
-
+
-
+
Button
-
+
-
+
Push Button
-
+
-
-
+
+
No Menu
-
+
-
-
-
+
+
+
Menu
-
+
-
+
Radio Button
-
+
-
+
Input
-
+
-
+
Line Edit
-
+
-
+
Text Edit
-
+
-
+
Combo Box
-
+
-
+
Spin Box
-
+
-
+
Progress
-
+
-
+
ProgressBar
-
+
-
+
ProgressRing
-
+
-
+
Indicator
-
+
-
+
BusyRing
-
+
-
+
BusyBar
-
+
-
+
PageIndicator
-
+
-
+
Views
-
+
-
+
MessageListView
-
+
-
+
Open Message List View
-
+
-
+
Others
-
+
-
+
Text
-
+
-
+
Open Menu
-
+
-
+
Popup
-
+
-
+
Open Popup
-
+
-
+
Open Popup Dialog (Double Choices)
-
+
-
+
Open Popup Dialog (Triple Choices)
-
+
-
+
MessageBar
-
+
-
+
Generate One Message
-
+
-
+
Clear All Messages
-
+
@@ -322,7 +360,7 @@
About
-
+
@@ -331,165 +369,171 @@
RibbonUI APP
-
-
-
-
-
- Tab Bar
-
+
-
- A tab bar for window, let user choose the controllers.
-
+
+ Tab Bar
+
-
-
- Tab Bar Buttons
-
+
+
+ A tab bar for window, let user choose the controllers.
+
-
- Tool buttons at the top of tab bar.
-
+
+ Tab Bar Buttons
+
-
-
- Sliders
-
+
+
+ Tool buttons at the top of tab bar.
+
-
- Vertical/Horizental sliders with/without buttons.
-
+
+ Sliders
+
-
-
- Switch Buttons
-
+
+
+ Vertical/Horizental sliders with/without buttons.
+
-
- Switch buttons with/without background color or grabber text.
-
+
+ Switch Buttons
+
-
-
- CheckBoxs
-
+
+
+ Switch buttons with/without background color or grabber text.
+
-
- CheckBoxs with colorful background or with/without label text.
-
+
+ CheckBoxs
+
-
-
- Buttons
-
+
+
+ CheckBoxs with colorful background or with/without label text.
+
-
- Buttons with/without background or label text.
-
+
+ Buttons
+
-
-
- Push Buttons
-
+
+
+ Buttons with/without background or label text.
+
-
- Push buttons with/without sub menu.
-
+
+ Push Buttons
+
-
-
- Line Edits
-
+
+
+ Push buttons with/without sub menu.
+
-
- Line edits with/without icon.
-
+
+ Line Edits
+
-
-
- Bottom Bar
-
+
+
+ Line edits with/without icon.
+
+
+ Bottom Bar
+
+
+
+
A bottom bar for window.
-
+
-
-
+
+
+
About
-
+
-
+
Tour
-
+
-
+
Test Item 2
-
+
-
+
Test Item 3
-
+
-
+
+
Home
-
+
-
+
+
File
-
+
-
+
+
Search
-
+
-
+
+
Account
-
+
-
+
+
Settings
-
+
diff --git a/example/i18n/RibbonUIAPP_zh_CN.ts b/example/i18n/RibbonUIAPP_zh_CN.ts
index f9e5c1d..3269722 100644
--- a/example/i18n/RibbonUIAPP_zh_CN.ts
+++ b/example/i18n/RibbonUIAPP_zh_CN.ts
@@ -44,115 +44,153 @@
-
+
Current Style:
当前风格:
-
+
Style
风格
-
+
Modern
现代化
-
+
Classic
经典
-
+
Text Render
文本渲染器
-
+
Current Text Render:
当前文本渲染器:
-
+
TitleBar
标题栏
-
+
Show TitleBar Icon:
显示标题栏图标:
-
+
Language
语言
-
+
Current Language:
当前语言:
+
+
+
+ Light
+ 亮色
+
+
+
+
+ Dark
+ 暗色
+
+
+
+
+ System
+ 跟随系统
+
+
+
+ Native
+ 原生
+
+
+
+ Qt
+ Qt
+
+
+
+ Show
+ 显示
+
+
+
+ Hide
+ 隐藏
+
TabBar
-
+
Basic
基本
-
+
Slider
滑动条
-
+
Switch Button
开关
-
+
CheckBox
复选框
-
+
Button
按钮
-
+
Push Button
按压按钮
-
-
+
+
No Menu
无菜单
-
-
-
+
+
+
@@ -160,157 +198,157 @@
菜单
-
+
Radio Button
单选按钮
-
+
Input
输入
-
+
Line Edit
行编辑
-
+
Text Edit
文本编辑
-
+
Combo Box
组合框
-
+
Spin Box
调整框
-
+
Progress
进度
-
+
ProgressBar
进度条
-
+
ProgressRing
进度环
-
+
Indicator
指示器
-
+
BusyRing
加载环
-
+
BusyBar
加载条
-
+
PageIndicator
页面指示器
-
+
Views
视图
-
+
MessageListView
消息列表视图
-
+
Open Message List View
打开消息列表视图
-
+
Others
其他
-
+
Text
文本
-
+
Open Menu
打开菜单
-
+
Popup
弹出窗口
-
+
Open Popup
打开弹出窗口
-
+
Open Popup Dialog (Double Choices)
打开弹出窗口(双选择)
-
+
Open Popup Dialog (Triple Choices)
打开弹出窗口(三选择)
-
+
MessageBar
信息栏
-
+
Generate One Message
生成一条信息
-
+
Clear All Messages
清除所有信息
@@ -334,160 +372,166 @@
RibbonUI 应用
-
+
Tab Bar
标签栏
-
+
A tab bar for window, let user choose the controllers.
一个让用户选择工具使用的标签栏。
-
+
Tab Bar Buttons
标签栏按钮
-
+
Tool buttons at the top of tab bar.
在标签栏顶端的工具按钮。
-
+
Sliders
滑动条
-
+
Vertical/Horizental sliders with/without buttons.
含/不含按钮的垂直/水平滑动条。
-
+
Switch Buttons
开关
-
+
Switch buttons with/without background color or grabber text.
有/没有背景颜色或者抓握指示器文本的开关。
-
+
CheckBoxs
复选框
-
+
CheckBoxs with colorful background or with/without label text.
具有多彩背景色彩或标签文本的复选框。
-
+
Buttons
按钮
-
+
Buttons with/without background or label text.
具有/不具有背景或标签文本的按钮。
-
+
Push Buttons
下压按钮
-
+
Push buttons with/without sub menu.
有/没有带菜单的下压按钮。
-
+
Line Edits
行编辑
-
+
Line edits with/without icon.
带/不带图标的行编辑器。
-
+
Bottom Bar
底层工具栏
-
+
A bottom bar for window.
窗口的底层工具栏。
-
-
+
+
+
About
关于
-
+
Tour
导览
-
+
Test Item 2
测试项目 1
-
+
Test Item 3
测试项目 1
-
+
+
Home
主页
-
+
+
File
文件
-
+
+
Search
搜索
-
+
+
Account
账户
-
+
+
Settings
设置
diff --git a/example/qml/Qt5/pages/SettingsMenuPage.qml b/example/qml/Qt5/pages/SettingsMenuPage.qml
index 2783520..f0cd016 100644
--- a/example/qml/Qt5/pages/SettingsMenuPage.qml
+++ b/example/qml/Qt5/pages/SettingsMenuPage.qml
@@ -26,22 +26,15 @@ RibbonBackStagePage{
}
RibbonComboBox{
id: theme_combo
+ textRole: "text"
model: ListModel {
- id: model_theme
- ListElement { text: "Light" }
- ListElement { text: "Dark" }
- ListElement { text: "System" }
+ ListElement { text: qsTr("Light"); value: RibbonThemeType.Light }
+ ListElement { text: qsTr("Dark"); value: RibbonThemeType.Dark }
+ ListElement { text: qsTr("System"); value: RibbonThemeType.System }
}
iconSource: RibbonIcons.DarkTheme
Component.onCompleted: update_state()
- onActivated: {
- if (currentText === "System")
- RibbonTheme.themeMode = RibbonThemeType.System
- else if (currentText === "Light")
- RibbonTheme.themeMode = RibbonThemeType.Light
- else
- RibbonTheme.themeMode = RibbonThemeType.Dark
- }
+ onActivated: RibbonTheme.themeMode = model.get(currentIndex).value
Connections{
target: RibbonTheme
function onThemeModeChanged(){
@@ -49,7 +42,7 @@ RibbonBackStagePage{
}
}
function update_state(){
- let str = (RibbonTheme.themeMode === RibbonThemeType.System ? "System" : RibbonTheme.themeMode === RibbonThemeType.Light ? "Light" : "Dark")
+ let str = (RibbonTheme.themeMode === RibbonThemeType.System ? qsTr("System") : RibbonTheme.themeMode === RibbonThemeType.Light ? qsTr("Light") : qsTr("Dark"))
currentIndex = find(str)
}
}
@@ -79,7 +72,7 @@ RibbonBackStagePage{
RibbonSwitchButton{
id: render_btn
text: "Render"
- grabberText: RibbonTheme.nativeText ? "Native" : "Qt"
+ grabberText: RibbonTheme.nativeText ? qsTr("Native") : qsTr("Qt")
checked: true
Layout.alignment: Qt.AlignHCenter
onClicked: {
@@ -99,7 +92,7 @@ RibbonBackStagePage{
}
RibbonSwitchButton{
text: "Icon"
- grabberText: RibbonTheme.nativeText ? "Show" : "Hide"
+ grabberText: RibbonTheme.nativeText ? qsTr("Show") : qsTr("Hide")
checked: true
Layout.alignment: Qt.AlignHCenter
onClicked: {
@@ -121,13 +114,11 @@ RibbonBackStagePage{
RibbonComboBox{
id: lang_combo
model: ListModel {
- id: model_lang
}
+ textRole: "text"
iconSource: RibbonIcons.LocalLanguage
Component.onCompleted: update_state()
- onActivated: {
- RibbonLocalization.currentLanguage = currentText
- }
+ onActivated: RibbonLocalization.currentLanguage = model.get(currentIndex).value
Connections{
target: RibbonLocalization
function onCurrentLanguageChanged(){
@@ -135,12 +126,15 @@ RibbonBackStagePage{
}
}
function update_state(){
- model_lang.clear()
+ model.clear()
let langs = RibbonLocalization.languageList()
for(let i = 0; i < langs.length; i++){
- model_lang.append({text:langs[i]})
+ model.append({
+ text:RibbonLocalization.languageTranslate(langs[i]),
+ value:langs[i]
+ })
}
- currentIndex = find(RibbonLocalization.currentLanguage)
+ currentIndex = find(RibbonLocalization.languageTranslate(RibbonLocalization.currentLanguage))
}
}
}
diff --git a/example/qml/Qt6/pages/SettingsMenuPage.qml b/example/qml/Qt6/pages/SettingsMenuPage.qml
index ab273e2..d996398 100644
--- a/example/qml/Qt6/pages/SettingsMenuPage.qml
+++ b/example/qml/Qt6/pages/SettingsMenuPage.qml
@@ -26,22 +26,15 @@ RibbonBackStagePage{
}
RibbonComboBox{
id: theme_combo
+ textRole: "text"
model: ListModel {
- id: model_theme
- ListElement { text: "Light" }
- ListElement { text: "Dark" }
- ListElement { text: "System" }
+ ListElement { text: qsTr("Light"); value: RibbonThemeType.Light }
+ ListElement { text: qsTr("Dark"); value: RibbonThemeType.Dark }
+ ListElement { text: qsTr("System"); value: RibbonThemeType.System }
}
iconSource: RibbonIcons.DarkTheme
Component.onCompleted: update_state()
- onActivated: {
- if (currentText === "System")
- RibbonTheme.themeMode = RibbonThemeType.System
- else if (currentText === "Light")
- RibbonTheme.themeMode = RibbonThemeType.Light
- else
- RibbonTheme.themeMode = RibbonThemeType.Dark
- }
+ onActivated: RibbonTheme.themeMode = model.get(currentIndex).value
Connections{
target: RibbonTheme
function onThemeModeChanged(){
@@ -49,7 +42,7 @@ RibbonBackStagePage{
}
}
function update_state(){
- let str = (RibbonTheme.themeMode === RibbonThemeType.System ? "System" : RibbonTheme.themeMode === RibbonThemeType.Light ? "Light" : "Dark")
+ let str = (RibbonTheme.themeMode === RibbonThemeType.System ? qsTr("System") : RibbonTheme.themeMode === RibbonThemeType.Light ? qsTr("Light") : qsTr("Dark"))
currentIndex = find(str)
}
}
@@ -79,7 +72,7 @@ RibbonBackStagePage{
RibbonSwitchButton{
id: render_btn
text: "Render"
- grabberText: RibbonTheme.nativeText ? "Native" : "Qt"
+ grabberText: RibbonTheme.nativeText ? qsTr("Native") : qsTr("Qt")
checked: true
Layout.alignment: Qt.AlignHCenter
onClicked: {
@@ -99,7 +92,7 @@ RibbonBackStagePage{
}
RibbonSwitchButton{
text: "Icon"
- grabberText: RibbonTheme.nativeText ? "Show" : "Hide"
+ grabberText: RibbonTheme.nativeText ? qsTr("Show") : qsTr("Hide")
checked: true
Layout.alignment: Qt.AlignHCenter
onClicked: {
@@ -121,13 +114,11 @@ RibbonBackStagePage{
RibbonComboBox{
id: lang_combo
model: ListModel {
- id: model_lang
}
+ textRole: "text"
iconSource: RibbonIcons.LocalLanguage
Component.onCompleted: update_state()
- onActivated: {
- RibbonLocalization.currentLanguage = currentText
- }
+ onActivated: RibbonLocalization.currentLanguage = model.get(currentIndex).value
Connections{
target: RibbonLocalization
function onCurrentLanguageChanged(){
@@ -135,12 +126,15 @@ RibbonBackStagePage{
}
}
function update_state(){
- model_lang.clear()
+ model.clear()
let langs = RibbonLocalization.languageList()
for(let i = 0; i < langs.length; i++){
- model_lang.append({text:langs[i]})
+ model.append({
+ text:RibbonLocalization.languageTranslate(langs[i]),
+ value:langs[i]
+ })
}
- currentIndex = find(RibbonLocalization.currentLanguage)
+ currentIndex = find(RibbonLocalization.languageTranslate(RibbonLocalization.currentLanguage))
}
}
}
diff --git a/lib_source/i18n/RibbonUI_en_US.ts b/lib_source/i18n/RibbonUI_en_US.ts
index f39d297..16cd140 100644
--- a/lib_source/i18n/RibbonUI_en_US.ts
+++ b/lib_source/i18n/RibbonUI_en_US.ts
@@ -7,7 +7,7 @@
Title
-
+
@@ -16,7 +16,7 @@
Name
-
+
@@ -25,31 +25,31 @@
Back
-
+
Close
-
+
Minimize
-
+
Restore
-
+
Maximize
-
+
@@ -58,13 +58,21 @@
Please input:
-
+
Clear
-
+
+
+
+
+ RibbonLocalization
+
+
+ Not Found
+
@@ -73,43 +81,43 @@
Link
-
+
Close
-
+
See More
-
+
ActionA
-
+
ActionB
-
+
ActionA Clicked
-
+
ActionB Clicked
-
+
@@ -120,25 +128,25 @@
's
-
+
Clear All
-
+
Show all messages
-
+
Hide all messages
-
+
@@ -147,13 +155,13 @@
Previous
-
+
Next
-
+
@@ -162,7 +170,7 @@
Loading
-
+
@@ -171,13 +179,13 @@
Open
-
+
Close
-
+
@@ -186,25 +194,25 @@
Settings
-
+
Show
-
+
Hide
-
+
RibbonTabBar: Error loading component:
-
+
@@ -213,13 +221,13 @@
Open
-
+
's external
-
+
@@ -228,25 +236,25 @@
Cut
-
+
Copy
-
+
Paste
-
+
Select All
-
+
@@ -255,13 +263,13 @@
Please input:
-
+
Clear
-
+
@@ -270,55 +278,55 @@
Close
-
+
Minimize
-
+
Restore
-
+
Maximize
-
+
Style
-
+
Modern
-
+
Classic
-
+
Dark Mode
-
+
Stay on Top
-
+
@@ -327,25 +335,25 @@
Don't auto pop up
-
+
Previous
-
+
Finish
-
+
Next
-
+
@@ -354,31 +362,54 @@
Quit
-
+
Minimize
-
+
Cancel
-
+
Do you want to close this window?
-
+
Please note
-
+
+
+
+
+ langList
+
+
+ zh_CN
+ Chinese (Simplified)
+
+
+
+ zh_TW
+ Chinese (Traditional)
+
+
+
+ en_US
+ English (USA)
+
+
+
+ en_UK
+ English (UK)
diff --git a/lib_source/i18n/RibbonUI_zh_CN.ts b/lib_source/i18n/RibbonUI_zh_CN.ts
index 2b922b2..a1ee699 100644
--- a/lib_source/i18n/RibbonUI_zh_CN.ts
+++ b/lib_source/i18n/RibbonUI_zh_CN.ts
@@ -67,6 +67,14 @@
清除
+
+ RibbonLocalization
+
+
+ Not Found
+ 未找到对应语言
+
+
RibbonMessageBar
@@ -382,4 +390,27 @@
请注意
+
+ langList
+
+
+ zh_CN
+ 简体中文
+
+
+
+ zh_TW
+ 繁体中文(台湾)
+
+
+
+ en_US
+ 英文(美国)
+
+
+
+ en_UK
+ 英文(英国)
+
+
diff --git a/lib_source/include/ribbonlocalization.h b/lib_source/include/ribbonlocalization.h
index 2e34d90..8f75374 100644
--- a/lib_source/include/ribbonlocalization.h
+++ b/lib_source/include/ribbonlocalization.h
@@ -21,6 +21,7 @@ public:
Q_INVOKABLE bool removeLanguage(QString langName, QString path);
Q_INVOKABLE void bindEngine();
Q_INVOKABLE QList languageList();
+ Q_INVOKABLE QString languageTranslate(QString langStr);
QString currentLanguage();
bool setCurrentLanguage(QString langName);
// Use if you need to directly save/load language from config files
@@ -34,10 +35,16 @@ private:
#endif
RibbonLocalization();
~RibbonLocalization();
-private:
+protected:
ModuleTranslator moduleLangList;
Translator transList;
QString _currentLang;
+ const QMap langList = {
+ {"zh_CN", QT_TRANSLATE_NOOP("langList", "zh_CN")},
+ {"zh_TW", QT_TRANSLATE_NOOP("langList", "zh_TW")},
+ {"en_US", QT_TRANSLATE_NOOP("langList", "en_US")},
+ {"en_UK", QT_TRANSLATE_NOOP("langList", "en_UK")},
+ };
signals:
void currentLanguageChanged();
};
diff --git a/lib_source/source/ribbonlocalization.cpp b/lib_source/source/ribbonlocalization.cpp
index c294483..fa9e2bd 100644
--- a/lib_source/source/ribbonlocalization.cpp
+++ b/lib_source/source/ribbonlocalization.cpp
@@ -104,3 +104,11 @@ QList RibbonLocalization::languageList(){
}
return list;
}
+
+QString RibbonLocalization::languageTranslate(QString langStr){
+ if(langList.contains(langStr)){
+ return qApp->translate("langList", langList[langStr]);
+ }
+ else
+ return tr("Not Found");
+}