Переводы Symfony не работают

Я сделал следующий контрольный список:

  • создан файл перевода с учетом формата domain.lang.loader
  • очищенный кеш
  • проверено, что каталог языков создан в папке с кешем

Хотя в моем файле шаблона twig,

{{ 'message'|trans }}

никогда не переводится.

Где я могу посмотреть дальше, чтобы сделать перевод?

Есть ли вероятность, что Doctrine Translatable Extension, которое я использую, создает какие-то конфликты?

Ответ 1

Включили ли вы службу Translator в своем файле конфигурации?

framework:
    translator: { fallback: en }

Каталог языков создается в вашей папке с кешем независимо от того, включен ли ваш переводчик.

Попробовал ли вы перевести свой контроллер?

$translatedMessage = $this->get('translator')->trans('message');

Ответ 2

В Symfony 3.0 мне пришлось очистить кеш:

php bin/console cache:clear

Я вижу, вы уже это сделали, может быть, это помогает другим, как я.

Ответ 3

Попробуйте указать домен. Если вы не укажете домен по умолчанию, это сообщения.

{{ 'message'|trans({}, 'some_domain') }} 

Тогда переводы можно найти в

  • каталог корневого каталога ядра/каталог ресурсов/переводов;
  • корневой каталог ядра/Ресурсы/имя/перевод каталог;
  • каталог ресурсов/переводов/каталога.

Например some_domain.fr.yml. Последний шаг - настроить локаль. Вы можете получить текущую локаль от запроса с помощью $request->getLocale()

P.S. попробуйте rm -r app/cache, чтобы убедиться, что кеш удален.

Ответ 4

Я мог бы использовать один из переводов, но не другой, и не знал почему. Если у вас есть проблемы с переводами, прочтите это.

Во-первых, стандартный контрольный список:

  • Убедитесь, что вы включили и настроили переводчик.
  • Убедитесь, что перевод находится в правильном месте и следует правильное назначение имен (домен (сообщения по умолчанию).lang_code.file_format).
  • Очистить кеш с помощью команды php app/console cache:clear.
  • Попробуйте вручную вызвать $this->getRequest()->setLocale('en'); в контроллере, также вы можете попробовать использовать $this->get('translator')->trans('Some message'); непосредственно в своем контроллере.
  • Если он все еще не работает, убедитесь, что в вашем переведенном файле нет спецификации. Это был мой случай.

Следите за BOM в переведенном файле. Переводчик, который переводит yml файл, используемый UTF8, который в порядке, но редактор использовал литую спецификацию в начале файла. Это опасно, вероятно, из-за ошибки PHP UTF8 BOM, поскольку она добавляет несколько невидимых символов в первый раздел вашего файла.

Btw, отладка ваших переводов также может быть очень полезной.

Ответ 5

В соответствии с страницами документации по переводу Symfony, если вы не используете Service Container для ваших целей перевода, это простые шаги:

  • Включить и настроить Услуга перевода Symfony.

    • YAML

      framework:
          translator: { fallbacks: [en] }
      
    • PHP

      $container->loadFromExtension('framework', array(
          'translator' => array('fallbacks' => array('en')),
      ));
      
  • Абстрактные строки (т.е. "сообщения" ) путем их обертывания вызовами Переводчика ( "Основной перевод").

    public function indexAction()
    {
        $translated = $this->get('translator')->trans('Symfony is great');
    
        return new Response($translated);
    }
    
  • Создавать ресурсы/файлы перевода для каждого поддерживаемого языкового стандарта, которые переводят каждое сообщение в приложении.

    Symfony ищет файлы сообщений (т.е. переводы) в следующих местоположениях по умолчанию:

    • каталог app/Resources/translations;
    • каталог app/Resources/<bundle name>/translations;
    • каталог Resources/translations/ внутри любого пакета.

      Имя файла перевода

      Также важно имя файла переводов: каждый файл сообщения должен быть назван в соответствии со следующим путем: домен. locale. загрузчик. > (например, filename: navigation.en.xlf):

      • domain: необязательный способ организации сообщений в группы (например, admin, navigation или по умолчанию messages) - см. Использование доменов сообщений;

      • locale: языковой стандарт, для которого предназначены переводы (например, en_GB, en и т.д.); loader: как Symfony должен загружать и анализировать файл (например, xlf, php, yml и т.д.).

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

        • xlf: файл XLIFF;
        • php: файл PHP;
        • yml: YAML.

          Выбор того, какой загрузчик использовать, полностью зависит от вас и является вопросом вкуса. Рекомендуемая опция - использовать xlf для переводов.

  • Определить, установить и управлять пользовательской локалью для запроса и необязательно на весь сеанс пользователя.


Процесс перевода

Чтобы на самом деле перевести сообщение, Symfony использует простой процесс:

  • Определяется локаль текущего пользователя, который хранится в запросе;
  • Каталог (например, большая коллекция) переведенных сообщений загружается из ресурсов перевода, определенных для локали (например, fr_FR). Сообщения из резервной локали также загружаются и добавляются в каталог, если они еще не существуют. Конечным результатом является большой "словарь" переводов.
  • Если сообщение находится в каталоге, возвращается перевод. Если нет, переводчик возвращает исходное сообщение.

Ответ 6

Я уже могу ответить на ваши 2 вопроса:

1: вы можете посмотреть

https://github.com/symfony/symfony/blob/master/src/Symfony/Bridge/Twig/Extension/TranslationExtension.php#L97 https://github.com/symfony/symfony/blob/master/src/Symfony/Bundle/FrameworkBundle/Translation/Translator.php https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Translation/Translator.php#L174

2: Если вы говорите о расширениях доктрины gedmo или Knopabs DoctrineBehaviors, нет, это не так, как это конфликтует с переводчиком symfonys. Это 2 независимых фигуры.

Ответ 7

Просто столкнулся с той же проблемой и зафиксировал ее с помощью $this->get('translator')->setLocale('fr'); в действии контроллера. Я исправил это, добавив {_locale} в маршрут.