intl.get() 的 code 参数必须严格按“服务名.功能名.类型.具体含义”两段式结构书写,用点连接且不可增删空格或符号;fallback 用 .d() 方法仅在完整路径匹配失败时生效,变量需通过第二参数传入并保持占位符一致;跨模块引用须在组件类上用 @formatterCollections 显式声明依赖的服务功能对。

intl.get() 的 code 参数怎么写才不报错
直接拼错 code 是最常见的多语言失效原因。它不是随便写的字符串,而是有固定两段式结构:[服务名].[功能名] + [类型].[具体含义],中间用点连接,不能漏点、不能多点、不能空格。
比如 "hpfm.event.model.event.code" 拆开看:
- 前半段
hpfm.event:服务名hpfm+ 功能名event,必须和@formatterCollections({ code: ['hpfm.event'] })里声明的一致 - 后半段
model.event.code:说明这是 event 模型的 code 字段,不是随便起的字段名,而是约定好的命名路径
常见错误:
-
intl.get("event.code")—— 缺少服务前缀,找不到资源 -
intl.get("hpfm-event-code")—— 用了中划线,但规范只认点号分隔 -
intl.get("hpfm.event.model.eventCode")—— 字段名写成驼峰,实际配置里是event.code
多语言 fallback 为什么没生效
intl.get(code).d(defaultMessage) 的 d() 方法是 fallback 关键,但它只在「整个 code 路径完全匹配失败」时才触发,默认值不会做变量插值。
立即学习“前端免费学习笔记(深入)”;
例如:intl.get('hzero.common.validation.notNull').d('{name} 不能为空') 这里的 {name} 不会被自动替换,d() 只返回原字符串。
真正要带变量的场景,得用第二参数传对象:
intl.get('hzero.common.validation.notNull', { name: intl.get('hpfm.event.model.event.code').d('事件编码') })
注意两点:
-
intl.get(...).d(...)必须嵌套调用,不能把.d()放在第二参数里 - 变量名(如
name)必须和多语言配置中占位符完全一致,包括大小写和括号 - 如果
hzero.common.validation.notNull本身不存在,d()才会生效;但如果存在却缺变量,就会报错或显示空白
跨模块引用多语言时 class 上怎么加注解
模块 A 要用模块 B 的多语言文案,不能只写 intl.get("xxx") 就完事——构建时会漏掉模块 B 的语言包,导致线上缺失。
必须在使用方的 React 组件类上,通过 @formatterCollections 显式声明依赖:
@formatterCollections({ code: ['hpfm.event', 'hzero.common'] })
这里填的是「服务.功能」层级,不是具体字段。比如要用 hzero.common.validation.notNull 和 hpfm.event.model.event.code,就都得列进 code 数组。
容易忽略的点:
- 数组里不能写
"hzero.common.validation"这种中间层,必须是顶层服务功能对 - 如果组件同时用多个服务的语言,每个都要列全,漏一个,对应语言包就不会被打包进去
- 注解只对当前组件生效,子组件不会继承,得各自声明
HTML class/id 命名和国际化 code 冲突吗
完全不冲突。HTML 的 class 和 id 命名走前端样式规范(比如 BEM、连字符分隔),而多语言 code 是纯逻辑标识,只在 JS 层调用 intl.get() 时起作用。
但实践中容易混在一起犯错:
- 有人把
class="view-button-submit"当成多语言 code 用,结果intl.get("view-button-submit")找不到 —— 这个字符串根本不在语言包里 - 也有人在 HTML 里硬编码中文,比如
label="提交",绕过intl.get(),导致切换语言时不动 - 更隐蔽的是:CSS 里写了
.btn-submit::after { content: "提交"; }—— 这种伪元素内容无法被多语言接管
关键判断标准:只要文本出现在 DOM 中(不管是 JSX 文本子节点、placeholder、title 还是 aria-label),就必须走 intl.get().d(),不能有任何例外。



















