简体   繁体   中英

Symfony - how switch and work with locale

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

  • how switch between languages (with language switcher in template) and how to keep an existing URL with just a change of language
  • how create URL with locale support

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

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

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM