Files
cms-core/Documentation/Changelog/14.2/Feature-109429-IntroducePSR-14ModifyLocalizationHandlerIsAvailableEvent.rst
T

92 lines
3.6 KiB
ReStructuredText

.. include:: /Includes.rst.txt
.. _feature-109429-1774888319:
===============================================================================
Feature: #109429 - Introduce PSR-14 `ModifyLocalizationHandlerIsAvailableEvent`
===============================================================================
See :issue:`109429`
Description
===========
:issue:`108049` modernizes the translation workflow in the backend
in the `Content > Layout` and `Content > Record` module views. Technically, this
workflow wizard is backed by localization handlers and finishers.
The PSR-14 event
:php-short:`\TYPO3\CMS\Backend\Localization\Event\ModifyLocalizationHandlerIsAvailableEvent`
is now introduced and dispatched in
:php-short:`\TYPO3\CMS\Backend\Localization\LocalizationHandlerRegistry`
to allow the availability state of a localization
handler to be overridden based on :php-short:`\TYPO3\CMS\Backend\Localization\LocalizationInstructions\LocalizationInstructions`.
The event has the following properties:
* :php:`public readonly string $identifier`: String identifier returned by
:php:`LocalizationHandlerInterface::getIdentifier()` from the handler
* :php:`public readonly string $className`: The concrete class name in case
a handler has been XCLASSed without changing the identifier
* :php:`public readonly LocalizationInstructions $instructions`: The
localization instructions passed to the handler's `isAvailable()` method
to define the context
* :php:`public bool $isAvailable`: The availability state returned by the
handler, which can be altered by a PSR-14 event listener
Example
-------
.. code-block:: php
:caption: EXT:my_extension/Classes/EventListener/DisableManualLocalizationHandlerForCustomTableEventListener.php
<?php
declare(strict_types=1);
namespace MyVendor\MyExtension\EventListener;
use TYPO3\CMS\Backend\Localization\Event\ModifyLocalizationHandlerIsAvailableEvent;
use TYPO3\CMS\Backend\Localization\Handler\ManualLocalizationHandler;
use TYPO3\CMS\Backend\Localization\LocalizationMode;
use TYPO3\CMS\Core\Attribute\AsEventListener;
final class DisableManualLocalizationHandlerForCustomTableEventListener
{
#[AsEventListener(identifier: 'myext/disable-manual-localization-handler-custom-table')]
public function __invoke(
ModifyLocalizationHandlerIsAvailableEvent $event,
): void {
if ($event->identifier !== 'manual') {
// Return early if not ManualLocalizationHandler.
return;
}
if ($event->className !== ManualLocalizationHandler::class) {
// Return early if the manual identifier is provided but
// a customized (XCLASSed) class is given. This is just an
// example for that property.
return;
}
if ($event->instructions->mode !== LocalizationMode::TRANSLATE) {
// Return early if not handling translation
// (localization) mode.
return;
}
if ($event->instructions->mainRecordType === 'my_custom_table') {
// Disallow translation/localization for 'my_custom_table'
// in general with the default core handler.
$event->isAvailable = false;
}
}
}
Impact
======
Custom extensions (public and project-specific) are now able to intercept
and determine which handlers are available for localization steps in the translation
wizard, based on localization context.
.. index:: Backend, PHP-API, ext:backend