Skip to content

@sheng/no-dynamic-i18n-t-key ​

要求 i18n 的 t() 第一个参数必须是字符串字面量,保证 IDE 插件和静态扫描能识别真实 key。

所属 config ​

  • i18n:翻译 key、调用点 fallback 和用户可见中文文案约定。

t() / $t() 的第一个参数如果是动态表达式,IDE 插件、静态扫描和翻译平台都看不到真实 key。缺失文案、拼错 key 和未翻译内容会被推迟到运行时才暴露。

这条规则不反对“根据状态切换文案”,它只要求每个候选 key 都能静态出现在代码里。显式分支看起来比模板字符串啰嗦一点,但 i18n key 会继续被补全、跳转、扫描和缺失检查识别。

会提示 ​

ts
t(`profile_${field}_label`)
t(labelKey)
t(keys.save)

推荐 ​

ts
const title = computed(() => {
  if (activeSection.value === 'birthday') return t('profile_edit_birthday_title')
  if (activeSection.value === 'height') return t('profile_edit_height_title')
  return t('profile_edit_title')
})

每个 key 都紧贴 t(),工具链才能扫描、补全和跳转。需要根据状态切换文案时,显式列出分支比拼接 key 更容易维护。

不处理的场景 ​

这条规则只检查翻译函数第一个参数的静态形态,不判断 key 是否真实存在,也不负责补齐语言包。缺失 key、未翻译文案和多语言同步仍然应该交给 i18n 平台、字典扫描或项目自己的语言包校验。

配置 ​

默认检查 t() 和 $t(),也能追踪 useAppI18n() 解构出的别名。项目里有其他翻译函数时,通过 functionNames 补充。

相关阅读 ​

这条规则的方法论背景见中文文章 Skill 管不住代码风格时:把项目约定写成 ESLint 护栏。具体触发条件、示例、配置和维护入口以本页为准。

在线试一下 ​

接入方式 ​

@sheng/eslint-plugin 的内置 config 会以 warn 开启这条规则。需要单独配置时,可以这样写:

js
import sheng from '@sheng/eslint-plugin'

export default [
  {
    plugins: {
      '@sheng': sheng,
    },
    rules: {
      '@sheng/no-dynamic-i18n-t-key': 'warn',
    },
  },
]

选项 ​

这条规则支持 options,具体 schema 以规则实现和测试用例为准。补充或调整选项时,同步更新本页示例。

维护入口 ​

  • 规则源码:src/rules/no-dynamic-i18n-t-key/index.mjs
  • 规则短说明:src/rules/no-dynamic-i18n-t-key/README.md
  • 测试用例:tests/unit/architecture/

基于 MIT 协议发布。