Laravel localization in Catalan Català
Everything you need to ship Catalan 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
ca
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,
Catalan commonly uses:
ca_ES, ca_AD, ca_FR, ca_IT
// config/app.php
'locale' => 'ca',
'fallback_locale' => 'en',
// Or switch at runtime
App::setLocale('ca');
Plural rules: what Catalan actually needs
CLDR defines 3 cardinal categories for Catalan. The sample numbers below were computed by ICU for this exact locale:
| CLDR category | Numbers that select it |
|---|---|
| one | 1 |
| many | 1000000 |
| other | 0, 2–130, 200, 1000, 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/ca/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 Catalan (ca locale),
generated by Carbon for March 21, 2026:
$date = now()->locale('ca');
$date->translatedFormat('l, j F Y');
// "dissabte, 21 de març 2026"
$date->isoFormat('LLLL');
// "dissabte 21 de març de 2026 a les 14:30"
$date->isoFormat('L');
// "21/03/2026"
$date->subDays(3)->diffForHumans();
// "fa 3 mesos"
What to watch out for in Catalan
- Uses tu/vostè formal-informal distinction; agree on register before translating UI copy.
- Articles elide before vowels (l'usuari, l'hora), so avoid gluing raw articles to placeholders.
- Nouns are gendered (masculine/feminine) and adjectives agree in gender and number.
- Decimal comma with dot as thousands separator (1.234,56).
Catalan is not a variety of Spanish
Catalan is a distinct Romance language with around ten million speakers across Catalonia, Valencia, the Balearic Islands, Andorra — where it is the sole official language — and parts of southern France and Sardinia. It is closer to Occitan than to Spanish, and treating it as a Spanish variant is both linguistically wrong and, in the market you are addressing, taken as a slight.
Practically this means a Catalan locale needs its own translation, not a lightly adapted Spanish one. Machine translation from Spanish produces text that is recognisably calqued, and Catalan speakers detect it quickly because the interference patterns are familiar to them.
It also means the locale code matters. Catalan is ca, with ca_ES and ca_AD for Spain and Andorra, and ca_ES_VALENCIA for the Valencian variety. Filing Catalan under a Spanish regional code is a modelling error that will surface the first time someone asks for the language list.
Public-sector and educational procurement in Catalonia commonly requires Catalan support, and the regional government maintains its own terminology standards through TERMCAT. If you are selling into that market, using the standardised terms rather than improvised translations is worth the small effort.
The interpunct, a character no other language uses
Catalan writes a geminate L with a middle dot between the two letters: col·legi, paral·lel, intel·ligent. The character is U+00B7 MIDDLE DOT, and it is a required part of the spelling rather than decoration.
It causes trouble in three places. Fonts occasionally lack it or position it badly, producing spacing that looks wrong. Slug generation and search normalisation strip it as punctuation, which merges col·legi and an incorrect collegi into the same key. And users on Spanish keyboard layouts frequently type a full stop or a bullet instead, producing values that look almost right and compare unequal.
Normalising interpunct variants on input
<?php
// Users commonly type U+2022 (bullet) or a period.
// Fold the lookalikes onto the correct character.
$value = str_replace(
["\u{2022}", "\u{2219}", "\u{0387}"],
"\u{00B7}",
$value
);
For slugs, the convention is to render l·l as ll rather than dropping the character and leaving ll ambiguous with the genuinely different digraph. Decide the rule once and apply it consistently, because URL slugs that change later cost redirects.
Keyboard availability is part of the problem worth understanding. The interpunct is directly accessible on Catalan and Spanish layouts but awkward elsewhere, so any field where users type Catalan text will accumulate lookalike substitutions over time. Normalising on input costs nothing and prevents a slow drift in your stored data that becomes very hard to clean up once several years of records carry it.
Elision, apostrophes and contractions
Catalan elides articles and prepositions before a vowel, more extensively than Spanish and more like French or Italian. El home is never written; it is l'home. Prepositions contract too: de el becomes del, a el becomes al.
| Before a consonant | Before a vowel | Meaning |
|---|---|---|
| el fitxer | l'usuari | the file / the user |
| la carpeta | l'aplicació | the folder / the application |
| del projecte | de l'usuari | of the project / of the user |
| al camp | a l'inici | to the field / to the start |
As in Italian and French, this makes assembling phrases from fragments unworkable: the correct form depends on the first sound of the following word, which a template cannot know. And the feminine article la does not elide before unstressed i or u — la universitat, not l'universitat — so even a rule based on the first letter would be wrong.
Catalan also has an elaborate system of weak pronouns that combine and change form according to what surrounds them: me'n, se'l, n'hi. These appear constantly in natural Catalan and are another reason interface copy must be written by a translator rather than assembled by code.
Accents that distinguish open and closed vowels
Catalan uses both grave and acute accents, and the choice encodes vowel quality rather than only stress. The letter e takes a grave when open (cafè) and an acute when closed (café in other languages, bé in Catalan), and the same applies to o.
This matters because Spanish uses only the acute. A translator or a system working from Spanish habits will produce é where Catalan requires è, and the result is a spelling error rather than a typographic preference. It is one of the more reliable signs that Catalan copy was adapted from Spanish rather than written.
Catalan also uses the cedilla (ç) and the diaeresis (ï, ü), the latter marking a vowel pronounced separately rather than as part of a diphthong. All of these are meaning-bearing and must survive storage, search normalisation and case conversion.
Uppercasing requires multi-byte-aware functions, as in every accented language: strtoupper() will corrupt ç, è and ï alike. Use mb_strtoupper() or Str::upper(), and note that unlike Greek, Catalan keeps its accents on capital letters.
Regional varieties, formality and formatting
The main varieties are Central Catalan, Valencian and Balearic. They share a written standard but differ in some vocabulary and verb forms, and Valencian in particular has its own official normative body and a distinct code, ca_ES_VALENCIA. Some Valencian institutions require the Valencian forms explicitly.
| Meaning | Central | Valencian |
|---|---|---|
| I speak | parlo | parle |
| service | servei | servici |
| this | aquest | este |
| mirror | mirall | espill |
For most products a single standard Catalan translation serves all varieties acceptably. If Valencia is a specific target — particularly for public-sector work — treat it as its own locale rather than assuming the Central forms will pass.
Catalan distinguishes informal tu from formal vostè, with software conventions matching Spanish: informal for consumer and most business products, formal for banking, government and institutional communication. As in Spanish, interface buttons commonly use the infinitive — Desar, Cancel·lar, Suprimir — which avoids the question for short labels.
| Catalan convention | |
|---|---|
| Thousands | 1.234.567 |
| Decimal | 1234,56 |
| Currency | 1.234,56 € |
| Short date | 21/03/2026 |
| Long date | 21 de març de 2026 |
| First day of week | Monday |
Long dates use de before the month, contracting to d' before a vowel — 21 d'abril de 2026. Month names are lowercase. Catalan expands around fifteen to twenty per cent over English, similar to Spanish.
Andorra is worth noting separately. Catalan is its only official language, so an Andorran user is not choosing Catalan as a regional preference alongside Spanish — it is simply the language of the country. Products serving Andorra that offer only Spanish are offering a foreign language, which is a different proposition from the bilingual situation in Catalonia.
Wiring Catalan into a bilingual product
Almost every Catalan deployment is bilingual, because the audience also reads Spanish and often English. That changes what the locale infrastructure has to do: language preference becomes an explicit user setting rather than something inferred, and it must persist reliably.
Do not infer Catalan from geography. A user in Barcelona may prefer Catalan, Spanish or English, and choosing on their behalf from an IP address is both unreliable and, given the political sensitivity around the language, worse than asking. Read the Accept-Language header for an initial guess, expose an explicit switcher, and store the choice against the account.
Set the fallback chain deliberately. The instinct is to fall back from Catalan to Spanish, since the audience reads it — but a Catalan interface that degrades into Spanish for missing keys reads as the language being treated as second class, which is precisely the impression offering Catalan was meant to avoid. Falling back to English is often received better, and failing loudly in CI is better than either.
Watch the interaction between locale and formatting. Catalan and Spanish share number and date conventions in Spain, so formatting rarely breaks, but Andorra uses the euro with the same conventions while being a separate country for tax and address purposes. If you handle billing, the country and the language are independent facts and should be stored separately.
Finally, install the Laravel-Lang Catalan files for framework strings rather than translating validation messages yourself. They handle the elisions and contractions correctly across every rule, and they use the standardised terminology that institutional customers expect.
What ships broken most often
- Catalan filed as a Spanish variant. A modelling error with a market cost.
- Interpunct stripped or mistyped. col·legi becoming collegi, or a bullet substituted for the middle dot.
- Acute accents where graves belong. The clearest sign of copy adapted from Spanish.
- Missing or wrong elision. el usuari instead of l'usuari, or l'universitat instead of la universitat.
- Concatenated phrases. Contractions and elisions depend on the following word.
- Capitalised months. Març instead of març.
- Decimal comma truncating numeric input. As in Spanish and the rest of continental Europe.
Catalan speakers are bilingual in Spanish, so a missing Catalan string is understood rather than reported — but offering Catalan at all is a deliberate signal, and half-translated Catalan undercuts it more than not offering the language would. If you ship the locale, verify its coverage in CI.
The interpunct is the one item worth a dedicated check. Add an assertion that Catalan strings containing the sequence l·l still hold U+00B7 after passing through whatever normalisation your pipeline applies, because slug generation, search indexing and spreadsheet round trips each strip it independently and none of them report doing so.
Framework strings already translated
Laravel's own validation, auth and pagination strings are maintained in Catalan 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 ca
php artisan lang:update
Translate your app into Catalan today
Import your lang files, translate every key into Catalan with one AI click, and publish changes live — no deploy. Set up in 5 minutes.