diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index fff70fba75422..aaea5b07a7ff7 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -172,7 +172,6 @@ use Symfony\Component\Translation\Bridge\Crowdin\CrowdinProviderFactory; use Symfony\Component\Translation\Bridge\Loco\LocoProviderFactory; use Symfony\Component\Translation\Bridge\Lokalise\LokaliseProviderFactory; -use Symfony\Component\Translation\Bridge\PoEditor\PoEditorProviderFactory; use Symfony\Component\Translation\Command\XliffLintCommand as BaseXliffLintCommand; use Symfony\Component\Translation\PseudoLocalizationTranslator; use Symfony\Component\Translation\Translator; @@ -1345,15 +1344,12 @@ private function registerTranslatorConfiguration(array $config, ContainerBuilder CrowdinProviderFactory::class => 'translation.provider_factory.crowdin', LocoProviderFactory::class => 'translation.provider_factory.loco', LokaliseProviderFactory::class => 'translation.provider_factory.lokalise', - PoEditorProviderFactory::class => 'translation.provider_factory.poeditor', ]; $parentPackages = ['symfony/framework-bundle', 'symfony/translation', 'symfony/http-client']; foreach ($classToServices as $class => $service) { - switch ($package = substr($service, \strlen('translation.provider_factory.'))) { - case 'poeditor': $package = 'po-editor'; break; - } + $package = substr($service, \strlen('translation.provider_factory.')); if (!$container->hasDefinition('http_client') || !ContainerBuilder::willBeAvailable(sprintf('symfony/%s-translation-provider', $package), $class, $parentPackages)) { $container->removeDefinition($service); diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation_providers.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation_providers.php index 45f8e6363af9f..cd140f077c172 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation_providers.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation_providers.php @@ -14,7 +14,6 @@ use Symfony\Component\Translation\Bridge\Crowdin\CrowdinProviderFactory; use Symfony\Component\Translation\Bridge\Loco\LocoProviderFactory; use Symfony\Component\Translation\Bridge\Lokalise\LokaliseProviderFactory; -use Symfony\Component\Translation\Bridge\PoEditor\PoEditorProviderFactory; use Symfony\Component\Translation\Provider\NullProviderFactory; use Symfony\Component\Translation\Provider\TranslationProviderCollection; use Symfony\Component\Translation\Provider\TranslationProviderCollectionFactory; @@ -63,14 +62,5 @@ service('translation.loader.xliff'), ]) ->tag('translation.provider_factory') - - ->set('translation.provider_factory.poeditor', PoEditorProviderFactory::class) - ->args([ - service('http_client'), - service('logger'), - param('kernel.default_locale'), - service('translation.loader.xliff'), - ]) - ->tag('translation.provider_factory') ; }; diff --git a/src/Symfony/Component/Translation/Bridge/PoEditor/.gitattributes b/src/Symfony/Component/Translation/Bridge/PoEditor/.gitattributes deleted file mode 100644 index 84c7add058fb5..0000000000000 --- a/src/Symfony/Component/Translation/Bridge/PoEditor/.gitattributes +++ /dev/null @@ -1,4 +0,0 @@ -/Tests export-ignore -/phpunit.xml.dist export-ignore -/.gitattributes export-ignore -/.gitignore export-ignore diff --git a/src/Symfony/Component/Translation/Bridge/PoEditor/.gitignore b/src/Symfony/Component/Translation/Bridge/PoEditor/.gitignore deleted file mode 100644 index c49a5d8df5c65..0000000000000 --- a/src/Symfony/Component/Translation/Bridge/PoEditor/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -vendor/ -composer.lock -phpunit.xml diff --git a/src/Symfony/Component/Translation/Bridge/PoEditor/CHANGELOG.md b/src/Symfony/Component/Translation/Bridge/PoEditor/CHANGELOG.md deleted file mode 100644 index bbb9efcaeb29b..0000000000000 --- a/src/Symfony/Component/Translation/Bridge/PoEditor/CHANGELOG.md +++ /dev/null @@ -1,7 +0,0 @@ -CHANGELOG -========= - -5.3 ---- - - * Create the bridge diff --git a/src/Symfony/Component/Translation/Bridge/PoEditor/LICENSE b/src/Symfony/Component/Translation/Bridge/PoEditor/LICENSE deleted file mode 100644 index efb17f98e7dd3..0000000000000 --- a/src/Symfony/Component/Translation/Bridge/PoEditor/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2021 Fabien Potencier - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/src/Symfony/Component/Translation/Bridge/PoEditor/PoEditorHttpClient.php b/src/Symfony/Component/Translation/Bridge/PoEditor/PoEditorHttpClient.php deleted file mode 100644 index 110020815f297..0000000000000 --- a/src/Symfony/Component/Translation/Bridge/PoEditor/PoEditorHttpClient.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Bridge\PoEditor; - -use Symfony\Component\HttpClient\DecoratorTrait; -use Symfony\Component\HttpClient\ScopingHttpClient; -use Symfony\Contracts\HttpClient\HttpClientInterface; -use Symfony\Contracts\HttpClient\ResponseInterface; - -final class PoEditorHttpClient implements HttpClientInterface -{ - use DecoratorTrait; - - public function request(string $method, string $url, array $options = []): ResponseInterface - { - if (isset($options['poeditor_credentials'])) { - if ('POST' === $method) { - $options['body'] = $options['poeditor_credentials'] + $options['body']; - } - unset($options['poeditor_credentials']); - } - - return $this->client->request($method, $url, $options); - } - - public static function create(HttpClientInterface $client, string $baseUri, string $apiToken, string $projectId): HttpClientInterface - { - return ScopingHttpClient::forBaseUri(new self($client), $baseUri, [ - 'poeditor_credentials' => [ - 'api_token' => $apiToken, - 'id' => $projectId, - ], - ]); - } -} diff --git a/src/Symfony/Component/Translation/Bridge/PoEditor/PoEditorProvider.php b/src/Symfony/Component/Translation/Bridge/PoEditor/PoEditorProvider.php deleted file mode 100644 index 5249e95307d8e..0000000000000 --- a/src/Symfony/Component/Translation/Bridge/PoEditor/PoEditorProvider.php +++ /dev/null @@ -1,214 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Bridge\PoEditor; - -use Psr\Log\LoggerInterface; -use Symfony\Component\Translation\Exception\ProviderException; -use Symfony\Component\Translation\Loader\LoaderInterface; -use Symfony\Component\Translation\Provider\ProviderInterface; -use Symfony\Component\Translation\TranslatorBag; -use Symfony\Component\Translation\TranslatorBagInterface; -use Symfony\Contracts\HttpClient\HttpClientInterface; - -/** - * @author Mathieu Santostefano - * - * In PoEditor: - * * Terms refer to Symfony's translation keys; - * * Translations refer to Symfony's translated messages; - * * Context fields refer to Symfony's translation domains - * - * PoEditor's API always returns 200 status code, even in case of failure. - * - * @experimental in 5.3 - */ -final class PoEditorProvider implements ProviderInterface -{ - private $client; - private $loader; - private $logger; - private $defaultLocale; - private $endpoint; - - public function __construct(HttpClientInterface $client, LoaderInterface $loader, LoggerInterface $logger, string $defaultLocale, string $endpoint) - { - $this->client = $client; - $this->loader = $loader; - $this->logger = $logger; - $this->defaultLocale = $defaultLocale; - $this->endpoint = $endpoint; - } - - public function __toString(): string - { - return sprintf('poeditor://%s', $this->endpoint); - } - - public function write(TranslatorBagInterface $translatorBag): void - { - $defaultCatalogue = $translatorBag->getCatalogue($this->defaultLocale); - - if (!$defaultCatalogue) { - $defaultCatalogue = $translatorBag->getCatalogues()[0]; - } - - $terms = $translationsToAdd = []; - foreach ($defaultCatalogue->all() as $domain => $messages) { - foreach ($messages as $id => $message) { - $terms[] = [ - 'term' => $id, - 'reference' => $id, - // tags field is mandatory to export all translations in read method. - 'tags' => [$domain], - 'context' => $domain, - ]; - } - } - $this->addTerms($terms); - - foreach ($translatorBag->getCatalogues() as $catalogue) { - $locale = $catalogue->getLocale(); - foreach ($catalogue->all() as $domain => $messages) { - foreach ($messages as $id => $message) { - $translationsToAdd[$locale][] = [ - 'term' => $id, - 'context' => $domain, - 'translation' => [ - 'content' => $message, - ], - ]; - } - } - } - - $this->addTranslations($translationsToAdd); - } - - public function read(array $domains, array $locales): TranslatorBag - { - $translatorBag = new TranslatorBag(); - $exportResponses = $downloadResponses = []; - - foreach ($locales as $locale) { - foreach ($domains as $domain) { - $response = $this->client->request('POST', 'projects/export', [ - 'body' => [ - 'language' => $locale, - 'type' => 'xlf', - 'filters' => json_encode(['translated']), - 'tags' => json_encode([$domain]), - ], - ]); - $exportResponses[] = [$response, $locale, $domain]; - } - } - - foreach ($exportResponses as [$response, $locale, $domain]) { - $responseContent = $response->toArray(false); - - if (200 !== $response->getStatusCode() || '200' !== (string) $responseContent['response']['code']) { - $this->logger->error('Unable to read the PoEditor response: '.$response->getContent(false)); - continue; - } - - $fileUrl = $responseContent['result']['url']; - $downloadResponses[] = [$this->client->request('GET', $fileUrl), $locale, $domain, $fileUrl]; - } - - foreach ($downloadResponses as [$response, $locale, $domain, $fileUrl]) { - $responseContent = $response->getContent(false); - - if (200 !== $response->getStatusCode()) { - $this->logger->error('Unable to download the PoEditor exported file: '.$responseContent); - continue; - } - - if (!$responseContent) { - $this->logger->error(sprintf('The exported file "%s" from PoEditor is empty.', $fileUrl)); - continue; - } - - $translatorBag->addCatalogue($this->loader->load($responseContent, $locale, $domain)); - } - - return $translatorBag; - } - - public function delete(TranslatorBagInterface $translatorBag): void - { - $deletedIds = $termsToDelete = []; - - foreach ($translatorBag->getCatalogues() as $catalogue) { - foreach ($catalogue->all() as $domain => $messages) { - foreach ($messages as $id => $message) { - if (\array_key_exists($domain, $deletedIds) && \in_array($id, $deletedIds[$domain], true)) { - continue; - } - - $deletedIds[$domain][] = $id; - $termsToDelete[] = [ - 'term' => $id, - 'context' => $domain, - ]; - } - } - } - - $this->deleteTerms($termsToDelete); - } - - private function addTerms(array $terms): void - { - $response = $this->client->request('POST', 'terms/add', [ - 'body' => [ - 'data' => json_encode($terms), - ], - ]); - - if (200 !== $response->getStatusCode() || '200' !== (string) $response->toArray(false)['response']['code']) { - throw new ProviderException(sprintf('Unable to add new translation keys to PoEditor: (status code: "%s") "%s".', $response->getStatusCode(), $response->getContent(false)), $response); - } - } - - private function addTranslations(array $translationsPerLocale): void - { - $responses = []; - - foreach ($translationsPerLocale as $locale => $translations) { - $responses = $this->client->request('POST', 'translations/add', [ - 'body' => [ - 'language' => $locale, - 'data' => json_encode($translations), - ], - ]); - } - - foreach ($responses as $response) { - if (200 !== $response->getStatusCode() || '200' !== (string) $response->toArray(false)['response']['code']) { - $this->logger->error(sprintf('Unable to add translation messages to PoEditor: "%s".', $response->getContent(false))); - } - } - } - - private function deleteTerms(array $ids): void - { - $response = $this->client->request('POST', 'terms/delete', [ - 'body' => [ - 'data' => json_encode($ids), - ], - ]); - - if (200 !== $response->getStatusCode() || '200' !== (string) $response->toArray(false)['response']['code']) { - throw new ProviderException(sprintf('Unable to delete translation keys on PoEditor: "%s".', $response->getContent(false)), $response); - } - } -} diff --git a/src/Symfony/Component/Translation/Bridge/PoEditor/PoEditorProviderFactory.php b/src/Symfony/Component/Translation/Bridge/PoEditor/PoEditorProviderFactory.php deleted file mode 100644 index 07ea5ddfab3ed..0000000000000 --- a/src/Symfony/Component/Translation/Bridge/PoEditor/PoEditorProviderFactory.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Translation\Bridge\PoEditor; - -use Psr\Log\LoggerInterface; -use Symfony\Component\Translation\Exception\UnsupportedSchemeException; -use Symfony\Component\Translation\Loader\LoaderInterface; -use Symfony\Component\Translation\Provider\AbstractProviderFactory; -use Symfony\Component\Translation\Provider\Dsn; -use Symfony\Component\Translation\Provider\ProviderInterface; -use Symfony\Contracts\HttpClient\HttpClientInterface; - -/** - * @author Mathieu Santostefano - * - * @experimental in 5.3 - */ -final class PoEditorProviderFactory extends AbstractProviderFactory -{ - private const HOST = 'api.poeditor.com'; - - private $client; - private $logger; - private $defaultLocale; - private $loader; - - public function __construct(HttpClientInterface $client, LoggerInterface $logger, string $defaultLocale, LoaderInterface $loader) - { - $this->client = $client; - $this->logger = $logger; - $this->defaultLocale = $defaultLocale; - $this->loader = $loader; - } - - /** - * @return PoEditorProvider - */ - public function create(Dsn $dsn): ProviderInterface - { - if ('poeditor' !== $dsn->getScheme()) { - throw new UnsupportedSchemeException($dsn, 'poeditor', $this->getSupportedSchemes()); - } - - $endpoint = 'default' === $dsn->getHost() ? self::HOST : $dsn->getHost(); - $endpoint .= $dsn->getPort() ? ':'.$dsn->getPort() : ''; - - $client = PoEditorHttpClient::create($this->client, 'https://'.$endpoint.'/v2/', $this->getPassword($dsn), $this->getUser($dsn)); - - return new PoEditorProvider($client, $this->loader, $this->logger, $this->defaultLocale, $endpoint); - } - - protected function getSupportedSchemes(): array - { - return ['poeditor']; - } -} diff --git a/src/Symfony/Component/Translation/Bridge/PoEditor/README.md b/src/Symfony/Component/Translation/Bridge/PoEditor/README.md deleted file mode 100644 index 9622a5d4779d4..0000000000000 --- a/src/Symfony/Component/Translation/Bridge/PoEditor/README.md +++ /dev/null @@ -1,28 +0,0 @@ -PoEditor Translation Provider -============================= - -Provides PoEditor integration for Symfony Translation. - -DSN example ------------ - -``` -// .env file -POEDITOR_DSN=poeditor://PROJECT_ID:API_KEY@default -``` - -where: - - `PROJECT_ID` is your PoEditor Project ID - - `API_KEY` is your PoEditor API key - -Go to the Project in PoEditor to find the Project ID in the url. - -[Generate an API key on PoEditor](https://poeditor.com/account/api) - -Resources ---------- - - * [Contributing](https://symfony.com/doc/current/contributing/index.html) - * [Report issues](https://github.com/symfony/symfony/issues) and - [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/src/Symfony/Component/Translation/Bridge/PoEditor/Tests/PoEditorProviderFactoryTest.php b/src/Symfony/Component/Translation/Bridge/PoEditor/Tests/PoEditorProviderFactoryTest.php deleted file mode 100644 index b0e6b5f41f876..0000000000000 --- a/src/Symfony/Component/Translation/Bridge/PoEditor/Tests/PoEditorProviderFactoryTest.php +++ /dev/null @@ -1,39 +0,0 @@ -getClient(), $this->getLogger(), $this->getDefaultLocale(), $this->getLoader()); - } -} diff --git a/src/Symfony/Component/Translation/Bridge/PoEditor/Tests/PoEditorProviderTest.php b/src/Symfony/Component/Translation/Bridge/PoEditor/Tests/PoEditorProviderTest.php deleted file mode 100644 index 708586c385a85..0000000000000 --- a/src/Symfony/Component/Translation/Bridge/PoEditor/Tests/PoEditorProviderTest.php +++ /dev/null @@ -1,511 +0,0 @@ -getClient(), 'https://poeditor', 'API_KEY', 'PROJECT_ID'); - - yield [ - $this->createProvider($client, $this->getLoader(), $this->getLogger(), $this->getDefaultLocale(), 'api.poeditor.com'), - 'poeditor://api.poeditor.com', - ]; - - yield [ - $this->createProvider($client, $this->getLoader(), $this->getLogger(), $this->getDefaultLocale(), 'example.com'), - 'poeditor://example.com', - ]; - - yield [ - $this->createProvider($client, $this->getLoader(), $this->getLogger(), $this->getDefaultLocale(), 'example.com:99'), - 'poeditor://example.com:99', - ]; - } - - public function testCompleteWriteProcess() - { - $successResponse = new MockResponse(json_encode([ - 'response' => [ - 'status' => 'success', - 'code' => '200', - 'message' => 'OK', - ], - ])); - - $responses = [ - 'addTerms' => function (string $method, string $url, array $options = []) use ($successResponse): MockResponse { - $this->assertSame('POST', $method); - $this->assertSame(http_build_query([ - 'api_token' => 'API_KEY', - 'id' => 'PROJECT_ID', - 'data' => json_encode([ - [ - 'term' => 'a', - 'reference' => 'a', - 'tags' => ['messages'], - 'context' => 'messages', - ], - [ - 'term' => 'post.num_comments', - 'reference' => 'post.num_comments', - 'tags' => ['validators'], - 'context' => 'validators', - ], - ]), - ]), $options['body']); - - return $successResponse; - }, - 'addTranslationsEn' => function (string $method, string $url, array $options = []) use ($successResponse): MockResponse { - $this->assertSame('POST', $method); - $this->assertSame(http_build_query([ - 'api_token' => 'API_KEY', - 'id' => 'PROJECT_ID', - 'language' => 'en', - 'data' => json_encode([ - [ - 'term' => 'a', - 'context' => 'messages', - 'translation' => ['content' => 'trans_en_a'], - ], - [ - 'term' => 'post.num_comments', - 'context' => 'validators', - 'translation' => ['content' => '{count, plural, one {# comment} other {# comments}}'], - ], - ]), - ]), $options['body']); - - return $successResponse; - }, - 'addTranslationsFr' => function (string $method, string $url, array $options = []) use ($successResponse): MockResponse { - $this->assertSame('POST', $method); - $this->assertSame(http_build_query([ - 'api_token' => 'API_KEY', - 'id' => 'PROJECT_ID', - 'language' => 'fr', - 'data' => json_encode([ - [ - 'term' => 'a', - 'context' => 'messages', - 'translation' => ['content' => 'trans_fr_a'], - ], - [ - 'term' => 'post.num_comments', - 'context' => 'validators', - 'translation' => ['content' => '{count, plural, one {# commentaire} other {# commentaires}}'], - ], - ]), - ]), $options['body']); - - return $successResponse; - }, - ]; - - $translatorBag = new TranslatorBag(); - $translatorBag->addCatalogue(new MessageCatalogue('en', [ - 'messages' => ['a' => 'trans_en_a'], - 'validators' => ['post.num_comments' => '{count, plural, one {# comment} other {# comments}}'], - ])); - $translatorBag->addCatalogue(new MessageCatalogue('fr', [ - 'messages' => ['a' => 'trans_fr_a'], - 'validators' => ['post.num_comments' => '{count, plural, one {# commentaire} other {# commentaires}}'], - ])); - - $provider = $this->createProvider( - new MockHttpClient($responses, 'https://api.poeditor.com/v2/'), - $this->getLoader(), - $this->getLogger(), - $this->getDefaultLocale(), - 'api.poeditor.com' - ); - - $provider->write($translatorBag); - } - - /** - * @dataProvider getResponsesForOneLocaleAndOneDomain - */ - public function testReadForOneLocaleAndOneDomain(string $locale, string $domain, string $responseContent, TranslatorBag $expectedTranslatorBag) - { - $loader = $this->getLoader(); - $loader->expects($this->once()) - ->method('load') - ->willReturn((new XliffFileLoader())->load($responseContent, $locale, $domain)); - - $responses = [ - new MockResponse(json_encode([ - 'response' => [ - 'status' => 'success', - 'code' => '200', - 'message' => 'OK', - ], - 'result' => [ - 'url' => 'https://api.poeditor.com/v2/download/file/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', - ], - ])), - new MockResponse($responseContent), - ]; - - $provider = $this->createProvider( - new MockHttpClient($responses, 'https://api.poeditor.com/v2/'), - $loader, - $this->getLogger(), - $this->getDefaultLocale(), - 'api.poeditor.com' - ); - - $translatorBag = $provider->read([$domain], [$locale]); - // We don't want to assert equality of metadata here, due to the ArrayLoader usage. - foreach ($translatorBag->getCatalogues() as $catalogue) { - $catalogue->deleteMetadata('', ''); - } - - $this->assertEquals($expectedTranslatorBag->getCatalogues(), $translatorBag->getCatalogues()); - } - - /** - * @dataProvider getResponsesForManyLocalesAndManyDomains - */ - public function testReadForManyLocalesAndManyDomains(array $locales, array $domains, array $responseContents, TranslatorBag $expectedTranslatorBag) - { - $exportResponses = $downloadResponses = []; - $consecutiveLoadArguments = []; - $consecutiveLoadReturns = []; - foreach ($locales as $locale) { - foreach ($domains as $domain) { - $exportResponses[] = new MockResponse(json_encode([ - 'response' => [ - 'status' => 'success', - 'code' => '200', - 'message' => 'OK', - ], - 'result' => [ - 'url' => 'https://api.poeditor.com/v2/download/file/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', - ], - ])); - $downloadResponses[] = new MockResponse($responseContents[$locale][$domain]); - $consecutiveLoadArguments[] = [$responseContents[$locale][$domain], $locale, $domain]; - $consecutiveLoadReturns[] = (new XliffFileLoader())->load($responseContents[$locale][$domain], $locale, $domain); - } - } - - $loader = $this->getLoader(); - $loader->expects($this->exactly(\count($consecutiveLoadArguments))) - ->method('load') - ->withConsecutive(...$consecutiveLoadArguments) - ->willReturnOnConsecutiveCalls(...$consecutiveLoadReturns); - - $provider = $this->createProvider( - new MockHttpClient(array_merge($exportResponses, $downloadResponses), 'https://api.poeditor.com/v2/'), - $loader, - $this->getLogger(), - $this->getDefaultLocale(), - 'api.poeditor.com' - ); - - $translatorBag = $provider->read($domains, $locales); - // We don't want to assert equality of metadata here, due to the ArrayLoader usage. - foreach ($translatorBag->getCatalogues() as $catalogue) { - $catalogue->deleteMetadata('', ''); - } - - $this->assertEquals($expectedTranslatorBag->getCatalogues(), $translatorBag->getCatalogues()); - } - - public function testDeleteProcess() - { - $successResponse = new MockResponse(json_encode([ - 'response' => [ - 'status' => 'success', - 'code' => '200', - 'message' => 'OK', - ], - ])); - - $translatorBag = new TranslatorBag(); - $translatorBag->addCatalogue(new MessageCatalogue('en', [ - 'messages' => ['a' => 'trans_en_a'], - 'validators' => ['post.num_comments' => '{count, plural, one {# comment} other {# comments}}'], - ])); - $translatorBag->addCatalogue(new MessageCatalogue('fr', [ - 'messages' => ['a' => 'trans_fr_a'], - 'validators' => ['post.num_comments' => '{count, plural, one {# commentaire} other {# commentaires}}'], - ])); - - $provider = $this->createProvider( - new MockHttpClient(function (string $method, string $url, array $options = []) use ($successResponse): MockResponse { - $this->assertSame('POST', $method); - $this->assertSame(http_build_query([ - 'api_token' => 'API_KEY', - 'id' => 'PROJECT_ID', - 'data' => json_encode([ - [ - 'term' => 'a', - 'context' => 'messages', - ], - [ - 'term' => 'post.num_comments', - 'context' => 'validators', - ], - ]), - ]), $options['body']); - - return $successResponse; - }, 'https://api.poeditor.com/v2/'), - $this->getLoader(), - $this->getLogger(), - $this->getDefaultLocale(), - 'api.poeditor.com' - ); - - $provider->delete($translatorBag); - } - - public function getResponsesForOneLocaleAndOneDomain(): \Generator - { - $arrayLoader = new ArrayLoader(); - - $expectedTranslatorBagEn = new TranslatorBag(); - $expectedTranslatorBagEn->addCatalogue($arrayLoader->load([ - 'index.hello' => 'Hello', - 'index.greetings' => 'Welcome, {firstname}!', - ], 'en')); - - yield ['en', 'messages', <<<'XLIFF' - - - - - - index.hello - Hello - index.hello - - index.hello - - - - - index.greetings - Welcome, {firstname}! - index.greetings - - index.greetings - - - - - - -XLIFF - , - $expectedTranslatorBagEn, - ]; - - $expectedTranslatorBagFr = new TranslatorBag(); - $expectedTranslatorBagFr->addCatalogue($arrayLoader->load([ - 'index.hello' => 'Bonjour', - 'index.greetings' => 'Bienvenue, {firstname} !', - ], 'fr')); - - yield ['fr', 'messages', <<<'XLIFF' - - - - - - index.hello - Bonjour - index.hello - - index.hello - - - - - index.greetings - Bienvenue, {firstname} ! - index.greetings - - index.greetings - - - - - - -XLIFF - , - $expectedTranslatorBagFr, - ]; - } - - public function getResponsesForManyLocalesAndManyDomains(): \Generator - { - $arrayLoader = new ArrayLoader(); - - $expectedTranslatorBag = new TranslatorBag(); - $expectedTranslatorBag->addCatalogue($arrayLoader->load([ - 'index.hello' => 'Hello', - 'index.greetings' => 'Welcome, {firstname}!', - ], 'en')); - $expectedTranslatorBag->addCatalogue($arrayLoader->load([ - 'index.hello' => 'Bonjour', - 'index.greetings' => 'Bienvenue, {firstname} !', - ], 'fr')); - $expectedTranslatorBag->addCatalogue($arrayLoader->load([ - 'firstname.error' => 'Firstname must contains only letters.', - 'lastname.error' => 'Lastname must contains only letters.', - ], 'en', 'validators')); - $expectedTranslatorBag->addCatalogue($arrayLoader->load([ - 'firstname.error' => 'Le prénom ne peut contenir que des lettres.', - 'lastname.error' => 'Le nom de famille ne peut contenir que des lettres.', - ], 'fr', 'validators')); - - yield [ - ['en', 'fr'], - ['messages', 'validators'], - [ - 'en' => [ - 'messages' => <<<'XLIFF' - - - - - - index.hello - Hello - index.hello - - index.hello - - - - - index.greetings - Welcome, {firstname}! - index.greetings - - index.greetings - - - - - - -XLIFF - , - 'validators' => <<<'XLIFF' - - - - - - firstname.error - Firstname must contains only letters. - firstname.error - - firstname.error - - - - - lastname.error - Lastname must contains only letters. - lastname.error - - lastname.error - - - - - - -XLIFF - , - ], - 'fr' => [ - 'messages' => <<<'XLIFF' - - - - - - index.hello - Bonjour - index.hello - - index.hello - - - - - index.greetings - Bienvenue, {firstname} ! - index.greetings - - index.greetings - - - - - - -XLIFF - , - 'validators' => <<<'XLIFF' - - - - - - firstname.error - Le prénom ne peut contenir que des lettres. - firstname.error - - firstname.error - - - - - lastname.error - Le nom de famille ne peut contenir que des lettres. - lastname.error - - lastname.error - - - - - - -XLIFF - , - ], - ], - $expectedTranslatorBag, - ]; - } -} diff --git a/src/Symfony/Component/Translation/Bridge/PoEditor/composer.json b/src/Symfony/Component/Translation/Bridge/PoEditor/composer.json deleted file mode 100644 index 1ddc1d87cd8ef..0000000000000 --- a/src/Symfony/Component/Translation/Bridge/PoEditor/composer.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "symfony/po-editor-translation-provider", - "type": "symfony-bridge", - "description": "Symfony PoEditor Translation Provider Bridge", - "keywords": ["poeditor", "translation", "provider"], - "homepage": "https://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Mathieu Santostefano", - "homepage": "https://github.com/welcomattic" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "require": { - "php": ">=7.2.5", - "symfony/config": "^5.3", - "symfony/http-client": "^5.3", - "symfony/translation": "^5.3" - }, - "autoload": { - "psr-4": { "Symfony\\Component\\Translation\\Bridge\\PoEditor\\": "" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "minimum-stability": "dev" -} diff --git a/src/Symfony/Component/Translation/Bridge/PoEditor/phpunit.xml.dist b/src/Symfony/Component/Translation/Bridge/PoEditor/phpunit.xml.dist deleted file mode 100644 index d23f853f5e8e6..0000000000000 --- a/src/Symfony/Component/Translation/Bridge/PoEditor/phpunit.xml.dist +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - ./Tests/ - - - - - - ./ - - ./Resources - ./Tests - ./vendor - - - - diff --git a/src/Symfony/Component/Translation/Exception/UnsupportedSchemeException.php b/src/Symfony/Component/Translation/Exception/UnsupportedSchemeException.php index b59ba81c09808..7fbaa8f04d08f 100644 --- a/src/Symfony/Component/Translation/Exception/UnsupportedSchemeException.php +++ b/src/Symfony/Component/Translation/Exception/UnsupportedSchemeException.php @@ -29,10 +29,6 @@ class UnsupportedSchemeException extends LogicException 'class' => Bridge\Lokalise\LokaliseProviderFactory::class, 'package' => 'symfony/lokalise-translation-provider', ], - 'poeditor' => [ - 'class' => Bridge\PoEditor\PoEditorProviderFactory::class, - 'package' => 'symfony/po-editor-translation-provider', - ], ]; public function __construct(Dsn $dsn, string $name = null, array $supported = []) diff --git a/src/Symfony/Component/Translation/Tests/Exception/UnsupportedSchemeExceptionTest.php b/src/Symfony/Component/Translation/Tests/Exception/UnsupportedSchemeExceptionTest.php index 99c1c89babffa..5fa018d8090a1 100644 --- a/src/Symfony/Component/Translation/Tests/Exception/UnsupportedSchemeExceptionTest.php +++ b/src/Symfony/Component/Translation/Tests/Exception/UnsupportedSchemeExceptionTest.php @@ -16,7 +16,6 @@ use Symfony\Component\Translation\Bridge\Crowdin\CrowdinProviderFactory; use Symfony\Component\Translation\Bridge\Loco\LocoProviderFactory; use Symfony\Component\Translation\Bridge\Lokalise\LokaliseProviderFactory; -use Symfony\Component\Translation\Bridge\PoEditor\PoEditorProviderFactory; use Symfony\Component\Translation\Exception\UnsupportedSchemeException; use Symfony\Component\Translation\Provider\Dsn; @@ -32,7 +31,6 @@ public static function setUpBeforeClass(): void CrowdinProviderFactory::class => false, LocoProviderFactory::class => false, LokaliseProviderFactory::class => false, - PoEditorProviderFactory::class => false, ]); } @@ -54,7 +52,6 @@ public function messageWhereSchemeIsPartOfSchemeToPackageMapProvider(): \Generat yield ['crowdin', 'symfony/crowdin-translation-provider']; yield ['loco', 'symfony/loco-translation-provider']; yield ['lokalise', 'symfony/lokalise-translation-provider']; - yield ['poeditor', 'symfony/po-editor-translation-provider']; } /**