【问题标题】:TYPO3 TypoScript: Language file with argumentsTYPO3 TypoScript:带参数的语言文件
【发布时间】:2016-09-07 10:05:13
【问题描述】:

如何在 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'}

=====
通过 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;
  }
}

【问题讨论】:

    标签: typo3 typoscript typo3-6.2.x


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      我认为这在 TEXT 对象中尚不可行,因为要从 TS 解析 LLL:,使用了 TypoScriptFrotnendController-&gt;sL() 方法。

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

      【讨论】:

        【解决方案3】:

        流体模板支持这些标记(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 会很有意义。在我看来这是一个合理的功能要求!

        【讨论】:

          【解决方案4】:

          由于我目前正在使用 TYPO3 CMS 6.2.x,因此 userFunc 为我工作。
          我扩展了 TypoScript,因为我需要根据 CONTENT 和 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;
              }
          }
          

          【讨论】:

          • 要么将 COA_INT 切换为 COA,要么将 USER_INT 切换为 USER,甚至删除 COA_INT 并直接使用 USER_INT 以获得更好的性能并删除不需要的行
          【解决方案5】:

          可以将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
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-28
            • 1970-01-01
            • 2014-02-05
            相关资源
            最近更新 更多