From 5eff1689c92d082b49d6b41fdeb6a79d402a6aa4 Mon Sep 17 00:00:00 2001 From: Markus Thielen Date: Fri, 23 Aug 2024 13:36:26 +0200 Subject: [PATCH] [Translation] [Loco] Ability to configure value of `status` query-variable --- .../Translation/Bridge/Loco/CHANGELOG.md | 5 +++ .../Translation/Bridge/Loco/LocoProvider.php | 7 +++- .../Bridge/Loco/LocoProviderFactory.php | 3 +- .../Translation/Bridge/Loco/README.md | 2 +- .../Loco/Tests/LocoProviderFactoryTest.php | 5 +++ .../Bridge/Loco/Tests/LocoProviderTest.php | 34 +++++++++++++++++-- .../LocoProviderWithoutTranslatorBagTest.php | 4 +-- 7 files changed, 53 insertions(+), 7 deletions(-) diff --git a/src/Symfony/Component/Translation/Bridge/Loco/CHANGELOG.md b/src/Symfony/Component/Translation/Bridge/Loco/CHANGELOG.md index 328a4df1fbcf4..9eae507d50296 100644 --- a/src/Symfony/Component/Translation/Bridge/Loco/CHANGELOG.md +++ b/src/Symfony/Component/Translation/Bridge/Loco/CHANGELOG.md @@ -1,6 +1,11 @@ CHANGELOG ========= +7.2 +--- + + * Add support for the `status` query parameter of Loco translation API + 6.1 --- diff --git a/src/Symfony/Component/Translation/Bridge/Loco/LocoProvider.php b/src/Symfony/Component/Translation/Bridge/Loco/LocoProvider.php index 351df638e7438..30207049e03e7 100644 --- a/src/Symfony/Component/Translation/Bridge/Loco/LocoProvider.php +++ b/src/Symfony/Component/Translation/Bridge/Loco/LocoProvider.php @@ -38,11 +38,16 @@ public function __construct( private string $defaultLocale, private string $endpoint, private ?TranslatorBagInterface $translatorBag = null, + private ?string $restrictToStatus = null, ) { } public function __toString(): string { + if ($this->restrictToStatus) { + return \sprintf('loco://%s?status=%s', $this->endpoint, $this->restrictToStatus); + } + return \sprintf('loco://%s', $this->endpoint); } @@ -96,7 +101,7 @@ public function read(array $domains, array $locales): TranslatorBag $response = $this->client->request('GET', \sprintf('export/locale/%s.xlf', rawurlencode($locale)), [ 'query' => [ 'filter' => $domain, - 'status' => 'translated,blank-translation', + 'status' => $this->restrictToStatus ?? 'translated,blank-translation', ], 'headers' => [ 'If-Modified-Since' => $previousCatalogue instanceof CatalogueMetadataAwareInterface ? $previousCatalogue->getCatalogueMetadata('last-modified', $domain) : null, diff --git a/src/Symfony/Component/Translation/Bridge/Loco/LocoProviderFactory.php b/src/Symfony/Component/Translation/Bridge/Loco/LocoProviderFactory.php index ef710e1a58ce7..aa48bf65c1934 100644 --- a/src/Symfony/Component/Translation/Bridge/Loco/LocoProviderFactory.php +++ b/src/Symfony/Component/Translation/Bridge/Loco/LocoProviderFactory.php @@ -43,6 +43,7 @@ public function create(Dsn $dsn): LocoProvider $endpoint = 'default' === $dsn->getHost() ? self::HOST : $dsn->getHost(); $endpoint .= $dsn->getPort() ? ':'.$dsn->getPort() : ''; + $restrictToStatus = $dsn->getOption('status'); $client = $this->client->withOptions([ 'base_uri' => 'https://'.$endpoint.'/api/', @@ -51,7 +52,7 @@ public function create(Dsn $dsn): LocoProvider ], ]); - return new LocoProvider($client, $this->loader, $this->logger, $this->defaultLocale, $endpoint, $this->translatorBag); + return new LocoProvider($client, $this->loader, $this->logger, $this->defaultLocale, $endpoint, $this->translatorBag, $restrictToStatus); } protected function getSupportedSchemes(): array diff --git a/src/Symfony/Component/Translation/Bridge/Loco/README.md b/src/Symfony/Component/Translation/Bridge/Loco/README.md index d402682c280f3..ce302e7f72b88 100644 --- a/src/Symfony/Component/Translation/Bridge/Loco/README.md +++ b/src/Symfony/Component/Translation/Bridge/Loco/README.md @@ -8,7 +8,7 @@ DSN example ``` // .env file -LOCO_DSN=loco://API_KEY@default +LOCO_DSN=loco://API_KEY@default?status=translated,blank-translation ``` where: diff --git a/src/Symfony/Component/Translation/Bridge/Loco/Tests/LocoProviderFactoryTest.php b/src/Symfony/Component/Translation/Bridge/Loco/Tests/LocoProviderFactoryTest.php index b83a1a15a92a4..e0ba1c414ae39 100644 --- a/src/Symfony/Component/Translation/Bridge/Loco/Tests/LocoProviderFactoryTest.php +++ b/src/Symfony/Component/Translation/Bridge/Loco/Tests/LocoProviderFactoryTest.php @@ -34,6 +34,11 @@ public static function createProvider(): iterable 'loco://localise.biz', 'loco://API_KEY@default', ]; + + yield [ + 'loco://localise.biz?status=translated,provisional', + 'loco://API_KEY@default?status=translated,provisional', + ]; } public static function incompleteDsnProvider(): iterable diff --git a/src/Symfony/Component/Translation/Bridge/Loco/Tests/LocoProviderTest.php b/src/Symfony/Component/Translation/Bridge/Loco/Tests/LocoProviderTest.php index 5ce4cf03f3541..3addc292335ae 100644 --- a/src/Symfony/Component/Translation/Bridge/Loco/Tests/LocoProviderTest.php +++ b/src/Symfony/Component/Translation/Bridge/Loco/Tests/LocoProviderTest.php @@ -30,9 +30,9 @@ class LocoProviderTest extends ProviderTestCase { - public static function createProvider(HttpClientInterface $client, LoaderInterface $loader, LoggerInterface $logger, string $defaultLocale, string $endpoint, ?TranslatorBagInterface $translatorBag = null): ProviderInterface + public static function createProvider(HttpClientInterface $client, LoaderInterface $loader, LoggerInterface $logger, string $defaultLocale, string $endpoint, ?TranslatorBagInterface $translatorBag = null, ?string $restrictToStatus = null): ProviderInterface { - return new LocoProvider($client, $loader, $logger, $defaultLocale, $endpoint, $translatorBag ?? new TranslatorBag()); + return new LocoProvider($client, $loader, $logger, $defaultLocale, $endpoint, $translatorBag ?? new TranslatorBag(), $restrictToStatus); } public static function toStringProvider(): iterable @@ -1170,4 +1170,34 @@ public static function getResponsesForReadWithLastModified(): \Generator yield [$locales, $domains, $responseContents, $lastModifieds, $expectedTranslatorBag]; } } + + public function testReadWithRestrictToStatus() + { + $loader = $this->getLoader(); + + $loader + ->expects($this->once()) + ->method('load') + ->willReturn($this->createMock(MessageCatalogue::class)); + + $provider = self::createProvider( + new MockHttpClient([ + function (string $method, string $url, array $options = []): ResponseInterface { + $this->assertSame('GET', $method); + $this->assertSame('https://localise.biz/api/export/locale/de.xlf?filter=messages&status=translated%2Cprovisional', $url); + $this->assertSame(['filter' => 'messages', 'status' => 'translated,provisional'], $options['query']); + + return new MockResponse(); + }, + ], 'https://localise.biz/api/'), + $this->getLoader(), + $this->getLogger(), + $this->getDefaultLocale(), + 'localise.biz/api/', + null, + 'translated,provisional' + ); + + $this->translatorBag = $provider->read(['messages'], ['de']); + } } diff --git a/src/Symfony/Component/Translation/Bridge/Loco/Tests/LocoProviderWithoutTranslatorBagTest.php b/src/Symfony/Component/Translation/Bridge/Loco/Tests/LocoProviderWithoutTranslatorBagTest.php index 81b0da879f6d2..2f974dc673c9b 100644 --- a/src/Symfony/Component/Translation/Bridge/Loco/Tests/LocoProviderWithoutTranslatorBagTest.php +++ b/src/Symfony/Component/Translation/Bridge/Loco/Tests/LocoProviderWithoutTranslatorBagTest.php @@ -25,9 +25,9 @@ class LocoProviderWithoutTranslatorBagTest extends LocoProviderTest { - public static function createProvider(HttpClientInterface $client, LoaderInterface $loader, LoggerInterface $logger, string $defaultLocale, string $endpoint, ?TranslatorBagInterface $translatorBag = null): ProviderInterface + public static function createProvider(HttpClientInterface $client, LoaderInterface $loader, LoggerInterface $logger, string $defaultLocale, string $endpoint, ?TranslatorBagInterface $translatorBag = null, ?string $restrictToStatus = null): ProviderInterface { - return new LocoProvider($client, $loader, $logger, $defaultLocale, $endpoint, null); + return new LocoProvider($client, $loader, $logger, $defaultLocale, $endpoint, null, $restrictToStatus); } /**