Laravel localization in Dutch Nederlands
Everything you need to ship Dutch 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
nl
Script / Direction
Latin · LTR
Plural forms (Laravel)
2
Text vs English
Expands
Locale codes
Set the base locale in config/app.php. For regional variants,
Dutch commonly uses:
nl_NL, nl_BE
// config/app.php
'locale' => 'nl',
'fallback_locale' => 'en',
// Or switch at runtime
App::setLocale('nl');
Plural rules: what Dutch actually needs
CLDR defines 2 cardinal categories for Dutch. The sample numbers below were computed by ICU for this exact locale:
| CLDR category | Numbers that select it |
|---|---|
| one | 1 |
| other | 0, 2–130, 200, 1000, 1000000, 1.5 |
Laravel's trans_choice() maps numbers to
2 pipe-separated
forms for this locale:
| Form index | Numbers that select it |
|---|---|
| 0 | 1 |
| 1 | 0, 2–130, 200, 1000 |
// lang/nl/messages.php
'items' => ':count item|:count items'
// Usage
trans_choice('messages.items', $count, ['count' => $count]);
Try any number live in the pluralization tester.
Localized dates with Carbon
Real output for Dutch (nl locale),
generated by Carbon for March 21, 2026:
$date = now()->locale('nl');
$date->translatedFormat('l, j F Y');
// "zaterdag, 21 maart 2026"
$date->isoFormat('LLLL');
// "zaterdag 21 maart 2026 14:30"
$date->isoFormat('L');
// "21-03-2026"
$date->subDays(3)->diffForHumans();
// "3 maanden geleden"
What to watch out for in Dutch
- Je/u formal-informal distinction; modern consumer UI usually uses je, but decide per audience.
- Two grammatical genders reflected in the articles de and het.
- Compounds are written as single words, producing long strings for labels and buttons.
- Decimal comma with dot as thousands separator (1.234,56).
Compounds, and why Dutch behaves like German in layout
Dutch forms compound nouns by joining words without spaces, exactly as German does. That makes it the second language most likely to break a fixed-width layout, and the overflow arrives as one unbreakable token rather than as a graceful wrap.
| English | Dutch | Growth |
|---|---|---|
| Save | Opslaan | +75% |
| Settings | Instellingen | +50% |
| Cancel | Annuleren | +67% |
| Sign up | Registreren | +57% |
| User account settings | Gebruikersaccountinstellingen | one word |
Dutch expands around twenty to twenty-five per cent over English overall, less than German, but the compounding problem is identical. Test with a genuinely long compound such as gebruikersaccountinstellingen rather than with short words, and allow hyphenation with the language declared so the browser can apply the right dictionary.
Hyphenation needs the lang attribute
<span class="hyphens-auto break-words" lang="nl">
Gebruikersaccountinstellingen
</span>
<!-- Without lang="nl", hyphens:auto silently
does nothing: there is no dictionary to use. -->
Dutch also uses the tussen-n — a linking letter inside compounds, as in pannenkoek — whose spelling rules changed in 1995 and again in 2005. Translators know the current convention; a compound assembled in code will not, which is another reason to keep whole terms in translation files rather than building them.
Table headers are where compounds hurt most in practice. Dutch column labels such as Aanmaakdatum or Laatstgewijzigd are single tokens that cannot wrap, so a table that fits comfortably in English will either overflow horizontally or force every column narrower. Give Dutch tables more horizontal room than the English design suggests, or accept abbreviated headers chosen by the translator rather than truncated by CSS.
The IJ digraph that CSS gets wrong
Dutch treats ij as a single letter. When a word beginning with it is capitalised, both characters are capitalised: IJsland (Iceland), IJssel, ijsje becoming IJsje. This is not optional styling; Ijsland is simply misspelled.
CSS does not know this. A text-transform: capitalize applied to Dutch text produces Ijsland, and there is no CSS mechanism that fixes it. The same applies to PHP's ucfirst() and Laravel's Str::title().
Capitalising Dutch correctly
<?php
function dutchUcfirst(string $value): string
{
$value = mb_strtoupper(mb_substr($value, 0, 1)) . mb_substr($value, 1);
// 'IJ' is one letter: capitalise both characters
if (str_starts_with(mb_strtolower($value), 'ij')) {
return 'IJ' . mb_substr($value, 2);
}
return $value;
}
dutchUcfirst('ijsland'); // 'IJsland'
The safest approach is to avoid programmatic capitalisation of Dutch entirely. Store strings in the case they should display, and let translators handle capitalisation as part of the translation.
Sorting is affected too, though less consistently. Traditional Dutch alphabetisation sorted ij together with y; modern practice sorts it as two separate letters. Standard Unicode collation follows the modern rule, which is what you want unless you are matching an existing dataset.
De and het: gender you cannot predict
Dutch has two genders for the definite article: de for common-gender nouns and het for neuter ones. Roughly two thirds of nouns take de, and there is no reliable rule for guessing which — it must be learned per word, as in German.
| Noun | Article | English |
|---|---|---|
| bestand | het bestand | the file |
| map | de map | the folder |
| account | het account | the account |
| gebruiker | de gebruiker | the user |
| project | het project | the project |
| instelling | de instelling | the setting |
In the plural, everything takes de, which removes the distinction — but only in the plural. The singular is where concatenated strings go wrong, and they go wrong roughly a third of the time, which is often enough to look like carelessness and rare enough to survive a quick review.
The gender also controls adjective inflection. An attributive adjective takes an -e ending with de words and with any definite noun, but stays bare with an indefinite neuter noun: een nieuw bestand against het nieuwe bestand and een nieuwe map. A shared 'new' string cannot satisfy all three.
Je or u, and the Dutch preference for informality
Dutch distinguishes informal je from formal u, and the culture leans informal more strongly than French or Italian. Consumer products, SaaS and most business software use je; u is reserved for banking, government, insurance and communications with older audiences.
| English | Informal (je) | Formal (u) |
|---|---|---|
| Your account | je account | uw account |
| Save your changes | Sla je wijzigingen op | Slaat u uw wijzigingen op |
| Do you want to continue? | Wil je doorgaan? | Wilt u doorgaan? |
| You have 3 messages | Je hebt 3 berichten | U heeft 3 berichten |
Belgium leans noticeably more formal than the Netherlands, so a product serving both may want u even where a Dutch-only product would use je. Flemish also differs in vocabulary — gsm rather than mobiel for a mobile phone, croque-monsieur rather than tosti — and in some grammatical preferences.
Dutch verbs are separable, which affects imperatives in a way that surprises translators of other languages: opslaan (to save) splits into sla op in the imperative, with the particle moving to the end of the clause. That means a button label and a full sentence use visibly different word forms for the same verb.
Plurals, dates and numbers
Dutch takes two plural forms, so trans_choice() works with a two-part string. Formation is split between -en and -s depending on stress and final sound: bestand becomes bestanden, while gebruiker becomes gebruikers.
Spelling changes accompany the suffix. A short vowel doubles its consonant (map becomes mappen) and a long vowel drops a letter (maan becomes manen). These are regular rules, but they mean the plural is not the singular with something appended, so translators must supply both forms explicitly.
The zero case uses the plural, as in English: 0 bestanden. Laravel maps zero to the 'other' form for Dutch, which is correct by default.
| Netherlands (nl_NL) | Belgium (nl_BE) | |
|---|---|---|
| Thousands | 1.234.567 | 1.234.567 |
| Decimal | 1234,56 | 1234,56 |
| Currency | € 1.234,56 | 1.234,56 € |
| Short date | 21-03-2026 | 21/03/2026 |
| Long date | 21 maart 2026 | 21 maart 2026 |
The Netherlands places the euro sign before the amount with a space; Belgium places it after. The short date separator differs too — hyphens in the Netherlands, slashes in Belgium. Months and weekdays are lowercase in both, so 21 maart 2026 rather than 21 Maart 2026.
Testing Dutch when your users all speak English
The Netherlands has among the highest English proficiency in the world, and that changes how translation defects behave. In most markets a missing or broken string generates support tickets. In Dutch it generates nothing: the user reads the English fallback, understands it perfectly, and carries on. The defect stays in production indefinitely because the feedback loop that would surface it never fires.
The practical consequence is that Dutch quality has to be verified rather than reported. A key-parity check in CI, comparing the Dutch key set against the source language and failing the build on gaps, is worth more here than any amount of user feedback. It is a few lines of code and it catches the entire class of silently missing translations.
Layout defects need the same treatment for a different reason: they are visible but easy to dismiss. A compound noun overflowing a button looks like a minor cosmetic issue in review and looks like an unfinished product to a Dutch user. Render every Dutch string into its real container as part of the test suite and flag overflow, using a genuinely long compound as the worst case rather than a short word.
Be deliberate about which terms stay in English, too. Dutch technical writing borrows heavily and inconsistently — uploaden, downloaden and account are entirely standard, while translating them produces stilted copy nobody uses. Conversely, translating some terms and not others within the same screen reads as carelessness. Give translators a glossary listing the terms that must stay in English, and the decision stops being made afresh by whoever is working that week.
Set the full locale rather than a bare nl. Belgium and the Netherlands differ in currency placement and date separators, and a shared language code silently applies Dutch conventions to Flemish users, who notice.
What ships broken most often
- Ijsland instead of IJsland. Any programmatic capitalisation of Dutch, whether CSS or PHP, gets the digraph wrong.
- Truncated compounds. A single long unbreakable noun overflowing a button or a table cell.
- Concatenated strings with the wrong article. De bestand instead of het bestand, wrong about a third of the time.
- Adjective endings. Een nieuwe bestand instead of een nieuw bestand, from a shared adjective string.
- Belgian users given Dutch conventions. Currency placement and date separators both differ.
- Capitalised months. Maart instead of maart.
- Decimal comma in numeric input. The same silent truncation as German and Italian.
Dutch speakers have unusually high English proficiency, which creates a specific risk: an untranslated string will be understood, so nobody reports it. Missing Dutch translations therefore survive far longer than missing translations in markets where English is less widely read, and a key-parity check in CI is worth more here than user reports.
The same proficiency shapes what good Dutch copy looks like. Over-translating reads worse than leaving standard borrowings alone, and Dutch users are quick to find fully translated technical vocabulary faintly ridiculous. The goal is natural Dutch, not maximal Dutch, and that is a judgement only a native speaker can make — which is an argument for review by a person rather than a coverage percentage.
Install the Laravel-Lang Dutch files for framework strings. Validation messages in particular involve a lot of article and adjective agreement that is tedious to get right by hand and already correct in the community translations.
Framework strings already translated
Laravel's own validation, auth and pagination strings are maintained in Dutch 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 nl
php artisan lang:update
Translate your app into Dutch today
Import your lang files, translate every key into Dutch with one AI click, and publish changes live — no deploy. Set up in 5 minutes.