Symfony多页面Locale切换器改造:解决路由为空及多页适配问题
解决方案
1. 修复Locale切换后需刷新的问题
核心是在语言切换时同步更新会话与当前请求的Locale,并重定向回用户原页面,而非固定跳转到首页。
修改LanguageController的切换方法:
// src/Controller/LanguageController.php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; class LanguageController extends AbstractController { #[Route('/switch-language/{locale}', name: 'switch_language')] public function switch(Request $request, string $locale): Response { // 获取可用语言列表(替换为你的API调用逻辑) $availableLocales = array_values($this->fetchAvailableLanguages()); // 验证语言合法性,非法则 fallback 到当前会话语言或默认语言 if (!in_array($locale, $availableLocales)) { $locale = $request->getSession()->get('_locale', 'en'); } // 更新会话Locale $request->getSession()->set('_locale', $locale); // 同步更新当前请求Locale,确保响应即时生效 $request->setLocale($locale); // 重定向回用户原页面,无referer则跳首页 $referer = $request->headers->get('referer'); return $referer ? $this->redirect($referer) : $this->redirectToRoute('index'); } // 模拟API调用获取语言列表 private function fetchAvailableLanguages(): array { return [ 'English' => 'en', 'Español' => 'es', 'Italiano' => 'it', 'Русский' => 'ru', '日本語' => 'ja', ]; } }
2. 解决app.request.get('_route')为空的问题
用render(controller())渲染头部时会发起子请求,子请求无法直接获取父请求的路由信息,需手动传递父请求的路由和参数到子控制器。
步骤2.1:添加语言切换器渲染方法
在LanguageController中新增方法,接收父请求的路由参数:
#[Route('/locale-switcher', name: 'locale_switcher', defaults: ['_route' => '', '_route_params' => []])] public function localeSwitcher(string $_route, array $_route_params): Response { $availableLanguages = $this->fetchAvailableLanguages(); $currentLocale = $this->getParameter('locale'); return $this->render('language/switcher.html.twig', [ 'available_languages' => $availableLanguages, 'current_locale' => $currentLocale, 'current_route' => $_route, 'current_route_params' => $_route_params, ]); }
步骤2.2:在模板中传递父请求路由信息
修改头部渲染代码,传递父请求的路由和参数:
{# base.html.twig 或头部模板 #} {{ render(controller( 'App\\Controller\\LanguageController::localeSwitcher', { '_route': app.request.attributes.get('_route'), '_route_params': app.request.attributes.get('_route_params') } )) }}
步骤2.3:动态生成当前页面的语言切换链接
编写语言切换器模板templates/language/switcher.html.twig,根据当前路由生成切换链接:
<div class="locale-switcher"> {% for languageLabel, locale in available_languages %} {% if locale != current_locale %} {# 合并当前路由参数与新Locale #} {% set routeParams = current_route_params|merge({'_locale': locale}) %} <a href="{{ path(current_route, routeParams) }}">{{ languageLabel }}</a> {% else %} <span class="active-locale">{{ languageLabel }}</span> {% endif %} {% endfor %} </div>
3. 基础配置检查
确保config/packages/translation.yaml中的Locale配置正确:
framework: default_locale: en translator: default_path: '%kernel.project_dir%/translations' fallbacks: - en
这样改造后,语言切换无需刷新页面即可生效,且切换链接会自动适配当前页面的路由(如index、view等)。
内容的提问来源于stack exchange,提问作者Mattew
相关产品推荐
相关产品推荐

