gc_i18n 1.4.3 → 1.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,25 +2,22 @@
2
2
 
3
3
  <cite>
4
4
  **本文档中引用的文件**
5
+ - [package.json](file://package.json) - *版本信息,从1.4.3升级到1.4.4*
5
6
  - [gc_i18n.es.js](file://lib/gc_i18n.es.js) - *在最近的提交中更新*
6
7
  - [i18nUtils.ts](file://packages/libs/i18nUtils.ts) - *在最近的提交中更新*
7
8
  - [service.js](file://packages/libs/service.js) - *在最近的提交中更新,包含关键逻辑变更*
8
9
  - [utils.js](file://packages/libs/utils.js) - *在最近的提交中更新,包含 mergeArraysByKey 函数*
9
10
  - [packages/index.js](file://packages/index.js) - *库的入口点,包含初始化逻辑*
10
- - [package.json](file://package.json) - *版本信息,从1.3.12升级到1.4.1*
11
11
  </cite>
12
12
 
13
13
  ## 更新摘要
14
14
  **变更内容**
15
- - 移除了 `fetchTranslate` 函数中的 `page` 参数,更新了函数签名和参数说明
16
- - 版本从 1.3.12 升级到 1.4.1
17
- - 更新了 `service.js` 中 `getTranslate` 方法的文档,以反映其新的行为:当返回 `common` 类型的翻译时,会移除当前路由的数据
18
- - 更新了 `gc_i18n.es.js` 中 `$t` 方法的文档,详细说明了其新的查找优先级:先查找 `route.key`,再查找 `common.key`,最后查找全局 `key`
19
- - 更新了 `utils.js` 中 `mergeArraysByKey` 函数的文档,说明了其在合并数据时会移除与 `common` 键匹配的当前路由数据
20
- - 修正了 `service.js` 中 `fetchTranslate` 和 `getTranslate` 方法的返回值描述,使其与代码实现一致
15
+ - 版本从 1.4.3 升级到 1.4.4
16
+ - 更新了 `packages/index.js` 中路由守卫的 `closeModal` 功能集成
17
+ - 更新了 `gc_i18n.es.js` 中 `$t` 方法的文档,详细说明了其新的查找优先级
18
+ - 更新了 `utils.js` 中 `mergeArraysByKey` 函数的文档
19
+ - 修正了 `service.js` 中 `fetchTranslate` `getTranslate` 方法的返回值描述
21
20
  - 更新了所有受影响部分的源代码引用,以反映最新的文件状态
22
- - **新增**:标准化了后端翻译服务端点,从 `i18n-web//app/getsupportedlangs` 迁移到 `i18n-web/app/getsupportedlangs`
23
- - **新增**:引入了 `getLanguagesWithCache` 函数,提供带缓存的语言列表获取功能
24
21
 
25
22
  ## 目录
26
23
  1. [简介](#简介)
@@ -40,6 +37,7 @@
40
37
  - **语言切换**:通过 `$changeLocale` 方法动态切换当前语言环境。
41
38
  - **语言包管理**:通过 `service.js` 提供的接口从后端获取和更新翻译资源。
42
39
  - **工具支持**:提供静态分析工具函数,用于提取项目中的翻译键。
40
+ - **模态框关闭**:通过 `closeModal` 方法统一管理 SweetAlert2 模态框的关闭。
43
41
 
44
42
  **Section sources**
45
43
  - [gc_i18n.es.js](file://lib/gc_i18n.es.js)
@@ -116,6 +114,41 @@ $changeLocale(locale: string): Promise<void>
116
114
  - [src/view/Home.vue](file://src/view/Home.vue#L2)
117
115
  - [src/view/login.vue](file://src/view/login.vue#L2)
118
116
 
117
+ ### closeModal (关闭模态框方法)
118
+ 此方法用于统一关闭 SweetAlert2 弹窗,确保模态框的正确销毁和资源清理。
119
+
120
+ **方法签名**
121
+ ```typescript
122
+ closeModal(): void
123
+ ```
124
+
125
+ **参数**
126
+ - 无参数
127
+
128
+ **返回值**
129
+ - `void` - 无返回值
130
+
131
+ **副作用**
132
+ - 关闭当前显示的 SweetAlert2 弹窗
133
+ - 清理弹窗相关的事件监听器和 DOM 元素
134
+ - 触发 `willClose` 和 `didClose` 事件回调
135
+ - 释放内存资源,防止内存泄漏
136
+
137
+ **使用限制**
138
+ - 仅在 SweetAlert2 弹窗处于激活状态时有效
139
+ - 调用后会触发弹窗的销毁流程,无法恢复
140
+
141
+ **错误处理建议**
142
+ - 确保在调用前检查弹窗是否已激活
143
+ - 监听 `willClose` 和 `didClose` 事件以处理关闭后的逻辑
144
+ - 在路由切换时自动调用此方法,避免弹窗残留
145
+
146
+ **新增** 该方法作为 SweetAlert2 的别名方法,提供统一的模态框关闭接口。
147
+
148
+ **Section sources**
149
+ - [gc_i18n.es.js:1340-1350](file://lib/gc_i18n.es.js#L1340-L1350) - *新增 closeModal 方法实现*
150
+ - [gc_i18n.es.js:1930-1932](file://lib/gc_i18n.es.js#L1930-L1932) - *closeModal 方法别名注册*
151
+
119
152
  ## i18nUtils.ts 工具函数
120
153
  `i18nUtils.ts` 文件提供了一个用于静态分析的工具函数,帮助开发者管理和审计翻译资源。
121
154
 
@@ -363,6 +396,16 @@ const keys = extractTranslationKeys(MyComponent);
363
396
  console.log(keys); // 输出: ["hello", "greeting"]
364
397
  ```
365
398
 
399
+ ### 路由守卫中集成 closeModal
400
+ ```javascript
401
+ // 在路由守卫中自动关闭模态框
402
+ this.router.beforeEach(async (to, from, next) => {
403
+ // 自动关闭配置中心弹窗
404
+ this.configInstance && this.configInstance.closeModal();
405
+ // 其他路由逻辑...
406
+ });
407
+ ```
408
+
366
409
  ## 错误处理与限制
367
410
  - **网络错误**: `service.js` 中的所有异步方法都可能因网络问题而失败。务必使用 `try-catch` 或 `.catch()` 处理 Promise 拒绝。
368
411
  - **缓存失效**: `getTranslate` 依赖本地存储。如果用户清除浏览器数据,缓存将丢失,需要重新下载完整语言包。
@@ -371,5 +414,7 @@ console.log(keys); // 输出: ["hello", "greeting"]
371
414
  - **逻辑变更**: `getTranslate` 方法现在会移除 `common` 键覆盖的当前路由数据,这可能会影响某些依赖于特定键的组件。
372
415
  - **参数变更**: `fetchTranslate` 函数已移除 `page` 参数,使用时请注意更新调用方式。
373
416
  - **端点标准化**: 所有翻译服务端点已标准化为 `/i18n-web/...` 结构,确保了后端服务的一致性。
417
+ - **模态框管理**: 新增的 `closeModal` 方法提供了统一的 SweetAlert2 弹窗管理,避免了弹窗残留问题。
418
+ - **版本更新** 本版本为 1.4.4,包含上述重要变更,特别是路由守卫中自动调用 `closeModal` 的功能集成。
374
419
 
375
- **版本更新** 本版本为 1.4.1,包含上述重要变更,特别是后端翻译服务端点的标准化迁移和新增的带缓存语言列表获取功能。
420
+ **版本更新** 本版本为 1.4.4,包含上述重要变更,特别是路由守卫中自动调用 `closeModal` 的功能集成。
@@ -24,6 +24,7 @@
24
24
  ## 更新摘要
25
25
  **变更内容**
26
26
  - 核心I18n类完全重写,引入Vue 2/3兼容层和createI18nCompat函数
27
+ - **新增单元代码支持功能**,在配置系统中引入unitCode属性,默认值为GREENCLOUD,增强了翻译数据结构和处理能力
27
28
  - **新增中文语言模式兼容性支持**,通过normalizeLocale方法支持zh-CN和zh-TW的自动规范化
28
29
  - **内部代码重构改进**,axios别名从Ve改为je,多个函数重命名等
29
30
  - 支持自动版本检测和适配,统一Vue 2和Vue 3的API差异
@@ -42,6 +43,7 @@
42
43
  - **安全机制改进**,新增JWT令牌验证和权限控制
43
44
  - **SweetAlert2集成优化**,改进变量命名和代码组织结构,提升可读性和维护性
44
45
  - **新增智能语言列表缓存机制**,通过getLanguagesWithCache提供缓存和自动失效功能
46
+ - **新增postMessage事件处理功能**,扩展了原有的updateLanguage事件处理机制,允许外部应用程序通过postMessage事件编程关闭模态框
45
47
 
46
48
  ## 目录
47
49
  1. [项目结构分析](#项目结构分析)
@@ -50,9 +52,10 @@
50
52
  4. [公共API接口文档](#公共api接口文档)
51
53
  5. [RTL方向管理功能](#rtl方向管理功能)
52
54
  6. [中文语言模式兼容性](#中文语言模式兼容性)
53
- 7. [文本编辑模式功能](#文本编辑模式功能)
54
- 8. [非组件环境使用](#非组件环境使用)
55
- 9. [样式文件作用](#样式文件作用)
55
+ 7. [单元代码支持功能](#单元代码支持功能)
56
+ 8. [文本编辑模式功能](#文本编辑模式功能)
57
+ 9. [非组件环境使用](#非组件环境使用)
58
+ 10. [样式文件作用](#样式文件作用)
56
59
 
57
60
  ## 项目结构分析
58
61
 
@@ -270,7 +273,7 @@ function _r(e, t) {
270
273
 
271
274
  ### 事件通知机制
272
275
 
273
- 事件通知通过自定义事件系统实现,使用mitt事件发射器:
276
+ **更新** 事件通知通过自定义事件系统实现,使用mitt事件发射器,新增了closeModal事件处理功能:
274
277
 
275
278
  ```javascript
276
279
  install(app, opts = {}) {
@@ -282,6 +285,10 @@ install(app, opts = {}) {
282
285
  if (event.data.type === "updateLanguage") {
283
286
  location.reload();
284
287
  }
288
+ // 新增:监听关闭弹窗消息
289
+ if (event.data.type === "closeModal") {
290
+ this.configInstance && this.configInstance.closeModal();
291
+ }
285
292
  });
286
293
  }
287
294
  ```
@@ -531,6 +538,10 @@ install(app, opts = {}) {
531
538
  if (event.data.type === "updateLanguage") {
532
539
  location.reload();
533
540
  }
541
+ // 新增:监听关闭弹窗消息
542
+ if (event.data.type === "closeModal") {
543
+ this.configInstance && this.configInstance.closeModal();
544
+ }
534
545
  });
535
546
  }
536
547
  ```
@@ -1032,6 +1043,132 @@ await $changeLocale('zh-CN'); // 切换到简体中文
1032
1043
  - [packages/index.js:437-492](file://packages/index.js#L437-L492)
1033
1044
  - [lang/index.json:1-130](file://lang/index.json#L1-L130)
1034
1045
 
1046
+ ## 单元代码支持功能
1047
+
1048
+ ### 单位代码配置机制
1049
+
1050
+ **新增** I18n类引入了unitCode属性,用于支持单元代码(组织代码)的配置和管理:
1051
+
1052
+ ```javascript
1053
+ constructor(options = {}) {
1054
+ // ... 其他初始化代码
1055
+ this.unitCode = options.unitCode || "GREENCLOUD";
1056
+ // ... 其他初始化代码
1057
+ }
1058
+ ```
1059
+
1060
+ ### 默认值设置和环境检测
1061
+
1062
+ **更新** 单元代码的默认值设置,结合环境检测机制:
1063
+
1064
+ ```javascript
1065
+ // 在语言包入口中,根据环境模式设置单元代码
1066
+ const i18n = new gc_i18n({
1067
+ // ... 其他配置
1068
+ orgCode: import.meta.env.MODE === "unit" ? "DD" : "GREENCLOUD",
1069
+ // ...
1070
+ });
1071
+ ```
1072
+
1073
+ ### 文本编辑模式中的单元代码集成
1074
+
1075
+ **新增** 文本编辑模式中集成了unitCode支持,用于翻译数据的保存和检索:
1076
+
1077
+ ```javascript
1078
+ async saveTranslations(key, values, originalData) {
1079
+ const original = originalData[0];
1080
+ const unitCode = this.unitCode || "GREENCLOUD";
1081
+
1082
+ const requestData = [];
1083
+ Object.keys(values).forEach(lang => {
1084
+ requestData.push({
1085
+ appCode: this.appCode,
1086
+ page: original.page,
1087
+ key: key,
1088
+ unitCode: unitCode,
1089
+ lang: lang,
1090
+ value: values[lang],
1091
+ fromAi: "F"
1092
+ });
1093
+ });
1094
+
1095
+ const response = await saveTranslate({
1096
+ data: { data: requestData, isLocal: "F" },
1097
+ token: this.token,
1098
+ baseUrl: this.baseUrl
1099
+ });
1100
+
1101
+ return response;
1102
+ }
1103
+ ```
1104
+
1105
+ ### 单元代码在配置系统中的应用
1106
+
1107
+ **新增** 单元代码在配置系统中的完整应用流程:
1108
+
1109
+ ```javascript
1110
+ /**
1111
+ * 初始化配置
1112
+ */
1113
+ async initConfig() {
1114
+ const i18nConfig = store2.get("I18N_CONFIG") || {};
1115
+ const env = i18nConfig.env || "local";
1116
+
1117
+ // 根据环境设置 baseUrl
1118
+ this.baseUrl =
1119
+ !env || env === "local"
1120
+ ? ""
1121
+ : env === "dev"
1122
+ ? "https://test.ihotel.cn"
1123
+ : "https://trans.ihotel.cn";
1124
+
1125
+ this.appCode = i18nConfig.appCode || "";
1126
+ this.unitCode = i18nConfig.unitCode || "GREENCLOUD";
1127
+ this.token = i18nConfig.token || store2.get("I18N_TOKEN") || "";
1128
+ this.currentLocale = i18nConfig.locale || store2.get("I18N_LANGUAGE") || "zh-CN";
1129
+
1130
+ await this.loadLanguages();
1131
+ }
1132
+ ```
1133
+
1134
+ ### 单元代码的默认值策略
1135
+
1136
+ **新增** 单元代码的默认值策略,确保在不同环境下的一致性:
1137
+
1138
+ ```javascript
1139
+ // 默认单元代码为 GREENCLOUD
1140
+ this.unitCode = options.unitCode || "GREENCLOUD";
1141
+
1142
+ // 在语言包入口中,根据模式覆盖默认值
1143
+ const unitCode = import.meta.env.MODE === "unit" ? "DD" : "GREENCLOUD";
1144
+ ```
1145
+
1146
+ ### 单元代码支持的最佳实践
1147
+
1148
+ **新增** 使用单元代码支持的推荐做法:
1149
+
1150
+ ```javascript
1151
+ // 1. 在创建I18n实例时显式设置unitCode
1152
+ const i18n = new I18n({
1153
+ unitCode: 'CUSTOM_UNIT_CODE',
1154
+ appCode: 'MY_APP',
1155
+ orgCode: 'ORG123'
1156
+ });
1157
+
1158
+ // 2. 在不同环境使用不同的unitCode
1159
+ const unitCode = import.meta.env.MODE === "unit" ? "DD" : "GREENCLOUD";
1160
+
1161
+ // 3. 在文本编辑模式中自动使用配置的unitCode
1162
+ await textEditMode.toggle();
1163
+ // 编辑的翻译数据将使用配置的unitCode保存
1164
+ ```
1165
+
1166
+ **本节来源**
1167
+ - [packages/index.js:70-125](file://packages/index.js#L70-L125)
1168
+ - [packages/libs/textEditMode.js:29-50](file://packages/libs/textEditMode.js#L29-L50)
1169
+ - [lang/index.js:10](file://lang/index.js#L10)
1170
+ - [lib/gc_i18n.es.js:1964-1966](file://lib/gc_i18n.es.js#L1964-L1966)
1171
+
1035
1172
  ## 文本编辑模式功能
1036
1173
 
1037
1174
  ### 文本编辑模式概述
@@ -1632,4 +1769,80 @@ div:where(.swal2-container) button:where(.swal2-close):focus-visible {
1632
1769
  - [lib/gc_i18n.css](file://lib/gc_i18n.css)
1633
1770
  - [packages/libs/textEditMode.css:1-166](file://packages/libs/textEditMode.css#L1-L166)
1634
1771
  - [packages/swal.css:1-18](file://packages/swal.css#L1-L18)
1635
- - [packages/index.js:338-343](file://packages/index.js#L338-L343)
1772
+ - [packages/index.js:338-343](file://packages/index.js#L338-L343)
1773
+
1774
+ ## PostMessage事件处理功能
1775
+
1776
+ **新增** I18n类现在支持通过postMessage事件编程控制模态框的关闭,扩展了原有的updateLanguage事件处理机制。
1777
+
1778
+ ### 事件处理机制
1779
+
1780
+ I18n类通过window.addEventListener监听postMessage事件,支持两种类型的事件:
1781
+
1782
+ ```javascript
1783
+ window.addEventListener("message", (event) => {
1784
+ if (event.data.type === "updateLanguage") {
1785
+ location.reload();
1786
+ }
1787
+ // 新增:监听关闭弹窗消息
1788
+ if (event.data.type === "closeModal") {
1789
+ this.configInstance && this.configInstance.closeModal();
1790
+ }
1791
+ });
1792
+ ```
1793
+
1794
+ ### 事件类型说明
1795
+
1796
+ #### updateLanguage事件
1797
+
1798
+ - **用途**: 触发语言更新,重新加载页面
1799
+ - **触发条件**: 接收到type为"updateLanguage"的消息
1800
+ - **行为**: 调用location.reload()重新加载当前页面
1801
+
1802
+ #### closeModal事件
1803
+
1804
+ - **用途**: 编程式关闭模态框
1805
+ - **触发条件**: 接收到type为"closeModal"的消息
1806
+ - **行为**: 调用configInstance.closeModal()关闭当前打开的配置模态框
1807
+ - **适用场景**: 外部应用程序需要程序化控制模态框的关闭
1808
+
1809
+ ### 外部应用程序集成
1810
+
1811
+ 外部应用程序可以通过postMessage API向目标窗口发送关闭模态框的指令:
1812
+
1813
+ ```javascript
1814
+ // 向目标窗口发送关闭模态框指令
1815
+ targetWindow.postMessage({ type: "closeModal" }, "*");
1816
+
1817
+ // 或者指定目标源
1818
+ targetWindow.postMessage({ type: "closeModal" }, "https://your-domain.com");
1819
+ ```
1820
+
1821
+ ### 与Earth组件的协同
1822
+
1823
+ Earth组件同样支持closeModal事件处理,确保组件间的一致性:
1824
+
1825
+ ```javascript
1826
+ const handleMessage = (event) => {
1827
+ if (event.data && event.data.type === "updateLanguage") {
1828
+ // 从 store 重新读取当前语言
1829
+ currentLocale.value = store2.get("I18N_LANGUAGE") || "zh-CN";
1830
+ }
1831
+ // Earth组件也支持closeModal事件
1832
+ if (event.data && event.data.type === "closeModal") {
1833
+ // Earth组件的关闭逻辑
1834
+ }
1835
+ };
1836
+ ```
1837
+
1838
+ ### 最佳实践
1839
+
1840
+ 1. **事件类型区分**: 确保发送的事件类型正确,避免误触发
1841
+ 2. **目标窗口确认**: 在生产环境中指定具体的目标源,提高安全性
1842
+ 3. **错误处理**: 添加适当的错误处理机制,防止事件丢失
1843
+ 4. **时机控制**: 在模态框真正打开后再发送closeModal事件
1844
+
1845
+ **本节来源**
1846
+ - [packages/index.js:546-555](file://packages/index.js#L546-L555)
1847
+ - [packages/components/earth.js:122-128](file://packages/components/earth.js#L122-L128)
1848
+ - [lib/gc_i18n.es.js:2868-2870](file://lib/gc_i18n.es.js#L2868-L2870)
@@ -8,7 +8,7 @@
8
8
  - [gc_i18n.es.js](file://lib/gc_i18n.es.js) - *在提交71b90fd中更新了搜索逻辑*
9
9
  - [earth.js](file://packages/components/earth.js) - *在提交71b90fd中更新了页面数据处理逻辑*
10
10
  - [service.js](file://packages/libs/service.js) - *新增appCode参数支持*
11
- - [packages/index.js](file://packages/index.js) - *新增appCode参数支持,新增文本编辑模式快捷键绑定*
11
+ - [packages/index.js](file://packages/index.js) - *新增appCode参数支持,新增文本编辑模式快捷键绑定,增强语言兼容性处理*
12
12
  - [textEditMode.js](file://packages/libs/textEditMode.js) - *新增文本编辑模式功能*
13
13
  - [textEditMode.css](file://packages/libs/textEditMode.css) - *新增文本编辑模式样式*
14
14
  </cite>
@@ -27,6 +27,7 @@
27
27
  - **更新** [翻译键值对结构](#翻译键值对结构)章节,反映lang/index.json中新增的24个翻译键,扩展了国际化的支持范围
28
28
  - **更新** [fetchTranslate函数参数说明](#fetchtranslate函数参数说明),移除了page参数的使用示例,确保文档与实际代码实现一致
29
29
  - **新增** [中文语言环境增强支持](#中文语言环境增强支持)章节,详细说明字符编码处理、中文排版支持等增强功能
30
+ - **新增** [语言兼容性处理机制](#语言兼容性处理机制)章节,详细说明normalizeLocale方法的增强功能,支持更精细的中文变体处理和统一的英文区域变体处理
30
31
 
31
32
  ## 目录
32
33
  1. [项目结构](#项目结构)
@@ -47,6 +48,7 @@
47
48
  16. [快捷键绑定机制](#快捷键绑定机制)
48
49
  17. [文本编辑模式样式系统](#文本编辑模式样式系统)
49
50
  18. [中文语言环境增强支持](#中文语言环境增强支持)
51
+ 19. [语言兼容性处理机制](#语言兼容性处理机制)
50
52
 
51
53
  ## 项目结构
52
54
 
@@ -336,6 +338,10 @@ LoadTranslations --> End([应用就绪])
336
338
  "fflhz3": {
337
339
  "zh-cn": "日本語",
338
340
  "zh-tw": "日本語"
341
+ },
342
+ "g9ioaz11": {
343
+ "zh-cn": "{{$values.id ===\"1\" ? \"新建预订\":\"修改预订\"}}",
344
+ "zh-tw": "{{$values.id ===\"1\" ? \"新建預訂\":\"修改預訂\"}}"
339
345
  }
340
346
  }
341
347
  ```
@@ -343,6 +349,7 @@ LoadTranslations --> End([应用就绪])
343
349
  **更新** 新增了24个翻译条目,包括文本编辑模式的用户界面文本、快捷键说明和操作提示。这些新增条目主要集中在键值对的末尾部分,提供了完整的编辑模式功能支持。新增的翻译键包括:
344
350
  - **文本编辑模式界面文本**:`i55x296`、`7vs7of6`、`edmbfk8`(简体中文、繁体中文、日语内容)
345
351
  - **语言名称翻译**:`fwrpxp4`、`gkc0dp4`、`fflhz3`(简体中文、繁体中文、日语)
352
+ - **条件翻译**:`g9ioaz11`(根据条件显示不同的翻译内容)
346
353
 
347
354
  翻译键值对的结构特点:
348
355
  - **键命名**:使用随机生成的短字符串作为键名(如qylb2),避免语义化键名带来的维护问题
@@ -357,7 +364,7 @@ LoadTranslations --> End([应用就绪])
357
364
  4. **工具友好**:便于自动化工具提取和管理翻译项
358
365
 
359
366
  **节来源**
360
- - [index.json:1-130](file://lang/index.json#L1-L130)
367
+ - [index.json:1-134](file://lang/index.json#L1-L134)
361
368
 
362
369
  ## 语言文件命名规范与目录结构
363
370
 
@@ -535,7 +542,7 @@ this.$t('greeting', { name: '张三', count: 5 })
535
542
 
536
543
  **节来源**
537
544
  - [index.js:1-20](file://lang/index.js#L1-L20)
538
- - [index.json:1-130](file://lang/index.json#L1-L130)
545
+ - [index.json:1-134](file://lang/index.json#L1-L134)
539
546
 
540
547
  ## JSON与JavaScript语言文件的适用场景
541
548
 
@@ -1310,4 +1317,114 @@ function processChineseText(text) {
1310
1317
  - [index.js](file://lang/index.js)
1311
1318
  - [index.json](file://lang/index.json)
1312
1319
  - [textEditMode.js](file://packages/libs/textEditMode.js)
1313
- - [textEditMode.css](file://packages/libs/textEditMode.css)
1320
+ - [textEditMode.css](file://packages/libs/textEditMode.css)
1321
+
1322
+ ## 语言兼容性处理机制
1323
+
1324
+ ### normalizeLocale方法增强
1325
+
1326
+ 系统新增了强大的语言兼容性处理机制,通过增强的`normalizeLocale`方法支持更精细的语言变体处理和统一的区域变体处理。
1327
+
1328
+ ### 方法实现详解
1329
+
1330
+ ```javascript
1331
+ normalizeLocale(locale) {
1332
+ if (!locale) return "zh-CN";
1333
+ // 保留繁体中文变体
1334
+ if (locale === "zh-TW" || locale === "zh-HK" || locale === "zh-MO") {
1335
+ return locale;
1336
+ }
1337
+ // zh-SG 等其它 zh- 开头映射为 zh-CN
1338
+ if (locale.startsWith("zh-")) {
1339
+ return "zh-CN";
1340
+ }
1341
+ // en-* 全部映射为 en-US
1342
+ if (locale.startsWith("en-")) {
1343
+ return "en-US";
1344
+ }
1345
+ // 处理完全匹配形式
1346
+ const localeMap = {
1347
+ zh: "zh-CN",
1348
+ en: "en-US"
1349
+ };
1350
+ return localeMap[locale] || locale;
1351
+ }
1352
+ ```
1353
+
1354
+ ### 支持的语言变体
1355
+
1356
+ #### 繁体中文变体保留
1357
+ - **zh-TW**:台湾繁体中文
1358
+ - **zh-HK**:香港繁体中文
1359
+ - **zh-MO**:澳门繁体中文
1360
+
1361
+ 这些繁体中文变体将被完整保留,不会被映射到简体中文,确保地区化内容的准确性。
1362
+
1363
+ #### 简体中文统一处理
1364
+ - **zh-CN**:中国大陆简体中文
1365
+ - **zh-SG**:新加坡简体中文
1366
+ - **zh-Hans**:简体中文(通用)
1367
+
1368
+ 所有以"zh-"开头的简体中文变体都会被统一映射到"zh-CN",确保简体中文内容的一致性。
1369
+
1370
+ #### 英文统一处理
1371
+ - **en-US**:美国英语
1372
+ - **en-GB**:英国英语
1373
+ - **en-CA**:加拿大英语
1374
+ - **en-AU**:澳大利亚英语
1375
+ - **en-IE**:爱尔兰英语
1376
+ - **en-NZ**:新西兰英语
1377
+ - **en-ZA**:南非英语
1378
+
1379
+ 所有以"en-"开头的英文变体都会被统一映射到"en-US",提供统一的英文用户体验。
1380
+
1381
+ ### 浏览器语言监听
1382
+
1383
+ 系统还集成了浏览器语言变化监听机制:
1384
+
1385
+ ```javascript
1386
+ setupLanguageChangeListener() {
1387
+ if ("onlanguagechange" in window) {
1388
+ window.addEventListener("languagechange", () => {
1389
+ const newBrowserLanguage = this.normalizeLocale(navigator.language);
1390
+ if (newBrowserLanguage !== this.locale) {
1391
+ this.setLanguage(newBrowserLanguage);
1392
+ }
1393
+ });
1394
+ }
1395
+ }
1396
+ ```
1397
+
1398
+ 当用户的浏览器语言发生变化时,系统会自动检测并应用合适的语言设置。
1399
+
1400
+ ### 使用示例
1401
+
1402
+ ```javascript
1403
+ // 不同语言代码的规范化处理
1404
+ console.log(normalizeLocale("zh-TW")); // 输出: "zh-TW" (保留不变)
1405
+ console.log(normalizeLocale("zh-HK")); // 输出: "zh-HK" (保留不变)
1406
+ console.log(normalizeLocale("zh-MO")); // 输出: "zh-MO" (保留不变)
1407
+ console.log(normalizeLocale("zh-SG")); // 输出: "zh-CN" (映射到简体中文)
1408
+ console.log(normalizeLocale("en-GB")); // 输出: "en-US" (映射到美式英语)
1409
+ console.log(normalizeLocale("en-CA")); // 输出: "en-US" (映射到美式英语)
1410
+ console.log(normalizeLocale("zh")); // 输出: "zh-CN" (完全匹配)
1411
+ console.log(normalizeLocale("en")); // 输出: "en-US" (完全匹配)
1412
+ ```
1413
+
1414
+ ### 实际应用场景
1415
+
1416
+ 1. **多地区部署**:支持中国大陆、台湾、香港、澳门等不同地区的语言需求
1417
+ 2. **全球化应用**:统一处理不同英语国家的语言偏好
1418
+ 3. **浏览器兼容**:自动适配用户浏览器的语言设置
1419
+ 4. **动态语言切换**:支持运行时的语言环境调整
1420
+
1421
+ ### 性能优化考虑
1422
+
1423
+ - **快速匹配**:使用简单的字符串比较和前缀检查
1424
+ - **缓存机制**:避免重复的语言代码处理
1425
+ - **浏览器支持检测**:仅在支持的浏览器中启用语言变化监听
1426
+ - **回退机制**:当语言代码无效时自动回退到默认语言
1427
+
1428
+ **节来源**
1429
+ - [packages/index.js:168-188](file://packages/index.js#L168-L188)
1430
+ - [packages/index.js:191-200](file://packages/index.js#L191-L200)
@@ -8,20 +8,18 @@
8
8
  - [lang/index.js](file://lang/index.js)
9
9
  - [packages/libs/service.js](file://packages/libs/service.js)
10
10
  - [packages/libs/i18nUtils.ts](file://packages/libs/i18nUtils.ts)
11
+ - [packages/libs/textEditMode.js](file://packages/libs/textEditMode.js)
11
12
  - [packages/swal.css](file://packages/swal.css)
12
13
  - [package.json](file://package.json)
13
- - [packages/libs/textEditMode.js](file://packages/libs/textEditMode.js)
14
14
  - [packages/libs/textEditMode.css](file://packages/libs/textEditMode.css)
15
15
  </cite>
16
16
 
17
17
  ## 更新摘要
18
18
  **所做更改**
19
- - 版本从1.4.1升级到1.4.2
20
- - SweetAlert2模态对话框的z-index增强,确保不被其他弹窗遮盖
21
- - 更新了基础URL配置,将 `https://i18n.ihotel.cn` 更新为 `https://trans.ihotel.cn`
22
- - 标准化了API端点路径,移除了重复的斜杠
23
- - 更新了环境配置说明,反映最新的URL变更
24
- - 修正了iframe配置的URL结构说明
19
+ - 新增了 `unitCode` 配置选项,允许在配置系统中指定单位代码,默认值为 "GREENCLOUD"
20
+ - 更新了版本号至 1.4.3
21
+ - 修正了 `orgCode` 配置的默认值说明,从 "DD" 改为 "GREENCLOUD"
22
+ - 更新了企业环境配置说明,反映 `unitCode` 的作用
25
23
 
26
24
  ## 目录
27
25
  1. [i18n构建配置](#i18n构建配置)
@@ -126,7 +124,7 @@ external: [
126
124
  - **样式**: 提供专门的CSS样式支持编辑模式的视觉反馈
127
125
 
128
126
  **Section sources**
129
- - [packages/index.js:67-547](file://packages/index.js#L67-L547)
127
+ - [packages/index.js:67-559](file://packages/index.js#L67-L559)
130
128
 
131
129
  ## 初始化配置对象
132
130
 
@@ -164,6 +162,7 @@ external: [
164
162
  - **login**: 是否启用登录功能
165
163
  - **messages**: 预定义的语言消息对象
166
164
  - **editKeyboard**: 文本编辑模式快捷键,默认为 "ctrl+shift+e"
165
+ - **unitCode**: 单位代码,默认值为 "GREENCLOUD",用于企业环境中的翻译范围控制
167
166
 
168
167
  **Section sources**
169
168
  - [src/main.js:1-12](file://src/main.js#L1-L12)
@@ -181,7 +180,7 @@ external: [
181
180
  | **appCode** | String | null | 任意字符串 | 应用标识符,用于区分不同应用 |
182
181
  | **messages** | Object | {} | 包含语言代码为键的对象 | 预定义的语言消息,用于快速加载 |
183
182
  | **token** | String | generateJWT(orgCode) 或 localStorage 中的 I18N_TOKEN | JWT token | 用于认证请求语言资源 |
184
- | **orgCode** | String | null | 任意字符串 | 用于生成 JWT token 的组织代码 |
183
+ | **orgCode** | String | "GREENCLOUD" | 任意字符串 | 用于生成 JWT token 的组织代码 |
185
184
  | **loginRouteName** | String | "login" | 任意字符串 | 登录页面的路由名称 |
186
185
  | **login** | Boolean | false | true/false | 是否启用登录功能 |
187
186
  | **keyboard** | String | "ctrl+shift+l" | 键盘快捷键组合 | 触发展示配置iframe的快捷键 |
@@ -189,6 +188,7 @@ external: [
189
188
  | **env** | String | "local" | "local"、"dev"、"production" | 环境模式,决定baseUrl |
190
189
  | **locale** | String | 浏览器语言或 "zh-CN" | 有效的语言代码 | 默认语言设置 |
191
190
  | **baseUrl** | String | 根据env计算 | "local"、"dev"、"production" 或自定义URL | 语言服务基础URL |
191
+ | **unitCode** | String | "GREENCLOUD" | 任意字符串 | 单位代码,用于企业环境中的翻译范围控制 |
192
192
 
193
193
  ### 环境配置详解
194
194
 
@@ -279,8 +279,19 @@ baseUrl: "https://custom-domain.com"
279
279
  | **iframeMinHeight** | String | "480px" | CSS 值 | iframe最小高度 |
280
280
  | **iframeBorderStyle** | String | "none" | CSS 值 | iframe边框样式 |
281
281
 
282
+ ### 企业环境配置详解
283
+
284
+ **新增** `unitCode` 配置选项用于企业环境中的翻译范围控制:
285
+
286
+ - **默认值**: `"GREENCLOUD"`
287
+ - **作用**: 控制翻译资源的访问范围,确保不同单位或部门的翻译数据相互隔离
288
+ - **应用场景**:
289
+ - 多租户环境下的数据隔离
290
+ - 不同业务单元的翻译范围控制
291
+ - 企业内部的权限管理
292
+
282
293
  **Section sources**
283
- - [packages/index.js:67-547](file://packages/index.js#L67-L547)
294
+ - [packages/index.js:67-559](file://packages/index.js#L67-L559)
284
295
  - [vite.config.js:1-72](file://vite.config.js#L1-L72)
285
296
  - [packages/swal.css:1-23](file://packages/swal.css#L1-L23)
286
297
  - [package.json:13-20](file://package.json#L13-L20)
@@ -316,6 +327,41 @@ const i18nInstance = new gc_i18n({
316
327
  });
317
328
  ```
318
329
 
330
+ ### 企业环境配置示例
331
+
332
+ #### 默认企业环境配置
333
+ ```js
334
+ const i18nInstance = new gc_i18n({
335
+ appCode: "ENTERPRISE_APP",
336
+ router: router,
337
+ orgCode: "GREENCLOUD", // 默认值
338
+ unitCode: "GREENCLOUD", // 默认值
339
+ env: "dev"
340
+ });
341
+ ```
342
+
343
+ #### 自定义单位代码配置
344
+ ```js
345
+ const i18nInstance = new gc_i18n({
346
+ appCode: "CUSTOM_UNIT_APP",
347
+ router: router,
348
+ orgCode: "CUSTOM_ORG",
349
+ unitCode: "CUSTOM_UNIT_001", // 自定义单位代码
350
+ env: "production"
351
+ });
352
+ ```
353
+
354
+ #### 多租户环境配置
355
+ ```js
356
+ const i18nInstance = new gc_i18n({
357
+ appCode: "MULTI_TENANT_APP",
358
+ router: router,
359
+ orgCode: "TENANT_A",
360
+ unitCode: "UNIT_A_001", // 租户A的单位代码
361
+ env: "dev"
362
+ });
363
+ ```
364
+
319
365
  ### 环境分离配置示例
320
366
 
321
367
  #### 本地开发环境
@@ -451,6 +497,6 @@ export default {
451
497
 
452
498
  **Section sources**
453
499
  - [lang/index.js:16-33](file://lang/index.js#L16-L33)
454
- - [packages/index.js:67-547](file://packages/index.js#L67-L547)
500
+ - [packages/index.js:67-559](file://packages/index.js#L67-L559)
455
501
  - [packages/swal.css:1-23](file://packages/swal.css#L1-L23)
456
502
  - [packages/libs/textEditMode.css:1-166](file://packages/libs/textEditMode.css#L1-L166)