TYPO3 基于当前前端语言加载对象

TYPO3 loading object based on current front end language

我是 运行 Typo3 v9.5.4 Onepager 风格的网站。内容直接从 tt_content 加载。该网站有两种 FE 语言 (German/English)。 我有一个带有锚链接的 CTA 按钮。该按钮是用错字创建的。我为德语版本创建了一个按钮,为英语版本创建了一个按钮,因为它们有另一个值和另一个 ancorlink。

我不确定我是否可以直接从流畅的 viewhelper 访问 tt_content 字段。这是我试过的代码

        <f:if condition="{tt_content.sys_language_uid} == 1">
          <f:then>
              <f:format.raw>{buttonEn}</f:format.raw>
          </f:then>
          <f:else>
              <f:format.raw>{buttonDe}</f:format.raw>
          </f:else>
        </f:if>

这是我的两个按钮对象的 Typoscript

lib.buttonDe = TEXT
lib.buttonDe {
    value = German Text
    stdWrap.typolink.parameter = #anchorlinkDE
    stdWrap.typolink.ATagParams = class="button"
}

lib.buttonEn = TEXT
lib.buttonEn {
    value = English Text
    stdWrap.typolink.parameter = #anchorlinkEN
    stdWrap.typolink.ATagParams = class="button"
}

这是加载内容、语言菜单和 Fluidtemplate 的拼写错误(Onepager 内容在没有 Fluidtemplate 的情况下加载,它直接从 tt_content 加载内容):

//--------------------- One Pager Content

lib.sectionContent = HMENU
lib.sectionContent {
  excludeUidList = 12,13,16,17,29
  1 = TMENU
  1 {
    NO = 1
    NO {
      doNotLinkIt = 1
      stdWrap >
      stdWrap {
        cObject = COA
        cObject {
          if.value = 4
          if.equals.field = doktype
          if.negate = 1
          10 < temp.titleSectionId
          10.wrap = <section id="|">
          20 = CONTENT
          20 {
            table = tt_content
            select {
              pidInList.field = uid
              orderBy = colPos,sorting
              # Only selects Content where CE Layout is 0
              where = (tt_content.layout = "0") 
            }

            wrap = <div class="container">|</div>
            renderObj < tt_content
          }
          30 = TEXT
          30 {
            wrap = </section>
          }
        }
      }
    }
  }
}

//---------------------

// Language Selector
lib.langmenu = HMENU
lib.langmenu {
    special = language
    addQueryString = 1
    special.value = {$config.language.uids}
    1 = TMENU
    1 {
        wrap = <ul class="dg-langmenu row">|</ul>
        NO = 1
        NO {
            stdWrap.current = 1
            stdWrap.setCurrent = {$config.language.labels}
            allWrap = <li class="col s6">|</li>
        }

        ACT < .NO
        ACT.doNotLinkIt = 1
        ACT.allWrap = <li class="act col s6">|</li>
    }
} 


page = PAGE
page{
    10 = FLUIDTEMPLATE
    10 {

        templateName = TEXT
        templateName.stdWrap{
            cObject = TEXT
            cObject{
                data = levelfield:-2,backend_layout_next_level,slide
                override.field = backend_layout
                split {
                    token = pagets__
                    1.current = 1
                    1.wrap = |
                    }
            }  
        ifEmpty = onePager
        }

    templateRootPaths {
    10 = {$path.privat}Templates/
    }
    layoutRootPaths {
        10 = {$path.privat}Layouts/
    }
    partialRootPaths {
        10 = {$path.privat}Partials/
    }

    variables{
    buttonDe < lib.buttonDe
    buttonEnd< lib.buttonEn
    }


}

如果内容有 sys_language_uid 1(英文),我想加载 buttonEn,否则我想加载 buttonDe。

我是否需要创建一个 Typoscript 对象,然后将此对象加载到 f:if viewhelper 中?如果是这样,我该如何创建这个 Typoscript 对象。

感谢您的帮助!

您应该使用 locallang 文件并在 TypoScript 中引用它。

  1. 创建一个名为 locallang.xlf
  2. 的 locallang 文件(复制现有值并删除所有值)
  3. 在那里添加你的英文标签
  4. 在同一文件夹中创建一个 locallang 文件,在文件名中添加前缀 de. (de.locallang.xlf) 并添加德语标签
  5. 使用 lib.button.data = LLL:EXT:your_ext/path/to/locallang/locallang.xlf:buttonLabel 在 TypoScript 中引用它,参见 https://docs.typo3.org/typo3cms/TyposcriptReference/DataTypes/Index.html#lll

这个TS getText函数根据设置的语言ID自动获取标签,按钮只需要一个TS。

示例:https://docs.typo3.org/typo3cms/TyposcriptIn45MinutesTutorial/UsingGetText/Index.html

简单的方法(纯打字错误)

lib.button = TEXT
lib.button {
    value = English text
    lang.de = Deutscher Text
    stdWrap.typolink.parameter = #anchorlinkDE
    stdWrap.typolink.ATagParams = class="button"
}
[siteLanguage("locale") == "en_EN.UTF-8"]
  lib.buton.stdWrap.typolink.parameter = #anchorlinkEN
[global]

但专业的解决方案是在语言文件中配置标签(请参阅 Thomas Löffler 的回答)并使用:

lib.button = TEXT
lib.button {
    lib.button.data = LLL:EXT:site_extension/Resources/Private/Language/locallang.xlf:button_label
    stdWrap.typolink.parameter = #anchorlinkEN
    stdWrap.typolink.ATagParams = class="button"
}
[siteLanguage("locale") == "de_DE.UTF-8"]
  lib.buton.stdWrap.typolink.parameter = #anchorlinkDE
[global]

对于依赖于语言的常量数据,您可以使用打字错误条件为您的非默认语言重新定义一个值。 (或为每种语言定义回退和条件。)