【问题标题】:Adding multi language option to a symfony 3 project向 symfony 3 项目添加多语言选项
【发布时间】:2017-06-19 15:54:02
【问题描述】:

阅读 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
            ));
        }
    }

我想为多语言添加选项。在 symfony 之前,我看到通过在会话中简单地保存语言以及用于更改它的按钮来做到这一点。在 symfony 中,我添加了一个 translations 文件夹,以及每种语言的文件。

//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% 清楚的(很可能我只是无法理解),并且找不到任何好的标题.

【问题讨论】:

    标签: php symfony multilingual


    【解决方案1】:

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

    然后使用

    设置语言环境
    $request->setLocale($locale);
    $request->getSession()->set('_locale', $locale);
    
    //now redirect as the locale change will take affect on the next pageload
    

    (同时设置并重定向)

    【讨论】:

      【解决方案2】:

      无论是通过 Annotation 还是通过 YAML 中的配置,最终结果都是一样的。如果你不小心,你会陷入赞成/反对注释的争论,我会继续说我个人不推荐它们。您的routing.yml 方法是我推荐的方法,应该可以正常工作。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 所以我添加了内核事件订阅者并且我没有触摸 url,但似乎我只能从以下位置更改语言:public function __construct($defaultLocale = '') I尝试使用 $request->setLocale('bg');在我的控制器中,只是为了测试,它确实改变了语言环境,我可以通过 $request->getLocale(); 看到这一点,但它不会改变页面的语言。我想我做得太晚了,它已经设置好了。或者我做错了。从这里更改语言的正确方法是什么?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-08
        • 2011-02-19
        • 2017-02-06
        • 1970-01-01
        • 1970-01-01
        • 2020-06-08
        • 1970-01-01
        相关资源
        最近更新 更多