Skip to content

[finding] 8 处 auth 调用点的内联 defaultValue 与 en 包值不一致 —— key 存在故兜底是死代码,三道 i18n 门禁按设计都看不见这一类 #3810

Description

@yinlianghui

#3546 切片三(PR 回填 auth 家族 54 个缺失 key)顺手量出,不在该 PR 范围内,单独记录。观察级:用户今天看到的字串是包值,包值本身没问题;坏的是同一个调用点还写着一句永远不会渲染、且与包值说法不同的英文。

量法

auth / oauth / acceptInvitation 三个命名空间的全部 122 个 t() 调用点做 AST 抽取(key + 内联 defaultValue 字面量),与 packages/i18n/src/locales/en.ts 的实际叶子值逐字节比对。其中 54 个是缺 key(#3546 切片三已补,补的时候 52/52 与站点默认值取到逐字节相同),剩下 68 个 key 是已经存在的 —— 这 68 个里有 8 处 en 值与站点默认值不同:

key en 包值(实际渲染) 站点内联 defaultValue(死代码) 位置
auth.forgotPassword.description Enter your email address and we'll send you a link to reset your password Enter your email and we'll send you a reset link. ForgotPasswordPage.tsx:33
auth.forgotPassword.submitButton Send Reset Link Send reset link :39
auth.forgotPassword.submittingButton Sending...(三个半角点) Sending…(U+2026) :40
auth.forgotPassword.successDescription We've sent a password reset link to {{email}}. Please check your inbox. If an account exists, a reset link has been sent. :46
auth.login.errors.invalidCredentials Invalid email or password. Please try again. Invalid email or password LoginPage.tsx:368
auth.login.submittingButton Signing in...(三个半角点) Signing in…(U+2026) LoginPage.tsx:386
auth.verifyEmail.resendFailed Cannot resend verification email Failed to resend verification email VerifyEmailPromptPage.tsx:81
auth.verifyEmail.resendFailed(同一 key 第二个站点) 同上 同上 VerifyEmailPromptPage.tsx:128

为什么它是 finding 而不是 bug

i18next 只在 miss 时用 defaultValue。这 8 个 key 十包都有,所以包值恒胜 —— 那些 defaultValue 是结构性死代码。用户看不到任何异常。

但它有两处真实代价:

  1. 误导读者。 读组件的人(和写代码的 AI)会以为按钮上写的是 Send reset link,实际是 Send Reset Link;以为忘记密码成功页遵守了"不暴露账号是否存在"的写法(If an account exists, …),实际渲染的是 We've sent a password reset link to …,断言了一个可能没发生的发送动作。改文案的人改错那一行,门禁一片绿。
  2. 一旦哪天 key 被删/改名,渲染会静默跳回这 8 句里的另一种说法,而没人在 review 里预期到文案会变。

第 3、6 行只差一个省略号字符(... vs ),是包内排版一致性问题(en 包里两种写法混用);其余 6 行是语义差异。

三道门禁为什么都看不见

所以这是 #3582 / #3625("key 在、值陈旧")之外的又一个值域盲区,而且更容易复发:任何人给一个已存在的 key 加内联 defaultValue,都可以自由写成另一句英文。

可能的收口方向(未裁决)

倾向 B(声明即强制,让写错的那一刻就红),存量按 A 一次性对齐。规模未量:本次只扫了 auth 家族三个命名空间,全仓 2320 个字面量 key 的调用点里还有多少同类未知 —— 这是这张单最该先做的一件事。

关联:#3546(存量缺 key 的账,切片三顺手量出本条)、#3530(调用点→en 门禁本体)、#3650(en-drift 门禁)、#3582 / #3625(值域盲区的前两个实例)。

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions