【问题标题】:Locale Symfony2语言环境 Symfony2
【发布时间】:2014-04-24 21:06:59
【问题描述】:

我有一个包含多种语言的网站:

例如:

/aboutus (english no language in the url)
/es/aboutus
/nl/aboutus

这是我的问题:
我在 twig 模板中创建了一个语言切换器,例如,当我在 ES 页面上时它可以工作:

{% set lng = '/' ~ app.request.locale ~ '/' %}

<li>
  <a href="{{ path(app.request.get('_route'), app.request.get('_route_params'))|replace({ (lng): '/'}) }}">
    <i class="cus-gb"></i> 
    English
  </a>
</li>
<li>
  <a href="{{ path(app.request.get('_route'), app.request.get('_route_params')|merge({'_locale': 'es'})) }}">
    <i class="cus-es"></i> 
    Spanish
  </a>
</li>
<li>
  <a href="{{ path(app.request.get('_route'), app.request.get('_route_params')|merge({'_locale': 'nl'})) }}">
    <i class="cus-nl"></i> 
    Dutch
  </a>
</li>

但是当我在 EN 页面上时它不起作用,因为_locale 不在 URL 中。我的路线:

_event_translate:
  path:  /{_locale}/{nameid}
  defaults: { _controller: Bundle:Event:index, _locale: en }
  requirements: 
    _locale: es|nl 
_event_default:
  path:  /{nameid}
  defaults: { _controller: Bundle:Event:index, _locale: en }

有人知道如何解决这个问题吗?

【问题讨论】:

    标签: symfony twig


    【解决方案1】:

    我使用这样的语言切换器,效果很好:

    {% set requestParams = app.request.attributes.get('_route_params') %}
    {% set requestRoute = app.request.attributes.get('_route') %}
    {% set locale = app.request.locale %}
    
    <div class="language-icons">
        <ul>
            <li>
                <a href="{{ path(requestRoute, requestParams|merge({'_locale' : 'en'})) }}">en</a>
            </li>
            <li>
                <a href="{{ path(requestRoute, requestParams|merge({'_locale' : 'fr'})) }}">fr</a>
            </li>
            <li>
                <a href="{{ path(requestRoute, requestParams|merge({'_locale' : 'ru'})) }}">ru</a>
            </li>
        </ul>
    </div>
    

    之后,您应该在应该应用翻译的每个路由中定义_locale

    _event_translate:
      path:  /{_locale}/{nameid}
      defaults: { _controller: Bundle:Event:index, _locale: en }
      requirements: 
        _locale: es|nl 
    _event_default:
      path:  /{_locale}/{nameid}
      defaults: { _controller: Bundle:Event:index, _locale: en }
    

    【讨论】:

    • 谢谢,不幸的是它没有工作,我收到一条错误消息:code在渲染模板期间抛出异常(路由“_event_translate”的“参数“_locale”必须匹配"es|nl" ("en" given) 生成对应的URL。")code
    • @SymonSays 抛出异常是因为您的_event_translate 路径requirements: _locale: es|nl 中有条件。您应该删除它并改用备用语言环境symfony.com/doc/current/book/…
    • 谢谢,我确实添加了一个本地后备,不幸的是,删除要求并没有起到作用。主要问题是 /en/ get 已添加到 url 中,对于英语,我希望将其删除。
    【解决方案2】:

    您是否尝试过以相同的方式简单地创建所有链接,使用 merge({'_locale': 'xy'}),如下所示:

    <li><a href="{{ path(app.request.get('_route'), app.request.get('_route_params')|merge({'_locale': 'en'})) }}"><i class="cus-gb"></i> English</a></li>
    <li><a href="{{ path(app.request.get('_route'), app.request.get('_route_params')|merge({'_locale': 'es'})) }}"><i class="cus-es"></i> Spanish</a></li>
    <li><a href="{{ path(app.request.get('_route'), app.request.get('_route_params')|merge({'_locale': 'nl'})) }}"><i class="cus-nl"></i> Dutch</a></li>
    

    它应该可以工作。

    [编辑]:

    并在路由中添加en

    _event_translate:
      path:  /{_locale}/{nameid}
      defaults: { _controller: Bundle:Event:index, _locale: en }
      requirements: 
        _locale: es|nl|en
    

    【讨论】:

    • 不幸的是,这不起作用,因为我的路线没有设置为拾取 en 作为一种语言,我想使用默认 en 语言,只有另一种语言使用本地参数。
    • 如果您添加en 并设置_locale: en,则URL 区域设置将仅与esnl 语言一起出现
    • 谢谢,但在菜单中仍然显示 /en/,我想为英文页面删除它。此外,当我访问像 / 这样的英文页面时,菜单在通过时没有给我正确的语言网址:_event_default:
    猜你喜欢
    • 2016-01-07
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 2011-12-01
    • 1970-01-01
    相关资源
    最近更新 更多