Laravel localization in Danish Dansk
Everything you need to ship Danish 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
da
Script / Direction
Latin · LTR
Plural forms (Laravel)
2
Text vs English
Similar
Locale codes
Set the base locale in config/app.php. For regional variants,
Danish commonly uses:
da_DK, da_GL
// config/app.php
'locale' => 'da',
'fallback_locale' => 'en',
// Or switch at runtime
App::setLocale('da');
Plural rules: what Danish actually needs
CLDR defines 2 cardinal categories for Danish. The sample numbers below were computed by ICU for this exact locale:
| CLDR category | Numbers that select it |
|---|---|
| one | 1, 1.5 |
| other | 0, 2–130, 200, 1000, 1000000 |
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/da/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 Danish (da locale),
generated by Carbon for March 21, 2026:
$date = now()->locale('da');
$date->translatedFormat('l, j F Y');
// "lørdag, 21 marts 2026"
$date->isoFormat('LLLL');
// "lørdag d. 21. marts 2026 kl. 14:30"
$date->isoFormat('L');
// "21.03.2026"
$date->subDays(3)->diffForHumans();
// "for 3 måneder siden"
What to watch out for in Danish
- Definite article is a suffix (bogen = "the book"), so "the {noun}" patterns do not map one-to-one.
- Two grammatical genders (common and neuter) affect articles and adjective endings.
- Informal du is standard in modern UI copy; the formal De is rare.
- Decimal comma with dot as thousands separator (1.234,56); dates are written dd.mm.yyyy.
The definite article is a suffix, not a word
Danish marks definiteness by attaching an ending to the noun rather than placing a word in front of it. En fil is a file; filen is the file. There is no separate word for the in the ordinary case, so the noun itself changes shape.
| English | Danish | Form |
|---|---|---|
| a file | en fil | indefinite |
| the file | filen | definite suffix |
| files | filer | indefinite plural |
| the files | filerne | definite plural suffix |
| the new file | den nye fil | separate article with adjective |
The last row is the complication. When an adjective is present, Danish switches to a free-standing article — den nye fil rather than nye filen. So whether definiteness appears as a suffix or as a separate word depends on whether the phrase carries an adjective, which a template cannot know.
Why a template cannot supply the article
// English keeps 'the' constant:
// 'Delete the :type'
//
// Danish needs the suffix on the noun:
// filen (the file)
// projektet (the project)
// mappen (the folder)
//
// The ending also depends on the noun's gender,
// so ':type' cannot carry it.
This is a stronger argument for complete-sentence keys than the equivalent problem in German or Spanish, because there is no article to concatenate at all — the grammar lives inside the word your placeholder holds.
Two genders you cannot predict
Danish nouns are either common gender (taking en) or neuter (taking et), and there is no reliable rule for guessing which. Roughly three quarters are common gender, and the remaining quarter must be learned per word — exactly as with Dutch de and het.
| Noun | Indefinite | Definite | English |
|---|---|---|---|
| fil | en fil | filen | file |
| projekt | et projekt | projektet | project |
| bruger | en bruger | brugeren | user |
| billede | et billede | billedet | image |
| mappe | en mappe | mappen | folder |
The gender determines the definite suffix (-en or -et) and the form of any accompanying adjective, so getting it wrong is visible in several places at once. Since the gender is arbitrary, no amount of string manipulation will derive it, and any code assembling noun phrases will be wrong for roughly a quarter of values.
Adjectives also inflect for definiteness: en ny fil but den nye fil. A shared adjective string reused across definite and indefinite contexts will be wrong in one of them.
There is no reliable shortcut here, and no equivalent of the semantic hints that help a little in German. Words for concepts that feel parallel take different genders — en fil but et dokument — so a translator supplies the gender as part of knowing the word, and any interface that builds noun phrases programmatically will produce errors a Danish reader registers as basic.
Danish numbers are built on twenties
Danish uses a vigesimal system for the tens above forty, and the number names are contractions of expressions counting in twenties. This has almost no effect on displayed digits and considerable effect on anything involving spoken or written-out numbers.
| Number | Danish | Literally |
|---|---|---|
| 50 | halvtreds | half-third [of twenty] = 2.5 × 20 |
| 60 | tres | three [twenties] |
| 70 | halvfjerds | half-fourth = 3.5 × 20 |
| 80 | firs | four [twenties] |
| 90 | halvfems | half-fifth = 4.5 × 20 |
Units are also spoken before tens, so 21 is enogtyve — one-and-twenty. Any feature that writes numbers out in words, reads them aloud, or parses spoken input cannot derive Danish number names from a rule built for English, and the ordering means a naive parser will assemble digits in the wrong order.
For most applications this only surfaces in written-out amounts, such as on invoices, and in voice interfaces. Use the platform's number-spelling support with the Danish locale rather than composing the words yourself.
Ordinals follow their own pattern too, formed with a following full stop — 1., 2., 3. — rather than with letter suffixes as in English. Any code appending st, nd or th to a number will produce something meaningless in Danish, and this shows up most often in date components and ranked lists.
Compounds, æ ø å, and sorting
Danish compounds nouns without spaces, as German and Dutch do, and Danish orthography is strict about it: writing a compound as two words is a common enough error to have a name in Danish (særskrivning) and is treated as a real mistake rather than a stylistic choice.
For layout that means the usual German-family problem. Compounds arrive as single unbreakable tokens, so a container sized for English will overflow rather than wrap. Danish expands around twenty to thirty per cent over English overall.
Allow long compounds to break
<span class="hyphens-auto break-words" lang="da">
Brugerkontoindstillinger
</span>
<!-- lang="da" is required for hyphenation to
have a dictionary to work from. -->
The letters æ, ø and å are distinct letters of the alphabet, not decorated vowels, and they sort at the very end after z. A byte-order sort or a collator configured for German — where ä sorts with a — produces an order Danish users do not recognise.
Danish collation places æ ø å after z
<?php
$collator = new Collator('da_DK');
$collator->sort($words);
// Correct Danish order: ... x, y, z, æ, ø, å
// Note: 'aa' is traditionally sorted as 'å'.
The digraph aa is an older spelling of å and still appears in place names and surnames, where it sorts as though it were å. A Danish collator handles this; a generic Unicode one does not.
Formality, plurals and formatting
Danish has a formal pronoun (De) but it is effectively obsolete. Danish culture is strongly informal and essentially all software, including banking and government services, addresses users as du. Using De reads as archaic or faintly comic rather than respectful, which makes this one of the few European languages where the register decision needs no deliberation.
Plurals use two CLDR categories, so trans_choice() takes a two-part string. Formation is irregular — -er, -e or no change at all, depending on the word — so both forms must be written out rather than derived. Zero takes the plural, as in English.
| Danish convention | |
|---|---|
| Thousands | 1.234.567 |
| Decimal | 1234,56 |
| Currency | 1.234,56 kr. |
| Short date | 21.03.2026 |
| Long date | 21. marts 2026 |
| First day of week | Monday |
| Time | 24-hour (14.30) |
Dates carry a full stop after the day number as an ordinal marker, and month names are lowercase. Times use a full stop rather than a colon, as in Finnish. The krone symbol follows the amount as kr. with the full stop included. Denmark uses the krone rather than the euro despite being in the European Union, which is a detail billing code written for a generic European market frequently gets wrong.
The decimal comma creates the same numeric-input hazard as elsewhere in continental Europe: floatval('1234,56') returns 1234, discarding the øre without any error.
Danish, Norwegian and Swedish are not interchangeable
The three mainland Scandinavian languages are close enough that speakers can often read each other, which regularly tempts teams into treating them as one locale or machine-translating between them. Users notice immediately, and the reaction is not neutral — each market reads the substitution as being served another country's product.
Written Danish and Norwegian Bokmål are especially close, sharing much vocabulary and the same æ, ø and å letters. Swedish uses ä and ö instead, and sorts them differently. The differences that matter in an interface are small in number and high in visibility: exactly the profile of errors that make a product feel foreign.
| English | Danish | Norwegian | Swedish |
|---|---|---|---|
| file | fil | fil | fil |
| user | bruger | bruker | användare |
| settings | indstillinger | innstillinger | inställningar |
| search | søg | søk | sök |
| now | nu | nå | nu |
Norwegian adds a further complication: it has two official written standards, Bokmål and Nynorsk, with distinct locale codes. Bokmål covers the large majority of users, but public-sector requirements sometimes specify both, and the generic no code is ambiguous between them.
Be careful with no in configuration files for a second reason. In YAML, an unquoted no parses as the boolean false, so a language list containing Norwegian silently loses it. This is well known enough to be called the Norway problem, and it is a real cause of missing locales in translation pipelines.
Model each Scandinavian language as its own locale from the start. They are cheap to add and expensive to separate later, because a shared translation memory built on the assumption that they are one language contaminates all three.
What ships broken most often
- Articles concatenated to placeholders. Danish definiteness lives inside the noun, so there is nothing to concatenate.
- Wrong definite suffix. -en where -et belongs, from unpredictable gender.
- Truncated compounds. Single long unbreakable words overflowing buttons and table headers.
- Sorting that places æ ø å with a and o. A German or generic collator applied to Danish.
- Colons in times. 14:30 rather than the Danish 14.30.
- Capitalised months. Marts instead of marts.
- Decimal comma truncating numeric input. The usual silent loss of the fractional part.
Danes read English fluently, so missing translations produce no complaints and survive indefinitely. As with Dutch and the other Nordic languages, verify coverage with a key-parity check in CI rather than waiting for reports that will not come.
Install the Laravel-Lang Danish files for framework strings. Validation messages involve gender-dependent suffixes and irregular plurals across dozens of rules, and reproducing that by hand is tedious work already done and reviewed.
Two habits prevent most of the rest. Write complete messages rather than assembling noun phrases, since Danish definiteness and gender both live inside the noun and neither can be supplied by a template. And render every Danish string into its real container in a test that flags overflow, using a long compound as the worst case — truncated compounds are the most visible defect and the easiest to catch automatically.
Framework strings already translated
Laravel's own validation, auth and pagination strings are maintained in Danish 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 da
php artisan lang:update
Translate your app into Danish today
Import your lang files, translate every key into Danish with one AI click, and publish changes live — no deploy. Set up in 5 minutes.