Skip to content

fix(i18n): parity suite runs, and 54 missing keys translated in 61 locales - #119

Merged
mayoalexander merged 2 commits into
iris/1.18.23from
i18n-parity
Oct 5, 2026
Merged

mayoalexander merged 2 commits into
iris/1.18.23from
i18n-parity

Conversation

@mayoalexander

Copy link
Copy Markdown

Issue for this PR

The i18n parity suite never actually ran. It imported upstream's Electron renderer dictionaries, which don't exist in this Tauri app, and failed with "Cannot find module" before comparing any keys. Behind that crash, 54 keys were missing from every one of the 61 locales.

Type of change

  • Bug fix
  • New feature
  • Refactor / code improvement
  • Documentation

What does this PR do?

  1. test(app): removes the dead desktop domain from parity.test.ts, so the suite compares the dictionaries that exist (app and ui).
  2. feat(i18n): adds the 54 missing keys to all 61 locales (122 files, insertions only, en.ts untouched). They cover the voice UI (ui.promptInput.dictate.*), the dictation microphone setting, the dictate command, command-palette filters, status dots, session panel add, the auto-update setting, and ui.promptInput.integrations.

Each locale reuses its file's existing terminology, and placeholders and plural families are preserved. A handful of existing strings that were clear machine-translation errors weren't reused; details are in the commit message.

Needs native review (no external corpus was consulted): dz, dv, am, my, si, lo, km, pa, ur, ne, mn, tg, tk, uz, ka, hy, fo, is.

Known English-source issue, not changed here: ui.promptInput.dictate.saved.one is "1 saved recording", without {{count}}. In ru/uk/bs/hr/sr/lt/lv/is/mk the "one" category also covers 21, 31 and so on, so it misreads there. The fix is an English copy change ("{{count}} saved recording") plus the extra plural categories.

How did you verify your code works?

  • bun test --conditions=solid --preload ./happydom.ts src/i18n (packages/app): 13 pass, 0 fail. The parity suite is 5/5.
  • A key-diff script reports 0 missing keys in app and ui across all 61 locales.
  • bun run typecheck: clean in packages/app and packages/ui.
  • git diff --stat: 122 locale files, 3441 insertions, 0 deletions.
  • Spot-checked de/fr/es/ja by eye.

Screenshots / recordings

N/A.

Checklist

  • I have tested my changes locally
  • I have not included unrelated changes in this PR

🤖 Generated with Claude Code

mayoalexander and others added 2 commits October 5, 2026 05:11
The suite imported upstream's Electron renderer dictionaries
(desktop/src/renderer/i18n), which do not exist in this Tauri app, so
every run failed on "Cannot find module" before comparing a single key,
and the real gaps were invisible. With the dead domain removed it runs:
4 of 5 checks pass, and the 5th reports 53 keys missing from all 61
locales (translated in the next commit).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_0178ACkfNSfZq61Zejqk55PG
Every non-English locale was missing the same keys: the voice UI
(ui.promptInput.dictate.*), the dictation microphone setting, the dictate
command, command-palette filters, status dots, session panel add, the
auto-update setting and ui.promptInput.integrations. The parity suite now
passes in full (5/5), with 0 keys missing in app and ui.

How: each locale reuses its own file's existing terminology (prompt,
session, copy, retry, background...), placeholders and plural families are
preserved, English is untouched. A few existing strings that were clear
machine-translation errors were not reused (e.g. hu "Collapse" as a crash,
tk "Dismiss" as firing someone); "Dismiss" uses "Close" in de/es/br/pl
where it would otherwise equal "Discard" in the same toast.

Needs native review (no external corpus was consulted): dz (weakest), dv,
am, my, si, lo, km (coined "dictate" verbs), pa (Shahmukhi, as the file
is), ur, ne, mn, tg, tk, uz, ka, hy, fo, is.

Known English-source issue, not changed here: ui.promptInput.dictate.saved
.one is "1 saved recording" without {{count}}, so the parity test cannot
require the extra plural categories, and in ru/uk/bs/hr/sr/lt/lv/is/mk the
"one" category also covers 21, 31... (21 would read "1 saved recording").
Fix: make English .one "{{count}} saved recording", then add the extra
categories.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_0178ACkfNSfZq61Zejqk55PG
@mayoalexander
mayoalexander merged commit 9603f57 into iris/1.18.23 Oct 5, 2026
1 of 6 checks passed
@mayoalexander
mayoalexander deleted the i18n-parity branch October 5, 2026 05:28
mayoalexander added a commit that referenced this pull request Oct 31, 2026
… sendAndLog, Hive reads on top

Conflicts:
- platform-mail.ts: main's send/reply kept (#191605, sendAndLog logging). The PR's numeric-id
  'mail reply' over Hive is dropped: two commands cannot share the name, and it needs daemon #28
  and API #119, both unmerged. inbox/search/read over Hive, the classifier and intent stay.
- capabilities.json: main's, regenerated.

Follow-on fixes:
- 'mail read' no longer points at a reply command that does not take that id.
- a body fetched by id is only used if sender and subject match: ids are per Mac, the rail unpinned.
- intent no longer says send/reply/iMessage are routed over Hive. They are not.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant