From e7851a74fb6e262ef1792c98c49db194323b21c7 Mon Sep 17 00:00:00 2001 From: Jon Uhlmann Date: Tue, 14 Oct 2025 09:37:48 +0200 Subject: [PATCH 1/3] New: Add property based translation connector This adds also an array-based connector interface. With this change, it is possible to add property connector on a property basis. Great for editors who save data as an array and for Objects who doesn't have a fixed data set by the object (Like the Repeatable object from the repeatable editor) --- .../TranslatablePropertyName.php | 11 +++++---- .../TranslatablePropertyNames.php | 5 ++-- .../TranslatablePropertyNamesFactory.php | 11 +++++++++ .../TranslationArrayConnectorInterface.php | 24 +++++++++++++++++++ 4 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 Classes/Domain/TranslationArrayConnectorInterface.php diff --git a/Classes/Domain/TranslatableProperty/TranslatablePropertyName.php b/Classes/Domain/TranslatableProperty/TranslatablePropertyName.php index 3da51e8..9030fdd 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..e556cc3 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; +} From d25a2d6857ddbac0729da43f748002e23ef70bf4 Mon Sep 17 00:00:00 2001 From: Jon Uhlmann Date: Tue, 14 Oct 2025 09:56:52 +0200 Subject: [PATCH 2/3] Update: Run connector also if type is an array --- Classes/ContentRepository/NodeTranslationService.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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); } } From 6fc01aea8cf0c1dfe250067bc2ba8584a5e0c13b Mon Sep 17 00:00:00 2001 From: Jon Uhlmann Date: Tue, 14 Oct 2025 10:12:38 +0200 Subject: [PATCH 3/3] Fix: Phpstan issues --- .../TranslatableProperty/TranslatablePropertyName.php | 6 +++--- .../TranslatableProperty/TranslatablePropertyNames.php | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Classes/Domain/TranslatableProperty/TranslatablePropertyName.php b/Classes/Domain/TranslatableProperty/TranslatablePropertyName.php index 9030fdd..1693b9d 100644 --- a/Classes/Domain/TranslatableProperty/TranslatablePropertyName.php +++ b/Classes/Domain/TranslatableProperty/TranslatablePropertyName.php @@ -15,13 +15,13 @@ class TranslatablePropertyName protected $name; /** - * @var TranslationConnectorInterface|TranslationArrayConnectorInterface|null + * @var TranslationConnectorInterface|TranslationArrayConnectorInterface>|null */ protected $translationConnector; /** * @param string $name - * @param TranslationConnectorInterface|TranslationArrayConnectorInterface|null $translationConnector + * @param TranslationConnectorInterface|TranslationArrayConnectorInterface>|null $translationConnector */ public function __construct(string $name, TranslationConnectorInterface | TranslationArrayConnectorInterface | null $translationConnector = null) { @@ -35,7 +35,7 @@ public function getName(): string } /** - * @return TranslationConnectorInterface|TranslationArrayConnectorInterface|null + * @return TranslationConnectorInterface|TranslationArrayConnectorInterface>|null */ public function getTranslationConnector(): TranslationConnectorInterface | TranslationArrayConnectorInterface | null { diff --git a/Classes/Domain/TranslatableProperty/TranslatablePropertyNames.php b/Classes/Domain/TranslatableProperty/TranslatablePropertyNames.php index e556cc3..80a1ca2 100644 --- a/Classes/Domain/TranslatableProperty/TranslatablePropertyNames.php +++ b/Classes/Domain/TranslatableProperty/TranslatablePropertyNames.php @@ -33,7 +33,7 @@ public function isTranslatable(string $propertyName): bool /** * @param string $propertyName - * @return TranslationConnectorInterface|TranslationArrayConnectorInterface|null + * @return TranslationConnectorInterface|TranslationArrayConnectorInterface>|null */ public function getTranslationObjectConnector(string $propertyName): TranslationConnectorInterface | TranslationArrayConnectorInterface | null {