I'm trying to get Symfony 5.3's Translation Providers working with Crowdin in my app. I'm using ICU format, trying to translate from pseudo-language to English (from "user.button.add" to "Add User").
The connection up works fine, I can run bin/console translation:push crowdin --force
to get all my strings from the local file to appear in their user interface.
Then I go to Crowdin and translate a string, save the translation, approve the translation and quit the editor.
My problem starts when I try to update the local file via the Symfony CLI.
The command I'm using is bin/console translation:pull crowdin --intl-icu --domains=messages --locales=en
and I have three observations:
I have used localise.biz with some success, but the same set of steps does not work with Crowdin, which makes me think I might be missing something on the Crowdin side of things?
Any kick in the right direction would be appreciated. Thanks for reading.
I have the same problem right now. I have two files for my two locales:
header+intl-icu.en.xlf
header+intl-icu.uk.xlf
They were extracted by these commands:
php bin/console translation:extract --force en --clean
php bin/console translation:extract --force uk --clean
All content of these files translated at crowdin. When i pull translations from crowdin the header+intl-icu.uk.xlf with UK locale updated and all OK:
<source>label.login</source>
<target>Увійти</target>
But header+intl-icu.en.xlf file with EN locale just modified but source and target was the same like before:
<source>label.login</source>
<target>__label.login</target>
And I start to dig in...
Crowdin translations managed by
crowdin-translation-provider/CrowdinProvider.php
When we try to pull translations by the command
php bin/console translation:pull crowdin --force --intl-icu
This flow managed by the function in CrowdinProvider.php:
public function read(array $domains, array $locales): TranslatorBag
There is a peace of code that executes changing for translation files for different locales:
foreach ($locales as $locale) {
if ($locale !== $this->defaultLocale) {
$response = $this->exportProjectTranslations($locale, $fileId);
} else {
$response = $this->downloadSourceFile($fileId);
}
$responses[] = [$response, $locale, $domain];
}
So in my case if locale === uk used function
$this->exportProjectTranslations($locale, $fileId)
And if locale === en function
$this->downloadSourceFile($fileId);
If I remove this check for the defaultLocale locale all my translations from the crowdin start to work fine. And I don't know what to do next. Looks like it is a native behavior of crowdin-translation-provider.