阅读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
答案 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
(设置并重定向)