国际化
国际化
Norbital 把每个界面——网站、Colony 平台与每个租户工作区——本地化为 英文 与 简体中文 。平台随附两套目录;租户工作区为两种语言各携带自己的副本,并可以覆盖平台外壳文案。
模型
目录 是把消息键映射到字符串的扁平映射——没有嵌套,因此目录通过展开合并时不会出现结构意外。每个目录都以 en / zh 配对存在, defineMessages 在编译时强制两种语言携带完全相同的键。英文是唯一事实来源;运行时按
回退,因此未来的第三种语言可以部分翻译而不破坏类型约定。占位符使用 {name} 语法,作为第二个参数传入:
const { t } = useI18n<TenantI18nKeys>();
t('app.quotes.title'); // "Quotes" / "报价"
t('component.doc_no', { no: 'Q-2026-014' });
受支持的语言
受支持的语言集合是封闭的: 'en' 与 'zh' 。客户端上的语言解析依次遵循持久化的选择(本地存储中的 norbital.locale )、浏览器语言,最后是英文。服务器代码以同样的方式从 Accept-Language 请求头(或显式的 ?lang= )解析。格式化遵循同样的语言: 'en' 映射到 en-US , 'zh' 映射到 zh-CN ,用于 Intl.* 的日期、数字与货币格式化。
平台目录
bolt 随附两套覆盖平台外壳文案的目录——外壳、设置、通知、Agent 界面、身份页面与事务性邮件:
@norbital-ai/ui/i18n——组件库目录(table.*、form.*、dataRenderer.*、…)。@norbital-ai/bolt/i18n——bolt 外壳目录(bolt.*、server.*、email.*)。
构建时的目录合并顺序是 platform catalogs ← tenant overrides ,因此租户可以通过复用相同的键按语言重新定制平台文案。
租户文案
工作区在 src/i18n/ 下编写自己的文案:
src/
└── i18n/
├── messages.en.json # your English copy
└── messages.zh.json # your Chinese copy — same keys
两个文件必须携带完全相同的键;bolt 编译器会拒绝不匹配。应用文件用 useI18n<TenantI18nKeys>() 中的 @norbital-ai/ui/i18n 翻译,其中 TenantI18nKeys 是从你的 messages.en.json 派生的生成类型联合( $bolt/i18n-keys ):
// src/apps/+quotes.svelte
import { useI18n } from '@norbital-ai/ui/i18n';
import type { TenantI18nKeys } from '$bolt/i18n-keys';
import { PageHeader } from '@norbital-ai/ui/page-header';
const { t } = useI18n<TenantI18nKeys>();
<svelte:head> 中的应用元数据保持静态英文——编译器读取它用于应用身份。侧边栏标签改为通过目录中的 app.<appId>.title 键按语言本地化。
切换语言
网站通过 URL 切换: