Symfony - 如何切换和使用区域设置

时间:2017-07-21 17:37:29

标签: php symfony twig symfony-3.3

如何在树枝模板中使用区域设置的最佳做法是什么:

  • 如何在语言之间切换(使用模板中的语言切换器)以及如何仅使用语言更改来保留现有网址
  • 如何使用区域设置支持创建网址

例如: 我有2种语言( ES EN ),默认语言为ES,对于我的主页,我为/创建2路由语录(默认语言,这种情况ES)和我的Controller文件中的/{_locale}/(对于其他语言)。

现在我需要将我的twig模板的locale参数添加到我的URL中,但前提是我不会使用我的默认语言。

手动重写URL工作正常,但是在我的twig模板上创建时,如何将语言环境参数添加到URL中有什么简单方法?

变量语言环境的实际值可以传递给Controller,但有没有更好的方法来获取它?

修改

/**
 * @Route(
 *     "/{_locale}/branches", name="branches",
 *     requirements={"_locale":"%app_locales%"}
 *     )
 * 
 */
public function indexAction(Request $request) {
    return $this->render('branches/index.html.twig');
}

index.html.twig

<li class="{% if app.request.attributes.get('_route') starts with 'branches' %}active{% endif %}">
                    <a href="{{ path('branches') }}" class="">{{ 'header.menu.branches'|trans }}</a>
                </li>

我得到了

找不到“GET / branches”的路由我使用此网址http://localhost:8080/en/branches(工作正常)和http://localhost:8080/branches(错误)我必须使用以下内容:

/**
 * @Route(
 *     "/branches/", name="branches_def",
 *     defaults={"_locale":"%locale%"},
 *     )
 * @Route(
 *     "/{_locale}/branches/", name="branches",
 *     requirements={"_locale":"%app_locales%"}
 *     )
 * 
 */
public function indexAction(Request $request) {
    return $this->render('branches/index.html.twig');
}

使用路径生成的网址没有问题,但是如果我在浏览器中删除了我网址中的区域设置参数,则会收到此错误。

非常感谢任何有用的建议

2 个答案:

答案 0 :(得分:2)

  1. 取消注释config.yml
  2. 中的行translator: { fallbacks: ['%locale%'] }
  3. 在同一个文件中声明所需的变量:

    parameters:
        locale: en
        app.locales: en|lv|ru
    
  4. 在routing.yml中声明您需要的路线,如下所示:

    contact_us:
        path: /{_locale}/contact
        defaults:
            _controller: 'AppBundle:Default:contact'
            _locale: '%app.locales%'
    
  5. 如果使用_locale占位符声明{{ path('another_route') }},则
  6. 使用不带参数的another_route。同样,对于单个文本翻译,请使用{{ 'home.title'|trans }}

答案 1 :(得分:1)

将您的语言环境保存到Cookie中,然后在您的twig文件中创建<a href="{{ path('your-path-name', {'locale': app.request.cookies.get('LOCALE_COOKIE')}) }}">

等链接

我不确定您是否会收到错误或空值(这将帮助您在控制器路由中使用默认语言环境)如果未设置cookie但您应该尝试使用它。