мультиязычность symfony 3 (Internationalization in Symfony 3)

Как я реализовывал мультиязычность на проекте Symfony 3. (i18n  = Internationalization in Symfony 3 )

вот код контроллера.

/**
 * @Route("/{_locale}",  requirements={"url" = ".*\/$"}, name="homepage", defaults={"_locale" = "ru" })
 */
public function indexAction(Request $request)
{

    // генерим текущую ссылку с языками
    if (str_replace(["ru", "de", "en"], "", $_SERVER['REQUEST_URI'])) {
        $freshlink = str_replace(["ru", "de", "en"], "", $_SERVER['REQUEST_URI']);
    } else {
        $freshlink = $_SERVER['REQUEST_URI'];
    }
    $freshlink = preg_replace("#/$#", "", $freshlink);
    $linken = "/en" . $freshlink;
    $linkde = "/de" . $freshlink;
    $linkru = "/ru" . $freshlink;
    $locale = $request->getLocale();
    // ***  генерим текущую ссылку с языками  ***
    return $this->render('default/index.html.twig', [
        'base_dir' => realpath($this->getParameter('kernel.project_dir')).DIRECTORY_SEPARATOR,
        'linken' => $linken,
        'linkde' => $linkde,
        'linkru' => $linkru,
        'locale' => $locale,
    ]);
}

что бы работали случаи когда на конце стоит слеш, то нужно добавить этот контроллер

 

<?php
namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

class RedirectingController extends Controller
{

    /**
     * @Route("/{url}", name="remove_trailing_slash",
     *     requirements={"url" = ".*\/$"}, methods={"GET"})
     */
    public function removeTrailingSlashAction(Request $request)
    {
        $pathInfo = $request->getPathInfo();
        $requestUri = $request->getRequestUri();

        $url = str_replace($pathInfo, rtrim($pathInfo, ' /'), $requestUri);

        return $this->redirect($url, 301);
    }
}

Теперь остановимся на вьюхе:

что бы было 3 языка: немецкий, русский и английский, то нужно добавить переключалку языка.

<ul class="dropdown-menu dropdown-menu-right">
    <li><a href="{{ linken }}"><i
                    class="{% if locale == 'en' %} icon-checkbox-checked2  {% else %} icon-checkbox-unchecked2 {% endif %}"></i>
            English</a></li>
    <li><a href="{{ linkde }}"><i
                    class="{% if locale == "de" %} icon-checkbox-checked2  {% else %} icon-checkbox-unchecked2 {% endif %}"></i>
            Deutsch</a></li>
    <li><a href="{{ linkru }}"><i
                    class="{% if locale == "ru" %} icon-checkbox-checked2  {% else %} icon-checkbox-unchecked2 {% endif %}"></i>
            Русский</a></li>
</ul>

не забываем что в Symfony i18n что бы заработало, надо прописать в config.yml

parameters:
    locale: en

translator: { fallbacks: [en] }

а так же создать файлы переводов с таким содержаинем

это немецкая версия:

<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
 <file source-language="en" datatype="plaintext" original="file.ext">
 <body>
 <trans-unit id="symfony_is_great">
 <source>symfony is great</source>
 <target>Symfony ist gut</target>
 </trans-unit>
 <trans-unit id="concert">
 <source>concert</source>
 <target>Konzert</target>
 </trans-unit>
 </body>
 </file>
</xliff>

Английская

<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
 <file source-language="en" target-language="en" datatype="plaintext" original="file.ext">
 <body>
 <trans-unit id="symfony_is_great">
 <source>symfony is great</source>
 <target>symfony is great</target>
 </trans-unit>
 <trans-unit id="concert">
 <source>concert</source>
 <target>concert</target>
 </trans-unit>
 </body>
 </file>
</xliff>

Русская:

<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
 <file source-language="en" datatype="plaintext" original="file.ext">
 <body>
 <trans-unit id="symfony_is_great">
 <source>symfony is great</source>
 <target>Симфони прекрасна</target>
 </trans-unit>
 <trans-unit id="concert">
 <source>concert</source>
 <target>Концерт</target>
 </trans-unit>
 </body>
 </file>
</xliff>

 

Вот так у меня расположены файлы переводов:

расположение файлов переводов
расположение файлов переводов

Во вьюхе используем так:

{% trans %} symfony is great  {% endtrans %}

P.s.

 

Что бы  в phpstorm можно было нормально редакитровать и форматировать файлы перевода с разрешением XLF, то нужно  в настройках добавить формат к существующему поведению XML :

XLF phpstorm  add
XLF phpstorm add