2017-06-19 97 views
0

阅读symfony 3的文档,我感到非常困惑,而且我不确定自己是否做得正确。这是怎么了我的正常控制器的一个看了开头:在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: Марки 

这个我在一些titorial看了之后,我可以加我的_locale,在我的路线是这样的:
@Route( “{_区域} /”,名字= “指数”)
而这实际上工作。我可以通过进入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%清楚的(很可能我不能理解它),并且找不到任何好的支流。

回答

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 

(同时设置,和重定向)

+0

就是这样,谢谢! – symfonypleb

0

无论是通过Annotation还是通过YAML中的配置,最终结果都是一样的。如果你不小心,你会陷入赞成/反对注释的辩论,而我会继续说,我不推荐他们个人。您的routing.yml方法是我会推荐的方法,并且应该工作得很好。

0

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

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

+0

所以我增加了内核事件订户的区域设置我没有触及url,但它似乎只能改变语言:public function __construct($ defaultLocale ='')我尝试使用$ request-> setLocale('bg');在我的控制器中,只是为了测试,它实际上改变了语言环境,我可以通过$ request-> getLocale()来看到它,但它不会改变页面的语言。我认为我做得太晚了,它已经设定好了。或者我做错了。从这里改变语言的正确方法是什么? – symfonypleb