TYPO3 v10修复language=all的Gridelements翻译CE渲染异常
当前运行环境为TYPO3 10.4.28,搭配gridelements 10.4.3(未启用DataProcessing)。
为减少多语言站点的内容冗余,我将无自有文本内容的内容元素(CE)设置为language=all,仅翻译包含文本内容的CE。对于未使用标题或其他自有文本字段的网格容器,设置为language=all是十分合理高效的方案:即可将容器内的插件、菜单元素、图片统一设为Language=all,即使容器内同时包含已翻译的文本CE也可正常管理。
但在language=all属性的gridelements容器内放置翻译CE时,翻译页面的前端渲染会出现异常:
fallbacktype: strict/fallback模式下翻译CE会重复渲染fallbacktype: free模式下会渲染出所有语言版本的CE
据gridelements维护者@Jo Hasenau说明,未修改的原生gridelements不直接支持将翻译元素放入language=all容器。
方案尝试
fallbacktype: free模式配置
配置代码如下:
[siteLanguage("languageId") == 1] lib.gridelements.defaultGridSetup.columns.default.renderObj.20.stdWrap.if { isInList.field = sys_language_uid # -1 对应 language=all value = -1,1 } [GLOBAL] # 仅允许当前语言或"all"语言的内容渲染 # 其他语言ID需重复添加对应条件配置
该配置存在明显缺陷:free模式下,翻译元素在前端的排序依据是自身的sorting字段,而非对应原元素的排序,会导致翻译元素与Language=all元素的相对位置和默认语言不一致,在大型站点中手动修正排序成本极高,适用性较差。
fallbacktype: strict模式初始配置尝试
strict模式下的默认渲染逻辑为:先渲染带翻译覆盖层的原元素,再渲染独立的翻译项本身。基于这个逻辑我最初尝试添加如下过滤配置:
lib.gridelements.defaultGridSetup.columns.default.renderObj.20.stdWrap.if { isFalse.field = l18n_parent }
原本预期该配置仅过滤独立的翻译项,但实际会同时过滤掉翻译覆盖层,经排查该渲染节点下两类元素的TypoScript识别属性完全一致,无法直接通过字段判断区分。
最终结果
目前已找到适用于strict和fallback模式的纯TypoScript解决方案,前述free模式的配置技术上可正常运行,仅因排序问题适用性较差,该渲染异常问题已基本解决。
开发提示:计划使用该结构的开发者需要注意,
sys_language_uid -1即Language All特性可能在TYPO3后续版本中被移除。
内容的提问来源于stack exchange,提问作者Wolfgang Löer

