#php #symfony #symfony3 #symfony4
Сталкнулся c непониманием, как можно организовать мультиязычность в symfony4. Идея
такая, есть адрес, например site.com. Если он без префикса локали, брать дефолтную
локаль, если он например site.com/en/, брать английскую локаль. Как правильно сделать
так, что бы локаль сетилась из префикса, а соответсвтенно подтягивались все переводы
и т.д. Ну и, если есть возможность, все урлы были с префиксом.
Ответы
Ответ 1
Как указывал @u_mulder выше в документации. В symfony есть бандл Translations. И весь механизм сводится к таким пунктам. настройка translations; включение локали в URL; Базовый перевод; Создать файлы перевода для каждой поддерживаемой локали; перевод в шаблоне. Настройка translations. Установка composer require symfony/translation Настройка translations. Конфигурация В документации предлагают создать некий config/packages/translation.yaml, а потом его подключить в config.yaml. Я предлагаю прямо сразу в конфиге в секции framework добавить framework: default_locale: 'ru' translator: fallbacks: ['ru'] Где default_locale локаль по умолчанию, а fallbacks - это резервная локаль. То есть локаль на которую будет переведен ключ в случае, если нигде не нашлось перевода. Включение локали в URL Механизм поддерживается системой маршрутизации с использованием специального параметра _locale. Добавляем в рутовый конфиг роутинга следующее: # config/routes.yaml main: path: /{_locale} controller: App\Controller\MainController::index requirements: _locale: ru|en Теперь роутинг будет формироваться example.com/ru. А так как ru по умолчанию, то example.com должен сделать редирект на example.com/ru. Соответсвенно, обращение к какому-нибудь example.com/ru/home нужно добавить : # config/routes.yaml main: .... home: path: /{_locale}/home controller: App\Controller\HomeController::index requirements: _locale: ru|en Но если нам, допустим, понадобится, к примеру, example.com/ru/home/room. Опять писать правило только для другого метода HomeController? Нет, в symfony можно настроить это глобально: # config/routes.yaml main: resource: "@AppBundle/Resources/config/routing.yml" prefix: /{_locale} requirements: _locale: ru|en defaults: { _locale: ru} Базовый перевод; этот пункт для случаев если нужно переводить прямо в коде. //MainController use Symfony\Contracts\Translation\TranslatorInterface; public function index(TranslatorInterface $translator) { $translated = $translator->trans('Some text'); // ... } Создать файлы перевода для каждой поддерживаемой локали По умолчанию Symfony ищет переводы в: translations/ в корне проекта; src/Resources/BUNDLE_NAME/translations/ в конкретном бандле depricated; Resources/translations/ в папке ресурсов. Также важно указать имя файла перевода. По умолчанию создайте файлы в папке translations/ messages.ru.yaml и messages.en.yaml. Ну и заполняем словари: # translations/messages.ru.yaml Some text: какой-то текст Hello world: привет мир ///////////////// # translations/messages.en.yaml Some text: кSome text Hello world: Hello world Как формируется правила создания файла перевода, настройка пути - все это можно почитать тут. Перевод в шаблоне Ну и в шаблоне (twig файле) переводим так: {{ message|trans }} Полезная информация: - управлять локалью для сессий пользователя; - переводы в шаблонах; - Как работать с локалью пользователя; - материалы на русском (не уверен что будет работать, но существенно упростит понимание некоторых моментов)
Комментариев нет:
Отправить комментарий