Я абсолютно застрял в поиске решения для ручного переключения переменной _locale в Symfony 4.
Я следил за эти шаги, но теперь я совершенно не знаю, как сделать простую кнопку переключения в разделе навигации. Я также посмотрел на вопрос это, но это похоже на более старую версию Symfony ..
Может ли кто-нибудь помочь мне выбраться из этой темной дыры и объяснить мне, как я могу интегрировать простую кнопку переключения _locale или, по крайней мере, указать мне правильное направление?






Ответ немного отличается от ответа это, который не применим в Symfony 4. Начните с редактирования файла services.yaml в каталоге config.
{# project/config/services.yaml}
# ...
parameters:
# ...
app_locales: [nl_NL, en_EN]
twig:
# ...
globals:
locales: %app_locales%
# ...
Затем добавьте шаблон для интеграции кнопки переключения где-нибудь в вашем базовом шаблоне.
{# project/templates/_locale_switcher.html.twig #}
{% set route = app.request.attributes.get('_route') %}
{% set route_params = app.request.attributes.get('_route_params') %}
{% set params = route_params|merge(app.request.query.all) %}
{# You may want to not print a flag/link for current view, the "if" here let
you handle it #}
{% for locale in locales if locale != app.request.locale %}
<li>
<a href = "{{ path(route, params|merge({ _locale: locale })) }}">
<img src = "{{ asset('img/flags/' ~ locale ~ '.jpg') }}" alt = "{{
locale }}">
</a>
</li>
{% endfor %}
И, наконец, интегрируйте этот новый шаблон в свой базовый шаблон.
{# project/templates/base.html.twig #}
{% include '_locale_switcher.html.twig' %}
Согласно ответу Чарльза ниже, значение локали в файле services.yaml должно быть вставлено в кавычки, чтобы избежать недопустимой ошибки YAML:
{# project/config/services.yaml}
# ...
parameters:
# ...
app_locales: [nl_NL, en_EN]
twig:
# ...
globals:
locales: "%app_locales%"
# ...
Вот что у меня работает в последней версии Symfony 4
services.yaml:
parameters:
locale: 'en'
app_locales: en|fr
twig:
globals:
locales: '%app_locales%'
шаблон языкового стандарта:
{# project/templates/_locale_switcher.html.twig #}
{% set route = app.request.attributes.get('_route') %}
{% set route_params = app.request.attributes.get('_route_params') %}
{% set params = route_params|merge(app.request.query.all) %}
{# You may want to not print a flag/link for current view, the "if" here let
you handle it #}
{% for locale in locales|split('|') %}
{% if locale != app.request.locale %}
<li>
<a href = "{{ path(route, params|merge({ _locale: locale })) }}">
<img src = "{{ asset('img/flags/' ~ locale ~ '.jpg') }}" alt = "{{ locale }}">
</a>
</li>
{% endif %}
{% endfor %}
Использование
$request->getSession()->set('_locale', 'en');в кнопке переключателя подойдет вам?