feat(i18n): ship Ukrainian

Merged
SE
9d ago
+21798-2

What & why

Adds Ukrainian (uk) as a full app language: all 7,054 messages, plus the iOS permission prompts and the native composer and attachments-sheet strings. A user who picks «Українська» in Settings, or whose system language is uk-UA, gets the app in Ukrainian. Closes #9189.

  • uk in SUPPORTED_LOCALES, the lazy catalog map and lingui.config; the picker label is «Українська».
  • Plurals carry all four Ukrainian forms (one, few, many, other): 1 проєкт, 3 проєкти, 5 проєктів, 21 проєкт.
  • Mobile: locales/uk.json, uk.lproj for the composer and attachments sheet, and the Hermes PluralRules and RelativeTimeFormat data for uk. The native test now expects few/many for uk, as it does for pl, ru and cs.
  • Glossary: paywall is пейвол.

Terms follow the glossary's "product vocabulary translates" rule, in the register Ukrainian developers actually use: workspace is робочий простір, session is сеанс, task is завдання, but coding agent is кодинг-агент, thread is тред, logs are логи, seed round is seed-раунд. Git verbs keep the forms teams say (коміт, запушити, злити, ребейз); worktree, diff, stash and issue stay in Latin script. Plain UI chrome stays standard product Ukrainian (Налаштування, Скасувати, Застосунок). Spelling follows the 2019 orthography (проєкт). Three new glossary rows record the funding terms, the developer terms and the verb forms for future strings.

Review: a second model read a random 500-string sample (12 fixes), then three reviewers read the whole catalog for register, meaning a dictionary-correct word that Ukrainian developers do not use (208 fixes, one pick per term family).

How I tested it

  • bun run check:i18n: uk has 7,054 messages and 0 missing; compile --strict passes.
  • Biome passes on every changed file, and tsc passes in packages/i18n and apps/mobile. packages/i18n tests pass (169/169), and so do apps/mobile tests (250/250).
  • Repo-wide bun run test on my machine: every task passes except time-outs in host-service and desktop git and shell tests, under load from other builds. This change does not touch those packages.
  • A run through @superset/i18n resolves uk-UA to uk, lazy-loads the catalog and renders the plurals above.
  • In the dev desktop app, driven over CDP with real clicks: Settings → Appearance → Language → Українська. The UI switches at once, with no restart, and keeps the choice after a reload.
  • A look through the running app found two labels that did not fit (the settings search placeholder clipped, a sidebar header wrapped) and verb forms mixed within one group (sample prompts, "Select …" placeholders, the getting-started card). Those are fixed.

Checklist

  • PR title follows conventional commits (type(scope): subject)
  • bun run lint and bun run typecheck pass (CI fails on lint warnings too)
  • "Allow edits from maintainers" is checked on fork PRs
  • I have signed the CLA (the bot asks on your first PR)