Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
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

Closed

Description

@hotlong

Moved from objectstack-ai/objectstack#8094 at triage (file-at-destination: all six sites are in this repo). Filed 2026-08-12 by @baozhoutao from a multi-org console walkthrough, original grading priority:p3. Batch siblings: objectstack-ai/objectstack#8090 #8091 #8092 #8093.

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.

Where

packages/app-shell/src/console/organizations/ (manage/MembersPage, manage/InvitationsPage, manage/InviteMemberDialog, manage/AcceptInvitationPage, OrganizationsPage create dialog).

Environment

Local dev server http://localhost:8080, multi-org enabled, zh locale. The server was started by the maintainer and its exact commit is not verified.

Activity

  1. self-assigned this
    on Aug 12, 2026
  2. yinlianghui commented on Aug 12, 2026

    @yinlianghui
    Contributor

    CLAIM — session session_017Qqyix2QcnpUC9XeYVDzx3, branch claude/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:

    1. 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.
    2. 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.
    3. 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.


    Generated by Claude Code


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions