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