Поставщик переводов Symfony 5.3+ Crowdin не обновляет локальный файл

Я пытаюсь заставить поставщиков переводов Symfony 5.3 работать с Crowdin в моем приложении. Я использую формат ICU, пытаюсь перевести с псевдоязыка на английский (с «user.button.add» на «Добавить пользователя»).

Подключение работает нормально, я могу запустить bin/console translation:push crowdin --force чтобы все мои строки из локального файла отображались в их пользовательском интерфейсе.

Затем я перехожу в Crowdin и перевожу строку, сохраняю перевод, утверждаю перевод и выхожу из редактора.

Моя проблема начинается, когда я пытаюсь обновить локальный файл через интерфейс командной строки Symfony.

Я использую команду bin/console translation:pull crowdin --intl-icu --domains=messages --locales=en и у меня есть три наблюдения:

  1. Когда я удаляю свой локальный файл перевода и запускаю команду, появляется новый файл, но с переводом Symfony по умолчанию (__user.button.add)
  2. Когда я запускаю команду с локальным файлом, он не обновляется переводами, присутствующими в Crowdin.
  3. Когда я захожу в Crowdin и пытаюсь экспортировать файл XLF вручную, он, как и ожидалось, содержит переводы.

Я использовал localise.biz с некоторым успехом, но тот же набор шагов не работает с Crowdin, что заставляет меня думать, что я могу что-то упустить на стороне Crowdin?

Приветствуется любой удар в правильном направлении. Спасибо за прочтение.

1 ответ

У меня сейчас такая же проблема. У меня есть два файла для двух моих языков:

      header+intl-icu.en.xlf
header+intl-icu.uk.xlf

Они были извлечены этими командами:

      php bin/console translation:extract --force en --clean
php bin/console translation:extract --force uk --clean

Все содержимое этих файлов переведено на crowdin. Когда я вытаскиваю переводы из crowdin header+intl-icu.uk.xlf с обновленной британской локалью, и все в порядке:

      <source>label.login</source>
<target>Увійти</target>

Но файл header+intl-icu.en.xlf с локалью EN только что изменен, но источник и цель остались такими же, как и раньше:

      <source>label.login</source>
<target>__label.login</target>

И начинаю копаться...

Переводы Crowdin под управлением

      crowdin-translation-provider/CrowdinProvider.php 

Когда пытаемся вытащить переводы командой

      php bin/console translation:pull crowdin --force --intl-icu

Этот поток управляется функцией в CrowdinProvider.php:

      public function read(array $domains, array $locales): TranslatorBag

Существует кусок кода, который выполняет изменение файлов перевода для разных локалей:

      foreach ($locales as $locale) {
      if ($locale !== $this->defaultLocale) {
         $response = $this->exportProjectTranslations($locale, $fileId);
      } else {
         $response = $this->downloadSourceFile($fileId);
      }

      $responses[] = [$response, $locale, $domain];
}

Итак, в моем случае, если локаль === uk использовала функцию

      $this->exportProjectTranslations($locale, $fileId)

И если локаль === функция en

      $this->downloadSourceFile($fileId);

Если я уберу эту проверку для локали defaultLocale, все мои переводы из крауддина начнут работать нормально. И я не знаю, что делать дальше. Похоже, это нативное поведение crowdin-translation-provider.

Другие вопросы по тегам