Как использовать одновременно 2 языка?

В рамках Symfony существует несколько подходов к работе с мультиязычностью. Один из наиболее распространенных подходов - это использование компонента Translation, который позволяет управлять переводами сообщений в приложении.

Для начала необходимо установить и подключить компонент Translation в вашем проекте Symfony. Вы можете сделать это через Composer, выполнив команду:

composer require symfony/translation

После установки компонента, вам необходимо настроить локали и каталоги с переводами в файле конфигурации config/packages/translation.yaml. Пример настройки для двух языков (английский и французский) может выглядеть следующим образом:

framework:
    default_locale: en
    translator:
        fallbacks: [fr]
        paths:
            - '%kernel.project_dir%/translations'

Здесь мы указываем, что локаль по умолчанию - английский (en), а в случае отсутствия перевода для данного сообщения, будет использоваться французский (fr). Также указываем путь к каталогу с переводами (%kernel.project_dir%/translations), где будут храниться файлы с переводами.

Следующим шагом является создание файлов с переводами. В каталоге translations создайте файлы с расширением .xlf для каждого языка. Например, messages.en.xlf для английского и messages.fr.xlf для французского. В этих файлах вы можете определить переводы для конкретных сообщений, используя XML-синтаксис.

<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" target-language="fr" datatype="plaintext">
        <body>
            <trans-unit id="welcome_message">
                <source>Welcome to my website!</source>
                <target>Bienvenue sur mon site web !</target>
            </trans-unit>
        </body>
    </file>
</xliff>

После создания файлов с переводами, вы можете использовать переводы в вашем коде. Для этого вы должны внедрить сервис translator в ваш контроллер или другой класс. Например:

use SymfonyContractsTranslationTranslatorInterface;

class MyController extends AbstractController
{
    private $translator;

    public function __construct(TranslatorInterface $translator)
    {
        $this->translator = $translator;
    }

    public function index()
    {
        $welcomeMessage = $this->translator->trans('welcome_message');
        // ...
    }
}

Здесь мы внедряем сервис translator через конструктор и используем его метод trans для получения перевода сообщения с идентификатором welcome_message. В зависимости от текущей локали, будет возвращен нужный перевод.

Чтобы установить текущую локаль в вашем приложении, вы можете использовать сервис session, например:

use SymfonyComponentHttpFoundationRequestStack;

class MyController extends AbstractController
{
    private $requestStack;

    public function __construct(RequestStack $requestStack)
    {
        $this->requestStack = $requestStack;
    }

    public function index()
    {
        $request = $this->requestStack->getCurrentRequest();
        $locale = $request->getLocale();
        // ...
    }
}

Здесь мы используем сервис RequestStack для получения текущего запроса, а затем получаем текущую локаль с помощью метода getLocale(). Вы можете использовать эту локаль для установки языка переводов приложения.

Таким образом, используя компонент Translation и правильные настройки, вы можете легко работать с множеством языков в Symfony. Вы можете определять переводы для различных сообщений и использовать их в вашем коде, основываясь на текущей локали пользователя.