Skip to content

Localize the app into Traditional Chinese and Japanese - #59

Merged
jhen0409 merged 11 commits into
mainfrom
i18n-zh-hant-ja
Aug 20, 2026
Merged

Localize the app into Traditional Chinese and Japanese#59
jhen0409 merged 11 commits into
mainfrom
i18n-zh-hant-ja

Conversation

@jhen0409

@jhen0409 jhen0409 commented Aug 18, 2026

Copy link
Copy Markdown
Member

Summary

  • String Catalogs (Multiplex/Localizable.xcstrings, MultiplexWidgets/Localizable.xcstrings, Multiplex/InfoPlist.xcstrings) with English text as the key — 1,057 app keys + 40 widget keys, all with zh-Hant (Taiwan wording) and ja values, every row needs_review pending a native pass.
  • Tiers (see docs/agents/i18n.md): A prose / sheets / alerts / notifications / Guide / FAQ (the in-app release-notes card stays English by decision) and B menus, section headers, row titles are localized; C TALLY micro chrome (DONE, CANCEL, ESC, LIVE, telemetry) stays English by design.
  • No in-app language picker: iOS/visionOS add the per-app Language row in Settings.app once a second localization ships; Multiplex Settings gains a LANGUAGE ↗ row that deep-links there.
  • ./Tools/build.sh strings runs the xcstringstool sync the IDE would (xcodebuild only emits .stringsdata); StringCatalogTests fails when any non-stale key lacks a zh-Hant/ja value or the bundle lacks either lproj.
  • Trap found + fixed: String(localized:) locale-groups integer interpolations (port 2,222) — ports and line numbers now interpolate String(...); recorded in the doc.
  • zh-Hant linted with zhtw-mcp lint --translationese-domain technical; glossary decisions (工作階段 / 連接·中斷連接 / Deck·Agent·Shell unchanged, Apple's 拷貝 for Copy) applied throughout.

Proof

visionOS + iPad simulator under -AppleLanguages "(zh-Hant)" / "(ja)": Deck + release card, Settings, Add Host, Pro paywall, FAQ, terminal GUIDE — CJK falls back to PingFang/Hiragino cleanly, no clipping observed; chrome stays English.

./Tools/build.sh lint clean · visionOS unit tests green (incl. the new catalog test) · iPad build green.

Follow-up

PR 2 (stacked): App Store metadata for zh-Hant / ja + CJK-range rule in Tools/metadata_limits.rb.

String Catalogs (app, widgets, InfoPlist) with English text as the key;
every user-visible sheet, alert, menu, notification, guide, FAQ and
release-note string goes through String(localized:), while the TALLY
micro chrome (DONE, ESC, LIVE, telemetry) stays English by design.
Language is chosen per app in Settings.app; Multiplex Settings gains a
LANGUAGE row that deep-links there.

`./Tools/build.sh strings` folds the build's .stringsdata into the
catalogs (the IDE-only sync step); StringCatalogTests fails when a key
lacks a zh-Hant or ja value. Integer interpolations that must not be
locale-grouped (ports, line numbers) interpolate String(...).
Every translated row is needs_review pending a native pass; zh-Hant was
linted with zhtw-mcp. Decisions and glossary: docs/agents/i18n.md.
No spaces between full- and half-width characters, full-width colons, no
spaces around slashes/brackets, spaced em dashes; textlint is now the
recorded ja lint step in docs/agents/i18n.md.
ReleaseNotes.swift reverts to plain literals; its 93 catalog keys are gone.
Versioned copy is rewritten every release, so the per-release translation
pass buys little — the App Store release notes are localized instead.
…g reset

Conflict resolutions keep main's new Guide wording wrapped in
String(localized:); the i18n TestFlight bullet moves into the fresh
post-1.4.0 section. New/reworded strings synced into the catalog with
zh-Hant/ja drafts marked needs_review.
@jhen0409
jhen0409 merged commit 579e67a into main Aug 20, 2026
2 checks passed
@jhen0409
jhen0409 deleted the i18n-zh-hant-ja branch August 20, 2026 01:42
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