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 中引用它。
- 创建一个名为
locallang.xlf
的 locallang 文件(复制现有值并删除所有值)
- 在那里添加你的英文标签
- 在同一文件夹中创建一个 locallang 文件,在文件名中添加前缀
de.
(de.locallang.xlf
) 并添加德语标签
- 使用
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]
对于依赖于语言的常量数据,您可以使用打字错误条件为您的非默认语言重新定义一个值。 (或为每种语言定义回退和条件。)
我是 运行 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 中引用它。
- 创建一个名为
locallang.xlf
的 locallang 文件(复制现有值并删除所有值)
- 在那里添加你的英文标签
- 在同一文件夹中创建一个 locallang 文件,在文件名中添加前缀
de.
(de.locallang.xlf
) 并添加德语标签 - 使用
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]
对于依赖于语言的常量数据,您可以使用打字错误条件为您的非默认语言重新定义一个值。 (或为每种语言定义回退和条件。)