在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
相关产品推荐
相关产品推荐

