Laravel localization in Norwegian Norsk
Everything you need to ship Norwegian 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
no
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,
Norwegian commonly uses:
nb_NO, nn_NO
// config/app.php
'locale' => 'no',
'fallback_locale' => 'en',
// Or switch at runtime
App::setLocale('no');
Plural rules: what Norwegian actually needs
CLDR defines 2 cardinal categories for Norwegian. 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/no/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 Norwegian (nb locale),
generated by Carbon for March 21, 2026:
$date = now()->locale('nb');
$date->translatedFormat('l, j F Y');
// "lørdag, 21 mars 2026"
$date->isoFormat('LLLL');
// "lørdag 21. mars 2026 kl. 14:30"
$date->isoFormat('L');
// "21.03.2026"
$date->subDays(3)->diffForHumans();
// "3 måneder siden"
What to watch out for in Norwegian
- Two written standards: Bokmål (nb, the majority form used in most software) and Nynorsk (nn); CLDR and Carbon use nb, not "no".
- Definite article is a suffix (boken = "the book"), so "the {noun}" patterns do not map one-to-one.
- Informal du is standard in modern UI copy.
- Decimal comma with space as thousands separator (1 234,56); dates are written dd.mm.yyyy.
Norwegian has two written standards
Norway has no single official written Norwegian. It has two: Bokmål, used by roughly ninety per cent of the population, and Nynorsk, which has equal official status and is the primary written form for a substantial minority, particularly in western Norway.
This is not a dialect distinction or a spelling reform. They are separately standardised written languages with different vocabulary and grammar, and a Bokmål interface is visibly Bokmål to a Nynorsk reader.
| English | Bokmål (nb) | Nynorsk (nn) |
|---|---|---|
| I | jeg | eg |
| not | ikke | ikkje |
| from | fra | frå |
| what | hva | kva |
| we | vi | me / vi |
For most commercial products Bokmål alone is a defensible choice, since it reaches the large majority and Nynorsk readers are entirely comfortable with it. Public-sector procurement is a different matter: Norwegian law requires state bodies to use both, with minimum proportions, so a product sold into government needs both locales.
Use the specific codes. nb is Bokmål and nn is Nynorsk; the generic no is ambiguous between them and is best avoided in anything that stores a user preference, because it defers a decision you will eventually have to make anyway.
The Norway problem: no parses as false
Norwegian's language code is no, and in YAML an unquoted no parses as the boolean false. A language list containing Norwegian therefore loses it silently, replaced by a boolean that no lookup will match.
The same list, quoted and unquoted
# Broken: 'no' becomes false, 'yes' becomes true
locales:
- en
- no
- sv
# Correct
locales:
- 'en'
- 'no'
- 'sv'
The bug is well enough known to be named after the language, and it is a genuine cause of missing locales in translation pipelines and CI configuration. It bites anywhere YAML touches a locale list: deployment manifests, CI workflows, translation-platform configuration and Symfony or Rails message catalogues.
The general fix is to quote every value in a YAML file that holds a code rather than prose. It costs nothing and prevents the whole family of type-coercion surprises, of which Norwegian is only the most famous.
Watch for the inverse in data too. A locale column that has somehow acquired the value false or 0 where a language code belongs is almost always this bug several steps upstream, and normalising it back to no is safe.
Definiteness lives inside the noun
Like Danish and Swedish, Norwegian marks definiteness with a suffix rather than a separate article. En fil is a file; filen is the file. There is no word to concatenate, because the grammar lives inside the noun a placeholder would hold.
| English | Bokmål | Form |
|---|---|---|
| a file | en fil | indefinite |
| the file | filen | definite suffix |
| files | filer | indefinite plural |
| the files | filene | definite plural suffix |
| the new file | den nye filen | double definiteness |
That last row is a Norwegian peculiarity worth knowing. When an adjective is present, Norwegian marks definiteness twice — a free-standing article and the suffix — where Danish drops the suffix. So Danish den nye fil corresponds to Norwegian den nye filen, and copying Danish text across produces something subtly wrong.
Bokmål also permits either two or three genders. The conservative system uses common and neuter, as Danish does; the radical system distinguishes masculine, feminine and neuter, so ei bok and boka appear alongside en bok and boken. Both are correct, which means the choice is a style decision that must be recorded for translators or the interface will drift between them.
The radical three-gender forms carry a mild regional and political flavour, being associated with dialect-oriented usage, while the conservative two-gender forms read as more neutral and are what most commercial software uses. Neither is wrong, but mixing them within one interface is, so settle it in the translation brief with a worked example rather than leaving it to whoever translates the next feature.
Compounds, æ ø å and sorting
Norwegian compounds nouns without spaces, and as in Danish, splitting a compound into two words is a recognised error rather than a stylistic variant. The layout consequence is the familiar one: single unbreakable tokens that overflow rather than wrap.
Let compounds hyphenate
<span class="hyphens-auto break-words" lang="nb">
Brukerkontoinnstillinger
</span>
<!-- lang="nb" rather than lang="no": the browser
needs the specific standard to pick a dictionary. -->
The alphabet ends with æ, ø and å, in that order, after z. This matters because Swedish uses å, ä and ö in a different order, so a Scandinavian collator is not interchangeable — sorting Norwegian with a Swedish collation puts the last three letters in the wrong sequence.
Norwegian collation
<?php
$collator = new Collator('nb_NO');
$collator->sort($words);
// Correct order: ... x, y, z, æ, ø, å
// Swedish would give: ... x, y, z, å, ä, ö
Norwegian expands roughly twenty to thirty per cent over English, in line with the rest of the Germanic family. Test with a long compound rather than with short labels, since the worst case is a single token rather than a long phrase.
Table headers are where this hurts most in practice. Norwegian column labels are frequently single compounds that cannot wrap at all, so a table comfortable in English either scrolls horizontally or squeezes every other column. Give Norwegian tables more horizontal room than the English design suggests, or accept abbreviations chosen by the translator rather than truncation imposed by CSS.
Formality, plurals and formatting
Norwegian has a formal pronoun (De) and it is effectively extinct. Norwegian culture is strongly egalitarian and all software, including banking and government services, addresses users as du. Using De reads as archaic rather than respectful, so the register decision that costs weeks in German requires no deliberation here.
Plurals use two CLDR categories, so trans_choice() takes a two-part string. Formation is irregular enough that both forms must be written out rather than derived, and zero takes the plural as in English.
| Norwegian convention | |
|---|---|
| Thousands | 1 234 567 (non-breaking space) |
| Decimal | 1234,56 |
| Currency | kr 1 234,56 |
| Short date | 21.03.2026 |
| Long date | 21. mars 2026 |
| First day of week | Monday |
| Time | 24-hour (14:30) |
Note that Norway uses a space for thousands where Denmark uses a full stop, and places the currency marker before the amount where Denmark places it after. The three Scandinavian conventions differ in small, visible ways, and a single shared Nordic format will be wrong for at least two of the three markets.
Norway is not in the European Union and uses the krone, which billing code written for a generic European market regularly gets wrong. The decimal comma creates the usual numeric-input hazard where floatval() silently discards the øre.
Choosing between Bokmål and Nynorsk in practice
The two-standard situation looks like it doubles the translation cost, and in practice it rarely does, because the decision is usually driven by who is buying rather than by who is reading.
For a commercial product, Bokmål alone is normal and uncontroversial. Every Norwegian reads it comfortably, including Nynorsk users, who encounter it constantly in national media. Shipping Bokmål is not a compromise imposed on anyone; it is the default written form of the country.
For anything sold to the public sector, the calculation changes. The Language Act obliges state bodies to use both standards, with minimum proportions of each, and procurement processes frequently make bilingual support a stated requirement. Discovering this after building on a single Norwegian locale means retrofitting a second one rather than adding a file.
Model the locales as nb and nn from the beginning even if you only translate one. The cost is a locale code in a configuration file; the alternative is a stored user preference of no that has to be reinterpreted the day Nynorsk arrives, across every account in the system.
If you do add Nynorsk, translate it rather than converting it. Automated Bokmål-to-Nynorsk conversion exists and produces text that Nynorsk readers identify immediately, which defeats the purpose of offering it — the point is to serve a group that notices when it is being served badly.
What ships broken most often
-
The locale silently becoming false. An unquoted
noin a YAML config, and Norwegian vanishes from the language list. - Danish text shipped as Norwegian. Close enough to tempt, different enough to notice — particularly double definiteness.
- Articles concatenated to placeholders. Definiteness is a suffix, so there is nothing to concatenate.
- Mixed two-gender and three-gender forms. Both are correct; using both in one interface is not.
- Swedish sort order applied to Norwegian. æ ø å rather than å ä ö.
- Truncated compounds. Long unbreakable words overflowing buttons and table headers.
- Euro or Danish formatting assumed. Norway uses the krone with its own separator and symbol placement.
Norwegians read English fluently, so missing translations generate no complaints and persist indefinitely. As with the rest of Scandinavia, a key-parity check in CI is worth more than user reports, which will not arrive.
Model Bokmål, Nynorsk, Danish and Swedish as four distinct locales from the start. They are cheap to keep apart and expensive to separate later, because a shared translation memory built on the assumption that they are variants of one language contaminates all of them.
Install the Laravel-Lang Norwegian files for framework strings. They cover Bokmål, handle the definite suffixes and irregular plurals consistently, and use the informal register throughout, which is the correct default and removes a few hundred small decisions from your translators.
One last operational note: Norway is outside the European Union but inside the EEA, so it follows GDPR while sitting outside the customs union and the VAT area. Billing, tax and shipping logic written for a generic European market frequently gets this combination wrong in one direction or the other, and it is worth checking separately from anything to do with the language.
Framework strings already translated
Laravel's own validation, auth and pagination strings are maintained in Norwegian 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 no
php artisan lang:update
Translate your app into Norwegian today
Import your lang files, translate every key into Norwegian with one AI click, and publish changes live — no deploy. Set up in 5 minutes.