diff --git a/src/Symfony/Component/Translation/Bridge/Crowdin/CrowdinProvider.php b/src/Symfony/Component/Translation/Bridge/Crowdin/CrowdinProvider.php
index 4d505de0ebf73..a865de1202076 100644
--- a/src/Symfony/Component/Translation/Bridge/Crowdin/CrowdinProvider.php
+++ b/src/Symfony/Component/Translation/Bridge/Crowdin/CrowdinProvider.php
@@ -278,7 +278,7 @@ private function uploadTranslations(int $fileId, string $domain, string $content
* @see https://support.crowdin.com/api/v2/#operation/api.projects.translations.postOnLanguage (Crowdin API)
* @see https://support.crowdin.com/enterprise/api/#operation/api.projects.translations.postOnLanguage (Crowdin Enterprise API)
*/
- return $this->client->request('POST', 'translations/'.$locale, [
+ return $this->client->request('POST', 'translations/'.str_replace('_', '-', $locale), [
'json' => [
'storageId' => $storageId,
'fileId' => $fileId,
@@ -294,7 +294,7 @@ private function exportProjectTranslations(string $languageId, int $fileId): Res
*/
return $this->client->request('POST', 'translations/exports', [
'json' => [
- 'targetLanguageId' => $languageId,
+ 'targetLanguageId' => str_replace('_', '-', $languageId),
'fileIds' => [$fileId],
],
]);
diff --git a/src/Symfony/Component/Translation/Bridge/Crowdin/Tests/CrowdinProviderTest.php b/src/Symfony/Component/Translation/Bridge/Crowdin/Tests/CrowdinProviderTest.php
index aa8624dd18913..2fd4d33f5cc5e 100644
--- a/src/Symfony/Component/Translation/Bridge/Crowdin/Tests/CrowdinProviderTest.php
+++ b/src/Symfony/Component/Translation/Bridge/Crowdin/Tests/CrowdinProviderTest.php
@@ -217,7 +217,10 @@ public function testCompleteWriteProcessUpdateFiles()
$provider->write($translatorBag);
}
- public function testCompleteWriteProcessAddFileAndUploadTranslations()
+ /**
+ * @dataProvider getResponsesForProcessAddFileAndUploadTranslations
+ */
+ public function testCompleteWriteProcessAddFileAndUploadTranslations(TranslatorBag $translatorBag, string $expectedLocale, string $expectedMessagesTranslationsContent)
{
$this->xliffFileDumper = new XliffFileDumper();
@@ -237,24 +240,6 @@ public function testCompleteWriteProcessAddFileAndUploadTranslations()
-XLIFF;
-
- $expectedMessagesTranslationsContent = <<<'XLIFF'
-
-
-
-
-
-
- a
- trans_fr_a
-
-
-
-
-
XLIFF;
$responses = [
@@ -296,23 +281,15 @@ public function testCompleteWriteProcessAddFileAndUploadTranslations()
return new MockResponse(json_encode(['data' => ['id' => 19]]), ['http_code' => 201]);
},
- 'UploadTranslations' => function (string $method, string $url, array $options = []): ResponseInterface {
+ 'UploadTranslations' => function (string $method, string $url, array $options = []) use ($expectedLocale): ResponseInterface {
$this->assertSame('POST', $method);
- $this->assertSame('https://api.crowdin.com/api/v2/projects/1/translations/fr', $url);
+ $this->assertSame(sprintf('https://api.crowdin.com/api/v2/projects/1/translations/%s', $expectedLocale), $url);
$this->assertSame('{"storageId":19,"fileId":12}', $options['body']);
return new MockResponse();
},
];
- $translatorBag = new TranslatorBag();
- $translatorBag->addCatalogue(new MessageCatalogue('en', [
- 'messages' => ['a' => 'trans_en_a'],
- ]));
- $translatorBag->addCatalogue(new MessageCatalogue('fr', [
- 'messages' => ['a' => 'trans_fr_a'],
- ]));
-
$provider = $this->createProvider((new MockHttpClient($responses))->withOptions([
'base_uri' => 'https://api.crowdin.com/api/v2/projects/1/',
'auth_bearer' => 'API_TOKEN',
@@ -321,10 +298,69 @@ public function testCompleteWriteProcessAddFileAndUploadTranslations()
$provider->write($translatorBag);
}
+ public function getResponsesForProcessAddFileAndUploadTranslations(): \Generator
+ {
+ $arrayLoader = new ArrayLoader();
+
+ $translatorBagFr = new TranslatorBag();
+ $translatorBagFr->addCatalogue($arrayLoader->load([
+ 'a' => 'trans_en_a',
+ ], 'en'));
+ $translatorBagFr->addCatalogue($arrayLoader->load([
+ 'a' => 'trans_fr_a',
+ ], 'fr'));
+
+ yield [$translatorBagFr, 'fr', <<<'XLIFF'
+
+
+
+
+
+
+ a
+ trans_fr_a
+
+
+
+
+
+XLIFF
+ ];
+
+ $translatorBagEnGb = new TranslatorBag();
+ $translatorBagEnGb->addCatalogue($arrayLoader->load([
+ 'a' => 'trans_en_a',
+ ], 'en'));
+ $translatorBagEnGb->addCatalogue($arrayLoader->load([
+ 'a' => 'trans_en_gb_a',
+ ], 'en_GB'));
+
+ yield [$translatorBagEnGb, 'en-GB', <<<'XLIFF'
+
+
+
+
+
+
+ a
+ trans_en_gb_a
+
+
+
+
+
+XLIFF
+ ];
+ }
+
/**
* @dataProvider getResponsesForOneLocaleAndOneDomain
*/
- public function testReadForOneLocaleAndOneDomain(string $locale, string $domain, string $responseContent, TranslatorBag $expectedTranslatorBag)
+ public function testReadForOneLocaleAndOneDomain(string $locale, string $domain, string $responseContent, TranslatorBag $expectedTranslatorBag, string $expectedTargetLanguageId)
{
$responses = [
'listFiles' => function (string $method, string $url): ResponseInterface {
@@ -340,10 +376,10 @@ public function testReadForOneLocaleAndOneDomain(string $locale, string $domain,
],
]));
},
- 'exportProjectTranslations' => function (string $method, string $url, array $options = []): ResponseInterface {
+ 'exportProjectTranslations' => function (string $method, string $url, array $options = []) use ($expectedTargetLanguageId): ResponseInterface {
$this->assertSame('POST', $method);
$this->assertSame('https://api.crowdin.com/api/v2/projects/1/translations/exports', $url);
- $this->assertSame('{"targetLanguageId":"fr","fileIds":[12]}', $options['body']);
+ $this->assertSame(sprintf('{"targetLanguageId":"%s","fileIds":[12]}', $expectedTargetLanguageId), $options['body']);
return new MockResponse(json_encode(['data' => ['url' => 'https://file.url']]));
},
@@ -401,7 +437,37 @@ public function getResponsesForOneLocaleAndOneDomain(): \Generator
XLIFF
,
- $expectedTranslatorBagFr,
+ $expectedTranslatorBagFr, 'fr',
+ ];
+
+ $expectedTranslatorBagEnUs = new TranslatorBag();
+ $expectedTranslatorBagEnUs->addCatalogue($arrayLoader->load([
+ 'index.hello' => 'Hello',
+ 'index.greetings' => 'Welcome, {firstname}!',
+ ], 'en_GB'));
+
+ yield ['en_GB', 'messages', <<<'XLIFF'
+
+
+
+
+
+
+ index.hello
+ Hello
+
+
+ index.greetings
+ Welcome, {firstname}!
+
+
+
+
+XLIFF
+ ,
+ $expectedTranslatorBagEnUs, 'en-GB',
];
}