Repository navigation
Commit 2ae3e30
i18n(platform-objects): ship the platform objects, Setup, Studio and Account in Russian; refresh the stale fr connect-agent subtitle (#31466)
domain:server#3 · os-project-manager · session_01FEkQ5pXkgNXVpCn2GZDjyy
Body: seat refresh (ACCEPT) · 2026-11-08T10:44Z
<!-- claude-projects-attribution: {"github_login":"os-project-manager"}
-->
_Requested by **Leehom** · [project
thread](https://claude.ai/code/project/chan_01TenzsRopZj4jMbvjX8uz1X?thread=cmsg_01TenzsRopZj4jMbvjX8uz1X5xwArPxERFNdAjYY2nKcc9)_
Part of #30512
Thread-read: 6719477612
Clause-②: no
Metadata-protocol: none
## 维护者速读
- 改了什么:给 `@objectstack/platform-objects` 加上俄语(ru):平台对象、Studio
的元数据表单、Setup/Studio/Account 导航、系统概览仪表板和用户/组织记录页的内嵌文字,做法与已合并的
fr(#31233)、pt-BR(#31440)逐文件一致。同一 PR 顺手修好 fr 的
`pages.connect_agent.subtitle`:按当前英文重译并刷新摘要。
- 为什么改:ru 是 #30512 要补的第五个语言(之后是 de、ko)。fr 那条副标题是按旧英文翻的,摘要过期,fr
用户目前看到的是英文回退。
- 风险与回滚:新增 ru 文件、注册行和测试里的语言列表;已有语言只改 fr 的一条副标题和它的摘要,其余 23
个生成文件字节不变;新文字同样走 source-hash 回退。回滚即 revert 本 PR。
-
先看:`packages/platform-objects/src/apps/translations/ru.ts`(导航钉住项),`fr.ts`
+ `fr.source-hashes.ts` 里 `connect_agent.subtitle`
的两行改动,`ru.source-hashes.generated.ts`(45 条与英文相同的叶子,下面逐类列出)。
- 两分钟验证:`cd packages/platform-objects && npx vitest run
src/apps/translations/source-hash.test.ts
src/apps/translations/app-nav-translation-parity.test.ts`,预期 2 个文件、111
个测试通过。
- 需要你做的:生成文件让本 PR 超过了 3000 行,所以要请 os-zhuang 或 hotlong 批准(或维护者直接合并)。席位
ACCEPT 是 PR 评论 6720497415,Head-sha
`efe02a1756a3e095bfa458add5860f81776726ad`。批准后由席位落地。
## What changes
- New `ru` bundles in `packages/platform-objects/src/apps/translations`:
`ru.objects.generated.ts` (1697 leaves),
`ru.metadata-forms.generated.ts` (1263 leaves), their provenance table
`ru.source-hashes.generated.ts` (45 deliberate byte copies of `en`,
listed under Acceptance notes), the hand-authored `ru.ts` (141 leaves)
and `ru.source-hashes.ts` recording the `en` digest of every hand leaf.
- Registration: the extract config's `--locales` docstring and
`translations:` baseline, `setup.translation.ts`, the `apps` barrel, and
`metadata-translations/index.ts`.
- Inline maps: 36 in `sys-user.page.ts`, 6 in
`sys-organization.page.ts`, and the System Overview null label in
`system.datasets.ts` (`Система`).
- Wording pins, as #31233 lists them: `nav_account_approvals` reads as
plugin-approvals' `my_pending` label (`Ждут моего решения`),
`nav_assignment_rules` as `sys_assignment_rule`'s plural label (`Правила
назначения`), each `nav_settings_*` (including
`nav_settings_access_policy`, `Политика доступа`) as its
service-settings hub title, `nav_settings_hub` as the console's
`backToHub` (`Все настройки`), and the four #30935 keys:
`grp_account_ai_assistant` = `ИИ-ассистент`; both `nav_connect_agent`
entries and `pages.connect_agent.label` = `Подключить ИИ-ассистента`.
- **fr fix:** `pages.connect_agent.subtitle` in `fr.ts` was translated
from the previous English subtitle (it spoke of "any MCP-compatible AI
client"), and `fr.source-hashes.ts` recorded that old digest
(`b0d7c6d174511bcb`), so the source-hash fallback served `fr` readers
the English sentence. It is now retranslated from the current English
text (`Travaillez dans ce système depuis Claude, Doubao et d’autres
assistants IA. Chacun agit en votre nom : il ne voit et ne modifie que
ce que vos propres autorisations permettent.`) and its digest is
`51c467af44024a1b`, which equals the digest the table derives from `en`
today. No other `fr` leaf changes.
- Changeset `.changeset/30512-platform-objects-ru.md` (patch), which
also names the `fr` fix.
## Tests
- `ru` added beside `pt-BR` to the locale lists of every test #31440
widened (vocabulary, nav parity, dead-key tombstone, source-hash,
bu-rename with `old: /Отдел/`, the five identity copy tests, record-page
tabs, null label, per-user stores, plugin translation loads), plus
plugin-approvals `approval-status-vocabulary`, plugin-security
`people-org-assignment-nav-contribution` and service-settings
`setup-nav-hub-parity`. The cli `platform-page-i18n-parity` LOCALE_KEY
shape already accepts `ru`.
- No new negative pin: #31440's plugin-audit `pt-BR` twin test is
outside this claim's file surface, so no `ru` twin is added here (see
Acceptance notes).
## Acceptance notes
- Every leaf is translated. The 45 byte copies of `en` the extract
records are identifiers and header names (`ID` ×24, `API` ×2, `JWKS`,
`JWKS URI`, `Message-ID`, `Slug`, `Web`, `snake_case`, the SAML
`urn:…:emailAddress` NameID format, the `openid email profile` / `email`
/ `name` defaults), lowercase option values that are identifiers
(`cron`, `dlq`, `api`, `web`), and the five JSON examples kept verbatim
as every locale keeps them.
- No catalog test refused an `en` echo, so no leaf needed its parent's
name added. Where Russian needs the parent to read correctly anyway, the
leaf names it (for example `Описание виджета`, `Тип фильтра`, `Размеры
виджета`).
- Vocabulary follows the existing `ru` plugin bundles: «» quotes,
`Должность`, `Бизнес-подразделение`, `Набор разрешений`, `Дашборд`,
`Очереди`, `Веб-хуки`, `HTTP-доставки`, `Общий доступ к записям`,
`Настройки уведомлений`; hub titles exactly as service-settings spells
them (`Доставка почты`, `Брендинг`, `Хранилище файлов`, `ИИ и Embedder`,
…). Adjectives and participles agree with the noun they qualify
(`Активен`/`Активны`, `Отключён`, `Отозван`, plural view names
`Активные`, `Ожидающие`, …).
- Business units are `Бизнес-подразделения`; no `sys_business_unit*`
label says `Отдел` (`bu-rename-consistency`). `Отдел` survives only as
the unit-kind option value, which is not a label.
- Deviation: #31440 shipped a plugin-audit `pt-BR` twin of the #28107
activity-summary test. This PR does not add a `ru` twin, because
plugin-audit is not in the claim's file surface; it can follow as its
own card.
## Verification
- `os i18n extract
packages/platform-objects/scripts/i18n-extract.config.ts
--locales=zh-CN,ja-JP,es-ES,zh-Hant,ar,fr,pt-BR,ru --fill=default
--source-hashes --out=packages/platform-objects/src/apps/translations`:
a rerun regenerates the `ru` bundles byte-identical and leaves the 23
other generated files unchanged (none of them is in the diff) (`cmp`
over every file in the directory). `check-i18n-bundles
--filter=platform-objects`: in sync (26 bundles).
- Resolved through `SetupAppTranslations`: `fr`
`pages.connect_agent.subtitle` now starts `Travaillez dans ce système
depuis Claude, Doubao…`; `ru` gets `Работайте с этой системой из Claude,
Doubao…`.
- `vitest run` in platform-objects: 120 files, 1841 tests passed.
plugin-approvals `approval-status-vocabulary` (6), plugin-security
`people-org-assignment-nav-contribution` (5), service-settings
`setup-nav-hub-parity` (19) and cli `platform-page-i18n-parity` (27)
passed.
- platform-objects `typecheck`: exit 0. `check:app-nav-i18n`: OK (13
contributors, 9 locales, 2 apps).
- `dispatch-gates --ran` at 9c137f2 (after merging `origin/main`): 68
derived families, 68 run, 0 NOT-MEASURED, all exit 0 (including
`check:i18n`, `check:i18n-stale-fill`, `check:dts-closure`,
`check:dual-build-cjs-loads`, `check:nul-bytes`).
- `eslint` over the changed `.ts` paths (scoped, `--no-inline-config`):
exit 0.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---
_Generated by [Claude
Code](https://claude.ai/code/session_01FEkQ5mqoYjnPaGZhS8jzcF)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 595311b commit 2ae3e30
38 files changed
Lines changed: 7278 additions & 50 deletions
File tree
- .changeset
- packages
- platform-objects
- scripts
- src
- apps
- dashboards
- translations
- identity
- metadata-translations
- pages
- plugins
- plugin-approvals/src/translations
- plugin-security/src
- services/service-settings/src
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
11 | | - | |
| 11 | + | |
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
| |||
225 | 225 | | |
226 | 226 | | |
227 | 227 | | |
| 228 | + | |
228 | 229 | | |
229 | 230 | | |
230 | 231 | | |
| |||
233 | 234 | | |
234 | 235 | | |
235 | 236 | | |
| 237 | + | |
236 | 238 | | |
237 | 239 | | |
238 | 240 | | |
| |||
259 | 261 | | |
260 | 262 | | |
261 | 263 | | |
| 264 | + | |
262 | 265 | | |
263 | 266 | | |
264 | 267 | | |
| |||
363 | 366 | | |
364 | 367 | | |
365 | 368 | | |
| 369 | + | |
366 | 370 | | |
367 | 371 | | |
368 | 372 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
34 | 34 | | |
35 | 35 | | |
36 | 36 | | |
| 37 | + | |
37 | 38 | | |
38 | 39 | | |
39 | 40 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
57 | 57 | | |
58 | 58 | | |
59 | 59 | | |
60 | | - | |
| 60 | + | |
61 | 61 | | |
62 | 62 | | |
63 | 63 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
49 | 49 | | |
50 | 50 | | |
51 | 51 | | |
| 52 | + | |
52 | 53 | | |
53 | 54 | | |
54 | 55 | | |
| |||
57 | 58 | | |
58 | 59 | | |
59 | 60 | | |
| 61 | + | |
60 | 62 | | |
61 | 63 | | |
62 | 64 | | |
| |||
65 | 67 | | |
66 | 68 | | |
67 | 69 | | |
| 70 | + | |
68 | 71 | | |
69 | 72 | | |
70 | 73 | | |
| |||
139 | 142 | | |
140 | 143 | | |
141 | 144 | | |
142 | | - | |
| 145 | + | |
143 | 146 | | |
144 | | - | |
| 147 | + | |
145 | 148 | | |
146 | 149 | | |
147 | 150 | | |
148 | 151 | | |
149 | 152 | | |
150 | 153 | | |
151 | 154 | | |
| 155 | + | |
152 | 156 | | |
153 | 157 | | |
154 | 158 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
| 22 | + | |
22 | 23 | | |
23 | | - | |
| 24 | + | |
24 | 25 | | |
25 | 26 | | |
26 | 27 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
114 | 114 | | |
115 | 115 | | |
116 | 116 | | |
| 117 | + | |
117 | 118 | | |
118 | 119 | | |
119 | | - | |
| 120 | + | |
120 | 121 | | |
121 | 122 | | |
122 | 123 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
62 | 62 | | |
63 | 63 | | |
64 | 64 | | |
| 65 | + | |
65 | 66 | | |
66 | | - | |
| 67 | + | |
67 | 68 | | |
68 | 69 | | |
69 | 70 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
| 21 | + | |
21 | 22 | | |
22 | 23 | | |
23 | 24 | | |
| |||
28 | 29 | | |
29 | 30 | | |
30 | 31 | | |
| 32 | + | |
31 | 33 | | |
32 | 34 | | |
33 | 35 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
| 32 | + | |
32 | 33 | | |
33 | 34 | | |
34 | 35 | | |
| |||
38 | 39 | | |
39 | 40 | | |
40 | 41 | | |
| 42 | + | |
41 | 43 | | |
42 | 44 | | |
43 | 45 | | |
| |||
0 commit comments