TYPO3 TypoScript:带参数的语言文件
TYPO3 TypoScript: Language file with arguments
如何在 TypoScript 中呈现带参数的本地语言键? (用一个值替换 %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'}
=====
通过 UserFunc 的解决方案 1:
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;
}
}
我认为这在 TEXT
对象中是不可能的,因为为了从 TS 解析 LLL:
,使用了方法 TypoScriptFrotnendController->sL()
。
然而,您可以使用 USER
对象调用用户函数,并使用 LocalizationUtility::translate()
在那里获取您的标签,您可以在其中传递参数。
如果您的问题只是 %s 部分,那么您可以使用 stdwrap.replacement 来处理:
stdWrap.replacement {
10 {
search = %s
replace = Me
}
}
见https://docs.typo3.org/typo3cms/TyposcriptReference/Functions/Replacement/Index.html
流体模板支持这些标记(sprintf()
样式),因为 TranslateViewHelper 调用 LocalizationUtility,后者在已解析的 LLL 上调用 vsprintf()
。
但是,目前无法通过 TypoScript 进行相同的处理。尽管从技术上讲它可以作为一种新型 stdWrap
函数添加。以前,此功能已被建议以允许调用任何 PHP 函数的形式 - 但由于安全问题以及 TypoScript 开发人员是第二 class 公民(与原始PHP) 在 TYPO3.
也就是说,有一个立即可用的选项,您可以使用它来重现行为 stdWrap
:
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_content.php']['stdWrap']
处有一个挂钩位置,允许您注册一个 class 名称,该名称实现 \TYPO3\CMS\Frontend\ContentObject\ContentObjectStdWrapHookInterface
,可以触发特殊 stdWrap
配置并执行您的 sprintf()
或 vsprintf()
在解析后调用 LLL 值。
附带说明一下,如果您完成了这样的功能,那么 suggest/contribute 将其返回到 TYPO3 就很有意义了。在我看来,这是一个合理的功能请求!
由于我目前正在使用 TYPO3 CMS 6。2.x userFunc 对我有用。
我扩展了 TypoScript,因为我需要根据内容结合 select 对动态值做出反应。
打字错误:
page.99 = CONTENT
page.99 {
table = tt_content
select {
uidInList = 484
pidInList = 156
}
selectFields = uid
renderObj = COA
renderObj {
10 = USER
10 {
userFunc = FluidTranslate->main
extensionName = my_ext
key = tx_myext_domain_model_mymodelname.langkey
fields.0 = uid
}
}
}
用户函数:
<?php
class FluidTranslate
{
/**
* @var \TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer
*/
public $cObj = null;
public function main($content, $conf)
{
$extensionName = $conf['extensionName'];
$key = $conf['key'];
$arguments = array();
$fields = $conf['fields.'];
foreach ($fields as $field) {
$arguments[] = $this->cObj->data[$field];
}
$value = \TYPO3\CMS\Extbase\Utility\LocalizationUtility::translate($key, $extensionName, $arguments);
return $value;
}
}
可以将 FLUIDTEMPLATE
与内联模板一起使用,以便使用 ViewHelper:
page.10 = FLUIDTEMPLATE
page.10 {
template = TEXT
template = {f:translate(key: 'author', arguments: {0: authorName}, extensionName: 'my_ext')}
variables {
authorName = TEXT
authorName {
field = author_name
}
}
}
如何在 TypoScript 中呈现带参数的本地语言键? (用一个值替换 %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'}
=====
通过 UserFunc 的解决方案 1:
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;
}
}
我认为这在 TEXT
对象中是不可能的,因为为了从 TS 解析 LLL:
,使用了方法 TypoScriptFrotnendController->sL()
。
然而,您可以使用 USER
对象调用用户函数,并使用 LocalizationUtility::translate()
在那里获取您的标签,您可以在其中传递参数。
如果您的问题只是 %s 部分,那么您可以使用 stdwrap.replacement 来处理:
stdWrap.replacement {
10 {
search = %s
replace = Me
}
}
见https://docs.typo3.org/typo3cms/TyposcriptReference/Functions/Replacement/Index.html
流体模板支持这些标记(sprintf()
样式),因为 TranslateViewHelper 调用 LocalizationUtility,后者在已解析的 LLL 上调用 vsprintf()
。
但是,目前无法通过 TypoScript 进行相同的处理。尽管从技术上讲它可以作为一种新型 stdWrap
函数添加。以前,此功能已被建议以允许调用任何 PHP 函数的形式 - 但由于安全问题以及 TypoScript 开发人员是第二 class 公民(与原始PHP) 在 TYPO3.
也就是说,有一个立即可用的选项,您可以使用它来重现行为 stdWrap
:
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_content.php']['stdWrap']
处有一个挂钩位置,允许您注册一个 class 名称,该名称实现 \TYPO3\CMS\Frontend\ContentObject\ContentObjectStdWrapHookInterface
,可以触发特殊 stdWrap
配置并执行您的 sprintf()
或 vsprintf()
在解析后调用 LLL 值。
附带说明一下,如果您完成了这样的功能,那么 suggest/contribute 将其返回到 TYPO3 就很有意义了。在我看来,这是一个合理的功能请求!
由于我目前正在使用 TYPO3 CMS 6。2.x userFunc 对我有用。
我扩展了 TypoScript,因为我需要根据内容结合 select 对动态值做出反应。
打字错误:
page.99 = CONTENT
page.99 {
table = tt_content
select {
uidInList = 484
pidInList = 156
}
selectFields = uid
renderObj = COA
renderObj {
10 = USER
10 {
userFunc = FluidTranslate->main
extensionName = my_ext
key = tx_myext_domain_model_mymodelname.langkey
fields.0 = uid
}
}
}
用户函数:
<?php
class FluidTranslate
{
/**
* @var \TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer
*/
public $cObj = null;
public function main($content, $conf)
{
$extensionName = $conf['extensionName'];
$key = $conf['key'];
$arguments = array();
$fields = $conf['fields.'];
foreach ($fields as $field) {
$arguments[] = $this->cObj->data[$field];
}
$value = \TYPO3\CMS\Extbase\Utility\LocalizationUtility::translate($key, $extensionName, $arguments);
return $value;
}
}
可以将 FLUIDTEMPLATE
与内联模板一起使用,以便使用 ViewHelper:
page.10 = FLUIDTEMPLATE
page.10 {
template = TEXT
template = {f:translate(key: 'author', arguments: {0: authorName}, extensionName: 'my_ext')}
variables {
authorName = TEXT
authorName {
field = author_name
}
}
}