SymonSays
SymonSays

Reputation: 26

Locale Symfony2

I have a site with various routes including languages:

eg:

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

Here is my problem:
I create a language switcher in a twig template, and it works when I am on the ES page for example:

{% 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>

But it doesn't work when I am on the EN page because the _locale is not in the URL. My routes:

_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 }

Does anyone have an idea how to solve this issue?

Upvotes: 1

Views: 533

Answers (2)

pazulx
pazulx

Reputation: 2379

Did you try to simple create all links the same way, with merge({'_locale': 'xy'}), like this:

<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>

It should work.

[EDIT]:

And add en to route

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

Upvotes: 1

user997172
user997172

Reputation:

I use language switcher like this and it works very well:

{% 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>

After that you should define _locale in each route where the translation should be applied:

_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 }

Upvotes: 1

Related Questions