feat(i18n): add Ukrainian language support
Summary
- Add comprehensive Ukrainian language support to ZITADEL
- Complete translation of all user-facing interfaces
- Integration with existing language configuration system
Changes Made
- ✅ Console translations: Complete Ukrainian translation for admin console (2,861 translated strings)
- ✅ Login interface: Ukrainian translations for authentication flows (535 strings)
- ✅ Email notifications: Ukrainian translations for system emails (68 strings)
- ✅ Common texts: Ukrainian translations for success/error messages (1,417 strings)
- ✅ Language configuration: Added Ukrainian to supported languages and Angular locale registration
- ✅ UI integration: Added Ukrainian option to language selection forms
Translation Quality
- Professional translations using established Ukrainian IT terminology
- Formal language appropriate for business software
- Consistent terminology across all components (Users→Користувачі, Organization→Організація, etc.)
- Preserved all technical placeholders, HTML tags, and formatting
Contributing Guidelines Compliance
- ✅ Followed semantic commit message format
- ✅ Added Ukrainian to all required configuration files
- ✅ Maintained consistent file structure with existing languages
- ✅ Used formal Ukrainian appropriate for business software
The Ukrainian translation is now ready for review by the ZITADEL team! 🚀
The latest updates on your projects. Learn more about Vercel for GitHub.
| Project | Deployment | Preview | Comments | Updated (UTC) |
|---|---|---|---|---|
| docs | Preview | Comment | Dec 11, 2025 1:51pm |
@polaz is attempting to deploy a commit to the zitadel Team on Vercel.
A member of the Team first needs to authorize it.
Thank you for your contribution, we'll have a look as soon as we can @polaz
View your CI Pipeline Execution ↗ for commit cf3cf3f800c219752fec19cfb318082be6228a0f
| Command | Status | Duration | Result |
|---|---|---|---|
nx affected --nxBail --targets lint test build ... |
✅ Succeeded | 1m 44s | View ↗ |
☁️ Nx Cloud last updated this comment at 2025-12-11 14:32:05 UTC
Hi @polaz
There are some linting issues in your changes, hence the pipeline is failing. Can you fix those and submit and update?
Here there's a link to the pipeline running and the failed task.
Hi @polaz
There are some linting issues in your changes, hence the pipeline is failing. Can you fix those and submit and update?
Here there's a link to the pipeline running and the failed task.
added a newline at the ond of file, prettier now doesnt warn
Hi @IAM-marco,
Thank you for the review. I've added the missing keys:
- LANGUAGES.uk: "Українська" (fixes the language selector display issue)
- SMTP.DETAIL.TITLE: "Налаштування SMTP постачальника"
- SMTP.EMPTY: "Немає доступного SMTP постачальника"
- SMTP.STEPS.SENDGRID: {} (structure match)
Verification shows all 2026 English keys are now present in Ukrainian translation. The only extra key is LANGUAGES.uk which is expected.
Ready for re-review.
Each translation file contains three LANGUAGES objects that must be kept synchronized:
- SETTING.LANGUAGES.OPTIONS (settings page)
- POLICY.LOGIN_TEXTS.LANGUAGES (login text customization)
- LANGUAGES (root level UI selector)
Previous commit only added "uk" key to one location in uk.json. Now added to all three locations across all 21 translation files with appropriate translations (63 additions total).
There's also linting to be fixed: https://cloud.nx.app/runs/3ufOzw4SNd
Standardized Ukrainian language key display across all translation files.
Previously "uk" key showed translated versions (en: "Ukrainian", de: "Ukrainisch", etc). Now displays native form "Українська" in all files, matching the pattern used for Russian ("ru": "Русский" appears in all files).
Updated 60 occurrences across 20 translation files.
Hi @polaz
Apologies for the delay.
I've looked at your changes, they seem good to me!
However, I tried running Zitadel in local, and Ukrainian language doesn't seem to be picked up by the interface. I am not sure why is that, I asked people from the frontend team to help me with this. I don't believe you missed anything, but somehow it still doesn't work. It just might be an issue on my side.
I will come back to you if anything needs changing.
Hey @polaz
I asked @skewis6, who's doing frontend, but we don't seem to understand what is the issue exactly.
It seems like the system doesn't find the uk.json translation, despite being there.
I'm waiting for @conblem to be back (currently OOO) and I'll ask him to take a look.
found the issue - i18n-iso-countries/langs/uk.json was missing from angular.json prebundle exclude list. all other language files were listed there except ukrainian.
added Ukrainian to supported languages list in docs (texts.md) and documented the angular.json prebundle exclude requirement in CONTRIBUTING.md to prevent this issue for future language additions.
added Ukrainian localization for login v2 (apps/login/locales/uk.json) and documented login v2 translation requirements in CONTRIBUTING.md.
found the issue - i18n-iso-countries/langs/uk.json was missing from angular.json prebundle exclude list. all other language files were listed there except ukrainian.
We did spot that. However, even after adding it, it seems that the ukrainian language is still not recognised.
Added Ukrainian translations to internal/query/v2-default.json to fix login v2 localization.
The build-console target has "cache": true. When uk.json was added, the NX cache for build-console was computed before uk.json existed, so NX served the cached (stale) output instead of re-running the copy command.
so uk.json is missing in static assets and not go to statik bundle (go)
i actually don't know how to fix the build chain without using --skip-nx-cache or manually copying to static assets
if i understand correctly - it seems that build-console target has no inputs defined, so NX cache hash is based only on apps/api/**/* files (default). dependsOn ensures task order but doesn't invalidate cache hash when console outputs change.
possible fix:
--- a/apps/api/project.json
+++ b/apps/api/project.json
@@ -211,6 +211,9 @@
],
"command": "cp -r console/dist/console/* internal/api/ui/console/static",
"cache": true,
+ "inputs": [
+ "{workspaceRoot}/console/dist/console/**/*"
+ ],
"outputs": [
"{workspaceRoot}/internal/api/ui/console/static"
]
tested locally - works.
Yeah you might be right, let me have a look!
Ok got it working
@polaz can you push the changes for cache management in apps/api/project.json ?