Установить язык TYPO3 StandaloneView в CommandController

Я использую TYPO3 \ CMS \ Fluid \ View \ StandaloneView в CommandController для отправки писем на мой fe_user.

Часть, где я создаю шаблон, выглядит так:

    /* @var \TYPO3\CMS\Fluid\View\StandaloneView $emailView */
$emailView = $this->objectManager->get( 'TYPO3\\CMS\\Fluid\\View\\StandaloneView' );

// pass extension name to standaloneView for translations
$extensionName = $this->request->getControllerExtensionName();
$emailView->getRequest()->setControllerExtensionName( $extensionName );

$extensionPath           = \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath( 'my_extension' );
$templatePathAndFilename = $extensionPath . 'Resources/Private/Templates/Email/' . $templateFile . '.html';
$emailView->setLayoutRootPath( $extensionPath . 'Resources/Private/Layouts/Email/' );
//$emailView->setPartialRootPath($ressourcePath . 'Partials/');

$emailView->setTemplatePathAndFilename( $templatePathAndFilename );

return $emailView->render();

Думаю, ничего особенного.

В html-шаблоне я использую обычный переводчик ViewHelper из Fluid:

<f:translate key="LLL:EXT:my_extension/Resources/Private/Language/locallang.xlf:mail.text" />

Все это хорошо работает на стандартном языке, но я понятия не имею, как я могу сказать View / CommandController какой язык использовать.

Я не совсем уверен, если это проблема StandaloneView или CommandController …

Редактировать:

Размещенный фрагмент вызывается из CommandController (Scheduler), поэтому текущий пользователь внешнего интерфейса отсутствует (мы находимся в бэкэнд-среде). Я получаю пользователя из репозитория, поэтому я должен сохранить выбранный язык там. Но тогда я должен установить язык для StandaloneView

1

Решение

Обычно вы можете установить язык в CommandController, выполнив это:

$GLOBALS['BE_USER']->uc['lang'] = 'de';

Проблема в том, что LocalizationUtility создает кеш для расширения после того, как оно было вызвано один раз для :: translate () чего-либо. Нет доступных функций для сброса этого кэша, но вы можете добавить эту маленькую служебную функцию в свое расширение, чтобы позволить вам сделать именно это:

namespace Vendor\Extension\Utility;

class LocalizationUtility extends \TYPO3\CMS\Extbase\Utility\LocalizationUtility
{
public static function resetExtensionLangCache($extensionName){
unset(static::$LOCAL_LANG[$extensionName]);
}
}

Если у вас есть случай, когда вам нужно переключить полный языковой контекст в вашем CommandController, вы можете вызвать это сразу после переключения языка для BE_USER:

\Vendor\Extension\Utility\LocalizationUtility::resetExtensionLangCache('<extensionname>');

Это сбросит кэш, и LocalizationUtility придется инициализировать его запись для вашего расширения, пока вы не переключитесь и не вызовете его снова.

2

Другие решения

Чтобы управлять языком, используемым в Fluid StandaloneView, из внутреннего интерфейса, просто установите язык, как показано ниже (я установил язык на немецкий).

$GLOBALS['BE_USER']->uc['lang'] = 'de';

Это должно быть установлено до вызова $emailView->render() метод.

1

Я предполагаю, что вы хотите отправить электронное письмо на языке, используемом в данный момент пользователем, в этом случае вы должны создать языковой конфиг для дополнительных языков, например описано в документации TYPO3.

При правильной настройке и использовании языка, отличного от используемого по умолчанию, все ваши представления (в том числе и автономные) будут переведены на ток язык.

AFAUK, нет никакого способа заставить переводить VH, чтобы использовать какой-то язык, т.е. давая его UID.

0
По вопросам рекламы [email protected]