diff --git a/Classes/ContentRepository/NodeTranslationService.php b/Classes/ContentRepository/NodeTranslationService.php index ca0658b..33a50d4 100644 --- a/Classes/ContentRepository/NodeTranslationService.php +++ b/Classes/ContentRepository/NodeTranslationService.php @@ -326,7 +326,7 @@ public function translateNode(NodeInterface $sourceNode, NodeInterface $targetNo if (is_array($propertyValue)) { $targetValue = $targetNode->getProperty($propertyName); if ($connector = $translatableProperties->getTranslationObjectConnector($propertyName)) { - if (is_object($targetValue)) { + if (is_object($targetValue) || is_array($targetValue)) { $targetValue = $connector->applyTranslations($targetValue, $propertyValue); } } diff --git a/Classes/Domain/TranslatableProperty/TranslatablePropertyName.php b/Classes/Domain/TranslatableProperty/TranslatablePropertyName.php index 3da51e8..1693b9d 100644 --- a/Classes/Domain/TranslatableProperty/TranslatablePropertyName.php +++ b/Classes/Domain/TranslatableProperty/TranslatablePropertyName.php @@ -5,6 +5,7 @@ namespace Sitegeist\LostInTranslation\Domain\TranslatableProperty; use Sitegeist\LostInTranslation\Domain\TranslationConnectorInterface; +use Sitegeist\LostInTranslation\Domain\TranslationArrayConnectorInterface; class TranslatablePropertyName { @@ -14,15 +15,15 @@ class TranslatablePropertyName protected $name; /** - * @var TranslationConnectorInterface|null + * @var TranslationConnectorInterface|TranslationArrayConnectorInterface>|null */ protected $translationConnector; /** * @param string $name - * @param TranslationConnectorInterface|null $translationConnector + * @param TranslationConnectorInterface|TranslationArrayConnectorInterface>|null $translationConnector */ - public function __construct(string $name, ?TranslationConnectorInterface $translationConnector = null) + public function __construct(string $name, TranslationConnectorInterface | TranslationArrayConnectorInterface | null $translationConnector = null) { $this->name = $name; $this->translationConnector = $translationConnector; @@ -34,9 +35,9 @@ public function getName(): string } /** - * @return TranslationConnectorInterface|null + * @return TranslationConnectorInterface|TranslationArrayConnectorInterface>|null */ - public function getTranslationConnector(): ?TranslationConnectorInterface + public function getTranslationConnector(): TranslationConnectorInterface | TranslationArrayConnectorInterface | null { return $this->translationConnector; } diff --git a/Classes/Domain/TranslatableProperty/TranslatablePropertyNames.php b/Classes/Domain/TranslatableProperty/TranslatablePropertyNames.php index 969ce1f..80a1ca2 100644 --- a/Classes/Domain/TranslatableProperty/TranslatablePropertyNames.php +++ b/Classes/Domain/TranslatableProperty/TranslatablePropertyNames.php @@ -5,6 +5,7 @@ namespace Sitegeist\LostInTranslation\Domain\TranslatableProperty; use Sitegeist\LostInTranslation\Domain\TranslationConnectorInterface; +use Sitegeist\LostInTranslation\Domain\TranslationArrayConnectorInterface; /** * @implements \IteratorAggregate @@ -32,9 +33,9 @@ public function isTranslatable(string $propertyName): bool /** * @param string $propertyName - * @return TranslationConnectorInterface|null + * @return TranslationConnectorInterface|TranslationArrayConnectorInterface>|null */ - public function getTranslationObjectConnector(string $propertyName): ?TranslationConnectorInterface + public function getTranslationObjectConnector(string $propertyName): TranslationConnectorInterface | TranslationArrayConnectorInterface | null { foreach ($this->translatableProperties as $translatableProperty) { if ($translatableProperty->getName() == $propertyName) { diff --git a/Classes/Domain/TranslatableProperty/TranslatablePropertyNamesFactory.php b/Classes/Domain/TranslatableProperty/TranslatablePropertyNamesFactory.php index 1c27a60..6d68cdc 100644 --- a/Classes/Domain/TranslatableProperty/TranslatablePropertyNamesFactory.php +++ b/Classes/Domain/TranslatableProperty/TranslatablePropertyNamesFactory.php @@ -8,6 +8,7 @@ use Neos\ContentRepository\Domain\Model\NodeType; use Neos\Flow\ObjectManagement\ObjectManagerInterface; use Sitegeist\LostInTranslation\Domain\TranslationConnectorInterface; +use Sitegeist\LostInTranslation\Domain\TranslationArrayConnectorInterface; class TranslatablePropertyNamesFactory { @@ -60,6 +61,8 @@ public function createForNodeType(NodeType $nodeType): TranslatablePropertyNames ?? false; $translationConnector = $this->translationConnectors[$type] ?? null; + $translationConnectorFromPropertyDefinition = $propertyDefinition['options']['translationConnector'] + ?? null; if ($automaticTranslationIsEnabled === false) { continue; @@ -73,6 +76,14 @@ public function createForNodeType(NodeType $nodeType): TranslatablePropertyNames $translationConnectorInstance = $this->objectManager->get($translationConnector); assert($translationConnectorInstance instanceof TranslationConnectorInterface); $translateProperties[] = new TranslatablePropertyName($propertyName, $translationConnectorInstance); + } elseif ($translationConnectorFromPropertyDefinition && $automaticTranslationIsEnabled) { + $translationConnectorInstance = $this->objectManager->get($translationConnectorFromPropertyDefinition); + if ($type === "array") { + assert($translationConnectorInstance instanceof TranslationArrayConnectorInterface); + } else { + assert($translationConnectorInstance instanceof TranslationConnectorInterface); + } + $translateProperties[] = new TranslatablePropertyName($propertyName, $translationConnectorInstance); } } $this->firstLevelCache[$nodeType->getName()] = new TranslatablePropertyNames(...$translateProperties); diff --git a/Classes/Domain/TranslationArrayConnectorInterface.php b/Classes/Domain/TranslationArrayConnectorInterface.php new file mode 100644 index 0000000..ffc166f --- /dev/null +++ b/Classes/Domain/TranslationArrayConnectorInterface.php @@ -0,0 +1,24 @@ + + */ + public function extractTranslations(array $array): array; + + /** + * @param TArray $array + * @param array $translations + * @return TArray + */ + public function applyTranslations(array $array, array $translations): array; +}