symfony 3 - 使用不同的语言环境生成当前 url

symfony 3 - generate current url with different locales

我想要做的是创建一个输出链接列表的语言切换器模板,如下所示:

<div class="language-switcher">
    <ul>
        {% for locale in allowed_locales %}
            <li>
                <a href="{{ path($get current route name here $, { '_locale': locale }) }}">
                    {{ locale|upper }}
                </a>
            </li>
        {% endfor %}
    </ul>
</div>

我遇到的主要问题是 - Twig 的内置 path 函数接受路由名称,似乎无法在 Symfony 3 中检索。

另一个问题是 - 路由可能有额外的参数,需要与 _locale 参数合并。从我在 Internet 上找到的代码(当然,都是针对 symfony v2 的),使这项工作产生非常丑陋的代码,绝对不属于模板。

我认为实现此目的的最佳方法是为此目的制作一个具有新路由生成功能的 Twig 扩展,但似乎也可能有问题,因为 path() 函数位于另一个扩展中,我不知道如何从我自己的扩展访问(我也不太确定这是个好主意)。

我怎么能做出这个东西?

编辑:我也不想在每个操作中将数据传递给模板,因为那根本不是 DRY。

如何设置一个更改区域设置的路由操作,然后通过请求中的引荐来源网址重定向回原始页面header(这将获取您之前的 url):

public function localeChangerAction(Request $request, $locale)
{
    return $this->redirect($request->headers->get('referer'));
}

这是未经测试的,但我之前已经实现了 - 我只是根据记忆在我的手机上点击了它。

我确实实现了食谱中的 'sticky' 语言环境来处理语言环境切换: http://symfony.com/doc/current/cookbook/session/locale_sticky_session.html

这可能对您有所帮助,它适用于所有路线!

我做了一个相当简短的解决方案:制作 path()/url() Twig 函数的本地化版本,它会自动检测当前路径并尝试找到本地化版本并替换 _locale 参数。

https://gist.github.com/jurchiks/3b4e1bd249d7e8c1b60e

基本上,您在页眉或页脚的某处有类似此模板的内容:

<h1>Current language: {{ app.request.getLocale() }}</h1>
<div class="language-switcher">
    <ul>
        {# allowed_locales comes from config #}
        {% for locale in allowed_locales %}
            <li>
                <a href="{{ localized_path('__current__', locale) }}">
                    {{ locale|upper }}
                </a>
            </li>
        {% endfor %}
    </ul>
</div>

或者,您可以这样做:

<a href="{{ localized_path('route_name') }}">

它会在当前语言环境中输出特定的路由。

路线如下:

@Route("/", name="home")
@Route("/{_locale}/", name="home_lang", requirements={"_locale"="%allowed_locales%"})
public function indexAction()
...

@Route("/{_locale}/foo/", name="foo", requirements={"_locale"="%allowed_locales%"})
public function fooAction()
...

如果打开http://127.0.0.1:8000/,会输出Current language: en/en/, /ru/, /tk/。对于 fooAction(),只允许显式语言环境,输出是相同的。 显然,明确的语言环境将被正确设置,这是由 Symfony 中的路由匹配器完成的。

@jurchick 对 localized_path 函数的 link 不再有效,所以我快速实现了一个纯 Twig 实现:

{% set req = app.request %}
{% for locale in allowed_locales %}
    {% if locale != req.getLocale() %}
        <link rel="alternate" hreflang="{{ locale }}" href="{{
            absolute_url(
                path(
                    req.attributes.get('_route'),
                    req.attributes.get('_route_params')|merge({'_locale': locale})
                )
            ) }}" />
    {% endif %}
{% endfor %}

此块实际上为当前页面生成备用语言 link。请随意在您的基础 HTML 区块中使用它。