跳到主要内容
版本:0.3.x(Latest)

基本介绍

LinaPro的国际化能力由主框架统一加载和合并。主框架提供基础语言包,源码插件提供插件自己的语言包,动态插件发布产物可以携带语言资源。启用插件后,主框架会把可用资源合并成运行时语言目录,供管理工作台、菜单、错误信息、插件页面和接口文档使用。

当前主仓库默认提供zh-CNen-US两套语言资源。其他语言需要项目团队自行创建和维护。

配置入口

国际化配置位于config.yaml

i18n:
default: zh-CN
enabled: true
locales:
- locale: en-US
nativeName: English
- locale: zh-CN
nativeName: 简体中文
配置项说明
default请求未携带语言标识或语言不受支持时使用的默认语言
enabled是否启用多语言能力;关闭后前端隐藏语言切换入口
locales运行时可选语言列表和展示名称

locales不仅影响前端语言切换菜单,也决定运行时哪些语言资源应被完整维护。

资源布局

主框架语言资源位于:

apps/lina-core/manifest/i18n/<locale>/

典型结构如下:

manifest/i18n/
├── zh-CN/
│ ├── framework.json
│ ├── menu.json
│ ├── dict.json
│ ├── config.json
│ ├── error.json
│ ├── job.json
│ ├── notify.json
│ ├── role.json
│ ├── plugin.json
│ ├── public-frontend.json
│ └── apidoc/
│ ├── common.json
│ └── core-api-*.json
└── en-US/
└── ...

直接位于<locale>/下的JSON文件用于运行时界面文案,apidoc/下的JSON文件用于接口文档翻译。两类资源分开加载,避免接口文档资源污染运行时界面文案。

语言包格式

语言包使用JSON格式,可以使用嵌套结构,也可以使用扁平点分隔键:

{
"menu": {
"dashboard": {
"title": "工作台"
}
},
"framework": {
"description": "面向可持续交付的 AI 原生全栈框架"
}
}

等价扁平键:

{
"menu.dashboard.title": "工作台",
"framework.description": "面向可持续交付的 AI 原生全栈框架"
}

加载后会规范化为扁平键。为了减少冲突,插件语言包应放在插件自己的命名空间下。

插件国际化

源码插件在自己的manifest/i18n/目录维护语言包:

apps/lina-plugins/content-notice/manifest/i18n/
├── zh-CN/
│ ├── content-notice.json
│ └── apidoc/
│ └── plugin-api-notice.json
└── en-US/
└── content-notice.json

插件语言包建议使用plugins.<plugin-id>.命名空间:

{
"plugins": {
"content-notice": {
"notice": {
"title": "通知公告",
"status": {
"draft": "草稿",
"published": "已发布"
}
}
}
}
}

动态插件的语言资源随发布产物携带。主框架加载有效发布版本时,会把这些资源作为插件资源参与合并,插件禁用或升级后再随运行时快照变化。

接口文档翻译

接口文档翻译放在manifest/i18n/<locale>/apidoc/下。主框架和插件都可以维护自己的apidoc资源:

manifest/i18n/zh-CN/apidoc/core-api-auth.json
manifest/i18n/zh-CN/apidoc/common.json
manifest/i18n/zh-CN/apidoc/plugin-api-notice.json

接口文档翻译使用结构化键,不建议使用展示文本作为键。插件翻译只维护自己的插件命名空间,主框架翻译只维护核心接口命名空间。

en-US接口文档资源通常可以保持为空占位,让源码中的英文summarydc和字段说明作为默认文案。中文等非英文语言应补齐翻译,保证工作台开发中心可读。

语言选择

运行时语言选择通常来自请求头、查询参数或前端保存的用户偏好。具体调用路径由工作台和主框架中间件协作完成。请求语言不存在或未配置时,主框架回退到i18n.default

i18n.enabled: false时,前端隐藏语言切换入口,主框架仍使用默认语言加载必要文案。

添加新语言

添加新语言通常需要四步:

  1. config.yamli18n.locales中加入语言代码和原生名称。
  2. apps/lina-core/manifest/i18n/<locale>/下创建主框架语言包。
  3. 为所有启用插件补齐manifest/i18n/<locale>/语言包。
  4. 如需接口文档本地化,补齐manifest/i18n/<locale>/apidoc/资源。

示例:

i18n:
locales:
- locale: ja-JP
nativeName: 日本語

创建目录:

mkdir -p apps/lina-core/manifest/i18n/ja-JP/apidoc

LinaPro不会自动生成新增语言的翻译内容。缺失翻译会回退到默认文案或显示未翻译键,具体表现取决于调用位置。

缓存与刷新

运行时语言资源会被缓存。开发环境修改语言包后,重启服务最直接:

make dev

生产环境应使用运行时缓存失效能力,按最小范围刷新:

范围说明
指定语言只刷新某个locale
指定插件只刷新某个插件的语言资源
主框架资源只刷新主框架语言包
接口文档资源只刷新apidoc翻译目录

不建议无理由清空所有语言和所有插件缓存。全量刷新会造成短暂的翻译抖动,也会增加下一次请求的加载成本。

语言代码

LinaPro使用标准IETF BCP 47语言代码。常见示例:

语言代码
简体中文zh-CN
繁體中文zh-TW
英文en-US
日文ja-JP
韩文ko-KR

目录名、config.yaml中的locale字段和前端请求中的语言参数应保持一致。