gc_i18n 1.3.10 → 1.3.12

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.
@@ -9,6 +9,7 @@
9
9
  - [packages/components/earth.js](file://packages/components/earth.js) - *地球组件*
10
10
  - [packages/libs/textEditMode.js](file://packages/libs/textEditMode.js) - *文本编辑模式模块*
11
11
  - [packages/libs/textEditMode.css](file://packages/libs/textEditMode.css) - *文本编辑模式样式*
12
+ - [packages/swal.css](file://packages/swal.css) - *SweetAlert2样式集成*
12
13
  - [lib/gc_i18n.css](file://lib/gc_i18n.css) - *样式文件*
13
14
  - [lib/gc_i18n.es.js](file://lib/gc_i18n.es.js) - *ES模块构建*
14
15
  - [lib/gc_i18n.umd.js](file://lib/gc_i18n.umd.js) - *UMD构建*
@@ -37,6 +38,8 @@
37
38
  - **集成$keyValueMap映射机制**,为文本编辑模式提供键值映射支持
38
39
  - **HTTP客户端现代化**,使用独立axios实例避免全局污染
39
40
  - **安全机制改进**,新增JWT令牌验证和权限控制
41
+ - **SweetAlert2集成优化**,改进变量命名和代码组织结构,提升可读性和维护性
42
+ - **新增智能语言列表缓存机制**,通过getLanguagesWithCache提供缓存和自动失效功能
40
43
 
41
44
  ## 目录
42
45
  1. [项目结构分析](#项目结构分析)
@@ -61,6 +64,7 @@ gc_i18n_es[gc_i18n.es.js]
61
64
  gc_i18n_umd[gc_i18n.umd.js]
62
65
  gc_i18n_css[gc_i18n.css]
63
66
  text_edit_css[textEditMode.css]
67
+ swal_css[swal.css]
64
68
  end
65
69
  subgraph "语言资源"
66
70
  lang[index.js<br/>index.json]
@@ -436,10 +440,79 @@ globalThis.$t = this.i18n.global.t = (key, defaultValue) => {
436
440
  globalThis.__I18N_ALL_KEYS__ = new Set();
437
441
  ```
438
442
 
443
+ ### 智能语言列表缓存机制
444
+
445
+ **新增** I18n类新增了智能语言列表缓存机制,通过getLanguagesWithCache函数提供缓存和自动失效功能:
446
+
447
+ ```javascript
448
+ /**
449
+ * 获取语言列表(带缓存)
450
+ * @param {Object} options - 配置选项
451
+ * @param {string} options.baseUrl - API 基础 URL
452
+ * @param {string} options.token - 认证 token
453
+ * @param {string} options.appCode - 应用代码
454
+ * @param {boolean} options.isRemote - 是否强制从远程获取
455
+ * @returns {Promise<Array>} 语言列表
456
+ */
457
+ export const getLanguagesWithCache = async ({
458
+ baseUrl,
459
+ token,
460
+ appCode,
461
+ isRemote = false
462
+ }) => {
463
+ // 先从缓存获取
464
+ const cached = store2.get("I18N_LANGUAGES");
465
+ if (cached && Array.isArray(cached) && cached.length > 0 && !isRemote) {
466
+ return cached.map((l) => ({
467
+ langCode: l.language || l.langCode || l,
468
+ langName: l.langName || l.language || l
469
+ }));
470
+ }
471
+
472
+ // 从 API 获取
473
+ if (!appCode) {
474
+ return [];
475
+ }
476
+
477
+ try {
478
+ const res = await http.get(`${baseUrl}/i18n-web/language/languages`, {
479
+ headers: {
480
+ appCode,
481
+ Authorization: token
482
+ }
483
+ });
484
+ if (res.data && res.data.result === 0) {
485
+ const langs = _.get(res.data, "retVal", []);
486
+ const formattedLangs = langs.map((l) => ({
487
+ langCode: l.language || l.langCode || l,
488
+ langName: l.langName || l.language || l
489
+ }));
490
+ store2.set("I18N_LANGUAGES", langs);
491
+ return formattedLangs;
492
+ }
493
+ } catch (error) {
494
+ console.error("获取语言列表失败:", error);
495
+ }
496
+
497
+ return [];
498
+ };
499
+ ```
500
+
501
+ ### 缓存策略和自动失效
502
+
503
+ 智能缓存机制具有以下特点:
504
+
505
+ 1. **本地缓存优先**:首次调用时从store2本地存储获取缓存数据
506
+ 2. **智能判断**:检查缓存数据的有效性(数组类型、长度大于0)
507
+ 3. **强制刷新**:通过isRemote参数强制从远程API获取最新数据
508
+ 4. **自动存储**:成功获取后自动存储到本地缓存
509
+ 5. **格式化输出**:统一返回标准化的语言列表格式
510
+
439
511
  **本节来源**
440
512
  - [packages/index.js:67-411](file://packages/index.js#L67-L411)
441
513
  - [packages/libs/i18nUtils.ts:1-54](file://packages/libs/i18nUtils.ts#L1-L54)
442
- - [packages/libs/service.js:1-136](file://packages/libs/service.js#L1-L136)
514
+ - [packages/libs/service.js:1-188](file://packages/libs/service.js#L1-L188)
515
+ - [packages/swal.css:1-18](file://packages/swal.css#L1-L18)
443
516
 
444
517
  ## Vue插件安装机制
445
518
 
@@ -625,9 +698,32 @@ if ($isRTL()) {
625
698
  }
626
699
  ```
627
700
 
701
+ ### $getLanguages() 方法
702
+
703
+ 获取语言列表,支持智能缓存和自动失效。
704
+
705
+ **参数:**
706
+ - `isRemote` (Boolean, 可选): 是否强制从远程获取,跳过缓存
707
+
708
+ **返回值:**
709
+ - Promise<Array>: 语言列表数组
710
+
711
+ **调用上下文:**
712
+ - 组件实例
713
+ - 全局对象
714
+
715
+ ```javascript
716
+ // 获取缓存的语言列表
717
+ const languages = await $getLanguages()
718
+
719
+ // 强制从远程获取最新数据
720
+ const latestLanguages = await $getLanguages(true)
721
+ ```
722
+
628
723
  **本节来源**
629
724
  - [packages/index.js:257-307](file://packages/index.js#L257-L307)
630
725
  - [packages/index.js:369-371](file://packages/index.js#L369-L371)
726
+ - [packages/index.js:412-420](file://packages/index.js#L412-L420)
631
727
 
632
728
  ## RTL方向管理功能
633
729
 
@@ -837,6 +933,7 @@ editKeyboard[editKeyboard配置]
837
933
  end
838
934
  subgraph "样式支持"
839
935
  textEditModeCSS[textEditMode.css]
936
+ swalCSS[swal.css]
840
937
  i18nEditableText[i18n-editable-text类]
841
938
  i18nEditModeActive[i18n-edit-mode-active类]
842
939
  end
@@ -854,11 +951,13 @@ textEditMode --> saveTranslations
854
951
  keyboardJS --> editKeyboard
855
952
  textEditModeCSS --> i18nEditableText
856
953
  textEditModeCSS --> i18nEditModeActive
954
+ swalCSS --> swal2Container
857
955
  ```
858
956
 
859
957
  **图示来源**
860
- - [packages/libs/textEditMode.js:14-475](file://packages/libs/textEditMode.js#L14-L475)
958
+ - [packages/libs/textEditMode.js:14-623](file://packages/libs/textEditMode.js#L14-L623)
861
959
  - [packages/index.js:109-156](file://packages/index.js#L109-L156)
960
+ - [packages/swal.css:1-18](file://packages/swal.css#L1-L18)
862
961
 
863
962
  ### 文本编辑模式快捷键配置
864
963
 
@@ -958,7 +1057,7 @@ scanTextNodes(rootElement) {
958
1057
  findKeyByValue(value) {
959
1058
  if (!value) return null;
960
1059
 
961
- // 首先尝试从全局映射中查找(由 $t 函数运行时记录)
1060
+ // 从全局映射中查找(由 $t 函数运行时记录)
962
1061
  if (
963
1062
  globalThis.__I18N_KEY_VALUE_MAP__ &&
964
1063
  globalThis.__I18N_KEY_VALUE_MAP__[value]
@@ -979,15 +1078,6 @@ findKeyByValue(value) {
979
1078
  }
980
1079
  }
981
1080
 
982
- // 尝试从当前路由的翻译中查找(如果存在)
983
- const routeMessagesKey = `I18N_MESSAGES_${this.currentLocale}`;
984
- const routeMessages = store2.get(routeMessagesKey) || {};
985
- for (const [key, val] of Object.entries(routeMessages)) {
986
- if (val === value) {
987
- return key;
988
- }
989
- }
990
-
991
1081
  // 如果找不到,返回 null
992
1082
  return null;
993
1083
  }
@@ -1006,7 +1096,7 @@ async openEditModal(key) {
1006
1096
  icon: "info",
1007
1097
  timer: 2000,
1008
1098
  showConfirmButton: false,
1009
- position: "top-end",
1099
+ position: "top",
1010
1100
  toast: true
1011
1101
  });
1012
1102
  return;
@@ -1130,6 +1220,37 @@ async openEditModal(key) {
1130
1220
  }
1131
1221
  ```
1132
1222
 
1223
+ ### SweetAlert2样式集成优化
1224
+
1225
+ **更新** SweetAlert2样式集成经过优化,提供更好的视觉体验:
1226
+
1227
+ ```css
1228
+ /* SweetAlert2 容器样式 */
1229
+ .gc_i18n_html_container {
1230
+ overflow: hidden;
1231
+ padding: 0px;
1232
+ margin: 5px 15px;
1233
+ }
1234
+
1235
+ /* SweetAlert2 标题样式 */
1236
+ .gc_i18n_title {
1237
+ font-size: 18px;
1238
+ text-align: left;
1239
+ }
1240
+
1241
+ /* SweetAlert2 关闭按钮样式 */
1242
+ .gc_i18n_close_button {
1243
+ border: none;
1244
+ outline: none;
1245
+ box-shadow: none;
1246
+ }
1247
+
1248
+ /* SweetAlert2 关闭按钮焦点样式修复 */
1249
+ div:where(.swal2-container) button:where(.swal2-close):focus-visible {
1250
+ box-shadow: none !important;
1251
+ }
1252
+ ```
1253
+
1133
1254
  ### 非组件环境使用
1134
1255
 
1135
1256
  在非组件环境中使用文本编辑模式功能:
@@ -1165,9 +1286,10 @@ if ($isRTL()) {
1165
1286
  ```
1166
1287
 
1167
1288
  **本节来源**
1168
- - [packages/libs/textEditMode.js:1-475](file://packages/libs/textEditMode.js#L1-L475)
1169
- - [packages/libs/textEditMode.css:1-145](file://packages/libs/textEditMode.css#L1-L145)
1289
+ - [packages/libs/textEditMode.js:1-623](file://packages/libs/textEditMode.js#L1-L623)
1290
+ - [packages/libs/textEditMode.css:1-166](file://packages/libs/textEditMode.css#L1-L166)
1170
1291
  - [packages/index.js:109-156](file://packages/index.js#L109-L156)
1292
+ - [packages/swal.css:1-18](file://packages/swal.css#L1-L18)
1171
1293
 
1172
1294
  ## 非组件环境使用
1173
1295
 
@@ -1214,7 +1336,8 @@ const createI18nInstance = (options) => {
1214
1336
  },
1215
1337
  getLocale: () => i18n.locale,
1216
1338
  isRTL: () => i18n.isRTL(),
1217
- checkRTL: (locale) => I18n.checkRTL(locale)
1339
+ checkRTL: (locale) => I18n.checkRTL(locale),
1340
+ getLanguages: (isRemote) => i18n.getLanguages(isRemote)
1218
1341
  }
1219
1342
  }
1220
1343
 
@@ -1240,7 +1363,7 @@ const myI18n = createI18nInstance({
1240
1363
  ```css
1241
1364
  .gc_i18n_html_container {
1242
1365
  overflow: hidden;
1243
- padding: 0;
1366
+ padding: 0px;
1244
1367
  margin: 5px 15px;
1245
1368
  }
1246
1369
 
@@ -1335,6 +1458,37 @@ div:where(.swal2-container) button:where(.swal2-close):focus-visible {
1335
1458
  }
1336
1459
  ```
1337
1460
 
1461
+ ### SweetAlert2样式集成
1462
+
1463
+ **更新** SweetAlert2样式集成优化,提供更好的用户体验:
1464
+
1465
+ ```css
1466
+ /* SweetAlert2 容器样式 */
1467
+ .gc_i18n_html_container {
1468
+ overflow: hidden;
1469
+ padding: 0px;
1470
+ margin: 5px 15px;
1471
+ }
1472
+
1473
+ /* SweetAlert2 标题样式 */
1474
+ .gc_i18n_title {
1475
+ font-size: 18px;
1476
+ text-align: left;
1477
+ }
1478
+
1479
+ /* SweetAlert2 关闭按钮样式 */
1480
+ .gc_i18n_close_button {
1481
+ border: none;
1482
+ outline: none;
1483
+ box-shadow: none;
1484
+ }
1485
+
1486
+ /* SweetAlert2 关闭按钮焦点样式修复 */
1487
+ div:where(.swal2-container) button:where(.swal2-close):focus-visible {
1488
+ box-shadow: none !important;
1489
+ }
1490
+ ```
1491
+
1338
1492
  ### 样式特性
1339
1493
 
1340
1494
  - **容器样式**: 为弹窗容器提供合适的内边距和溢出控制
@@ -1343,8 +1497,10 @@ div:where(.swal2-container) button:where(.swal2-close):focus-visible {
1343
1497
  - **无障碍支持**: 确保键盘导航时的焦点可见性
1344
1498
  - **RTL支持**: 自动适配RTL语言的文本方向和对齐方式
1345
1499
  - **编辑模式支持**: 为可编辑文本提供视觉反馈和交互效果
1500
+ - **SweetAlert2集成**: 提供完整的SweetAlert2样式支持和焦点管理
1346
1501
 
1347
1502
  **本节来源**
1348
1503
  - [lib/gc_i18n.css](file://lib/gc_i18n.css)
1349
- - [packages/libs/textEditMode.css:1-145](file://packages/libs/textEditMode.css#L1-L145)
1504
+ - [packages/libs/textEditMode.css:1-166](file://packages/libs/textEditMode.css#L1-L166)
1505
+ - [packages/swal.css:1-18](file://packages/swal.css#L1-L18)
1350
1506
  - [packages/index.js:338-343](file://packages/index.js#L338-L343)