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', ]; }