You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
console: organization & invitation UI ships untranslated English in a zh locale (6 sites, incl. icon-only aria-labels) #4474
With the console in zh, the organization / invitation surfaces mix untranslated English into otherwise Chinese screens. Collected in one pass over the sign-up → create workspace → invite → accept flow (2026-08-12):
Where
Shown
Note
Invite user dialog, 角色 dropdown
Delegated Admin
siblings render 所有者 / 管理员 / 成员
Members page, role badges
Owner, Member
the same roles are 所有者 / 成员 in the invite dropdown — inconsistent within one feature
Invite dialog submitted by a member
You are not allowed to invite users to this organization
raw server message rendered as inline form error
Create workspace, slug already taken
Organization already exists
inline form error
Accept-invitation page, wrong recipient
You are not the recipient of the invitation
toast body under the translated title 接受失败
Members / invitations rows
aria-label = Member actions, Copy invitation link, Cancel invitation
icon-only buttons — this is the only label a screen reader gets
The last three are server-supplied strings echoed verbatim; they need a code→message mapping on the client (better-auth returns a stable code, e.g. YOU_ARE_NOT_ALLOWED_TO_INVITE_USERS_TO_THIS_ORGANIZATION), not a translation of the English text.
Filed as one issue because it is a single sweep over one feature area; split per surface if that suits the fix better.
Ruling (delegated authority; open veto window): unlocked by PR #4480 landing (shared surface). Three string families, three treatments — kept as ONE card since it is one sweep over one feature:
Client-authored strings (role names in the invite dropdown, role badges, dialog labels): route through the existing i18n channel per repo convention (defaults-maps + packs; the fix(i18n): the drifted detail row mirrors the en pack, and the three defaults maps get a gate (#4401) #4409 map-mirror gate is live — every new key needs its map rows). One-answer requirement: role display names come from ONE shared role-label map consumed by BOTH the dropdown and the badges — the card's measured inconsistency (Owner/Member badges beside 所有者/成员 dropdown) is exactly two hand-authored lists drifting; collapse them.
Server-supplied strings (the three echoed messages): map the stable better-auth code (e.g. YOU_ARE_NOT_ALLOWED_TO_INVITE_USERS_TO_THIS_ORGANIZATION) → translated message, per the card's own analysis. Unknown code → show the raw server message as fallback (never swallow an error; prefer mapped, degrade to verbatim). Do NOT translate English text by string-matching.
Icon-only aria-labels (Member actions / Copy invitation link / Cancel invitation): same i18n channel — these are the only label a screen reader gets.
Red-first: zh-locale render tests on the six measured sites — pre-fix red showing the English strings, post-fix the zh resolutions; code-mapping unit tests (known code → zh, unknown code → verbatim fallback, both directions pinned). Must-not-change: en locale still renders correct English through the same channel.
Grading: patch @object-ui/app-shell (strings/i18n only; .d.ts-checked, never major).
Surface (mutual exclusion): packages/app-shell/src/console/organizations/** (the five files the card names) + defaults-maps/packs per convention + tests + one changeset. Disjoint from in-flight #4431 (chatbot/core/fields/ledger), #4473 (RootLandingRedirect/app surface), #4452 (plugin-calendar), #4462 (print stylesheet + three button sites — it does NOT enter organizations/). #4475 (members-page role gating) is POOLED behind this card — do not fix the gating, strings only.
Activity
yinlianghui commentedon Aug 12, 2026
CLAIM — session
session_017Qqyix2QcnpUC9XeYVDzx3, branchclaude/issue-4474-org-i18n.Ruling (delegated authority; open veto window): unlocked by PR #4480 landing (shared surface). Three string families, three treatments — kept as ONE card since it is one sweep over one feature:
Owner/Memberbadges beside 所有者/成员 dropdown) is exactly two hand-authored lists drifting; collapse them.code(e.g.YOU_ARE_NOT_ALLOWED_TO_INVITE_USERS_TO_THIS_ORGANIZATION) → translated message, per the card's own analysis. Unknown code → show the raw server message as fallback (never swallow an error; prefer mapped, degrade to verbatim). Do NOT translate English text by string-matching.aria-labels (Member actions / Copy invitation link / Cancel invitation): same i18n channel — these are the only label a screen reader gets.Red-first: zh-locale render tests on the six measured sites — pre-fix red showing the English strings, post-fix the zh resolutions; code-mapping unit tests (known code → zh, unknown code → verbatim fallback, both directions pinned). Must-not-change: en locale still renders correct English through the same channel.
Grading: patch
@object-ui/app-shell(strings/i18n only;.d.ts-checked, never major).Surface (mutual exclusion):
packages/app-shell/src/console/organizations/**(the five files the card names) + defaults-maps/packs per convention + tests + one changeset. Disjoint from in-flight #4431 (chatbot/core/fields/ledger), #4473 (RootLandingRedirect/app surface), #4452 (plugin-calendar), #4462 (print stylesheet + three button sites — it does NOT enter organizations/). #4475 (members-page role gating) is POOLED behind this card — do not fix the gating, strings only.Generated by Claude Code
Generated by Claude Code
fix(app-shell): organization & invitation UI translates its six Engli…