Twig链接到当前路由,但更改语言环境

5
我会在现有网站中添加不同语言版本的链接。虽然它可以正常工作,但是看起来非常丑陋^^。
<li>
    <a href="{{ path(app.request.attributes.get('_route'), app.request.attributes.get('_route_params')|merge(app.request.query.all|merge({_locale: 'es'}))) }}">
       <img src="{{ asset('img/flags/es.jpg') }}" alt="es">
    </a>
</li>
<li>
    <a href="{{ path(app.request.attributes.get('_route'), app.request.attributes.get('_route_params')|merge(app.request.query.all|merge({_locale: 'fr'}))) }}">
       <img src="{{ asset('img/flags/fr.jpg') }}" alt="fr">
    </a>
</li>

你有没有更好的想法?让它变得更好吧!


3
没人访问网站会看到那个,不用担心。 - malcolm
1个回答

11

你可能需要在很多页面和/或多个项目中使用这个。以下是一个基于我在一些项目中使用的可能方法:

# app/config/config.yml

# ...
parameters:
    # ...
    app_locales: [en, es, fr]

twig:
    # ...
    globals:
        locales: %app_locales%
        # ...

然后是用于容纳标志的模板:

{# app/Resources/views/includes/_flags.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 %}

最后,在任何视图中都包含标志:

{# app/Resources/views/base.html.twig #}

{% include 'includes/_flags.html.twig' %}

能否用Silex实现同样的功能?我没有config.yml文件...这是我的问题(50赏金):https://dev59.com/pKnka4cB1Zd3GeqPOXW0 - Mickaël Leger
1
有关Symfony 4方法,请参见:https://stackoverflow.com/questions/51597719/manually-switch-locale-in-symfony-4/ - marcuse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接