From c3dbe3b9875b955d3161f305f04815c4d9cd8f42 Mon Sep 17 00:00:00 2001 From: Marek Snopkowski Date: Tue, 24 Aug 2021 13:48:34 +0200 Subject: [PATCH] Make sure importer is aware of ICU domain format Because of MessageCatalogue interface limitation we're using NSA to access raw messages data. Additionally because defines() method uses isset() were force to check raw messages data directly to check if key exits (translations from source collection are all set to NULL). https://github.com/php-translation/symfony-bundle/issues/300 --- Service/Importer.php | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/Service/Importer.php b/Service/Importer.php index 482813a..f90eaa9 100644 --- a/Service/Importer.php +++ b/Service/Importer.php @@ -78,8 +78,8 @@ public function extractToCatalogues(Finder $finder, array $catalogues, array $co $this->convertSourceLocationsToMessages($target, $sourceCollection, $catalogue); // Remove all SourceLocation and State form catalogue. - foreach ($catalogue->getDomains() as $domain) { - foreach ($catalogue->all($domain) as $key => $translation) { + foreach (NSA::getProperty($catalogue, 'messages') as $domain => $translations) { + foreach ($translations as $key => $translation) { $meta = $this->getMetadata($catalogue, $key, $domain); $meta->removeAllInCategory('file-source'); $meta->removeAllInCategory('state'); @@ -91,28 +91,36 @@ public function extractToCatalogues(Finder $finder, array $catalogues, array $co $result = $merge->getResult(); $domains = $merge->getDomains(); + $resultMessages = NSA::getProperty($result, 'messages'); + // Mark new messages as new/obsolete foreach ($domains as $domain) { + $intlDomain = $domain . '+intl-icu' /* MessageCatalogueInterface::INTL_DOMAIN_SUFFIX */; + foreach ($merge->getNewMessages($domain) as $key => $translation) { - $meta = $this->getMetadata($result, $key, $domain); + $messageDomain = array_key_exists($key, $resultMessages[$intlDomain] ?? []) ? $intlDomain : $domain; + + $meta = $this->getMetadata($result, $key, $messageDomain); $meta->setState('new'); - $this->setMetadata($result, $key, $domain, $meta); + $this->setMetadata($result, $key, $messageDomain, $meta); // Add custom translations that we found in the source if (null === $translation) { if (null !== $newTranslation = $meta->getTranslation()) { - $result->set($key, $newTranslation, $domain); + $result->set($key, $newTranslation, $messageDomain); // We do not want "translation" key stored anywhere. $meta->removeAllInCategory('translation'); } elseif (null !== ($newTranslation = $meta->getDesc()) && $catalogue->getLocale() === $this->defaultLocale) { - $result->set($key, $newTranslation, $domain); + $result->set($key, $newTranslation, $messageDomain); } } } foreach ($merge->getObsoleteMessages($domain) as $key => $translation) { - $meta = $this->getMetadata($result, $key, $domain); + $messageDomain = array_key_exists($key, $resultMessages[$intlDomain] ?? []) ? $intlDomain : $domain; + + $meta = $this->getMetadata($result, $key, $messageDomain); $meta->setState('obsolete'); - $this->setMetadata($result, $key, $domain, $meta); + $this->setMetadata($result, $key, $messageDomain, $meta); } } $results[] = $result;