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); pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy