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

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

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.

We use cookies to improve your experience and analyze site traffic. Cookie Policy

Cookie Preferences

Essential

Required for the site to work

Analytics

Help us improve the site

Marketing

Personalized ads and content