From f259891b37778f558441eb5d5aaae8ecaa5d3064 Mon Sep 17 00:00:00 2001 From: Oleg Mifle Date: Mon, 6 Dec 2021 16:47:59 +0300 Subject: [PATCH] =?UTF-8?q?[Translation]=20[Bridge]=20[Lokalise]=20Fix=20p?= =?UTF-8?q?ush=20keys=20to=20lokalise.=20Closes=20#=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Bridge/Lokalise/LokaliseProvider.php | 56 ++++++++++++------- .../Lokalise/Tests/LokaliseProviderTest.php | 12 +++- 2 files changed, 46 insertions(+), 22 deletions(-) diff --git a/src/Symfony/Component/Translation/Bridge/Lokalise/LokaliseProvider.php b/src/Symfony/Component/Translation/Bridge/Lokalise/LokaliseProvider.php index 06d053fd0233c..9130a3265da78 100644 --- a/src/Symfony/Component/Translation/Bridge/Lokalise/LokaliseProvider.php +++ b/src/Symfony/Component/Translation/Bridge/Lokalise/LokaliseProvider.php @@ -32,6 +32,8 @@ */ final class LokaliseProvider implements ProviderInterface { + private const LOKALISE_GET_KEYS_LIMIT = 5000; + private $client; private $loader; private $logger; @@ -75,7 +77,7 @@ public function write(TranslatorBagInterface $translatorBag): void $existingKeysByDomain[$domain] = []; } - $existingKeysByDomain[$domain] += $this->getKeysIds(array_keys($defaultCatalogue->all($domain)), $domain); + $existingKeysByDomain[$domain] += $this->getKeysIds([], $domain); } $keysToCreate = $createdKeysByDomain = []; @@ -219,7 +221,7 @@ private function createKeys(array $keys, string $domain): array * Translations will be created for keys without existing translations. * Translations will be updated for keys with existing translations. */ - private function updateTranslations(array $keysByDomain, TranslatorBagInterface $translatorBag) + private function updateTranslations(array $keysByDomain, TranslatorBagInterface $translatorBag): void { $keysToUpdate = []; @@ -250,28 +252,23 @@ private function updateTranslations(array $keysByDomain, TranslatorBagInterface } } - $chunks = array_chunk($keysToUpdate, 500); - $responses = []; - - foreach ($chunks as $chunk) { - $responses[] = $this->client->request('PUT', 'keys', [ - 'json' => ['keys' => $chunk], - ]); - } + $response = $this->client->request('PUT', 'keys', [ + 'json' => ['keys' => $keysToUpdate], + ]); - foreach ($responses as $response) { - if (200 !== $response->getStatusCode()) { - $this->logger->error(sprintf('Unable to create/update translations to Lokalise: "%s".', $response->getContent(false))); - } + if (200 !== $response->getStatusCode()) { + $this->logger->error(sprintf('Unable to create/update translations to Lokalise: "%s".', $response->getContent(false))); } } - private function getKeysIds(array $keys, string $domain): array + private function getKeysIds(array $keys, string $domain, int $page = 1): array { $response = $this->client->request('GET', 'keys', [ 'query' => [ 'filter_keys' => implode(',', $keys), 'filter_filenames' => $this->getLokaliseFilenameFromDomain($domain), + 'limit' => self::LOKALISE_GET_KEYS_LIMIT, + 'page' => $page, ], ]); @@ -279,14 +276,33 @@ private function getKeysIds(array $keys, string $domain): array $this->logger->error(sprintf('Unable to get keys ids from Lokalise: "%s".', $response->getContent(false))); } - return array_reduce($response->toArray(false)['keys'], static function ($carry, array $keyItem) { - $carry[$keyItem['key_name']['web']] = $keyItem['key_id']; + $result = []; + $keysFromResponse = $response->toArray(false)['keys'] ?? []; - return $carry; - }, []); + if (\count($keysFromResponse) > 0) { + $result = array_reduce($keysFromResponse, static function ($carry, array $keyItem) { + $carry[$keyItem['key_name']['web']] = $keyItem['key_id']; + + return $carry; + }, []); + } + + $paginationTotalCount = $response->getHeaders(false)['x-pagination-total-count'] ?? []; + $keysTotalCount = (int) (reset($paginationTotalCount) ?? 0); + + if (0 === $keysTotalCount) { + return $result; + } + + $pages = ceil($keysTotalCount / self::LOKALISE_GET_KEYS_LIMIT); + if ($page < $pages) { + $result = array_merge($result, $this->getKeysIds($keys, $domain, ++$page)); + } + + return $result; } - private function ensureAllLocalesAreCreated(TranslatorBagInterface $translatorBag) + private function ensureAllLocalesAreCreated(TranslatorBagInterface $translatorBag): void { $providerLanguages = $this->getLanguages(); $missingLanguages = array_reduce($translatorBag->getCatalogues(), static function ($carry, $catalogue) use ($providerLanguages) { diff --git a/src/Symfony/Component/Translation/Bridge/Lokalise/Tests/LokaliseProviderTest.php b/src/Symfony/Component/Translation/Bridge/Lokalise/Tests/LokaliseProviderTest.php index fe4532a4627ab..3cf46b012a268 100644 --- a/src/Symfony/Component/Translation/Bridge/Lokalise/Tests/LokaliseProviderTest.php +++ b/src/Symfony/Component/Translation/Bridge/Lokalise/Tests/LokaliseProviderTest.php @@ -76,8 +76,10 @@ public function testCompleteWriteProcess() $getKeysIdsForMessagesDomainResponse = function (string $method, string $url, array $options = []): ResponseInterface { $expectedQuery = [ - 'filter_keys' => 'young_dog', + 'filter_keys' => '', 'filter_filenames' => 'messages.xliff', + 'limit' => 5000, + 'page' => 1, ]; $this->assertSame('GET', $method); @@ -89,8 +91,10 @@ public function testCompleteWriteProcess() $getKeysIdsForValidatorsDomainResponse = function (string $method, string $url, array $options = []): ResponseInterface { $expectedQuery = [ - 'filter_keys' => 'post.num_comments', + 'filter_keys' => '', 'filter_filenames' => 'validators.xliff', + 'limit' => 5000, + 'page' => 1, ]; $this->assertSame('GET', $method); @@ -337,6 +341,8 @@ public function testDeleteProcess() $expectedQuery = [ 'filter_keys' => 'a', 'filter_filenames' => 'messages.xliff', + 'limit' => 5000, + 'page' => 1, ]; $this->assertSame('GET', $method); @@ -355,6 +361,8 @@ public function testDeleteProcess() $expectedQuery = [ 'filter_keys' => 'post.num_comments', 'filter_filenames' => 'validators.xliff', + 'limit' => 5000, + 'page' => 1, ]; $this->assertSame('GET', $method);