gc_i18n 1.5.0 → 1.5.2

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.
@@ -10,14 +10,15 @@
10
10
  - [gc_i18n.js](file://lib/gc_i18n.js)
11
11
  - [config.vue](file://packages/components/config.vue)
12
12
  - [App.vue](file://src/App.vue)
13
- - [utils.js](file://packages/libs/utils.js) - *更新了数据合并逻辑*
13
+ - [utils.js](file://packages/libs/utils.js)
14
+ - [package.json](file://package.json)
14
15
  </cite>
15
16
 
16
17
  ## 更新摘要
17
18
  **变更内容**
18
- - 更新了“加载失败问题”部分,新增了关于 `common` 键处理逻辑的说明
19
- - 在“根本原因分析”和“具体解决方案”中增加了对 `mergeArraysByKey` 函数行为的详细解释
20
- - 更新了相关源码引用,添加了 `utils.js` 文件的引用
19
+ - 新增了"消息事件处理错误"章节,专门针对1.5.1版本改进的消息事件处理错误处理机制
20
+ - 更新了"调试模式与日志查看"部分,增加了跨域安全检查相关的日志输出
21
+ - 在"配置有效性验证"中添加了消息事件处理的安全性验证要点
21
22
  - 保持了原有文档结构和未受影响部分的完整性
22
23
 
23
24
  ## 目录
@@ -25,9 +26,10 @@
25
26
  2. [语言不切换问题](#语言不切换问题)
26
27
  3. [翻译文本显示为键名](#翻译文本显示为键名)
27
28
  4. [加载失败问题](#加载失败问题)
28
- 5. [调试模式与日志查看](#调试模式与日志查看)
29
- 6. [配置有效性验证](#配置有效性验证)
30
- 7. [测试策略建议](#测试策略建议)
29
+ 5. [消息事件处理错误](#消息事件处理错误)
30
+ 6. [调试模式与日志查看](#调试模式与日志查看)
31
+ 7. [配置有效性验证](#配置有效性验证)
32
+ 8. [测试策略建议](#测试策略建议)
31
33
 
32
34
  ## 常见问题汇总
33
35
 
@@ -37,8 +39,9 @@
37
39
  - **加载失败**:语言包无法正确加载,导致翻译功能失效
38
40
  - **异步组件问题**:动态加载的组件中翻译键未被正确收集
39
41
  - **缓存问题**:旧的语言数据未被清除,影响新语言的加载
42
+ - **消息事件处理错误**:跨域消息通信时出现安全错误或异常
40
43
 
41
- 这些问题通常源于配置错误、异步处理不当或依赖关系未正确处理。以下将针对每个问题提供详细的根因分析和解决方案。
44
+ 这些问题通常源于配置错误、异步处理不当或依赖关系未正确处理。1.5.1版本特别加强了消息事件处理的安全性和稳定性。以下将针对每个问题提供详细的根因分析和解决方案。
42
45
 
43
46
  ## 语言不切换问题
44
47
 
@@ -91,8 +94,8 @@ this.router.beforeEach(async (to, from, next) => {
91
94
  ```
92
95
 
93
96
  **Section sources**
94
- - [packages/index.js](file://packages/index.js#L231-L277)
95
- - [packages/index.js](file://packages/index.js#L160-L194)
97
+ - [packages/index.js:231-277](file://packages/index.js#L231-L277)
98
+ - [packages/index.js:160-194](file://packages/index.js#L160-L194)
96
99
 
97
100
  ## 翻译文本显示为键名
98
101
 
@@ -167,7 +170,7 @@ globalThis.$clearI18n();
167
170
  store2.namespace(`I18N_${appCode.toUpperCase()}`).clearAll();
168
171
  ```
169
172
 
170
- ``mermaid
173
+ ```mermaid
171
174
  flowchart TD
172
175
  A[开始] --> B{翻译键存在?}
173
176
  B --> |是| C[返回翻译文本]
@@ -185,12 +188,12 @@ D --> |否| M[返回原始键名]
185
188
  ```
186
189
 
187
190
  **Diagram sources**
188
- - [packages/index.js](file://packages/index.js#L200-L230)
191
+ - [packages/index.js:200-230](file://packages/index.js#L200-L230)
189
192
 
190
193
  **Section sources**
191
- - [packages/index.js](file://packages/index.js#L200-L230)
192
- - [packages/libs/i18nUtils.ts](file://packages/libs/i18nUtils.ts#L0-L52)
193
- - [packages/libs/service.js](file://packages/libs/service.js#L65-L123)
194
+ - [packages/index.js:200-230](file://packages/index.js#L200-L230)
195
+ - [packages/libs/i18nUtils.ts:0-52](file://packages/libs/i18nUtils.ts#L0-L52)
196
+ - [packages/libs/service.js:65-123](file://packages/libs/service.js#L65-L123)
194
197
 
195
198
  ## 加载失败问题
196
199
 
@@ -305,9 +308,119 @@ async setLanguage(language) {
305
308
  ```
306
309
 
307
310
  **Section sources**
308
- - [packages/index.js](file://packages/index.js#L250-L277)
309
- - [packages/libs/service.js](file://packages/libs/service.js#L65-L123)
310
- - [packages/libs/utils.js](file://packages/libs/utils.js#L9-L28) - *更新了数据合并逻辑*
311
+ - [packages/index.js:250-277](file://packages/index.js#L250-L277)
312
+ - [packages/libs/service.js:65-123](file://packages/libs/service.js#L65-L123)
313
+ - [packages/libs/utils.js:9-28](file://packages/libs/utils.js#L9-L28)
314
+
315
+ ## 消息事件处理错误
316
+
317
+ **更新** 新增此章节,反映1.5.1版本中改进的消息事件处理错误处理机制
318
+
319
+ ### 根本原因分析
320
+
321
+ 消息事件处理错误主要出现在跨域通信场景中,1.5.1版本之前可能存在以下问题:
322
+ 1. **跨域安全错误**:直接访问 `event.origin` 导致 SecurityError
323
+ 2. **未捕获的异常**:try-catch 机制不完善,导致错误传播到控制台
324
+ 3. **调试困难**:跨域错误与业务逻辑错误混合,难以区分
325
+ 4. **性能影响**:频繁的跨域错误导致不必要的日志输出
326
+
327
+ ### 具体解决方案
328
+
329
+ 1. **启用跨域安全检查**
330
+ ```javascript
331
+ // 1.5.1版本中改进的消息事件处理
332
+ window.top.addEventListener("message", (event) => {
333
+ try {
334
+ // 跨域检查:如果源不匹配,跳过处理以避免安全错误
335
+ if (!event.origin || event.origin === "null") {
336
+ return;
337
+ }
338
+ console.log("打印接收到的数据message:", event.data);
339
+ if (event.data && event.data.type === "updateLanguage") {
340
+ location.reload();
341
+ } else if (event.data && event.data.type === "closeModal") {
342
+ if (this.swalInstance) {
343
+ this.swalInstance.close();
344
+ }
345
+ }
346
+ } catch (error) {
347
+ // 静默处理跨域错误,不在控制台显示
348
+ if (error.name !== "SecurityError") {
349
+ console.warn("Message event handler error:", error);
350
+ }
351
+ }
352
+ });
353
+ ```
354
+
355
+ 2. **验证跨域配置**
356
+ ```javascript
357
+ // 确保正确的跨域配置
358
+ const allowedOrigins = [
359
+ "https://trusted-domain.com",
360
+ "https://*.ihotel.cn",
361
+ window.location.origin
362
+ ];
363
+
364
+ // 在发送消息时指定正确的目标源
365
+ iframe.contentWindow.postMessage(data, targetOrigin);
366
+ ```
367
+
368
+ 3. **检查消息事件监听器**
369
+ ```javascript
370
+ // 验证消息事件监听器的正确性
371
+ if (window.top && window.top !== window) {
372
+ window.top.addEventListener("message", messageHandler);
373
+ } else {
374
+ console.warn("无法设置跨域消息监听器");
375
+ }
376
+ ```
377
+
378
+ 4. **实现优雅降级**
379
+ ```javascript
380
+ // 如果跨域检查失败,使用替代方案
381
+ function handleMessage(event) {
382
+ try {
383
+ // 1.5.1版本的改进检查
384
+ if (!event.origin || event.origin === "null") {
385
+ // 静默忽略,不输出错误日志
386
+ return;
387
+ }
388
+
389
+ // 处理消息事件
390
+ processMessage(event.data);
391
+ } catch (error) {
392
+ // 只记录非跨域相关的错误
393
+ if (error.name !== "SecurityError") {
394
+ console.warn("消息处理错误:", error);
395
+ }
396
+ }
397
+ }
398
+ ```
399
+
400
+ 5. **监控消息事件状态**
401
+ ```javascript
402
+ // 添加消息事件处理的状态监控
403
+ let messageHandlerStatus = {
404
+ initialized: false,
405
+ lastError: null,
406
+ errorCount: 0
407
+ };
408
+
409
+ function setupMessageHandler() {
410
+ try {
411
+ window.top.addEventListener("message", handleMessage);
412
+ messageHandlerStatus.initialized = true;
413
+ console.log("消息事件处理器已初始化");
414
+ } catch (error) {
415
+ messageHandlerStatus.lastError = error;
416
+ messageHandlerStatus.errorCount++;
417
+ console.warn("消息事件处理器初始化失败:", error);
418
+ }
419
+ }
420
+ ```
421
+
422
+ **Section sources**
423
+ - [packages/index.js:661-681](file://packages/index.js#L661-L681)
311
424
 
312
425
  ## 调试模式与日志查看
313
426
 
@@ -329,11 +442,13 @@ const { i18n } = new gc_i18n({
329
442
  - 语言切换时的 token 更新
330
443
  - 翻译键的收集过程
331
444
  - 网络请求的详细信息
445
+ - **新增** 消息事件处理的日志输出
332
446
 
333
447
  ```javascript
334
448
  // 示例日志输出
335
449
  console.log(" this.token", this.token);
336
450
  console.log(" this.token2", this.token);
451
+ console.log("打印接收到的数据message:", event.data); // 1.5.1版本新增
337
452
  ```
338
453
 
339
454
  3. **监控关键事件**
@@ -350,6 +465,17 @@ setupLanguageChangeListener() {
350
465
  });
351
466
  }
352
467
  }
468
+
469
+ // 监控消息事件处理状态
470
+ setupMessageHandlerMonitoring() {
471
+ const originalAddEventListener = window.addEventListener;
472
+ window.addEventListener = function(type, listener, options) {
473
+ if (type === "message") {
474
+ console.log("设置消息事件监听器");
475
+ }
476
+ return originalAddEventListener.apply(this, arguments);
477
+ };
478
+ }
353
479
  ```
354
480
 
355
481
  ### 关键日志位置
@@ -358,8 +484,9 @@ setupLanguageChangeListener() {
358
484
  2. **翻译键收集日志**:路由守卫中的 `extractTranslationKeys` 调用
359
485
  3. **网络请求日志**:`service.js` 中的 `getTranslate` 和 `fetchTranslate` 方法
360
486
  4. **错误日志**:异步组件加载失败时的 `console.error`
487
+ 5. ****消息事件日志**:**1.5.1版本新增** `packages/index.js` 中的消息事件处理日志
361
488
 
362
- ``mermaid
489
+ ```mermaid
363
490
  sequenceDiagram
364
491
  participant User as 用户
365
492
  participant App as 应用
@@ -374,12 +501,12 @@ App-->>User : 界面语言更新
374
501
  ```
375
502
 
376
503
  **Diagram sources**
377
- - [packages/index.js](file://packages/index.js#L250-L277)
378
- - [packages/libs/service.js](file://packages/libs/service.js#L65-L123)
504
+ - [packages/index.js:250-277](file://packages/index.js#L250-L277)
505
+ - [packages/libs/service.js:65-123](file://packages/libs/service.js#L65-L123)
379
506
 
380
507
  **Section sources**
381
- - [packages/index.js](file://packages/index.js#L250-L277)
382
- - [packages/libs/service.js](file://packages/libs/service.js#L65-L123)
508
+ - [packages/index.js:250-277](file://packages/index.js#L250-L277)
509
+ - [packages/libs/service.js:65-123](file://packages/libs/service.js#L65-L123)
383
510
 
384
511
  ## 配置有效性验证
385
512
 
@@ -442,10 +569,21 @@ console.log("I18N_TOKEN:", store2.get("I18N_TOKEN"));
442
569
  console.log("I18N_LANGUAGES:", store2.get("I18N_LANGUAGES"));
443
570
  ```
444
571
 
572
+ 3. ****验证消息事件处理配置**:**1.5.1版本新增**
573
+ ```javascript
574
+ // 检查消息事件处理状态
575
+ console.log("消息事件处理器状态:", messageHandlerStatus);
576
+
577
+ // 验证跨域配置
578
+ console.log("允许的来源:", allowedOrigins);
579
+ console.log("当前窗口来源:", window.location.origin);
580
+ ```
581
+
445
582
  **Section sources**
446
- - [main.js](file://src/main.js#L0-L9)
447
- - [lang/index.js](file://lang/index.js#L0-L42)
448
- - [packages/index.js](file://packages/index.js#L0-L325)
583
+ - [main.js:0-9](file://src/main.js#L0-L9)
584
+ - [lang/index.js:0-42](file://lang/index.js#L0-L42)
585
+ - [packages/index.js:0-325](file://packages/index.js#L0-L325)
586
+ - [package.json:1-48](file://package.json#L1-L48)
449
587
 
450
588
  ## 测试策略建议
451
589
 
@@ -504,6 +642,46 @@ test('should handle async components in route guards', async () => {
504
642
  });
505
643
  ```
506
644
 
645
+ 3. ****测试消息事件处理**:**1.5.1版本新增**
646
+ ```javascript
647
+ // 测试跨域消息事件处理
648
+ test('should handle cross-domain messages safely', () => {
649
+ const messageHandler = jest.fn();
650
+ const originalAddEventListener = window.addEventListener;
651
+ window.addEventListener = messageHandler;
652
+
653
+ setupMessageHandler();
654
+
655
+ // 测试 null origin 的情况
656
+ const nullOriginEvent = { origin: null, data: { type: 'updateLanguage' } };
657
+ window.dispatchEvent(new MessageEvent('message', nullOriginEvent));
658
+
659
+ expect(messageHandler).toHaveBeenCalled();
660
+ expect(console.warn).not.toHaveBeenCalledWith("Message event handler error:");
661
+ });
662
+
663
+ // 测试 SecurityError 的静默处理
664
+ test('should silently handle SecurityError', () => {
665
+ const originalConsoleWarn = console.warn;
666
+ console.warn = jest.fn();
667
+
668
+ // 模拟 SecurityError
669
+ const securityError = new Error('SecurityError');
670
+ securityError.name = 'SecurityError';
671
+
672
+ try {
673
+ throw securityError;
674
+ } catch (error) {
675
+ if (error.name !== "SecurityError") {
676
+ console.warn("Message event handler error:", error);
677
+ }
678
+ }
679
+
680
+ expect(console.warn).not.toHaveBeenCalled();
681
+ console.warn = originalConsoleWarn;
682
+ });
683
+ ```
684
+
507
685
  ### 端到端测试
508
686
 
509
687
  1. **模拟真实用户场景**
@@ -511,15 +689,18 @@ test('should handle async components in route guards', async () => {
511
689
  - 测试语言切换后的界面更新
512
690
  - 验证登录页面的特殊处理
513
691
  - 检查浏览器语言变化的自动响应
692
+ - **新增** 验证跨域消息通信的稳定性
514
693
 
515
694
  2. **性能测试**
516
695
  - 测量语言包加载时间
517
696
  - 验证缓存机制的有效性
518
697
  - 测试大量翻译键的处理性能
698
+ - **新增** 测试消息事件处理的性能开销
519
699
 
520
- 通过实施这些测试策略,可以有效预防常见错误,确保国际化功能的稳定性和可靠性。
700
+ 通过实施这些测试策略,可以有效预防常见错误,确保国际化功能的稳定性和可靠性,特别是1.5.1版本中改进的消息事件处理安全性。
521
701
 
522
702
  **Section sources**
523
- - [packages/index.js](file://packages/index.js#L0-L325)
524
- - [packages/libs/i18nUtils.ts](file://packages/libs/i18nUtils.ts#L0-L52)
525
- - [packages/libs/service.js](file://packages/libs/service.js#L0-L123)
703
+ - [packages/index.js:0-325](file://packages/index.js#L0-L325)
704
+ - [packages/libs/i18nUtils.ts:0-52](file://packages/libs/i18nUtils.ts#L0-L52)
705
+ - [packages/libs/service.js:0-123](file://packages/libs/service.js#L0-L123)
706
+ - [package.json:1-48](file://package.json#L1-L48)
@@ -2324,11 +2324,6 @@ export const getLanguagesWithCache = async ({
2324
2324
  }));
2325
2325
  }
2326
2326
 
2327
- // 从 API 获取
2328
- if (!appCode) {
2329
- return [];
2330
- }
2331
-
2332
2327
  try {
2333
2328
  const res = await http.get(`${baseUrl}/i18n-web//app/getsupportedlangs`, {
2334
2329
  headers: {
@@ -2,9 +2,9 @@
2
2
 
3
3
  <cite>
4
4
  **本文档中引用的文件**
5
- - [index.js](file://lang/index.js) - *简化了国际化实现,移除了复杂的 vue-i18n 集成*
5
+ - [index.js](file://lang/index.js) - *改进了安装和初始化过程,新增了中文语言支持的消息配置对象*
6
6
  - [index.json](file://lang/index.json) - *包含138个翻译键,新增阿拉伯语支持*
7
- - [packages/index.js](file://packages/index.js) - *自包含的翻译系统实现,API更加简洁*
7
+ - [packages/index.js](file://packages/index.js) - *自包含的翻译系统实现,API更加简洁,增强了全局组件注册*
8
8
  - [utils.js](file://packages/libs/utils.js) - *RTL语言支持和工具函数*
9
9
  - [service.js](file://packages/libs/service.js) - *语言数据获取和缓存机制*
10
10
  - [textEditMode.js](file://packages/libs/textEditMode.js) - *文本编辑模式功能*
@@ -15,13 +15,12 @@
15
15
 
16
16
  ## 更新摘要
17
17
  **已做更改**
18
- - 更新了[语言资源组织与加载机制](#语言资源组织与加载机制)以反映简化的自包含翻译系统
19
- - 更新了[多语言数据导出机制](#多语言数据导出机制)以反映移除的复杂vue-i18n集成
20
- - 新增了[自包含翻译系统架构](#自包含翻译系统架构)章节,说明简化的API设计
21
- - 更新了[动态加载策略](#动态加载策略)以反映简化的实现方式
22
- - 新增了[简化的API设计](#简化的api设计)章节,介绍新的使用方式
23
- - 更新了[RTL语言支持机制](#rtl语言支持机制)以反映增强的RTL检测功能
24
- - 更新了[文本编辑模式功能](#文本编辑模式功能)以反映简化的实现
18
+ - 更新了[语言资源组织与加载机制](#语言资源组织与加载机制)以反映改进的安装和初始化过程
19
+ - 更新了[多语言数据导出机制](#多语言数据导出机制)以反映新增的中文语言支持配置
20
+ - 更新了[全局组件注册机制](#全局组件注册机制)以反映增强的组件挂载功能
21
+ - 更新了[简化的API设计](#简化的api设计)以反映改进的 `$t` 函数挂载逻辑
22
+ - 新增了[中文语言支持配置](#中文语言支持配置)章节,说明新增的消息配置对象
23
+ - 更新了[动态加载策略](#动态加载策略)以反映改进的初始化流程
25
24
 
26
25
  ## 目录
27
26
  1. [项目结构](#项目结构)
@@ -43,6 +42,8 @@
43
42
  17. [文本编辑模式功能](#文本编辑模式功能)
44
43
  18. [快捷键绑定机制](#快捷键绑定机制)
45
44
  19. [文本编辑模式样式系统](#文本编辑模式样式系统)
45
+ 20. [中文语言支持配置](#中文语言支持配置)
46
+ 21. [全局组件注册机制](#全局组件注册机制)
46
47
 
47
48
  ## 项目结构
48
49
 
@@ -197,20 +198,31 @@ const english = $t('welcome', 'Welcome'); // "欢迎"(fallback)
197
198
  import gc_i18n from "../packages/index.js";
198
199
 
199
200
  const i18n = new gc_i18n({
200
- appCode: "TEST",
201
+ appCode: "TEST-SRC",
201
202
  orgCode: import.meta.env.MODE === "unit" ? "DD" : "GREENCLOUD",
202
203
  env: "dev",
204
+ messages: {
205
+ "zh-CN": {
206
+ test: "测试"
207
+ }
208
+ },
203
209
  login: false
204
210
  });
205
211
 
206
212
  export default {
207
213
  install(app, router) {
208
- i18n.setRouter(router);
214
+ // Vue 2 下 app 为 Vue 构造函数,需传入以正确注册 VueI18n
215
+ // 调用实例的 install 方法来注册全局组件和挂载 $t
216
+ i18n.install(app);
217
+ // 设置 router(如果传入)
218
+ if (router) {
219
+ i18n.setRouter(router);
220
+ }
209
221
  }
210
222
  };
211
223
  ```
212
224
 
213
- **更新** 简化后的实现移除了复杂的Vue插件注册过程,采用更直接的实例化方式。
225
+ **更新** 简化后的实现移除了复杂的Vue插件注册过程,采用更直接的实例化方式,并新增了中文语言支持的消息配置对象。
214
226
 
215
227
  **节来源**
216
228
  - [index.js](file://lang/index.js)
@@ -704,4 +716,100 @@ ModalContent --> EditForm
704
716
  - [packages/libs/textEditMode.js](file://packages/libs/textEditMode.js)
705
717
 
706
718
  **节来源**
707
- - [packages/libs/textEditMode.js](file://packages/libs/textEditMode.js)
719
+ - [packages/libs/textEditMode.js](file://packages/libs/textEditMode.js)
720
+
721
+ ## 中文语言支持配置
722
+
723
+ ### 配置对象结构
724
+
725
+ 系统现在支持在`lang/index.js`中直接配置中文语言支持的消息对象:
726
+
727
+ ```javascript
728
+ const i18n = new gc_i18n({
729
+ appCode: "TEST-SRC",
730
+ orgCode: import.meta.env.MODE === "unit" ? "DD" : "GREENCLOUD",
731
+ env: "dev",
732
+ messages: {
733
+ "zh-CN": {
734
+ test: "测试"
735
+ }
736
+ },
737
+ login: false
738
+ });
739
+ ```
740
+
741
+ ### 配置特点
742
+
743
+ 1. **直接配置**:通过`messages`选项直接提供语言配置
744
+ 2. **多语言支持**:支持同时配置多种语言的消息
745
+ 3. **灵活扩展**:可以根据需要添加更多语言配置
746
+ 4. **环境适配**:支持基于环境变量的配置切换
747
+
748
+ ### 使用场景
749
+
750
+ 这种配置方式特别适用于:
751
+ - 需要在应用启动时就提供本地翻译的场景
752
+ - 团队内部开发阶段的快速测试
753
+ - 需要离线运行的应用环境
754
+ - 对翻译数据进行本地化定制的场景
755
+
756
+ **节来源**
757
+ - [index.js](file://lang/index.js)
758
+
759
+ ## 全局组件注册机制
760
+
761
+ ### 增强的组件注册
762
+
763
+ 系统在`packages/index.js`中增强了全局组件注册功能,通过`install`方法自动注册全局组件:
764
+
765
+ ```javascript
766
+ install(app, opts = {}) {
767
+ // 兼容 Vue 2 和 Vue 3
768
+ if (isVue2) {
769
+ // Vue 2: 直接在 Vue 原型上挂载 $t 和 $i18n
770
+ const Vue = VueDemi;
771
+ Vue.prototype.$t = this.t || globalThis.$t;
772
+ Vue.prototype.$i18n = this.i18n;
773
+ } else {
774
+ // Vue 3: 通过 globalProperties 挂载 $t 和 $i18n
775
+ app.config.globalProperties.$t = this.t || globalThis.$t;
776
+ app.config.globalProperties.$i18n = this.i18n;
777
+ }
778
+
779
+ // 自动注册全局组件,传入 baseUrl
780
+ app.component("i18n-earth", {
781
+ ...earthVue,
782
+ props: {
783
+ ...earthVue.props,
784
+ baseUrl: {
785
+ type: String,
786
+ default: this.baseUrl
787
+ }
788
+ }
789
+ });
790
+
791
+ window.top.addEventListener("message", (event) => {
792
+ // 处理消息事件
793
+ });
794
+ }
795
+ ```
796
+
797
+ ### 组件注册特点
798
+
799
+ 1. **自动注册**:通过`install`方法自动注册全局组件
800
+ 2. **Vue版本兼容**:同时支持Vue 2和Vue 3的组件注册方式
801
+ 3. **属性传递**:向注册的组件传递必要的属性(如baseUrl)
802
+ 4. **事件监听**:自动监听来自父窗口的消息事件
803
+
804
+ ### 使用方式
805
+
806
+ ```javascript
807
+ // 在应用中使用
808
+ app.use(i18n);
809
+
810
+ // 在组件中使用
811
+ <i18n-earth />
812
+ ```
813
+
814
+ **节来源**
815
+ - [packages/index.js](file://packages/index.js)