Symfony4修改请求locale实现页面语言切换

秋辰小哥_2515

秋辰小哥_2515

2026-08-19

271人浏览

原创

symfony 4 页面语言切换需在请求早期动态设置 locale 并持久化,推荐通过 url 参数(如 /en/contact)实现,配合路由配置、localelistener 监听器、twig 多语言链接及翻译文件支持。

symfony4修改请求locale实现页面语言切换

在 Symfony 4 中实现页面语言切换,核心是动态修改请求的 locale,并确保它被路由、翻译、表单、验证等组件正确识别和使用。关键不在于“硬编码改 locale”,而是在请求生命周期早期就设置好,并持久化用户选择(如通过 URL 参数或 Session)。

通过 URL 参数传递 locale(推荐)

Symfony 4 默认支持在路由中定义 {_locale} 占位符,让 locale 成为 URL 的一部分(如 /en/contact 或 /zh_CN/blog)。这是最符合 SEO 和用户体验的方式。

  • 在 config/routes.yaml 中启用 locale 参数(全局或按路由):
# config/routes.yaml
controllers:
  resource: '../src/Controller/'
  type: 'annotation'
  defaults: { _locale: 'en' }
  requirements: { _locale: '%app.supported_locales%' }

其中 %app.supported_locales% 在 config/services.yaml 中定义:

# config/services.yaml
parameters:
  app.supported_locales: 'en|zh_CN|ja'

控制器方法无需额外处理,Symfony 会自动将 _locale 值注入到请求属性中,并设为当前请求 locale。

手动设置请求 locale(如从 Session 或 Cookie 读取)

若希望用户选择后“记住”语言(例如点击国旗图标切换),可把 locale 存入 Session,并在每次请求前覆盖默认 locale。

Symfony Linux版
Symfony Linux版

Symfony Linux版整理 Symfony CLI 5.17.1 官方下载入口和 Symfony 框架安装配置说明。

下载
  • 创建一个事件监听器,在 kernel.request 早期(优先级 > 0)读取 Session 并设置 locale:
# src/EventListener/LocaleListener.php
namespace App\EventListener;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
class LocaleListener
{
  private $defaultLocale;
  private $session;
  public function __construct(string $defaultLocale, SessionInterface $session)
  {
    $this->defaultLocale = $defaultLocale;
    $this->session = $session;
  }
  public function onKernelRequest(RequestEvent $event)
  {
    if (!$event->isMainRequest()) { return; }
    $request = $event->getRequest();
    $locale = $request->attributes->get('_locale', $this->session->get('_locale', $this->defaultLocale));
    $request->setLocale($locale);
    $this->session->set('_locale', $locale);
  }
}

再在 config/services.yaml 中注册该监听器:

# config/services.yaml
App\EventListener\LocaleListener:
  arguments:
    -$defaultLocale: '%kernel.default_locale%'
  tags:
    -[ name: kernel.event_listener, event: kernel.request, priority: 20 ]

提供语言切换链接(带当前路由参数)

切换语言时,应保持当前页面路径,仅替换 locale。使用 url() 或 path() Twig 函数时传入 _locale 即可:

{# templates/base.html.twig #}

      
  • English

  •   
  • 中文

  • 如果当前路由有其他参数(如 /blog/{slug}),url() 会自动继承它们;也可用 merge 显式保留:

    {{ url(app.request.attributes.get('_route'), app.request.attributes.get('_route_params')|merge({ _locale: 'zh_CN' })) }}

    验证与调试 locale 是否生效

    可在控制器或模板中快速检查当前 locale:

    • Twig 模板中:{{ app.request.locale }} 或 {{ app.locale }}
    • 控制器中:$request->getLocale()
    • 确保 translator.default_path 配置指向正确的 translations 目录(如 translations/),且存在 messages+intl-icu.en.yaml 等文件
    • 清除缓存:php bin/console cache:clear(开发环境也建议加 --env=dev)

    不复杂但容易忽略:确保所有路由都允许 _locale 参数(或显式声明 defaults),否则 Symfony 会 fallback 到 kernel.default_locale,导致切换失效。

    相关文章

    PHP速学视频免费教程(入门到精通)
    PHP速学视频免费教程(入门到精通)

    PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

    下载

    相关标签:

    symfony

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    相关专题

    更多
    php文件怎么打开
    php文件怎么打开

    打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

    2023.09.01

    10424

    6

    php怎么取出数组的前几个元素
    php怎么取出数组的前几个元素

    取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

    2023.10.11

    6121

    5

    php反序列化失败怎么办
    php反序列化失败怎么办

    php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

    2023.10.11

    2115

    5

    php怎么连接mssql数据库
    php怎么连接mssql数据库

    连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

    2023.10.23

    3868

    4

    php连接mssql数据库的方法
    php连接mssql数据库的方法

    php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

    2023.10.23

    4574

    6

    html怎么上传
    html怎么上传

    html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

    2023.11.03

    3571

    9

    PHP出现乱码怎么解决
    PHP出现乱码怎么解决

    PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

    2023.11.09

    5117

    8

    php文件怎么在手机上打开
    php文件怎么在手机上打开

    php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

    2023.11.13

    4002

    8

    sprintf函数用法详解
    sprintf函数用法详解

    sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

    2023.11.27

    11982

    4

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    Symfony 官方文档
    Symfony 官方文档

    共0课时 | 0人学习

    Composer手册
    Composer手册

    共0课时 | 0人学习

    Symfony5【从0开始开发博客系统】
    Symfony5【从0开始开发博客系统】

    共120课时 | 15.5万人学习