如何在TypoScript中使用参数渲染locallang键? (用值替换%s)
<trans-unit id="author">
<source>created by %s</source>
</trans-unit>
在Fluid中,它完成了以下操作:
<f:translate key="author" arguments="{0:authorName}"/>
现在通过TypoScript?我尝试了以下方法:
page.10 = TEXT
page.10.dataWrap = {LLL:EXT:my_ext/Resources/Private/Language/locallang.xlf:author|'Me'}
=====
解决方案1通过UserFunc:
page.10 = USER_INT
page.10 {
userFunc = FluidTranslate->main
extensionName = my_ext
key = tx_myext_domain_model_mymodel.author
arguments.0 = Me
}
PHP:
<?php
class FluidTranslate
{
public function main($content, $conf)
{
$extensionName = $conf['extensionName'];
$key = $conf['key'];
$arguments = $conf['arguments.'];
$value = \TYPO3\CMS\Extbase\Utility\LocalizationUtility::translate($key, $extensionName, $arguments);
return $value;
}
}
4 回答
我认为这在
TEXT
对象中是不可能的,因为为了从TS解析LLL:
,使用方法TypoScriptFrotnendController->sL()
.但是,您可以使用
USER
对象调用用户函数,并使用LocalizationUtility::translate()
在那里获取您的标签,您可以在其中传递参数 .如果您的问题只是%s部分,那么您可以使用stdwrap.replacement来处理:
见https://docs.typo3.org/typo3cms/TyposcriptReference/Functions/Replacement/Index.html
Fluid模板支持这些标记(
sprintf()
样式),因为TranslateViewHelper调用LocalizationUtility,它在已解析的LLL上调用vsprintf()
.但是,目前TypoScript无法进行相同的处理 . 虽然它在技术上可以添加为新类型的
stdWrap
功能 . 以前,这个功能已经被允许调用任何PHP函数的形式建议 - 但由于安全问题以及TypoScript开发人员是TYPO3中的二等公民(与原始PHP相比)这一事实被拒绝(合理地如此) .这就是说有一个立即可用的选项,您可以用来重现行为
stdWrap
:$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_content.php']['stdWrap']
处有一个挂钩位置,允许您注册实现\TYPO3\CMS\Frontend\ContentObject\ContentObjectStdWrapHookInterface
的类名,该类可以触发特殊的stdWrap
配置,并在解析后对LLL值执行sprintf()
或vsprintf()
调用 .另外,如果您完成了这样的功能,建议/将其贡献给TYPO3会很有意义 . 在我看来,这是一个合理的功能要求!
由于我目前正在使用TYPO3 CMS 6.2.x,因此userFunc为我工作 .
我扩展了TypoScript,因为我需要对动态值做出反应,基于CONTENT和select .
Typo脚本:
UserFunction: