将多语言选项添加到symfony 3项目

时间:2017-06-19 15:54:03

标签: php symfony multilingual

阅读symfony 3的文档,我感到非常困惑,我不确定我是否做得对。这是我的一个普通控制器看起来的开始:

class IndexController extends Controller

    {
        /**
         * @Route("/", name="index")
         */
        public function indexAction(Request $request)
        {
            $articles = $this->getDoctrine()
                ->getRepository(Article::class)->findAll();

            return $this->render("index.html.twig", array(
                'articles' => $articles
            ));
        }
    }

我想为multy语言添加选项。在symfony之前,我看到这样做,只需简单地保存会话中的语言,以及用于更改它的按钮。在symfony中,我添加了翻译文件夹,以及每种语言的文件。

//messages.en.yml
    base.menu.1: Home
    base.menu.2: Products
    base.menu.3: Brands

//messages.bg.yml
    base.menu.1: Начало
    base.menu.2: Продукти
    base.menu.3: Марки

在此之后,我在一些媒体中看到我可以在我的路线中添加 _locale ,如下所示:
@Route(“{_ locale} /”,name =“index”)
这实际上有效。我可以通过进入bg /或en /。来改变我的主页语言 但是区域变量并没有保存在任何地方。如果我去了其他页面,它不知道之前设置了什么语言。所以我阅读了更多内容,通过在 routing.yml 中保存我的所有路由,我可以解决这个问题:

index:
    path:     /{_locale}/
    defaults: { _controller: AppBundle:Index:index }
    requirements:
        _locale: '%app.locales%'

然后设置我的配置:

parameters:
    locale: bg
    app.locales: bg|en

framework:
    translator: { fallbacks: ['%locale%'] }

除非我必须将路由从控制器移到 routing.yml ,否则这一切都有效。我想问这是否是正确的方法,做所有这些,因为我不确定,文档不是100%明确(很可能我只是无法理解),并且找不到任何好的titorials

3 个答案:

答案 0 :(得分:0)

无论是通过注释还是通过YAML中的配置,最终结果都是相同的。如果你不小心的话,你会陷入关于支持/反对注释的辩论,我会继续说我不会亲自推荐它们。您的routing.yml方法是我推荐的方法,应该可以正常工作。

答案 1 :(得分:0)

我相信你已经在How to Work with the User's Locale阅读了Symfony的帖子,你正在寻找的是Making the Locale "Sticky" during a User's Session

  

Symfony将语言环境设置存储在请求中,这意味着此设置不会跨请求自动保存(“粘滞”)。但是,您可以将语言环境存储在会话中,以便在后续请求中使用它。

答案 2 :(得分:0)

使用' make locale sticky'方法,如上所述,

然后使用

设置区域设置
$request->setLocale($locale);
$request->getSession()->set('_locale', $locale);

//now redirect as the locale change will take affect on the next pageload

(设置并重定向)