---
title: "Feature: #109429 - Introduce PSR-14 ModifyLocalizationHandlerIsAvailableEvent"
manual: "TYPO3 Core Changelog"
version: "main"
permalink: "https://docs.typo3.org/permalink/changelog:feature-109429-1774888319"
source: "Changelog/14.2/Feature-109429-IntroducePSR-14ModifyLocalizationHandlerIsAvailableEvent.rst"
typo3-version: "14.2"
typo3-major: 14
type: "feature"
issue: 109429
forge: "https://forge.typo3.org/issues/109429"
tags: ["Backend", "PHP-API", "ext:backend"]
rendered: "2026-09-20T18:31:11+00:00"
---

# Feature: #109429 - Introduce PSR-14 `ModifyLocalizationHandlerIsAvailableEvent` {#feature-109429-1774888319}

See [forge#109429](https://forge.typo3.org/issues/109429)

## Description {#description}

[forge#108049](https://forge.typo3.org/issues/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
`ModifyLocalizationHandlerIsAvailableEvent`
is now introduced and dispatched in
`LocalizationHandlerRegistry`
to allow the availability state of a localization
handler to be overridden based on `LocalizationInstructions`.

The event has the following properties:

-   `public readonly string $identifier`: String identifier returned by
    `LocalizationHandlerInterface::getIdentifier()` from the handler
-   `public readonly string $className`: The concrete class name in case
    a handler has been XCLASSed without changing the identifier
-   `public readonly LocalizationInstructions $instructions`: The
    localization instructions passed to the handler's `isAvailable()` method
    to define the context
-   `public bool $isAvailable`: The availability state returned by the
    handler, which can be altered by a PSR-14 event listener

### Example {#example}

**EXT:my_extension/Classes/EventListener/DisableManualLocalizationHandlerForCustomTableEventListener.php**

```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 {#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.
