我实现了小图标以在语言之间切换并返回到同一页面,但我遇到了新的Symfony2.2 _locale
行为。
<a class="lang" href="{{ path(app.request.get('_route'), app.request.get('_route_params')|merge({'_locale': 'fr'})) }}">
<img src="{{ asset('bundles/fuzlayout/images2/locale_fr.png') }}" title="Français" alt="Français" />
</a>
<a class="lang" href="{{ path(app.request.get('_route'), app.request.get('_route_params')|merge({'_locale': 'en'})) }}">
<img src="{{ asset('bundles/fuzlayout/images2/locale_en.png') }}" title="English" alt="English" />
</a>
显示:
如果我点击我网站上的任何地方的区域设置,这是可以的,因为所有路由都采用着名的_locale
参数,例如,如果我在以下页面中:
fuz_home_test:
pattern: /{_locale}/test
defaults: { _controller: FuzHomeBundle:Default:test }
requirements:
_locale: fr|en
以下路线生成的网址为/fr/test
或/en/test
。
但是,我的主页不能有_locale
参数:
fuz_home:
pattern: /
defaults: { _controller: FuzHomeBundle:Default:index }
如果我输入默认参数,例如:
fuz_home:
pattern: /{_locale}
defaults: { _controller: FuzHomeBundle:Default:index, _locale: %locale% }
requirements:
_locale: fr|en
默认情况下,Symfony将使用后备区域设置而不是用户原始区域设置。
所以我的问题是:如何创建一个多语言的主页?
答案 0 :(得分:2)
在完全解决问题之后,我终于得到了解决方案。
您需要将/
绑定到控制器,该控制器会根据用户的区域设置将用户重定向到正确的翻译主页。
在您的路由中:
fuz_index:
pattern: /
defaults: { _controller: FuzHomeBundle:Default:index }
fuz_home:
pattern: /{_locale}
defaults: { _controller: FuzHomeBundle:Default:home }
requirements:
_locale: fr|en
在您的控制器中:
public function indexAction()
{
$router = $this->get('router');
$locale = $this->getRequest()->getLocale(); // here is the magic!
$url = $router->generate('fuz_home', array('_locale' => $locale));
return new RedirectResponse($url);
}
public function homeAction()
{
return $this->render('FuzHomeBundle:Default:index.html.twig');
}
我终于安装了使用标准路由透明地管理i18n的JMSI18nRoutingBundle。远比Symfony2的内置方式容易得多,特别是在特殊视图上(404 /错误回退,登录请求页面......)。