i18n 国际化
NocoBase 插件通过 src/locale/ 目录管理多语言文件。翻译文件写好后,在 Plugin 里用 this.t()、在组件里用 useT() hook、在 FlowModel 定义里用 tExpr() 就能拿到翻译文本。
翻译文件
在插件的 src/locale/ 下按语言创建 JSON 文件,key 是英文原文,value 是对应语言的翻译:
几个注意事项:
- key 用英文原文,这样即使翻译缺失也能 fallback 到英文
- 变量用双花括号
{{name}},跟 i18next 的语法一致 - 初次添加语言文件需要重启应用才能生效,之后修改内容热更新即可
- NocoBase 会自动以插件的包名作为翻译的命名空间(namespace),不同插件的翻译不会冲突
在 Plugin 中使用:this.t()
在 Plugin 类里,this.t() 会自动注入当前插件的包名作为 namespace,不需要手动传 ns:
在组件中使用:useT()
在 React 组件里不能直接用 this.t()。插件脚手架会自动生成一个 locale.ts 文件,里面提供了 useT() hook:
在组件里这样用:
useT() 返回的 t 函数已经绑定了插件的 namespace,直接传 key 就行。
在 FlowModel 中使用:tExpr()
FlowModel.define() 和 registerFlow() 是在模块加载时执行的,此时 i18n 还没初始化,不能直接调用 t()。这种场景用 tExpr()——它生成一个延迟翻译的表达式字符串,运行时再解析:
简单来说:this.t() 和 useT() 用于运行时翻译,tExpr() 用于静态定义时的延迟翻译。
提示
tExpr 有两个来源:插件自动生成的 locale.ts 和 @nocobase/flow-engine。区别在于 locale.ts 里的 tExpr 已经绑定了插件的包名作为 namespace,而从 @nocobase/flow-engine 直接导入的 tExpr 没有 namespace 绑定。在插件代码里,始终用 locale.ts 导出的 tExpr,这样翻译才能正确匹配到插件自己的语言文件。
三种用法速查
相关链接
- Context → 常用能力 → 国际化 — ctx.t、ctx.i18n 的完整 API 参考
- 语言列表 — NocoBase 支持的语言代码完整列表
- Component 组件开发 — 组件中使用 useFlowContext
- FlowEngine 概述 — tExpr 在 FlowModel 中的用法

