Skip to content

Commit af20898

Browse files
committed
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. #300
1 parent ef9c691 commit af20898

File tree

1 file changed

+28
-15
lines changed

1 file changed

+28
-15
lines changed

Catalogue/Operation/ReplaceOperation.php

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Translation\Bundle\Catalogue\Operation;
1313

14+
use Nyholm\NSA;
1415
use Symfony\Component\Translation\Catalogue\AbstractOperation;
1516
use Symfony\Component\Translation\MessageCatalogueInterface;
1617
use Symfony\Component\Translation\MetadataAwareInterface;
@@ -40,20 +41,28 @@ protected function processDomain($domain): void
4041

4142
$intlDomain = $domain . '+intl-icu' /* MessageCatalogueInterface::INTL_DOMAIN_SUFFIX */;
4243

44+
$sourceMessages = NSA::getProperty($this->source, 'messages');
45+
$targetMessages = NSA::getProperty($this->target, 'messages');
46+
4347
foreach ($this->source->all($domain) as $id => $message) {
44-
$messageDomain = $this->source->defines($id, $intlDomain) ? $intlDomain : $domain;
48+
$sourceIdInIntl = array_key_exists($id, $sourceMessages[$intlDomain] ?? []);
49+
$targetIdInIntl = array_key_exists($id, $targetMessages[$intlDomain] ?? []);
50+
51+
$sourceMessageDomain = $sourceIdInIntl ? $intlDomain : $domain;
52+
$targetMessageDomain = $targetIdInIntl ? $intlDomain : $domain;
53+
$resultMessageDomain = $sourceIdInIntl || $targetIdInIntl ? $intlDomain : $domain;
4554

4655
if (!$this->target->has($id, $domain)) {
4756
// No merge required
4857
$translation = $message;
49-
$this->messages[$domain]['new'][$id] = $message;
50-
$resultMeta = $this->getMetadata($this->source, $messageDomain, $id);
58+
$this->messages[$resultMessageDomain]['new'][$id] = $message;
59+
$resultMeta = $this->getMetadata($this->source, $sourceMessageDomain, $id);
5160
} else {
5261
// Merge required
53-
$translation = $message ?? $this->target->get($id, $domain);
62+
$translation = $message ?? $this->target->get($id, $targetMessageDomain);
5463
$resultMeta = null;
55-
$sourceMeta = $this->getMetadata($this->source, $messageDomain, $id);
56-
$targetMeta = $this->getMetadata($this->target, $this->target->defines($id, $intlDomain) ? $intlDomain : $domain, $id);
64+
$sourceMeta = $this->getMetadata($this->source, $sourceMessageDomain, $id);
65+
$targetMeta = $this->getMetadata($this->target, $targetMessageDomain, $id);
5766
if (\is_array($sourceMeta) && \is_array($targetMeta)) {
5867
// We can only merge meta if both is an array
5968
$resultMeta = $this->mergeMetadata($sourceMeta, $targetMeta);
@@ -65,11 +74,11 @@ protected function processDomain($domain): void
6574
}
6675
}
6776

68-
$this->messages[$domain]['all'][$id] = $translation;
69-
$this->result->add([$id => $translation], $messageDomain);
77+
$this->messages[$resultMessageDomain]['all'][$id] = $translation;
78+
$this->result->add([$id => $translation], $resultMessageDomain);
7079

7180
if (!empty($resultMeta)) {
72-
$this->result->setMetadata($id, $resultMeta, $messageDomain);
81+
$this->result->setMetadata($id, $resultMeta, $resultMessageDomain);
7382
}
7483
}
7584

@@ -80,14 +89,18 @@ protected function processDomain($domain): void
8089
continue;
8190
}
8291

83-
$messageDomain = $this->target->defines($id, $intlDomain) ? $intlDomain : $domain;
84-
$this->messages[$domain]['all'][$id] = $message;
85-
$this->messages[$domain]['obsolete'][$id] = $message;
86-
$this->result->add([$id => $message], $messageDomain);
92+
$sourceIdInIntl = array_key_exists($id, $sourceMessages[$intlDomain] ?? []);
93+
$targetIdInIntl = array_key_exists($id, $targetMessages[$intlDomain] ?? []);
94+
95+
$resultMessageDomain = $sourceIdInIntl || $targetIdInIntl ? $intlDomain : $domain;
96+
97+
$this->messages[$resultMessageDomain]['all'][$id] = $message;
98+
$this->messages[$resultMessageDomain]['obsolete'][$id] = $message;
99+
$this->result->add([$id => $message], $resultMessageDomain);
87100

88-
$resultMeta = $this->getMetadata($this->target, $messageDomain, $id);
101+
$resultMeta = $this->getMetadata($this->target, $resultMessageDomain, $id);
89102
if (!empty($resultMeta)) {
90-
$this->result->setMetadata($id, $resultMeta, $messageDomain);
103+
$this->result->setMetadata($id, $resultMeta, $resultMessageDomain);
91104
}
92105
}
93106
}

0 commit comments

Comments
 (0)