Skip to content

i18n 国际化

版本: v1.0.0+ | 4 语言支持 | 运行时切换

国际化模块为整个应用提供多语言支持,支持运行时动态切换语言,无需重启应用。

概述

i18n 国际化模块为 ChainlessChain 桌面应用提供完整的多语言支持,覆盖简体中文、English、Francais、Espanol 四种语言。系统支持运行时热切换(界面即时更新无需重启)、按功能模块命名空间组织翻译键、主进程与渲染进程统一翻译方案,以及翻译缺失时自动回退到默认语言的容错机制。

核心特性

  • 🌍 4 语言支持: 简体中文、English、Francais、Espanol 完整翻译覆盖
  • 🔄 运行时热切换: 动态切换语言,界面即时更新无需重启应用
  • 📁 命名空间组织: 按功能模块(common/errors/menu/ai/...)结构化管理翻译键
  • 🔗 前后端统一: 主进程与渲染进程共用同一套翻译方案,保持一致性
  • 🛡️ 自动回退机制: 翻译缺失时自动回退到 zh-CN 默认语言,确保不出现空白

系统架构

┌──────────────────┐     ┌──────────────┐     ┌─────────────────┐
│  渲染进程 (Vue3)  │────→│  i18n Core   │←────│  主进程 (Node)   │
│  t() / setLocale │     │  翻译引擎     │     │  t() / setLocale│
└──────────────────┘     └──────┬───────┘     └─────────────────┘

                    ┌───────────┼───────────┐
                    ▼           ▼           ▼
              ┌──────────┐ ┌────────┐ ┌──────────┐
              │ zh-CN.js │ │ en-US  │ │ fr-FR /  │
              │ 默认语言  │ │ .js    │ │ es-ES.js │
              └──────────┘ └────────┘ └──────────┘

回退链: 当前语言 → zh-CN (默认)

系统概述

支持语言

语言代码语言状态
zh-CN简体中文默认语言,完整翻译
en-USEnglish完整翻译
fr-FRFrançais完整翻译
es-ESEspañol完整翻译

核心特性

  • 运行时切换: 动态切换语言,界面即时更新
  • 命名空间: 按功能模块组织翻译键
  • 回退机制: 找不到翻译时自动回退到 zh-CN
  • 主进程 + 渲染进程: 前后端统一的翻译方案

使用方式

翻译函数

javascript
const { t, setLocale, getLocale } = require("./i18n");

// 翻译
t("errors.notFound"); // "未找到" (zh-CN)
t("common.save"); // "保存"

// 切换语言
setLocale("en-US");
t("errors.notFound"); // "Not Found"

// 获取当前语言
getLocale(); // "en-US"

命名空间约定

翻译键结构:
├─ common.*          — 通用(保存、取消、确认...)
├─ errors.*          — 错误消息
├─ menu.*            — 菜单项
├─ settings.*        — 设置页面
├─ knowledge.*       — 知识库模块
├─ social.*          — 社交模块
├─ trading.*         — 交易模块
├─ ai.*              — AI 功能
└─ ...

API

函数说明
t(key)翻译键,返回当前语言的文本
setLocale(locale)切换当前语言
getLocale()获取当前语言代码
getSupportedLocales()返回所有支持的语言列表

关键文件

文件职责
src/main/i18n/index.jsi18n 核心模块
src/main/i18n/locales/zh-CN.js简体中文翻译
src/main/i18n/locales/en-US.js英文翻译
src/main/i18n/locales/fr-FR.js法文翻译
src/main/i18n/locales/es-ES.js西班牙文翻译

使用示例

主进程中使用翻译

javascript
const { t, setLocale, getLocale } = require('./i18n');

// 获取当前语言
console.log(getLocale()); // "zh-CN"

// 翻译错误消息
const msg = t('errors.networkTimeout'); // "网络连接超时"

// 切换到英文
setLocale('en-US');
console.log(t('errors.networkTimeout')); // "Network connection timed out"

// 获取所有支持的语言列表
const locales = getSupportedLocales();
// ['zh-CN', 'en-US', 'fr-FR', 'es-ES']

渲染进程(Vue3)中使用

vue
<template>
  <a-button @click="switchLang('en-US')">{{ t('common.switchLanguage') }}</a-button>
  <p>{{ t('settings.languageDescription') }}</p>
</template>

<script setup>
import { useI18n } from '@/composables/useI18n';
const { t, setLocale } = useI18n();

function switchLang(lang) {
  setLocale(lang); // 界面即时更新,无需重启
}
</script>

通过配置文件设置默认语言

json
{
  "app": {
    "language": "en-US"
  }
}

故障排查

翻译键显示为原始 key 而非翻译文本

当翻译缺失时系统会回退到 zh-CN。如果仍显示原始 key,说明 zh-CN 也缺少该翻译:

bash
# 检查翻译文件中是否存在对应的 key
# 在 src/main/i18n/locales/zh-CN.js 中搜索缺失的 key
# 添加翻译后重启应用即可

切换语言后部分界面未更新

确认组件使用了响应式的 t() 函数,而非在初始化时缓存了翻译结果:

javascript
// 错误:翻译结果在初始化时固化,切换语言后不会更新
const title = t('common.save');

// 正确:在 computed 或模板中使用,保持响应式
// <span>{{ t('common.save') }}</span>

新增语言后未显示在语言列表

确保在 src/main/i18n/index.jssupportedLocales 数组中注册了新语言,并在 locales/ 目录下创建对应的翻译文件。


配置参考

配置项类型默认值说明
app.languagestring"zh-CN"应用默认语言,写入 .chainlesschain/config.json
i18n.fallbackLocalestring"zh-CN"翻译缺失时的回退语言
i18n.supportedLocalesstring[]["zh-CN","en-US","fr-FR","es-ES"]已注册的支持语言列表
i18n.warnOnMissingKeybooleantrue翻译键缺失时是否在控制台打印警告
i18n.persistLocalebooleantrue是否将用户切换的语言持久化到配置文件
i18n.mainProcessSyncbooleantrue渲染进程切换语言时是否同步通知主进程

通过配置文件设置初始语言:

json
{
  "app": {
    "language": "en-US"
  }
}

运行时通过 API 切换后语言选择会自动持久化(persistLocale: true),下次启动无需重新选择。

性能指标

指标典型值说明
模块初始化时间< 5 ms启动时加载全部 4 个语言包
单次 t() 调用耗时< 0.05 ms基于对象属性路径查找,O(1)
setLocale() 切换耗时< 2 ms切换内部引用,不重新解析文件
单语言包文件大小~30 KB未压缩,含所有命名空间键
全部 4 语言包总内存~480 KB已解析 JS 对象,常驻内存
Vue3 响应式更新延迟< 16 ms切换后下一帧完成界面重绘(60 fps)
主进程同步 IPC 开销< 1 mssetLocale 通过 IPC 同步到主进程

测试覆盖率

测试文件测试数覆盖内容
tests/unit/i18n/i18n-core.test.js28t() 路径查找、缺键回退、嵌套命名空间
tests/unit/i18n/locale-switching.test.js16setLocale / getLocale、持久化、IPC 同步
tests/unit/i18n/supported-locales.test.js10getSupportedLocales()、新增语言注册
tests/unit/i18n/fallback-chain.test.js14多级回退、warnOnMissingKey 日志验证
tests/integration/i18n/vue3-composable.test.ts18useI18n() 响应式绑定、组件热更新
总计86覆盖率 ≥ 95%

安全考虑

  • XSS 防护: 翻译文本在渲染时经过 Vue3 的自动转义,防止注入攻击
  • 翻译文件来源: 仅加载本地 locales/ 目录下的翻译文件,不从网络动态加载,防止远程代码注入
  • 用户输入隔离: 翻译系统仅处理预定义的翻译键,用户输入不会被当作翻译键解析
  • 敏感信息排除: 翻译文件中不包含 API Key、密码等敏感信息,所有敏感数据通过配置系统管理
  • 审计追踪: 语言切换操作记录在应用日志中,便于问题排查

相关文档

基于 MIT 许可发布