Skip to content

Commit

Permalink
Make sure we're aware of 3 different message domains
Browse files Browse the repository at this point in the history
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.

php-translation#300
  • Loading branch information
snpy committed Jan 28, 2022
1 parent c81f1da commit 82afa30
Showing 1 changed file with 28 additions and 15 deletions.
43 changes: 28 additions & 15 deletions Catalogue/Operation/ReplaceOperation.php
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -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);
}
}

Expand All @@ -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);
}
}
}
Expand Down

0 comments on commit 82afa30

Please sign in to comment.