Jan Sršeň
Jan Sršeň

Reputation: 1095

Symfony - how switch and work with locale

what is the best practise how to work with locale in the twig templates:

For example: I have 2 languages (ES and EN), default language is ES, for my home page I create 2 Route Anotations for / (for default language, in this case ES) and for /{_locale}/ (for other languages) in my Controller file.

And now I need to get locale parameter to my twig template to my URL, but only if I will not on my default language.

Manually rewrite URL works fine, but is there any easy way how add locale parameter to URL when I creating on my twig templates ?

The actual value of the variable locale can be passed to Controller, but is there any better way to got it in twig?

EDIT:

/**
 * @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>

I got

No route found for "GET /branches" i use this URL http://localhost:8080/en/branches (works OK) and http://localhost:8080/branches (ERROR) I must use something like this:

/**
 * @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');
}

URL generating with path is OK, but if I delete locale parameter from my URL in my browser I got this error.

Thanks a lot for any usefull advice

Upvotes: 0

Views: 4051

Answers (2)

Dmitrijs Čornobiļs
Dmitrijs Čornobiļs

Reputation: 953

  1. uncomment row translator: { fallbacks: ['%locale%'] } in config.yml
  2. declare needed variables in the same file:

    parameters:
        locale: en
        app.locales: en|lv|ru
    
  3. declare your needed route in routing.yml like this:

    contact_us:
        path: /{_locale}/contact
        defaults:
            _controller: 'AppBundle:Default:contact'
            _locale: '%app.locales%'
    
  4. use {{ path('another_route') }} without parameters, in case another_route declared with _locale placeholder. Also for single text translation use {{ 'home.title'|trans }}.

Upvotes: 2

Herr Nentu&#39;
Herr Nentu&#39;

Reputation: 1506

save your locale into a cookie and then inside your twig file create links like <a href="{{ path('your-path-name', {'locale': app.request.cookies.get('LOCALE_COOKIE')}) }}">

I am not sure if you will get an error or a null value (which will help you with your default locale in your controller route) if the cookie is not set but you should try it out.

Upvotes: 1

Related Questions