Language Setup & Configuration
When to Use
When initializing a multilingual site — adding languages, setting default language, configuring language fallback.
Decision: How to Add Languages
| If you need... | Use... | Why |
|---|---|---|
| Add languages via UI | /admin/config/regional/language/add |
Simple, interactive, good for initial setup |
| Add languages via config YAML (recommended) | config/install/language.entity.*.yml |
Repeatable, version-controlled, deployment-friendly |
| Programmatically add languages | ConfigurableLanguage::create() |
For migrations, install hooks, test fixtures |
Pattern: Adding Languages via Config YAML
File: config/install/language.entity.es.yml
langcode: en
status: true
dependencies: {}
id: es
label: Spanish
direction: ltr
weight: 1
locked: false
Explanation:
- id: es — language code (ISO 639-1)
- label: Spanish — human-readable name
- direction: ltr — text direction (ltr or rtl)
- weight: 1 — sort order (lower weights appear first)
- locked: false — can be disabled/removed
Programmatic example:
use Drupal\language\Entity\ConfigurableLanguage;
$language = ConfigurableLanguage::create([
'id' => 'es',
'label' => 'Spanish',
'direction' => 'ltr',
'weight' => 1,
]);
$language->save();
Default language — set via config/install/system.site.yml:
langcode: en
default_langcode: en
Common Mistakes
- Using wrong language code → Must use valid ISO 639-1 code (en, es, fr). Invalid codes throw validation error. Check
LanguageInterface::VALID_LANGCODE_REGEXfor pattern - Forgetting to export config after UI changes → Adding language via UI doesn't automatically update config YAML. Export config after changes for deployment consistency
- Setting locked: true without understanding → Locked languages cannot be disabled or removed. Only lock system languages (en, und, zxx) or when you have a specific deployment reason
- Not considering RTL languages → Arabic, Hebrew require
direction: rtl. Test layout with RTL to catch CSS issues early - Adding languages before enabling Language module → Language module must be enabled first. Enable via config or
drush en languagebefore adding languages
See Also
- → Language Negotiation — detection configuration
- → Content Translation Setup — enabling translation per entity
- Reference: https://www.drupal.org/docs/administering-a-drupal-site/multilingual-guide/choosing-and-installing-multilingual-modules