支持的语言
界面提供 5 种语言,每种语言的键集完全一致(各 498 个键):
语言代码列表定义在
public/i18n.js 的 LANGUAGES 数组中;模块对外暴露 window.__i18n(t() / getLocale() / getLanguages() / loadLocale())。
工作原理
- 持久化键:
blog.locale(切换语言时写入;只接受受支持的代码) - 自动识别:按
navigator.language前缀匹配(zh→zh-CN) - 语言包加载:
public/locales/<lang>.json?v=<I18N_VER>,I18N_VER是语言包缓存版本 - HTML lang:加载完成后同步设置
document.documentElement.lang - 占位符插值:
t('comment.replyTo', { author: '小明' })会替换文案中的{author}
中文兜底
中文翻译内嵌在i18n.js 中(_BUILTIN_ZH,与 public/locales/zh-CN.json 同步)作为兜底:file:// 本地预览时 fetch 会被浏览器拦截,内嵌副本确保导航、菜单等核心文字始终可读。在线部署时 fetch 成功加载最新 JSON 并覆盖内置值;其它语言加载失败时同样回退到内嵌中文。
语言包键分组
键名按域前缀分组,便于增量补齐:添加新语言
- 复制任意语言包为
public/locales/<lang>.json,翻译全部 498 个键(缺键会回退显示键名或中文兜底) - 把新语言加进
public/i18n.js的LANGUAGES数组,并在getLocale()的语言前缀匹配里补一条 - 在
public/flags/下放同名 SVG 国旗(代码 →cn.svg/gb.svg/jp.svg/kr.svg/in.svg的命名约定) - 递增
I18N_VER - 运行
node smoke-test.js验证语言包加载与导航渲染
语言包格式
上面的片段只演示 JSON 结构(扁平键值对);真实语言包使用
nav.home、admin.dashboard.totalPosts 这类带域前缀的键名,可参考 public/locales/zh-CN.json。界面切换
切换语言会写入
blog.locale 并重新渲染当前路由,无需刷新页面。
翻译贡献
欢迎修正现有翻译或添加新语言支持。翻译文件位于public/locales/<lang>.json;改动后记得递增 I18N_VER 并同步 i18n.js 内嵌中文。流程见贡献指南。