Laravel localization in Ukrainian Українська
Everything you need to ship Ukrainian in a Laravel app: the right locale codes,
the exact plural forms trans_choice() expects,
real localized Carbon output and Cyrillic-script considerations.
Every value on this page was generated by running ICU, CLDR and Carbon — not copied from another article.
ISO 639-1
uk
Script / Direction
Cyrillic · LTR
Plural forms (Laravel)
3
Text vs English
Expands
Locale codes
Set the base locale in config/app.php. For regional variants,
Ukrainian commonly uses:
uk_UA
// config/app.php
'locale' => 'uk',
'fallback_locale' => 'en',
// Or switch at runtime
App::setLocale('uk');
Plural rules: what Ukrainian actually needs
CLDR defines 4 cardinal categories for Ukrainian. The sample numbers below were computed by ICU for this exact locale:
| CLDR category | Numbers that select it |
|---|---|
| one | 1, 21, 31, 41, 51, 61, … |
| few | 2–4, 22–24, 32–34, 42–44, 52–54, 62–64, … |
| many | 0, 5–20, 25–30, 35–40, 45–50, 55–60, … |
| other | 1.5 |
Laravel's trans_choice() maps numbers to
3 pipe-separated
forms for this locale:
| Form index | Numbers that select it |
|---|---|
| 0 | 1, 21, 31, 41, 51, 61, … |
| 1 | 2–4, 22–24, 32–34, 42–44, 52–54, 62–64, … |
| 2 | 0, 5–20, 25–30, 35–40, 45–50, 55–60, … |
// lang/uk/messages.php
'items' => ':count item|:count items'
// Usage
trans_choice('messages.items', $count, ['count' => $count]);
This language uses 3 plural forms. Laravel's built-in trans_choice only resolves two, so for grammatically correct output use an ICU MessageFormat package or handle the extra forms explicitly against the CLDR categories above.
Try any number live in the pluralization tester.
Localized dates with Carbon
Real output for Ukrainian (uk locale),
generated by Carbon for March 21, 2026:
$date = now()->locale('uk');
$date->translatedFormat('l, j F Y');
// "субота, 21 березня 2026"
$date->isoFormat('LLLL');
// "субота, 21 березня 2026, 14:30"
$date->isoFormat('L');
// "21.03.2026"
$date->subDays(3)->diffForHumans();
// "3 місяці тому"
What to watch out for in Ukrainian
- Seven grammatical cases: noun forms change inside sentences, so avoid raw placeholder insertion.
- Plural rules use one/few/many/other categories (1, 2-4, 5+ patterns that repeat by tens).
- Ти/ви formal-informal distinction; three grammatical genders with agreement.
- Uses Ukrainian-specific Cyrillic letters (і, ї, є, ґ) absent from Russian; decimal comma with space as thousands separator.
Ukrainian is not Russian, and the difference is the point
Ukrainian and Russian are both East Slavic and both written in Cyrillic, which regularly leads to the assumption that one translation serves both. It does not, and in the Ukrainian market that assumption is not received as a technical shortcut.
The alphabets differ. Ukrainian has і, ї, є and ґ, which Russian does not; Russian has ы, э, ъ and ё, which Ukrainian does not. Ukrainian и and Russian и represent different sounds, and Ukrainian г is pronounced quite differently from its Russian counterpart.
| English | Ukrainian | Russian |
|---|---|---|
| file | файл | файл |
| user | користувач | пользователь |
| settings | налаштування | настройки |
| search | пошук | поиск |
| thank you | дякую | спасибо |
| week | тиждень | неделя |
Machine translation from Russian produces Ukrainian that is recognisably calqued — a phenomenon Ukrainians call surzhyk when the two languages blend — and readers identify it immediately. Translate from your source language directly, and keep the translation memories separate.
Place names matter too. Ukrainian transliterations are Kyiv, Lviv, Kharkiv and Odesa, not the Russian-derived Kiev, Lvov, Kharkov and Odessa. Any address data, dropdown or map label carrying the older forms is a visible error, and correcting it is a small change with disproportionate goodwill attached.
Four plural forms with a cyclical rule
Ukrainian uses four CLDR categories with a rule based on the last digit and the last two digits together, in the same family as Russian and Polish. The forms cycle rather than increasing with the count, so a two-form translation is wrong for most numbers and the error repeats every hundred.
| Category | Selected by | Example |
|---|---|---|
| one | 1, 21, 31, 101… | 1 файл |
| few | 2–4, 22–24, 32–34… | 3 файли |
| many | 0, 5–20, 25–30… | 5 файлів |
| other | decimals | 1,5 файла |
Four forms in CLDR order
// lang/uk/messages.php
// one|few|many|other
'files' => ':count файл|:count файли|:count файлів|:count файла',
trans_choice('messages.files', $count, ['count' => $count]);
As in Russian, twenty-one takes the one form while eleven takes many, because the teens are excluded from the cycle. Test with 1, 2, 5, 11, 21 and a fraction — those six values exercise every branch and catch a mis-ordering that is otherwise invisible.
Seven cases, and the vocative that Russian lost
Ukrainian nouns inflect for seven cases across three genders. Six of them are shared with Russian; the seventh, the vocative, is a living part of Ukrainian that Russian has largely lost, and it is used whenever someone is addressed directly.
| Case | Role | "file" (файл) |
|---|---|---|
| Nominative | subject | файл |
| Genitive | of / negation | файлу |
| Dative | to / for | файлу |
| Accusative | direct object | файл |
| Instrumental | by means of | файлом |
| Locative | about / in | файлі |
| Vocative | addressing | файле |
The vocative matters in interfaces because greetings use it. Addressing a user named Олена produces Олено, and a greeting that reads Привіт, Олена rather than Привіт, Олено is noticeably stilted — the equivalent of an English greeting with slightly wrong grammar.
As in Russian and Polish, a noun-bearing placeholder cannot be reused across sentences, since the case required depends on the role the noun plays. Write complete messages as single keys, and where a variable is unavoidable, quote it so the grammar attaches to a fixed noun you control.
Past-tense verbs agree with the gender of their subject, so any sentence telling the user what they did commits to a gender in the informal register. Formal ви takes plural agreement, which is not gendered, so choosing the formal register removes the problem — the same useful leverage that Russian offers.
Cyrillic in code: homoglyphs and the apostrophe
Ukrainian Cyrillic shares the homoglyph problem with Russian and Greek. Characters such as а, е, о, р, с, х, і and their capitals are visually identical to Latin letters in almost every font while being different code points, so mixed-script values look identical and compare unequal.
Ukrainian adds one of its own: і (U+0456) is indistinguishable from Latin i, and ї and є have no Latin lookalikes but are frequently missing from fonts and keyboard layouts configured for Russian. A Ukrainian user on a Russian layout may substitute и for і, producing a misspelling that looks plausible.
Ukrainian also uses an apostrophe as a letter-level orthographic mark, in words such as п'ять (five) and об'єкт (object). It should be the typographic apostrophe rather than a straight quote, and it is neither punctuation to be stripped nor a quotation mark to be normalised. A smart-quote routine or a punctuation-stripping regex will silently corrupt these words.
Flagging mixed-script values
<?php
$hasCyrillic = preg_match('/\p{Cyrillic}/u', $value);
$hasLatin = preg_match('/\p{Latin}/u', $value);
if ($hasCyrillic && $hasLatin) {
// Almost never intentional inside one word
}
Sorting needs a Ukrainian collator. The alphabet order differs from Russian — і, ї and є occupy their own positions, and ґ follows г — so a Russian collation produces a list Ukrainian users read as unsorted.
The letter ґ is worth a separate note. It was banned under Soviet orthography and restored in 1990, so it is absent from older fonts, missing from some keyboard layouts, and frequently replaced by г in legacy data. Verify that the fonts you ship contain it, and do not fold ґ and г together when comparing.
Formality, layout and formatting
Ukrainian distinguishes informal ти from formal ви, with conventions close to Russian: formal is standard for business software, banking and government, while consumer products aimed at younger users increasingly use the informal form. Choosing formal also avoids the gendered past tense, which is a practical argument beyond tone.
Names have three parts — given name, patronymic and surname — and the respectful form of address is given name plus patronymic. Surnames are gendered, so members of one family do not share a byte-identical surname, and deduplication logic assuming they do will misbehave.
Ukrainian expands roughly twenty to thirty per cent over English. There are no articles, but case endings and longer stems more than compensate, and Cyrillic letterforms are slightly wider than Latin at the same size.
| Ukrainian convention | |
|---|---|
| Thousands | 1 234 567 (non-breaking space) |
| Decimal | 1234,56 |
| Currency | 1 234,56 ₴ (after the amount) |
| Short date | 21.03.2026 |
| Long date | 21 березня 2026 р. |
| First day of week | Monday |
Long dates put the month in the genitive — березня rather than the nominative березень — and are conventionally followed by р. for рік (year). Month names are lowercase. The decimal comma creates the usual numeric-input hazard.
Language choice is a product decision here
Ukraine is a bilingual country in practice, and language preference carries weight that it does not in most markets. How your product handles the choice is noticed.
Do not infer the locale from geography or from a browser configured years ago. Expose an explicit language switcher, default to Ukrainian for Ukrainian users rather than to Russian, and store the choice against the account so it persists. Silently serving Russian to a Ukrainian user because a header suggested it is a specific and avoidable failure.
Set the fallback chain deliberately. Falling back from Ukrainian to Russian for missing keys is the technically obvious choice and the wrong one; falling back to English is received far better, and failing loudly in CI is better than either. A key-parity check that blocks the build is the right mechanism, because a fallback nobody notices is a fallback that ships.
Ukrainian law also requires that services offered in Ukraine provide a Ukrainian-language interface by default, with other languages available but not preferred. For products selling into the market this is a compliance matter rather than only a quality one, and it applies to the interface, support and customer communications alike.
Store the locale as a full tag and keep the market separate from the language, as always. And if you support both Ukrainian and Russian, keep their translation memories and glossaries strictly apart — a shared memory produces the blended vocabulary that Ukrainian readers identify immediately.
What ships broken most often
- Russian shipped as Ukrainian. Or machine-translated from it, producing recognisably calqued copy.
- Russian-derived place names. Kiev rather than Kyiv, in address data and dropdowns.
- Two plural forms instead of four. Wrong for most counts; 11 and 21 are the giveaways.
- The apostrophe stripped or curled. A letter-level mark treated as punctuation, corrupting words like об'єкт.
- Latin homoglyphs inside Cyrillic words. Invisible on screen, unequal in every comparison.
- Russian collation applied to Ukrainian. і, ї, є and ґ placed wrongly.
- Nominative months and no р. In long dates.
Install the Laravel-Lang Ukrainian files for framework strings rather than translating them yourself. They apply the four-form plurals and case agreement consistently across every rule, and they use the formal register, which removes the gendered past tense from several hundred messages at once.
If you already support Russian, adding Ukrainian is mostly translation work rather than engineering work: the plural machinery, the case-driven string architecture and the Cyrillic handling are all shared. What is not shared is the vocabulary, and that is precisely the part that cannot be automated.
Budget for a native reviewer rather than relying on coverage figures. Calqued Ukrainian passes every automated check — the keys are present, the plurals have four forms, the characters are Cyrillic — and reads as translated-from-Russian to anyone who speaks the language. That distinction is invisible to tooling and obvious to users, which makes it exactly the kind of quality problem worth paying a person to catch.
Set the full locale for formatting so dates carry the genitive month and the trailing р., and so amounts show the hryvnia with the separator conventions above. As everywhere in the region, the decimal comma means numeric input must be parsed explicitly rather than passed to floatval(), which will discard the kopiykas without reporting anything.
Framework strings already translated
Laravel's own validation, auth and pagination strings are maintained in Ukrainian by the open-source Laravel-Lang project (MIT). Install them, then manage your app's own strings live:
composer require laravel-lang/common --dev
php artisan lang:add uk
php artisan lang:update
Translate your app into Ukrainian today
Import your lang files, translate every key into Ukrainian with one AI click, and publish changes live — no deploy. Set up in 5 minutes.