You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Symfony 4中生成包含区域设置的URL

搞定Symfony 4多语言路由的Twig链接生成问题

嘿,先给你提个小细节:你路由配置里的requirements字段下写的是maw,这应该是笔误,得改成_locale才行,不然路由的语言匹配规则不会生效。修正后的路由配置应该是这样:

suchpage:
    path: /{_locale}/suchpage/
    controller: App\Controller\SimplePageController::such
    requirements:
        _locale: '%app.locales%'
    defaults:
        _locale: '%locale%'

接下来就说Twig里怎么生成对应语言的链接,有几种实用的方式:

1. 直接生成指定语言的suchpage链接

用Twig自带的path()函数,传入路由名称和_locale参数就搞定了:

{# 生成英文版本的suchpage链接 #}
<a href="{{ path('suchpage', {'_locale': 'en'}) }}">English Version</a>

{# 生成德文版本的suchpage链接 #}
<a href="{{ path('suchpage', {'_locale': 'de'}) }}">Deutsche Version</a>

要是需要生成带完整域名的URL,把path()换成url()就行:

<a href="{{ url('suchpage', {'_locale': 'de'}) }}">Deutsche Version (Full URL)</a>

2. 生成当前页面的其他语言版本链接

如果想做语言切换按钮,不管当前在哪个页面都能跳转到对应语言的同页面,那可以这么写:先获取当前路由的所有参数,然后替换掉_locale值:

{# 获取当前路由的所有参数 #}
{% set currentRouteParams = app.request.attributes.get('_route_params') %}

{# 跳转到当前页面的英文版本 #}
<a href="{{ path(app.request.attributes.get('_route'), currentRouteParams|merge({'_locale': 'en'})) }}">English</a>

{# 跳转到当前页面的德文版本 #}
<a href="{{ path(app.request.attributes.get('_route'), currentRouteParams|merge({'_locale': 'de'})) }}">Deutsch</a>

这种方式不用硬写路由名,通用性很强,适合做全局的语言切换栏。

3. 进阶:用Twig宏简化语言切换代码

如果页面多处需要语言切换链接,不如写个Twig宏来复用代码,省得重复写:

{# 比如放在_macros.html.twig里 #}
{% macro localeSwitcher(locales) %}
    {% set currentRoute = app.request.attributes.get('_route') %}
    {% set currentRouteParams = app.request.attributes.get('_route_params') %}
    
    <div class="locale-switcher">
        {% for locale in locales %}
            {% if locale != app.request.locale %}
                <a href="{{ path(currentRoute, currentRouteParams|merge({'_locale': locale})) }}">
                    {{ locale|upper }}
                </a>
            {% else %}
                <span class="active-locale">{{ locale|upper }}</span>
            {% endif %}
        {% endfor %}
    </div>
{% endmacro %}

然后在需要的模板里导入并使用:

{% import '_macros.html.twig' as macros %}

{# 生成en和de的语言切换按钮 #}
{{ macros.localeSwitcher(['en', 'de']) }}

这样不仅代码更简洁,还能自动标记当前激活的语言,体验更好。


内容的提问来源于stack exchange,提问作者Jeroen De Dauw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 07:05:08