Translation loaders 

Changed in version 14.0

The TYPO3 localization system has been migrated to use Symfony Translation components.

Custom language parsers, registered via $GLOBALS['TYPO3_CONF_VARS']['SYS']['lang']['parser']['xlf'] are not supported anymore.

In order to load translation files TYPO3 uses class \TYPO3\CMS\Core\Localization\Loader\XliffLoader for XLIFF file processing.

TYPO3 overrides the default XLIFF loader provided by Symfony to implement special functionality like $GLOBALS['TYPO3_CONF_VARS']['LANG']['requireApprovedLocalizations'].

Example: A custom json translation file loader 

New in version 14.0

Extension developers can now implement custom translation loaders by implementing Symfony's translation loader interfaces:

EXT:my_extension/Classes/JsonFileLoader.php
<?php

declare(strict_types=1);

namespace MyVendor\MyExtension\LanguageLoader;

use Symfony\Component\Translation\Loader\LoaderInterface;
use Symfony\Component\Translation\MessageCatalogue;

class JsonFileLoader implements LoaderInterface
{
    public function load(mixed $resource, string $locale, string $domain = 'messages'): MessageCatalogue
    {
        $catalogue = new MessageCatalogue($locale);
        if (!is_string($resource) || !file_exists($resource)) {
            throw new \InvalidArgumentException(sprintf('Resource "%s" is not a valid file.', $resource), 1695225932);
        }
        $data = json_decode(file_get_contents($resource), true, 512, JSON_THROW_ON_ERROR);
        foreach ($data as $key => $translation) {
            $catalogue->set((string)$key, (string)$translation, $domain);
        }
        return $catalogue;
    }
}
Copied!

Register custom loaders via configuration:

EXT:my_extension/ext_localconf.php
$GLOBALS['TYPO3_CONF_VARS']['LANG']['loader']['json'] = \MyExtension\Translation\JsonFileLoader::class;
Copied!