Laravel localization in Czech Čeština
Everything you need to ship Czech in a Laravel app: the right locale codes,
the exact plural forms trans_choice() expects,
real localized Carbon output and Latin-script considerations.
Every value on this page was generated by running ICU, CLDR and Carbon — not copied from another article.
ISO 639-1
cs
Script / Direction
Latin · LTR
Plural forms (Laravel)
3
Text vs English
Similar
Locale codes
Set the base locale in config/app.php. For regional variants,
Czech commonly uses:
cs_CZ
// config/app.php
'locale' => 'cs',
'fallback_locale' => 'en',
// Or switch at runtime
App::setLocale('cs');
Plural rules: what Czech actually needs
CLDR defines 4 cardinal categories for Czech. The sample numbers below were computed by ICU for this exact locale:
| CLDR category | Numbers that select it |
|---|---|
| one | 1 |
| few | 2–4 |
| other | 0, 5–130, 200, 1000, 1000000 |
| many | 1.5 |
Laravel's trans_choice() maps numbers to
3 pipe-separated
forms for this locale:
| Form index | Numbers that select it |
|---|---|
| 0 | 1 |
| 1 | 2–4 |
| 2 | 0, 5–130, 200, 1000 |
// lang/cs/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 Czech (cs locale),
generated by Carbon for March 21, 2026:
$date = now()->locale('cs');
$date->translatedFormat('l, j F Y');
// "sobota, 21 března 2026"
$date->isoFormat('LLLL');
// "sobota 21. března 2026 14:30"
$date->isoFormat('L');
// "21. 03. 2026"
$date->subDays(3)->diffForHumans();
// "před 3 měsíci"
What to watch out for in Czech
- Seven grammatical cases: nouns inside sentences change form, so avoid inserting raw placeholders mid-sentence.
- Plural rules use one/few/many/other categories (1, 2-4, and 5+ behave differently).
- Diacritics (háček and acute: č, š, ž, ř, á, í) are mandatory; ensure fonts and encoding support them.
- Ty/vy formal-informal distinction; decimal comma with space as thousands separator (1 234,56).
Seven cases, and what they do to your placeholders
Czech inflects nouns for seven grammatical cases, and the case is chosen by the noun's role in the sentence. Every noun therefore has up to seven distinct forms in the singular and seven more in the plural, and the form that appears depends on the surrounding words rather than on the noun itself.
| Case | Role | "file" (soubor) |
|---|---|---|
| Nominative | subject | soubor |
| Genitive | of / possession | souboru |
| Dative | to / for | souboru |
| Accusative | direct object | soubor |
| Vocative | addressing | soubore |
| Locative | about / in | souboru |
| Instrumental | by means of | souborem |
The consequence for software is that a placeholder holding a noun cannot be dropped into arbitrary sentences. Smazat soubor (delete the file) uses the accusative, while Kopie souboru (copy of the file) needs the genitive. A single stored value substituted into both produces text that is visibly wrong in one of them.
Why a shared noun placeholder fails
// English reuses one word everywhere:
'deleted' => 'Deleted :type',
'copy_of' => 'Copy of :type',
// Czech needs different forms of the same noun:
// Smazán soubor (nominative)
// Kopie souboru (genitive)
//
// Passing :type = 'soubor' makes one of them wrong.
The practical answer is to write each message as a complete key rather than assembling it. Where a placeholder genuinely must hold a variable noun — a user-supplied project name, for instance — Czech convention allows leaving it in the nominative inside quotation marks, which reads as a citation rather than as broken grammar.
Personal names decline too, which surprises teams building notification copy. Petr Novák becomes Petra Nováka in the genitive. Czech users accept the nominative form in interfaces, but a template that produces zpráva od Petr Novák reads as foreign; zpráva od uživatele Petr Novák avoids it by inserting a declinable common noun before the name.
Feminine surnames end in -ová
Czech surnames take a feminine form, conventionally by adding -ová: the wife or daughter of Novák is Nováková. This applies to foreign names too in traditional usage, so Angela Merkel appears in Czech media as Angela Merkelová.
For software this matters mainly in validation and in matching. A surname field that rejects long names, or a deduplication routine that treats Novák and Nováková as a probable duplicate, will misbehave. It also means the same family will not share a byte-identical surname, which breaks naive household or account grouping.
Since 2022 Czech law allows women to register the masculine form without justification, so both forms now occur legitimately. Do not normalise one into the other, and do not infer gender from the ending — the inference was never fully reliable and is now actively wrong.
Three plural forms, plus one for decimals
Czech uses four CLDR categories, and the distribution is unlike anything in Western European languages. The many category exists solely for decimal numbers, which is a detail that catches out translators used to two-form systems.
| Category | Selected by | Example |
|---|---|---|
| one | 1 | 1 soubor |
| few | 2, 3, 4 | 3 soubory |
| many | decimals (1.5, 2.5…) | 1,5 souboru |
| other | 0, 5, 6, 7… 100… | 5 souborů |
Note that zero takes the other form and that five onwards also takes other, so the sequence runs one, few, few, few, other, other — not the ascending pattern an English speaker expects. The many form only ever appears when the count is fractional.
Four forms in CLDR order
// lang/cs/messages.php
// one|few|many|other
'files' => ':count soubor|:count soubory|:count souboru|:count souborů',
trans_choice('messages.files', $count, ['count' => $count]);
A two-form Czech translation will be wrong for 2, 3 and 4 in every string that counts something, which in a typical application is a great many strings. Check the boundaries with the pluralization tester — the values worth testing are 1, 2, 5 and 1.5.
Diacritics, sorting and the ch digraph
Czech uses two diacritical marks: the háček (č, š, ž, ř, ě, ň, ď, ť) and the acute for long vowels (á, é, í, ó, ú, ý), plus the ring on ů. They are meaning-bearing, not decorative — být (to be) and byt (flat) are different words.
Stripping diacritics is therefore only acceptable for URL slugs and search normalisation, never for display. As with other accented languages, uppercasing requires multi-byte-aware functions: strtoupper() will corrupt every one of these characters.
Sorting has a Czech-specific rule that catches most implementations. The digraph ch is a single letter of the Czech alphabet and sorts after h, not inside the letter c. So chyba comes after hudba, which is nowhere near where a byte-order sort would put it.
Sorting Czech correctly
<?php
// Wrong: puts 'chyba' among the c-words
// and every accented word after 'z'
sort($words);
// Right: Czech collation knows 'ch' is one letter
$collator = new Collator('cs_CZ');
$collator->sort($words);
Accented letters also sort immediately after their base letter rather than at the end of the alphabet, so č follows c. Both rules come free with a locale-aware collator and are impossible to get right with a plain sort.
The letter ř deserves a note of its own. It represents a sound found in almost no other language, and it is frequently missing from older fonts, mistyped as plain r by users on foreign keyboards, and mangled by systems that normalise aggressively. Verify that the fonts you ship render it, and never treat r and ř as interchangeable in stored data.
Formality, layout and formatting
Czech distinguishes informal ty from formal vy, with the formal form used more readily than in Dutch or Spanish. Consumer products increasingly use ty, but business software, banking and anything addressing an unknown adult defaults to vy. The distinction runs through verb conjugations, so switching later means retranslating.
Text expansion is modest — around ten per cent over English — because Czech drops articles entirely and uses case endings where English needs prepositions. Individual words can still be long, and the language permits consonant clusters that look alarming but wrap normally at word boundaries.
| Czech convention | |
|---|---|
| Thousands | 1 234 567 (non-breaking space) |
| Decimal | 1234,56 |
| Currency | 1 234,56 Kč (after the amount) |
| Short date | 21. 3. 2026 |
| Long date | 21. března 2026 |
| First day of week | Monday |
Dates use a full stop after both the day and the month, with a space between the parts. Month names are lowercase and appear in the genitive in long dates — března rather than the nominative březen — which is one more reason to let Carbon format dates with the locale rather than assembling them from parts.
The koruna symbol follows the amount with a space, and the decimal comma creates the same numeric-input hazard as in German: floatval('1234,56') returns 1234, silently discarding the fractional part.
Getting Czech into the application
Czech is one of the locales where the wiring around the translations causes as many visible defects as the translations themselves, mostly because the language exercises collation, plural selection and date formatting all at once.
Set the locale for formatting as well as for translation. Laravel resolves strings from lang/cs/, but Carbon needs the locale to produce genitive month names, the Number helper needs it for the space separator and decimal comma, and any Collator needs it for the ch rule. Passing a bare default to any one of these produces output that is wrong in a way nobody on an English-speaking team will notice.
Database collation deserves explicit attention. A general Unicode collation will sort Czech acceptably for most words and will still misplace ch, so if alphabetical ordering is user-facing, sort in the application with a Czech collator rather than relying on the database default. Where that is too slow, store a precomputed sort key alongside the display value.
Search should be diacritic-insensitive. A user typing zluty expects to find žlutý, and requiring them to produce háčeks and acutes to match a record is a real barrier — Czech keyboards make it easy, but plenty of users are typing on a phone or a foreign layout. Fold diacritics for matching while preserving them for display.
Finally, verify the plural forms with real data rather than by inspection. A four-form string is easy to mis-order, the failure is silent, and the wrong form appears only for particular counts — which means a demo with a single test record will look perfect while the production list of three items is grammatically wrong.
What ships broken most often
- Two plural forms instead of four. Wrong for 2, 3 and 4 in every counting string.
- Nouns substituted into sentences. A placeholder in the wrong case, unavoidable without complete-sentence keys.
- Sorting that misplaces ch. A byte-order sort putting chyba with the c-words and accented terms after z.
-
Diacritics lost on uppercase.
strtoupper()mangling every háček and acute. - Surname matching that flags -ová as a duplicate. Or validation that assumes gender from the ending.
- Capitalised or nominative months. Březen instead of března in a long date.
- Decimal comma truncating numeric input. The same silent data loss as in German and Italian.
Install the Laravel-Lang Czech files for framework strings. The validation messages alone require correct four-form plurals and case agreement across dozens of rules, which is a meaningful amount of linguistic work already done and reviewed.
One habit prevents most of the list above: treat every counting string as needing four forms and every noun-bearing message as needing its own key, from the first Czech string you write rather than as a later correction. Retrofitting either decision means revisiting every message that counts or names something, which in practice is most of the interface.
Czech is a good proxy for Slavic languages generally. An application that handles four plural categories and avoids substituting nouns into sentences will usually extend to Polish, Russian and Ukrainian without structural changes, whereas one built on English assumptions has to be reworked for all of them at once.
Framework strings already translated
Laravel's own validation, auth and pagination strings are maintained in Czech 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 cs
php artisan lang:update
Translate your app into Czech today
Import your lang files, translate every key into Czech with one AI click, and publish changes live — no deploy. Set up in 5 minutes.