Поставщик переводов 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
и у меня есть три наблюдения:
- Когда я удаляю свой локальный файл перевода и запускаю команду, появляется новый файл, но с переводом Symfony по умолчанию (__user.button.add)
- Когда я запускаю команду с локальным файлом, он не обновляется переводами, присутствующими в Crowdin.
- Когда я захожу в 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.