|
32 | 32 | */
|
33 | 33 | final class LokaliseProvider implements ProviderInterface
|
34 | 34 | {
|
| 35 | + private const LOKALISE_GET_KEYS_LIMIT = 5000; |
| 36 | + |
35 | 37 | private $client;
|
36 | 38 | private $loader;
|
37 | 39 | private $logger;
|
@@ -75,7 +77,7 @@ public function write(TranslatorBagInterface $translatorBag): void
|
75 | 77 | $existingKeysByDomain[$domain] = [];
|
76 | 78 | }
|
77 | 79 |
|
78 |
| - $existingKeysByDomain[$domain] += $this->getKeysIds(array_keys($defaultCatalogue->all($domain)), $domain); |
| 80 | + $existingKeysByDomain[$domain] += $this->getKeysIds([], $domain); |
79 | 81 | }
|
80 | 82 |
|
81 | 83 | $keysToCreate = $createdKeysByDomain = [];
|
@@ -219,7 +221,7 @@ private function createKeys(array $keys, string $domain): array
|
219 | 221 | * Translations will be created for keys without existing translations.
|
220 | 222 | * Translations will be updated for keys with existing translations.
|
221 | 223 | */
|
222 |
| - private function updateTranslations(array $keysByDomain, TranslatorBagInterface $translatorBag) |
| 224 | + private function updateTranslations(array $keysByDomain, TranslatorBagInterface $translatorBag): void |
223 | 225 | {
|
224 | 226 | $keysToUpdate = [];
|
225 | 227 |
|
@@ -250,43 +252,57 @@ private function updateTranslations(array $keysByDomain, TranslatorBagInterface
|
250 | 252 | }
|
251 | 253 | }
|
252 | 254 |
|
253 |
| - $chunks = array_chunk($keysToUpdate, 500); |
254 |
| - $responses = []; |
255 |
| - |
256 |
| - foreach ($chunks as $chunk) { |
257 |
| - $responses[] = $this->client->request('PUT', 'keys', [ |
258 |
| - 'json' => ['keys' => $chunk], |
259 |
| - ]); |
260 |
| - } |
| 255 | + $response = $this->client->request('PUT', 'keys', [ |
| 256 | + 'json' => ['keys' => $keysToUpdate], |
| 257 | + ]); |
261 | 258 |
|
262 |
| - foreach ($responses as $response) { |
263 |
| - if (200 !== $response->getStatusCode()) { |
264 |
| - $this->logger->error(sprintf('Unable to create/update translations to Lokalise: "%s".', $response->getContent(false))); |
265 |
| - } |
| 259 | + if (200 !== $response->getStatusCode()) { |
| 260 | + $this->logger->error(sprintf('Unable to create/update translations to Lokalise: "%s".', $response->getContent(false))); |
266 | 261 | }
|
267 | 262 | }
|
268 | 263 |
|
269 |
| - private function getKeysIds(array $keys, string $domain): array |
| 264 | + private function getKeysIds(array $keys, string $domain, int $page = 1): array |
270 | 265 | {
|
271 | 266 | $response = $this->client->request('GET', 'keys', [
|
272 | 267 | 'query' => [
|
273 | 268 | 'filter_keys' => implode(',', $keys),
|
274 | 269 | 'filter_filenames' => $this->getLokaliseFilenameFromDomain($domain),
|
| 270 | + 'limit' => self::LOKALISE_GET_KEYS_LIMIT, |
| 271 | + 'page' => $page, |
275 | 272 | ],
|
276 | 273 | ]);
|
277 | 274 |
|
278 | 275 | if (200 !== $response->getStatusCode()) {
|
279 | 276 | $this->logger->error(sprintf('Unable to get keys ids from Lokalise: "%s".', $response->getContent(false)));
|
280 | 277 | }
|
281 | 278 |
|
282 |
| - return array_reduce($response->toArray(false)['keys'], static function ($carry, array $keyItem) { |
283 |
| - $carry[$keyItem['key_name']['web']] = $keyItem['key_id']; |
| 279 | + $result = []; |
| 280 | + $keysFromResponse = $response->toArray(false)['keys'] ?? []; |
284 | 281 |
|
285 |
| - return $carry; |
286 |
| - }, []); |
| 282 | + if (\count($keysFromResponse) > 0) { |
| 283 | + $result = array_reduce($keysFromResponse, static function ($carry, array $keyItem) { |
| 284 | + $carry[$keyItem['key_name']['web']] = $keyItem['key_id']; |
| 285 | + |
| 286 | + return $carry; |
| 287 | + }, []); |
| 288 | + } |
| 289 | + |
| 290 | + $paginationTotalCount = $response->getHeaders(false)['x-pagination-total-count'] ?? []; |
| 291 | + $keysTotalCount = (int) (reset($paginationTotalCount) ?? 0); |
| 292 | + |
| 293 | + if (0 === $keysTotalCount) { |
| 294 | + return $result; |
| 295 | + } |
| 296 | + |
| 297 | + $pages = ceil($keysTotalCount / self::LOKALISE_GET_KEYS_LIMIT); |
| 298 | + if ($page < $pages) { |
| 299 | + $result = array_merge($result, $this->getKeysIds($keys, $domain, ++$page)); |
| 300 | + } |
| 301 | + |
| 302 | + return $result; |
287 | 303 | }
|
288 | 304 |
|
289 |
| - private function ensureAllLocalesAreCreated(TranslatorBagInterface $translatorBag) |
| 305 | + private function ensureAllLocalesAreCreated(TranslatorBagInterface $translatorBag): void |
290 | 306 | {
|
291 | 307 | $providerLanguages = $this->getLanguages();
|
292 | 308 | $missingLanguages = array_reduce($translatorBag->getCatalogues(), static function ($carry, $catalogue) use ($providerLanguages) {
|
|
0 commit comments