TYPO3 TypoScript:带参数的语言文件

4
我该如何在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;
  }
}
5个回答

4

1

我认为在TEXT对象中尚不可能实现这一点,因为为了解决TS中的LLL:,使用了方法TypoScriptFrotnendController->sL()

但是,您可以使用USER对象调用用户函数,在那里使用LocalizationUtility::translate()获取您的标签,并可以传递参数。


1
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 会很有意义。对我来说,这是一个合理的功能请求!


0

可以使用内联模板和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
        }
    }
}

0

由于我目前正在使用TYPO3 CMS 6.2.x,因此userFunc对我有用。
我扩展了TypoScript,因为我需要根据与select结合的CONTENT上的动态值做出反应。

TypoScript:

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;
    }
}

将COA_INT切换到COA或将USER_INT切换到USER,甚至可以删除COA_INT并直接使用USER_INT以获得更好的性能并删除不需要的行。 - Georg Ringer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接