Drupal Multilingual Setup
Drupal is one of the best CMS for multilingual sites. Translation support is built into core: content, configuration, administration interface, menus, blocks, taxonomy terms are all translatable.
Required Modules (all in core)
drush en language locale content_translation config_translation -y
drush cr
- language — base language module
- locale — interface translation
- content_translation — content translation (nodes, taxonomies, blocks)
- config_translation — configuration translation (field labels, content types)
Adding Languages
Configuration → Languages → Add language. Drupal automatically downloads interface translations from drupal.org.
URL pattern configuration: Configuration → Languages → Detection and selection:
- URL prefix:
ru/,en/— recommended - Domain:
ru.site.com,site.com— for large multilingual sites
Enabling Translation for Content Type
Configuration → Content language → select content type → enable translation for each field individually.
Or programmatically:
// Enable Content Translation for all 'article' type fields
$config = \Drupal::configFactory()->getEditable('language.content_settings.node.article');
$config->set('third_party_settings.content_translation.enabled', TRUE)->save();
Creating Translation via API
use Drupal\node\Entity\Node;
// Load original node (English)
$node = Node::load(42);
// Add translation
if (!$node->hasTranslation('ru')) {
$translated = $node->addTranslation('ru', [
'title' => 'Заголовок на русском',
'body' => ['value' => '<p>Текст на русском</p>', 'format' => 'full_html'],
'status' => 1,
]);
$translated->save();
}
Twig: Language-Aware Display
{# Get current language #}
{% set current_lang = language.getId() %}
{# Language switcher links (use Views Language Switcher instead) #}
{% for language in languages %}
<a href="{{ path('<current>', {}, {'language': language}) }}"
hreflang="{{ language.getId() }}"
{% if language.getId() == current_lang %}class="active"{% endif %}>
{{ language.getName() }}
</a>
{% endfor %}
Configuration Translation
Field labels, content type descriptions, button text — translated via Configuration → Translations. Or via export:
drush config:export
# Edit locale/*.po files
drush locale:import en /path/to/en.po
Menus and Blocks
Each menu item is translated separately via Structure → Menus → [menu] → Edit → Translate. Blocks: Structure → Block placement → [block] → Translate.
URL Aliases for Translations
Pathauto creates aliases for each translation separately: /about (en), /uk/про-нас (uk). Configuration: Configuration → Pathauto → patterns include [node:language].
hreflang for SEO
Drupal automatically adds <link rel="alternate" hreflang="..."> for all translations via Metatag module:
composer require drupal/metatag
drush en metatag -y
Timeline
Basic multilingual setup for 2–3 languages with content type and interface translation — 2–3 days. Full multilingual configuration with URL patterns, hreflang, and menus — 4–5 days.







