我在命令控制器中使用TYPO3''CMS''Fluid''View''StandaloneView向我的fe_user发送电子邮件。
im构建模板的部分如下所示:
/* @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模板中,我使用的是Fluid的普通翻译ViewHelper:
<f:translate key="LLL:EXT:my_extension/Resources/Private/Language/locallang.xlf:mail.text" />
这一切都在标准语言中运行良好,但我不知道如何告诉视图/命令控制器使用哪种语言。
我不太确定这是独立视图还是命令控制器问题......
编辑:
发布的代码段是从命令控制器(调度程序)调用的 - 因此没有当前前端用户(我们在后端环境中)。我从存储库中获取用户,因此我必须将所选语言保存在其中。但是我必须为独立视图设置语言
通常,
您可以通过执行以下操作在命令控制器中设置语言:
$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]);
}
}
如果您遇到必须在命令控制器中切换完整语言上下文的情况,您现在可以在切换BE_USER的语言后立即调用它:
'Vendor'Extension'Utility'LocalizationUtility::resetExtensionLangCache('<extensionname>');
这将重置缓存,并且 LocalizationUtility 必须初始化扩展的条目,直到您切换并再次调用它。
要从后端上下文控制 Fluid StandaloneView 中使用的语言,只需按如下所示设置语言(我将语言设置为德语)。
$GLOBALS['BE_USER']->uc['lang'] = 'de';
这应该在调用 $emailView->render()
方法之前设置。
我假设您想用用户当前使用的语言发送电子邮件,在这种情况下,您应该为其他语言创建语言配置,如 TYPO3 文档中所述。
如果配置正确并使用非默认语言,则所有视图(包括这些独立视图)都将转换为当前语言。
AFAUK,没有办法强制翻译VH使用某些语言,即通过给出它的UID。