Як додати багатомовність: на прикладі Symfony 6.4 з перемиканням мов через URL параметр

MVC фреймворк Symfony має потужний вбудований механізм перекладів, який можна легко інтегрувати в будь-який міні-сервіс або велику систему. У цьому блозі ми розглянемо, як додати підтримку української мови до міні-додатку на Symfony 6.4, де за замовчуванням використовується англійська.


🔧 Крок 1: Налаштування системи перекладів

У файлі

config/packages/translation.yaml

вказуємо англійську як мову за замовчуванням і вказуємо шлях до файлів перекладів:

# config/packages/translation.yaml
framework:
    default_locale: en
    translator:
        default_path: '%kernel.project_dir%/translations'

📁 Створюємо папку

translations/

, якщо вона ще не існує.


📂 Крок 2: Файли перекладів

У папці

translations/

створюємо два файли:

  • messages.en.yaml
"tr_your_ip_address_is": "Your IP Address is"
"tr_country": "Country"
"tr_city": "City"
"tr_isp": "ISP"
"tr_browser": "Browser"
  • messages.uk.yaml
"tr_your_ip_address_is": "Ваша IP адреса"
"tr_country": "Країна"
"tr_city": "Місто"
"tr_isp": "Провайдер"
"tr_browser": "Браузер"

🧠 Крок 3: Використання перекладів у Twig шаблонах

Ось приклад шаблону

index.html.twig

, де ми використовуємо фільтр

trans

:

{% extends 'base.html.twig' %}

{% block title %}{{ 'tr_your_ip_address_is' |trans }}: {{ ip_address }}{% endblock %}

{% block body %}
<div class="ip-address-wrapper"><h1>{{ 'tr_your_ip_address_is' |trans }}: {{ ip_address }}</h1></div>
<ul class="ip-info">
<li>{{ 'tr_country' |trans }}: {{ country }}</li>
<li>{{ 'tr_city' |trans }}: {{ city }}</li>
<li>{{ 'tr_isp' |trans }}: {{ isp }}</li>
<li>{{ 'tr_browser' |trans }}: {{ user_agent }}</li>
</ul>
{% endblock %}


🧬 Крок 4: Додавання логіки перемикання мови

Створюємо

LocaleSubscriber

, який буде змінювати мову в залежності від параметру

?lang=uk

:

// src/EventSubscriber/LocaleSubscriber.php

namespace App\EventSubscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;

class LocaleSubscriber implements EventSubscriberInterface
{
    private string $defaultLocale;

    public function __construct(string $defaultLocale = 'en')
    {
        $this->defaultLocale = $defaultLocale;
    }

    public function onKernelRequest(RequestEvent $event): void
    {
        $request = $event->getRequest();
        $locale = $request->query->get('lang', $this->defaultLocale);
        $request->setLocale($locale);
    }

    public static function getSubscribedEvents(): array
    {
        return [
            KernelEvents::REQUEST => [['onKernelRequest', 20]],
        ];
    }
}

🛠 Крок 5: Реєстрація сервісу

У

config/services.yaml

переконаймося, що

App\

автозавантажується:

services:
    App\:
        resource: '../src/'
        exclude:
            - '../src/DependencyInjection/'
            - '../src/Entity/'
            - '../src/Kernel.php'

Symfony автоматично знайде та зареєструє

LocaleSubscriber

як підписника подій.


📱 Крок 6: Як це працює

Коли ви переходите на сторінку:

https://example.com/?lang=uk

Symfony автоматично переключає локаль на

uk

і використовує

messages.uk.yaml

для перекладу всіх ключів.


✅ Підсумок

Ось що потрібно, щоб додати мультимовність у Symfony 6.4:

  1. Увімкнути переклади в
    translation.yaml
  2. Створити файли перекладів
    messages.en.yaml

    і

    messages.uk.yaml
  3. Використовувати
    |trans

    у Twig

  4. Написати
    LocaleSubscriber

    , який читає

    ?lang=uk
  5. Додати підписника до сервісів

📣 Готово! Тепер ваш Symfony-застосунок підтримує багатомовність та зручно перемикає мову за параметром у URL. Якщо цікаво — можу показати, як зробити перемикач мов у навігації або підтримку cookie/сесії для збереження мови.

Хочеш продовження? Пиши в коментарях або надсилай запит на наступну тему 😉

Залишити відповідь