Symfony2语言环境语言整页事件侦听器
我需要创建一个类似facebook lang系统的系统,当用户点击language to example france(“fr”)时,页面将重新加载,messages.fr.yml中的所有内容都将显示出来 我试图使路由类似于Symfony2语言环境语言整页事件侦听器,symfony,service,kernel,listener,translation,Symfony,Service,Kernel,Listener,Translation,我需要创建一个类似facebook lang系统的系统,当用户点击language to example france(“fr”)时,页面将重新加载,messages.fr.yml中的所有内容都将显示出来 我试图使路由类似于/language/{localExtension},但当我在那里设置locale,然后重定向时,它不起作用。。。我不知道,我假设它只是针对某个页面而不是全局页面?因为当我在控制器的顶部设置setLocale('fr')时,它会工作 我在使用www.example.com/c
/language/{localExtension}
,但当我在那里设置locale,然后重定向时,它不起作用。。。我不知道,我假设它只是针对某个页面而不是全局页面?因为当我在控制器的顶部设置setLocale('fr')
时,它会工作
我在使用www.example.com/contact/en
,/contact/fr
等时发现了一些文章
但是我想要/contact
和以前选择的语言显示的内容。或者默认为“en”,就像现在用户没有更改它一样
我整天都在谷歌上搜索,我想应该用。。。服务=>侦听器和。。。根据kernel.request?或者类似的
这里是有趣的链接,我想这就是我需要的?或我试图设置服务并创建侦听器,但出现了一些错误,我甚至不知道这是否是创建它的方法://是的,出于某种原因,您需要使用侦听器:
<?php
namespace Your\Bundle\Listener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class LocaleListener implements EventSubscriberInterface
{
private $defaultLocale;
public function __construct($defaultLocale = 'en')
{
$this->defaultLocale = $defaultLocale;
}
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
if (!$request->hasPreviousSession()) {
return;
}
if ($locale = $request->attributes->get('_locale')) {
$request->getSession()->set('_locale', $locale);
} else {
$request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
}
}
static public function getSubscribedEvents()
{
return array(
// must be registered before the default Locale listener
KernelEvents::REQUEST => array(array('onKernelRequest', 17)),
);
}
}
?>
在service.xml中注册侦听器:
<service id="my.listener" class="Your\Bundle\Listener\LocaleListener">
<argument>%locale%</argument>
<tag name="kernel.event_subscriber"/>
</service>
%区域设置%
如何在细枝模板中实现语言切换器的示例:
{% for locale in ['en', 'fr','zh'] %}
<li>
<a href="{{ path(app.request.get('_route'), app.request.get('_route_params')|merge({'_locale' : locale})) }}">
{% if locale == 'en' %}
<img title="English" src="{{ asset('bundles/fkmywebsite/images/UnitedStates.png') }}" alt="English" height="30" width="30"/>
{% elseif locale == 'fr' %}
<img title="Français" src="{{ asset('bundles/fkmywebsite/images/France.png') }}" alt="Français" height="30" width="30"/>
{% endif %}
</div>
</li>
{% endfor %}
{%用于['en'、'fr'、'zh']%中的区域设置]
{%if locale=='en'%}
{%elseif locale=='fr%}
{%endif%}
{%endfor%}
听众工作起来,帮了我很多忙。我重用了脚本来设置会话中的区域设置(带有子标记区域)和语言(区域设置语言代码)
<?php
namespace Fer\CaveBundle\EventListener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\DependencyInjection\ContainerInterface;
class LocaleListener implements EventSubscriberInterface
{
private $defaultLocale;
private $locales;
public function __construct($defaultLocale='es', ContainerInterface $container)
{
//values from configuration of my bundle
$backend = $container->getParameter('cave.backend');
$this->locales = $backend['_locale'];
// $this->locales = array( 'es'=>'es_ES'
// 'en'=>'en_GB,en_US',
// 'fr'=>'fr_FR,fr_BG'
// );
//default must exists in _locales array. locale_lookup Default: es_ES
$this->defaultLocale = locale_lookup(array_keys($this->locales),
$defaultLocale,
false,
current(explode(',',implode(',',array_values($this->locales)))));
}
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
$session = $request->getSession();
// Locale Get parameters
if($locale = $request->query->get('_locale'))
{
$this->setLocale($request, $session, $locale);
return;
}
// Locale Post parameters with custom form name
if($locale = $request->request->get('_localeForm'))
{
$this->setLocale($request, $session, $locale['_locale']);
return;
}
// Locale session parameters
if($locale = $session->get('_locale'))
{
$this->setLocale($request, $session, $locale);
return;
}
//Locale in browser
if($locale = $request->getPreferredLanguage()){
$this->setLocale($request, $session, $locale);
return;
}
$this->setLocale($request, $session, $this->defaultLocale);
return;
}
public function setLocale($request,$session,$locale)
{
//search language and lookup, default first locale in language
if(in_array(current(locale_parse($locale)),array_keys($this->locales))){
$locale = locale_lookup(explode(',',$this->locales[current(locale_parse($locale))]),
$locale,
false,
current(explode(',',$this->locales[current(locale_parse($locale))])));
}else{
$locale = $this->defaultLocale;
}
//set session parameter
if($locale!==$session->get('_locale')){
$session->set('_locale',$locale);
$session->set('language', current(locale_parse($locale)));//language code
}
//Set the default PHP locale.(for translations)
$request->setLocale($locale);
//set post parameter
$request->request->set('_locale',$locale);
//set get parameter
$request->query->set('_locale',$locale);
return;
}
static public function getSubscribedEvents()
{
return array(
// must be registered before the default Locale listener
KernelEvents::REQUEST => array(array('onKernelRequest', 17)),
);
}
}
?>
示例细枝形式:
<form action="" method="post" {{ form_enctype(_localeForm) }}>
{{ form_widget(_localeForm)}} <br><br>
<input type="submit" value="Enviar" />
{{ form_rest(_localeForm) }}
</form>
捆绑包的配置参数中的清洁器:
fer_cave.backend:
_locale: {es: [es_ES],en: [en_GB,en_US],fr: [fr_FR,fr_BG]}
encoding: UTF-8
cave.frontend:
_locale: {es: es_ES}
encoding: UTF-8
现在我可以使用get、post或浏览器配置设置会话的语言环境和语言
希望我的英语能说清楚,抱歉,因为我一直在编辑文字。好人,真的很好。我现在不能尝试,因为我使用了区域设置包,因为我找不到答案,这里除了thx之外没有人帮过我很多!似乎是功能性的。语言环境\u侦听器:类:Acme\DemoBundle\listener\LocaleListener参数:[%locale%]标记:-{name:'kernel.event\u subscriber'}Yml配置引用:)uph。。。。谢谢你的回复。。。太晚了,我现在没有时间尝试。。。我可能会有这个问题,稍后我会告诉你,如果某事:)但thx为您的时间;)不要担心英语:D一切都足够干净。
{% for locale in ('fer_cave.backend._locale'|caveParam)|keys %}
<li {% if locale == app.session.get('language') %}class="active" style="color: red"{% endif %}>
{#<a href="{{path(app.request.get('_route'), {'_locale': locale}) }}">{{ locale }}</a>#}
{% set route = app.request.get('_route') %}
{% set route_params = app.request.get('_route_params') %}
<a href="{{ path(route, route_params | merge({ '_locale': locale })) }}">{{ locale }}</a>
{% endfor %}
{#
Locale in session: {{app.session.get('_locale')}}<br>
Language in session: {{app.session.get('language')}}<br>
Locale as get param: {{app.request.get('_locale')}}<br>
Locale as post {{app.request.request.get('_locale')}}
#}
<service id="cave.listener" class="Fer\CaveBundle\EventListener\LocaleListener">
<argument>%locale%</argument>
<argument type="service" id="service_container" />
<tag name="kernel.event_subscriber"/>
</service>
//-------------------ejemplo de backend-------------------//
->arrayNode('backend')
->addDefaultsIfNotSet()
->children()
->arrayNode('_locale')
->addDefaultsIfNotSet()
->children()
->scalarNode('es')->defaultValue('es_ES')->end()//language=>region
->scalarNode('en')->defaultValue('en_GB,en_US')->end()//
->scalarNode('fr')->defaultValue('fr_FR,fr_BG')->end()//
->end()
->end()//end arrayNode('_locale')
->scalarNode('encoding')->defaultValue('UTF-8')->end()
->end()
->end()//end arrayNode('backend')
fer_cave.backend:
_locale: {es: [es_ES],en: [en_GB,en_US],fr: [fr_FR,fr_BG]}
encoding: UTF-8
cave.frontend:
_locale: {es: es_ES}
encoding: UTF-8