gc_i18n 1.3.11 → 1.3.13
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.
- package/.qoder/repowiki/zh/content//346/240/270/345/277/203/345/272/223/345/256/236/347/216/260.md +174 -18
- package/.qoder/repowiki/zh/content//347/273/204/344/273/266/351/233/206/346/210/220.md +337 -210
- package/.qoder/repowiki/zh/content//350/257/255/350/250/200/350/265/204/346/272/220/347/256/241/347/220/206.md +159 -130
- package/.qoder/repowiki/zh/content//351/253/230/347/272/247/347/224/250/346/263/225//351/253/230/347/272/247/347/224/250/346/263/225.md +477 -15
- package/.qoder/repowiki/zh/meta/repowiki-metadata.json +1 -1
- package/lang/index.json +24 -0
- package/lib/gc_i18n.css +1 -1
- package/lib/gc_i18n.es.js +1364 -1256
- package/lib/gc_i18n.umd.js +58 -42
- package/package.json +1 -1
- package/packages/components/earth.css +53 -1
- package/packages/components/earth.js +216 -66
- package/packages/components/earth.md +108 -0
- package/packages/index.js +11 -19
- package/packages/libs/service.js +53 -2
- package/packages/libs/textEditMode.js +1 -1
- package/src/view/Home.vue +30 -1
package/.qoder/repowiki/zh/content//346/240/270/345/277/203/345/272/223/345/256/236/347/216/260.md
CHANGED
|
@@ -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-
|
|
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-
|
|
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
|
-
//
|
|
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
|
|
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-
|
|
1169
|
-
- [packages/libs/textEditMode.css:1-
|
|
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:
|
|
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-
|
|
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)
|