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

Php Symfony-如何切换和使用区域设置,php,symfony,twig,symfony-3.3,Php,Symfony,Twig,Symfony 3.3,如何在细枝模板中使用区域设置的最佳实践是什么: 如何在语言之间切换(在模板中使用语言切换器),以及如何仅通过更改语言来保留现有URL 如何使用区域设置支持创建URL 例如: 我有两种语言(ES和EN),默认语言是ES,对于我的主页,我为控制器文件中的/(对于默认语言,在本例中为ES)和/{u locale}/(对于其他语言)创建了两个路由选项 现在我需要将我的分支模板的locale参数设置到我的URL中,但前提是我不使用默认语言 手动重写URL可以很好地工作,但当我在我的小树枝模板上创建时,

如何在细枝模板中使用区域设置的最佳实践是什么:

  • 如何在语言之间切换(在模板中使用语言切换器),以及如何仅通过更改语言来保留现有URL
  • 如何使用区域设置支持创建URL
例如: 我有两种语言(ESEN),默认语言是ES,对于我的主页,我为控制器文件中的
/
(对于默认语言,在本例中为ES)和
/{u locale}/
(对于其他语言)创建了两个路由选项

现在我需要将我的分支模板的locale参数设置到我的URL中,但前提是我不使用默认语言

手动重写URL可以很好地工作,但当我在我的小树枝模板上创建时,有没有简单的方法可以将区域设置参数添加到URL

变量locale的实际值可以传递给控制器,但有没有更好的方法在twig中获取它呢

编辑:

/**
 * @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>
使用路径生成URL是可以的,但如果我在浏览器中从URL中删除区域设置参数,则会出现此错误


非常感谢您提供的有用建议

将您的区域设置保存到cookie中,然后在您的小树枝文件中创建链接,如


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

将区域设置保存到cookie中,然后在您的小树枝文件中创建类似

如果没有设置cookie,我不确定您是否会得到错误或空值(这将帮助您在控制器路由中使用默认区域设置),但您应该尝试一下

  • 取消对config.yml中的行
    转换器的注释:{fallbacks:['%locale%']}
  • 在同一文件中声明所需的变量:

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

    /**
     * @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');
    }
    
    contact_us:
        path: /{_locale}/contact
        defaults:
            _controller: 'AppBundle:Default:contact'
            _locale: '%app.locales%'
    
  • 如果
    另一个路由
    是用_locale占位符声明的,则使用
    {path('other_route')}}
    而不带参数。对于单文本翻译,也可以使用
    {{'home.title'|trans}
  • 取消对config.yml中的行
    转换器的注释:{fallbacks:['%locale%']}
  • 在同一文件中声明所需的变量:

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

    /**
     * @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');
    }
    
    contact_us:
        path: /{_locale}/contact
        defaults:
            _controller: 'AppBundle:Default:contact'
            _locale: '%app.locales%'
    
  • 如果
    另一个路由
    是用_locale占位符声明的,则使用
    {path('other_route')}}
    而不带参数。对于单文本翻译,也可以使用
    {{'home.title'|trans}

  • 根据您的编辑尝试此捆绑包,更好的方法是使用两个单独的操作,并具有自己的注释参数,如我的示例中所示?更好的方法是使用2@Route注释?一个用于locale,另一个用于URL,但不带此参数?如果您知道操作中的逻辑将来会很复杂,那么两个单独的操作将有助于调试和查找潜在错误的原因。但如果没有,您也可以使用as 2@Route注释,它完全可以工作,只需在测试项目上检查它即可。根据您的编辑尝试此捆绑包,更好的方法是使用两个单独的操作,并使用自己的注释参数,如我的示例所示?更好的方法是使用2@Route注释?一个用于locale,另一个用于URL,但不带此参数?如果您知道操作中的逻辑将来会很复杂,那么两个单独的操作将有助于调试和查找潜在错误的原因。但若并没有,你们也可以使用as 2@Route注释,它完全可以工作,只是在测试项目中检查了一下。非常感谢,但它也可以用于会话吗?在最好的方式,我正在寻找一些简单的方法,我怎么能做到这一点。在我看来,这个变量条目太长,无法用于每个URL地址,而且很难使用。我在
    app/
    中使用我自己的翻译文件,其中一种方法是在每个控制器中添加locale参数,作为twig模板的参数,但是可以在基本控制器中或自动执行此操作?非常感谢,但也可以将此用于会话?在最好的方式,我正在寻找一些简单的方法,我怎么能做到这一点。在我看来,这个变量条目太长,无法用于每个URL地址,而且很难使用。我正在
    app/
    中使用我自己的翻译文件,其中一种方法是在每个控制器中添加locale参数,作为twig模板的参数,但这可以自动执行,也可以在base controller中执行?您好,感谢您的帖子,
    {{path('other_route')}
    将树枝模板中的实际
    \u locale
    参数提供给我的URL?例如,如果我的主页中实际有
    /en/
    路径,并且我需要转到
    /en/contact/
    ,那么
    en
    参数是自动添加到我的URL吗?我在一页上使用了两条路线。对于默认lang(
    /
    对于home,
    /conatcts/
    等)和2。对于其他语言(
    /en/
    对于home,
    /en/conatcts/
    /de/contacts/
    等)是的,在您的示例中,
    en
    参数将自动添加到callyok中,非常感谢,我使用了这个
    /***@Route(*“/{{locale}/branches”,name=“braches”,*requirements={u locales”:“%app u locales%”*)***/
    它对
    /en/branchs
    很好,但是当我在没有区域设置的url中使用
    /branchs
    时,我收到错误消息,然后路由
    /branchs
    不存在,在这种情况下,我的控制器中的每个操作都必须有2条路由?在url中,您应该使用路由名称(联系我们),而不是路由路径(/{u locale}/contact})。在此之后,您不应该使用我在控制器路由注释中缺少的第二个路由部分(从您的示例中),这是
    \u controller:'AppBundle:Default:contact'
    ,但是当我从URL/en/branch->/branch中删除时,我得到的错误消息路由不存在,在twig中生成的URL现在可以正常工作了,谢谢您的帖子,