feat(i18n): ship Ukrainian
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.
ukinSUPPORTED_LOCALES, the lazy catalog map andlingui.config; the picker label is «Українська».- Plurals carry all four Ukrainian forms (one, few, many, other): 1 проєкт, 3 проєкти, 5 проєктів, 21 проєкт.
- Mobile:
locales/uk.json,uk.lprojfor the composer and attachments sheet, and the Hermes PluralRules and RelativeTimeFormat data foruk. The native test now expects few/many foruk, 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 --strictpasses.- Biome passes on every changed file, and
tscpasses inpackages/i18nandapps/mobile.packages/i18ntests pass (169/169), and so doapps/mobiletests (250/250). - Repo-wide
bun run teston 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/i18nresolves uk-UA touk, 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 lintandbun run typecheckpass (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)