I18n API
Yumeri 提供了一个轻量级的国际化(i18n)文本管理,用于注册、获取与替换多语言文本点,支持用户语言优先级和系统回退语言双重机制。
3.0 之后,I18n 不仅能注册单一键值,还支持对象扁平化、ctx.i18n() 自动注册,以及和 Schema.key() 的联动。
构造参数
constructor(fallback?: string[])
- fallback:
string[]
系统默认回退语言列表,按优先级从高到低排列。
当用户语言中无匹配时,会依次使用此列表查找。
默认值:['en']
注册方式
register(key: string, lang: Record<string, string>): void
注册一个文本点及其多语言翻译:
ts
core.i18n.register('app.title', {
zh: '示例应用',
en: 'Sample App',
})register(map: Record<string, any>): void
以对象方式批量注册,并自动展开嵌套对象:
ts
ctx.i18n({
app: {
title: { zh: '示例应用', en: 'Sample App' },
subtitle: { zh: '欢迎', en: 'Welcome' },
},
})这会被自动转换为:
ts
{
'app.title': { zh: '示例应用', en: 'Sample App' },
'app.subtitle': { zh: '欢迎', en: 'Welcome' },
}语言映射不会被限制为固定的 zh / en 字段。只要对象的值全部是字符串,就会被视为语言表,因此也可以使用 ja、ko、fr 或项目自定义的语言标识:
ts
ctx.i18n({
greeting: {
'zh-CN': '你好',
en: 'Hello',
ja: 'こんにちは',
},
})嵌套对象会继续展开为点号路径;只有叶子节点的语言映射会被注册为文本点。
ctx.i18n()是实际最常用的注册入口,因为它会把注册结果挂到当前插件的上下文生命周期中,并在插件卸载时自动清理。
获取与回退
get(key: string, langs?: string[]): string
根据语言优先级列表获取对应翻译文本:
ts
const text = core.i18n.get('app.title', ['zh', 'en'])
// => '示例应用'行为:
- 优先按
langs顺序匹配。 - 若未匹配到,则使用系统回退语言列表。
- 若仍无结果,则返回
key本身。
setFallback(fallback: string[]): void
设置系统回退语言列表:
ts
core.i18n.setFallback(['zh', 'en'])replaceAll(input: string, langs?: string[]): string
批量替换字符串中的文本点:
ts
const value = core.i18n.replaceAll('Hello {{app.title}}', ['en'])
// => 'Hello Sample App'查验与删除
isRegistered(key: string): boolean
判断某个文本点是否已注册。
delete(key: string): void
删除某个文本点的所有语言内容。
all(): Record<string, Record<string, string>>
返回当前所有已注册的翻译数据:
ts
const all = core.i18n.all()与 Schema 配置联动
在 3.0 中,配置字段说明文字可以绑定到 i18n key:
ts
export const config = Schema.object({
port: Schema.number('监听端口')
.key('demo.config.port')
.default(14510),
})当请求语言是 ['zh', 'en'] 时,Yumeri 会优先按语言取对应文案;如果没有命中,则回退到原始 description。这让配置面板、控制台文本和页面展示保持一致。
典型用法
ts
ctx.i18n({
plugin: {
name: { zh: '插件示例', en: 'Plugin Example' },
tip: { zh: '欢迎使用', en: 'Welcome' },
},
})
const text = ctx.getCore().i18n.get('plugin.name', ['zh', 'en'])与 session / request 语言结合
实际使用中,语言通常来自 session 或 request 的 accept-language 解析结果,形如:
ts
['zh-cn', 'zh', 'en']Yumeri 会按这个顺序寻找匹配项,若未命中,则再回退到系统默认语言列表。这样能兼顾用户偏好与框架默认文案。
