Symfony 4 не переводит и всегда показывает английский по умолчанию - PullRequest
0 голосов
/ 31 мая 2018

Я использую Symfony 4 и установил систему перевода, используя

composer require symfony/translation

Я создал два файла в сообщениях /translations:

  • .ru.xlf
  • messages.es.xlf

Использование php bin/console debug:translation es Я также получаю правильный результат:

----------- ---------- ------ ---------------------- ------------------------------- 
 State       Domain     Id     Message Preview (es)   Fallback Message Preview (en)  
----------- ---------- ------ ---------------------- ------------------------------- 
             messages   test   Value ES               Value EN                       
----------- ---------- ------ ---------------------- ------------------------------- 

Записи выглядят так:

<trans-unit id="test">
    <source>test</source>
    <target>Value EN</target>
</trans-unit>

и это:

<trans-unit id="test">
    <source>test</source>
    <target>Value ES</target>
</trans-unit>

В моем контроллере я установил локаль, которая, кажется, работает нормально и также представлена ​​вшаблоны Twig:

public function index(Request $request, TranslatorInterface $translator)
{
    $request->setLocale('es');
    // prints 'es'
    print $request->getLocale();
    return $this->render();
}

А в Twig:

{# prints 'es' #}
{{ app.request.locale }}

Однако, когда я сейчас запускаю:

print $translator->trans('test');

или:

{{ 'test'|trans }}

Я всегда получаю Value EN, что кажется неправильным, как и должно быть Value ES.


Я запускаю Symfony 4.0 и очищаю кэш несколько раз - даже удаляювся папка.

translations.yml выглядит так:

framework:
    default_locale: '%locale%'
    translator:
        paths:
            - '%kernel.project_dir%/translations'
        fallbacks:
            - '%locale%'

А services.yml выглядит так:

parameters:
    locale: 'en'
    locales: en|de|es

Что яздесь не хватает?

1 Ответ

0 голосов
/ 31 мая 2018

Из официальной документации

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

И затем (это часть, которая объясняет поведение вашего кода)

Установка языкового стандарта с помощью $ request-> setLocale () в контроллереслишком поздно, чтобы повлиять на переводчика.Установите языковой стандарт через прослушиватель (как выше), URL (см. Далее) или вызовите setLocale () непосредственно в службе переводчиков.

...