From 82afa30bac61a3368731626774d6a0bd22c01d06 Mon Sep 17 00:00:00 2001 From: Marek Snopkowski Date: Tue, 24 Aug 2021 13:53:01 +0200 Subject: [PATCH] Make sure we're aware of 3 different message domains We have: 1. Source message domain. 2. Target message domain. 3. Result message domain (this is tied to 2 of the above). This solution assumes we'd always like to use ICU format (result message domain) if we use it in any of source or target catalogue. Additionally because of default NULL values in source catalogue (internal extractor design to set NULL for "target" when creating messages catalogue from source collection) we have to check if desired catalogue's messages field has a key (within requested domain) or not. Using MessageCatalogue::defines() would return false for catalogue without translation (NULL value). Lastly - make sure internal messages field utilised result message domain for consistency with result field. https://github.com/php-translation/symfony-bundle/issues/300 --- Catalogue/Operation/ReplaceOperation.php | 43 +++++++++++++++--------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/Catalogue/Operation/ReplaceOperation.php b/Catalogue/Operation/ReplaceOperation.php index 12a5317..5400aa7 100644 --- a/Catalogue/Operation/ReplaceOperation.php +++ b/Catalogue/Operation/ReplaceOperation.php @@ -11,6 +11,7 @@ namespace Translation\Bundle\Catalogue\Operation; +use Nyholm\NSA; use Symfony\Component\Translation\Catalogue\AbstractOperation; use Symfony\Component\Translation\MessageCatalogueInterface; use Symfony\Component\Translation\MetadataAwareInterface; @@ -40,20 +41,28 @@ protected function processDomain($domain): void $intlDomain = $domain . '+intl-icu' /* MessageCatalogueInterface::INTL_DOMAIN_SUFFIX */; + $sourceMessages = NSA::getProperty($this->source, 'messages'); + $targetMessages = NSA::getProperty($this->target, 'messages'); + foreach ($this->source->all($domain) as $id => $message) { - $messageDomain = $this->source->defines($id, $intlDomain) ? $intlDomain : $domain; + $sourceIdInIntl = array_key_exists($id, $sourceMessages[$intlDomain] ?? []); + $targetIdInIntl = array_key_exists($id, $targetMessages[$intlDomain] ?? []); + + $sourceMessageDomain = $sourceIdInIntl ? $intlDomain : $domain; + $targetMessageDomain = $targetIdInIntl ? $intlDomain : $domain; + $resultMessageDomain = $sourceIdInIntl || $targetIdInIntl ? $intlDomain : $domain; if (!$this->target->has($id, $domain)) { // No merge required $translation = $message; - $this->messages[$domain]['new'][$id] = $message; - $resultMeta = $this->getMetadata($this->source, $messageDomain, $id); + $this->messages[$resultMessageDomain]['new'][$id] = $message; + $resultMeta = $this->getMetadata($this->source, $sourceMessageDomain, $id); } else { // Merge required - $translation = $message ?? $this->target->get($id, $domain); + $translation = $message ?? $this->target->get($id, $targetMessageDomain); $resultMeta = null; - $sourceMeta = $this->getMetadata($this->source, $messageDomain, $id); - $targetMeta = $this->getMetadata($this->target, $this->target->defines($id, $intlDomain) ? $intlDomain : $domain, $id); + $sourceMeta = $this->getMetadata($this->source, $sourceMessageDomain, $id); + $targetMeta = $this->getMetadata($this->target, $targetMessageDomain, $id); if (\is_array($sourceMeta) && \is_array($targetMeta)) { // We can only merge meta if both is an array $resultMeta = $this->mergeMetadata($sourceMeta, $targetMeta); @@ -65,11 +74,11 @@ protected function processDomain($domain): void } } - $this->messages[$domain]['all'][$id] = $translation; - $this->result->add([$id => $translation], $messageDomain); + $this->messages[$resultMessageDomain]['all'][$id] = $translation; + $this->result->add([$id => $translation], $resultMessageDomain); if (!empty($resultMeta)) { - $this->result->setMetadata($id, $resultMeta, $messageDomain); + $this->result->setMetadata($id, $resultMeta, $resultMessageDomain); } } @@ -80,14 +89,18 @@ protected function processDomain($domain): void continue; } - $messageDomain = $this->target->defines($id, $intlDomain) ? $intlDomain : $domain; - $this->messages[$domain]['all'][$id] = $message; - $this->messages[$domain]['obsolete'][$id] = $message; - $this->result->add([$id => $message], $messageDomain); + $sourceIdInIntl = array_key_exists($id, $sourceMessages[$intlDomain] ?? []); + $targetIdInIntl = array_key_exists($id, $targetMessages[$intlDomain] ?? []); + + $resultMessageDomain = $sourceIdInIntl || $targetIdInIntl ? $intlDomain : $domain; + + $this->messages[$resultMessageDomain]['all'][$id] = $message; + $this->messages[$resultMessageDomain]['obsolete'][$id] = $message; + $this->result->add([$id => $message], $resultMessageDomain); - $resultMeta = $this->getMetadata($this->target, $messageDomain, $id); + $resultMeta = $this->getMetadata($this->target, $resultMessageDomain, $id); if (!empty($resultMeta)) { - $this->result->setMetadata($id, $resultMeta, $messageDomain); + $this->result->setMetadata($id, $resultMeta, $resultMessageDomain); } } }