【问题标题】:Symfony2 routing multilingual siteSymfony2 路由多语言站点
【发布时间】:2014-06-13 10:50:05
【问题描述】:

我有一个多语言网站的路由问题。这是routing.yml(仅适用于一个捆绑包,但其他捆绑包相同)

icoo_pitanja_route:
pattern:  /{_locale}/najcesca-pitanja
defaults: { _controller: IcooPitanjaBundle:Pitanja:pitanja, _locale:hr }
requirements:
    _locale: hr|en|de

icoo_pitanja_route:
pattern:  /{_locale}/common-questions
defaults: { _controller: IcooPitanjaBundle:Pitanja:pitanja, _locale:en }
requirements:
    _locale: hr|en|de

在我的页面顶部,我有 3 个链接可以将语言更改为克罗地亚语(默认)、英语和德语。制作链接以更改它们的代码是这样的......

{% set requestParams = app.request.attributes.get('_route_params') %}
    {% set requestRoute = app.request.attributes.get('_route') %}
    <div class='languages col-xs-4'>
        <a href="{{ path(requestRoute, requestParams|merge({'_locale' : 'hr'})) }}" class='col-xs-3'><span class='real-link'>croatian</span><span></span></a>
        <a href="{{ path(requestRoute, requestParams|merge({'_locale' : 'en'})) }}" class='col-xs-3'><span class='real-link'>english</span><span>|</span></a>
        <a href="{{ path(requestRoute, requestParams|merge({'_locale' : 'de'})) }}" class='col-xs-3'><span class='real-link'>deutch</span><span>|</span></a>
    </div>

真正的问题在于path() twig 方法,它为上述路线控制的导航创建链接。它仅为英文版创建路径。我想因为它是最后一个,所以当我为德语放置一条路线时,它会生成该路线的路径。由于路径名称是icoo_pitanja_route,并且它的英语和克罗地亚版本的路由名称相同,因此path() 的定义如下......

path('icoo_naslovna_route')

我想要的是,当我点击克罗地亚语时,网址是 www.example.com/hr/najcesca-pitanja,英文为 www.example.com/en/common-questions。但是paht() 方法选择了最后一种,即英文的。

现在,有几种方法可以解决这个问题。其中之一是为每种语言制定不同的路线。另一种是让它像这样......

pattern: (_locale}/{language-specific-link} 

并在控制器中使用每种语言的有效链接数组对其进行处理,然后,如果 url 有效,则返回正确的响应。如果不是,则抛出未找到的异常,但我认为这会使 Symfony2 路由的目的无效。

有人对如何处理这个问题有任何想法吗?

【问题讨论】:

    标签: php symfony


    【解决方案1】:

    因为您的路线名称相同。尝试更改路线名称:

    icoo_pitanja_route_hr:
    pattern:  /{_locale}/najcesca-pitanja
    defaults: { _controller: IcooPitanjaBundle:Pitanja:pitanja, _locale:hr }
    requirements:
      _locale: hr|en|de
    
    icoo_pitanja_route_en:
    pattern:  /{_locale}/common-questions
    defaults: { _controller: IcooPitanjaBundle:Pitanja:pitanja, _locale:en }
    requirements:
       _locale: hr|en|de
    

    然后也更改相应的path 函数调用。

    这是必需的,因为_locale 参数是special

    【讨论】:

    • 是的,但是文档指出,如果路线名称相同,则第一个获胜。那么为什么这会是一个问题呢?另外,如果第一个路径获胜,为什么 path() 方法选择最后一个来创建链接。
    • _locale 参数是特殊的。您可能无法像您的示例中那样明确设置它。这由请求在内部通过getLocale() 方法填充。我希望您的请求当前包含“en”作为语言环境,因此包含“en”路由。
    • 感谢您的回答。我会切换到你的实现
    • 更新的答案突出显示了 _locale 部分。
    猜你喜欢
    • 2015-07-19
    • 1970-01-01
    • 2016-06-19
    • 2017-02-21
    • 2015-12-26
    • 1970-01-01
    • 2018-09-17
    • 2015-04-12
    • 2013-12-19
    相关资源
    最近更新 更多