核心是构建可配置的自动化i18n流水线:构建阶段自动扫描 locales/ 目录生成 manifest,分离语言包为带 hash 的异步 chunk;运行时按需加载、本地存储偏好、错误降级;配套校验、类型生成与 cli 提升可维护性。

核心在于把语言资源识别、打包和加载三个环节串成一条可配置的自动化流水线,而不是手动维护一堆 JSON 文件再一个个 import。
构建阶段自动识别语言包
在构建工具(如 Vite 或 Webpack)中配置扫描规则,让脚本自动发现 locales/ 目录下的所有语言文件,无需硬编码语言列表:
- Vite 可用
glob插件或import.meta.glob批量导入:const locales = import.meta.glob('../locales/*.json', { eager: false }) - Webpack 可配合
require.context或自定义 plugin 遍历目录,生成语言映射表(如{ en: () => import('./locales/en.json'), zh: () => import('./locales/zh.json') }) - 输出一个标准化的
i18n-manifest.json,包含支持的语言码、文件路径、哈希值,供运行时读取
打包时分离语言资源为独立 chunk
避免语言包被打进主包,确保它们能被浏览器缓存并按需拉取:
一款AI工具,主要用于生成可直接复制粘贴的 Bash 脚本,用于 Ralph Wiggum/AI 代理循环(Codex、Claude Code、OpenCode、Goose)。适用于“拉尔夫循环”“Ralph Wiggum 循环”或 AI 循环请求,依据 PROMPT.md、AGENTS.md、SPECS、IMPLEMENTATION_PLAN.md 进行计划/构建,包含计划与构建模式、背压、沙箱及完成条件,适合需要提升相关任务效率的用户。
- 使用动态
import()加载语言模块,构建工具会自动将其拆分为异步 chunk(如locales-en.abc123.js) - 在 vite.config.ts 中显式配置 code splitting:
build.rollupOptions.output.manualChunks指定locales/**路径归入localeschunk 组 - 为每个语言包生成带 contenthash 的文件名,提升长期缓存命中率
运行时按需加载与切换
加载行为不依赖初始化全量注入,而是响应用户操作或环境变化实时触发:
- 封装
loadLocale(lang)方法:先校验 lang 是否在 manifest 中存在,再调用对应动态 import,成功后调用i18n.setLocaleMessage(lang, data)注入 - 自动检测浏览器语言:
navigator.language,但仅作默认建议,不强制覆盖用户历史选择 - 语言切换后持久化到
localStorage,并在应用启动时优先读取该值,再加载对应包 - 支持错误降级:加载失败时 fallback 到
fallbackLocale并提示用户(可静默)
配套工程能力增强可维护性
单靠加载逻辑还不够,需配套机制保障长期演进:
- 添加构建时校验:检查各语言包 key 是否对齐(比如中文有
login,英文也必须有),缺失则报 warning - 生成类型定义(如 TypeScript 的
LocaleMessages),让 IDE 在写t('xxx')时自动提示可用 key - 提供 CLI 命令一键新增语言模板(如
npx i18n add ja自动生成locales/ja.json并更新 manifest)










