如何使用用户的语言环境
编辑本页如何使用用户的语言环境
当前用户的语言环境存储在请求中,可以通过请求
对象:
1 2 3 4 5 6
使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;公共函数指数(请求$请求){$语言环境=$请求->getLocale ();}
要设置用户的语言环境,你可能想要创建一个自定义事件监听器,以便在系统的其他部分(即翻译器)需要它之前设置它:
1 2 3 4 5 6 7
公共函数onKernelRequestRequestEvent ($事件){$请求=$事件->getRequest ();//确定$locale的一些逻辑$请求->setLocale ($语言环境);}
请注意
必须调用自定义侦听器之前LocaleListener
,它会根据当前请求初始化区域设置。为此,将侦听器优先级设置为高于的值LocaleListener
优先级(可以通过运行调试:事件kernel.request
命令)。
读会话有关如何使用户的区域设置“粘滞”到会话的更多信息。
请注意
使用请求- > setLocale ()
在控制器中太晚影响翻译器。通过监听器(如上所述),URL(见下)或调用设置区域设置setLocale ()
直接在翻译
服务。
看到如何使用用户的语言环境小节介绍通过路由设置区域设置。
区域和URL
由于可以在会话中存储用户的语言环境,因此可能很容易使用相同的URL根据用户的语言环境以不同的语言显示资源。例如,http://www.example.com/contact
可以为一个用户显示英语内容,为另一个用户显示法语内容。不幸的是,这违反了Web的基本规则:不管用户是谁,特定URL都会返回相同的资源。更复杂的问题是,哪个版本的内容会被搜索引擎索引?
方法在URL中包含区域设置是一种更好的策略特殊的_locale参数:
- 属性
- YAML
- XML
- PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src /控制器/ ContactController.php名称空间应用程序\控制器;/ /……类ContactController扩展AbstractController{#(路线(路径:“/ {_locale} /接触”名称:“接触”,要求:[“_locale”= >“en | fr |德”,],)]公共函数联系(){}}
1 2 3 4 5 6
#配置/ routes.yaml联系人:路径:/ {_locale} /接触控制器:控制器应用\ \ ContactController:索引要求:_locale:在| fr |德
12 3 4 5 6 7 8 9 10 11 12
<!——config/routes.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<路线xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing //www.oldmanjams.com/schema/routing/routing-1.0.xsd”><路线id=“接触”路径=“/ {_locale} /接触”>控制器= " App \控制器\ ContactController:指数”><要求关键=“_locale”>在| fr |德要求>路线>路线>
12 3 4 5 6 7 8 9 10 11 12
/ /配置/ routes.php使用应用程序\控制器\ContactController;使用欧宝娱乐app下载地址\组件\路由\加载程序\配置器\RoutingConfigurator;返回函数(RoutingConfigurator$路线){$路线->add (“接触”,“/ {_locale} /接触”)->控制器([ContactController::类,“指数”])->需求([“_locale”= >“en | fr |德”,]);};
使用特殊时_locale
参数,则匹配的区域设置为在请求上自动设置并且可以通过getLocale ()方法。换句话说,如果用户访问URI/ fr /联系
,区域fr
将自动设置为当前请求的区域设置。
现在可以使用语言环境创建到应用程序中其他已翻译页面的路由。
提示
将区域设置需求定义为容器参数避免在所有路由中硬编码它的值。
设置默认区域设置
如果还没有确定用户的语言环境怎么办?类型可以保证为每个用户的请求设置语言环境default_locale
对于框架:
- YAML
- XML
- PHP
1 2 3
#配置/包/ translation.yaml框架:default_locale:在
12 3 4 5 6 7 8 9 10 11 12
<!——config/packages/translation.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:框架=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/symfony //www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd”><框架:配置缺省语言环境=“en”/>容器>
1 2 3 4 5 6
/ /配置/包/ translation.php使用欧宝娱乐app下载地址\配置\FrameworkConfig;返回静态函数(FrameworkConfig$框架){$框架->defaultLocale (“en”);};