Skip to content

feat(i18n): Russian, Ukrainian, Chinese, Japanese, Korean + non-Latin font pipeline - #895

Merged
marceld23 merged 1 commit into
mainfrom
feat/cyrillic-cjk-locales
Aug 9, 2026
Merged

feat(i18n): Russian, Ukrainian, Chinese, Japanese, Korean + non-Latin font pipeline#895
marceld23 merged 1 commit into
mainfrom
feat/cyrillic-cjk-locales

Conversation

@marceld23

Copy link
Copy Markdown
Owner

Closes #886
Closes #887
Closes #888
Closes #889
Closes #891

The last five languages of the localization push — the game is now fully localized in 14 languages.

Font pipeline (the blocker all five issues shared)

Rajdhani covers Latin (+ Devanagari) only. UiKit.Font's Rajdhani importer now carries a fallbackFontReferences chain (legacy TrueTypeFontImporter, honored by uGUI dynamic fonts):

  1. Noto Sans Medium — full Latin/Greek/Cyrillic, 620 KB; covers ru/uk including ґ/є/і/ї
  2. Noto Sans CJK SC/JP/KR Medium subsets — built with pyftsubset from exactly the glyphs the translations use, plus CJK punctuation (U+3000–303F) and fullwidth forms: 794 / 812 / 196 KB instead of ~16 MB each. The WebGL bundle grows ~2.4 MB total instead of ~50 MB.

OFL license files ship next to the fonts (same pattern as Rajdhani). The local Unity batch build imported the new fonts and hand-written .meta files cleanly.

Locales

  • 3048/3048 main-table keys + VEGA-prologue story packs (68/68) per language; locale_report.py --check clean
  • Register hints in the translate prompt: informal ru "ты" / uk "ти", Japanese です/ます, Korean 해요체, Chinese plain friendly
  • A homoglyph pass normalized stray Latin lookalikes inside Cyrillic words (7 keys)
  • Full Step-4 wiring: GameLocale members (native names Русский / Українська / 简体中文 / 日本語 / 한국어), WebGL fallback manifest, OS-language first-run defaults, localized content-error dialogs, AI-backend _LANGUAGE_NAMES
  • All five clear the 45 % picker gate and appear in the settings automatically

Verification

  • dotnet build -c Release --no-incremental — 0 warnings
  • dotnet test (non-Slow): 1611 server + 187 client passing
  • Local Unity Windows build — complete, fonts imported, no stray synced files

Known limits (noted in the closed issues)

  • CJK chat input: characters outside the translation-derived subset show tofu on WebGL (desktop falls back to OS fonts). UI strings are fully covered.
  • Native-speaker review + on-screen overflow spot-check pending playtest — CJK/Cyrillic strings run long, and Mistral-generated NPC lines in CJK deserve a native ear before actively marketing these locales.

🤖 Generated with Claude Code

… font pipeline

The last five languages of the localization push, plus the font work
that unblocks them: Rajdhani covers Latin only, so UiKit's font now
carries a fallbackFontReferences chain — Noto Sans Medium (full
Latin/Greek/Cyrillic, 620 KB; covers ru/uk incl. г/є/і/ї) followed by
Noto Sans CJK SC/JP/KR Medium subsets built with pyftsubset from
exactly the glyphs the translations use plus CJK punctuation and
fullwidth forms (794/812/196 KB instead of ~16 MB each). OFL license
files ship next to the fonts.

Locale files: 3048/3048 main keys + story packs (68/68) per language,
locale_report.py --check clean; the translate prompt carries
per-language register hints (informal ru/uk, Japanese desu/masu,
Korean haeyo-che); a homoglyph pass normalized stray Latin lookalikes
inside Cyrillic words (7 keys). Full TRANSLATION_GUIDE Step-4 wiring:
GameLocale members, WebGL fallback manifest, OS-language first-run
defaults, content-error dialog cases, AI-backend language map.

Known limits tracked in the closed issues: CJK chat input outside the
subset shows tofu on WebGL (desktop falls back to OS fonts); native
review and on-screen overflow spot-checks pending playtest.

Closes #886
Closes #887
Closes #888
Closes #889
Closes #891

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@marceld23
marceld23 merged commit ac5832f into main Aug 9, 2026
17 checks passed
@marceld23
marceld23 deleted the feat/cyrillic-cjk-locales branch August 9, 2026 22:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant