1

_locale我实现了小图标在语言之间切换并返回到同一页面,但我被新的 Symfony2.2行为卡住了。

<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>

这显示:

在此处输入图像描述

如果我在我的网站上的任何地方单击一个语言环境,这没关系,因为所有路由都采用著名的_locale参数,例如,如果我在以下页面中:

fuz_home_test:
    pattern:  /{_locale}/test
    defaults: { _controller: FuzHomeBundle:Default:test }
    requirements:
      _locale: fr|en

以下路由生成的 URL 将是/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 将使用备用语言环境而不是用户原始语言环境。

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

4

1 回答 1

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');
}

编辑

我终于安装了JMSI18nRoutingBundle,它使用标准路由透明地管理 i18n。比 Symfony2 的内置方式要容易得多,尤其是在特殊视图上(404 / 错误后备,登录请求页面......)。

于 2013-04-28T21:17:17.303 回答