Localization in Extbase 

Translating labels with the LocalizationUtility 

Multilingual websites are widespread nowadays, which means that the web-available texts have to be localized. Extbase provides the helper class \TYPO3\CMS\Extbase\Utility\LocalizationUtility for the translation of the labels. Besides, there is the Fluid ViewHelper <f:translate>, with the help of whom you can use that functionality in templates.

The localization class has only one public static method called translate, which does all the translation. The method can be called like this:

EXT:my_extension/Classes/Controller/SomeController.php
use TYPO3\CMS\Extbase\Utility\LocalizationUtility;

$someString = LocalizationUtility::translate($key, $extensionName, $arguments);
Copied!
$key
The identifier to be translated. If the format LLL:path:key is given, then this identifier is used, and the parameter $extensionName is ignored. Otherwise, the file Resources/Private/Language/locallang.xlf from the given extension is loaded, and the resulting text for the given key in the current language returned.
$extensionName
The extension name. It can be fetched from the request.
$arguments

It allows you to specify an array of arguments. In the LocalizationUtility, these arguments will be passed to the function vsprintf. So you can insert dynamic values in every translation. You can find the possible wildcard specifiers under https://www.php.net/manual/function.sprintf.php#refsect1-function.sprintf-parameters.

Example language file with inserted wildcards

EXT:my_extension/Resources/Private/Language/locallang.xlf
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.0" xmlns="urn:oasis:names:tc:xliff:document:1.1">
    <file source-language="en" datatype="plaintext" original="messages" date="..." product-name="...">
        <header/>
        <body>
            <trans-unit id="count_posts">
                <source>You have %d posts with %d comments written.</source>
            </trans-unit>
            <trans-unit id="greeting">
                <source>Hello %s!</source>
            </trans-unit>
        </body>
    </file>
</xliff>
Copied!

Called translations with arguments to fill data in wildcards

EXT:my_extension/Classes/Controller/SomeController.php
use TYPO3\CMS\Extbase\Utility\LocalizationUtility;

$someString = LocalizationUtility::translate('count_posts', 'BlogExample', [$countPosts, $countComments])

$anotherString = LocalizationUtility::translate('greeting', 'BlogExample', [$userName])
Copied!

Localization of Extbase models 

Identifiers in localized models 

Domain models have a main identifier uid and an additional property _localizedUid.

Depending on whether the overlay type language aspect is enabled ( LanguageAspect::OVERLAYS_ON or LanguageAspect::OVERLAYS_MIXED) or disabled ( LanguageAspect::OVERLAYS_OFF), the identifier contains different values.

When the overlay language aspect is enabled, then the uid property contains the uid value of the default language record and the uid of the translated record is kept in the _localizedUid.

Context Record in language 0 Translated record
Database uid:2 uid:11, l10n_parent:2
Domain object values with Overlay language aspect enabled uid:2, _localizedUid:2 uid:2, _localizedUid:11
Domain object values with Overlay language aspect disabled uid:2, _localizedUid:2 uid:11, _localizedUid:11