Skip to content

feat(i18n): add Ukrainian (uk) locale - #889

Open
zerox9dev wants to merge 1 commit into
oblien:mainfrom
zerox9dev:feat/uk-locale
Open

zerox9dev wants to merge 1 commit into
oblien:mainfrom
zerox9dev:feat/uk-locale

Conversation

@zerox9dev

Copy link
Copy Markdown

Summary

  • Adds Ukrainian (uk) as a supported dashboard locale, per CONTRIBUTING.md'''s i18n guide: full translation under apps/dashboard/src/i18n/locales/uk/ (all 24 namespaces), registered in locales in apps/dashboard/src/i18n/index.ts, and the two Record<Locale, string> display-name maps (Settings > Language, onboarding language picker).
  • Adds docs/i18n/README.uk.md (translated root README) and links it from the language-switcher badge row in the root README and every existing translation.
  • Key and interpolation-placeholder ({name}, {count}, etc.) parity with en is exact across all 24 files — verified programmatically, not just by eye.
  • Product/brand names, CLI commands, PEM certificate/key headers, and other technical strings are left untranslated, per the contributing guide.

Why UNTRANSLATED_BASELINE changed

The dashboard'''s own i18n-parity.test.ts ratchets a per-namespace count of locale strings that are byte-identical to English. Adding a 10th locale necessarily adds its own irreducible remainder to that count — this is not a translation gap, it'''s exactly the same class of exception every existing locale already has baked into that baseline: brand names (Openship Cloud/Edge/Mail, GitHub Releases, Amazon SES, Cloudflare Tunnel/R2, AWS S3, Backblaze B2, DigitalOcean Spaces, Microsoft Teams), literal technical strings that must not change (PEM headers, npm start, a pg_dump command, a mail-client name list), and placeholder-only templates with no actual prose (e.g. {greeting}, {name}, {status} → {hostname}). Every ordinary UI string in uk was translated — I audited every single uk value the parity checker flagged (bun run i18n:check --full) before touching the baseline, and fixed the ones that were genuinely missed (OAuth field labels, an SSH port label, a cron-expression subtitle, an account-switcher placeholder, etc.) rather than just raising the number to make the test pass.

Test plan

  • Programmatic key-parity check: every uk/*.json has the exact same key set as its en/*.json counterpart (24/24 match).
  • Programmatic placeholder-parity check: every {placeholder} occurrence count matches between en and uk (24/24 match).
  • bun run i18n:check — reviewed the full untranslated-value diff for uk before adjusting the baseline (see above).
  • bun run test (apps/dashboard) — 1186/1186 passing, including the updated i18n-parity.test.ts.
  • bun run lint (tsc --noEmit, apps/dashboard) — no errors.

Full Ukrainian translation of the dashboard, following the existing
i18n structure: all 24 namespaces under apps/dashboard/src/i18n/locales/uk/,
registered in the locale list and the two Locale-keyed display maps
(Settings > Language, onboarding).

Also adds docs/i18n/README.uk.md and links it from the language switcher
in the root README and every existing translation.

Key/placeholder parity with en is exact across all 24 files (verified
programmatically). The dashboard's own parity test (i18n-parity.test.ts)
required raising UNTRANSLATED_BASELINE per namespace for this locale's own
irreducible remainder: brand names (Openship Cloud/Edge/Mail, GitHub
Releases, Amazon SES, Cloudflare Tunnel/R2, AWS S3, Backblaze B2,
DigitalOcean Spaces, Microsoft Teams), literal technical strings that must
not change (PEM certificate/key headers, `npm start`, a `pg_dump` command,
a mail-client name list), and placeholder-only templates with no actual
prose (e.g. `{greeting}, {name}`). Every ordinary UI string was translated.
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