首页 文章

TYPO3 TypoScript:带参数的语言文件

提问于
浏览
1

如何在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 回答

  • 0

    我认为这在 TEXT 对象中是不可能的,因为为了从TS解析 LLL: ,使用方法 TypoScriptFrotnendController->sL() .

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

  • 3

    如果您的问题只是%s部分,那么您可以使用stdwrap.replacement来处理:

    stdWrap.replacement {
        10 {
          search = %s
          replace = Me
        }
      }
    

    https://docs.typo3.org/typo3cms/TyposcriptReference/Functions/Replacement/Index.html

  • 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

    由于我目前正在使用TYPO3 CMS 6.2.x,因此userFunc为我工作 .
    我扩展了TypoScript,因为我需要对动态值做出反应,基于CONTENT和select .

    Typo脚本:

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

    UserFunction:

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

相关问题