在Symfony 2.2中创建i18n主页?

时间:2013-04-28 21:17:17

标签: php symfony internationalization routing translation

我实现了小图标以在语言之间切换并返回到同一页面,但我遇到了新的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>
 &nbsp;
<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>

显示:

enter image description here

如果我点击我网站上的任何地方的区域设置,这是可以的,因为所有路由都采用着名的_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将使用后备区域设置而不是用户原始区域设置。

所以我的问题是:如何创建一个多语言的主页?

1 个答案:

答案 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 /错误回退,登录请求页面......)。