Я использую 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
Обычно вы можете установить язык в 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 придется инициализировать его запись для вашего расширения, пока вы не переключитесь и не вызовете его снова.
Чтобы управлять языком, используемым в Fluid StandaloneView, из внутреннего интерфейса, просто установите язык, как показано ниже (я установил язык на немецкий).
$GLOBALS['BE_USER']->uc['lang'] = 'de';
Это должно быть установлено до вызова $emailView->render()
метод.
Я предполагаю, что вы хотите отправить электронное письмо на языке, используемом в данный момент пользователем, в этом случае вы должны создать языковой конфиг для дополнительных языков, например описано в документации TYPO3.
При правильной настройке и использовании языка, отличного от используемого по умолчанию, все ваши представления (в том числе и автономные) будут переведены на ток язык.
AFAUK, нет никакого способа заставить переводить VH, чтобы использовать какой-то язык, т.е. давая его UID.