如何让TYPO3的HMENU(special=language)仅显示可用页面?
核心问题分析
你的代码里手动指定了additionalParams的语言参数,且固定使用当前页面UID生成链接,没有检查当前页面是否存在对应语言的翻译版本,导致无翻译页面时,链接指向当前页面加语言参数,最终触发404。同时没有利用HMENU special=language的自动处理逻辑——它本来可以自动获取对应语言的页面UID,并过滤无翻译的菜单项。
调整方案
1. 自动过滤无翻译的语言项
在HMENU的special配置中添加hideIfNoTranslation = 1,让TYPO3自动隐藏当前页面没有对应语言翻译的菜单项。
2. 修正链接生成逻辑
移除手动设置的additionalParams,改用HMENU提供的对应语言页面UID(itemData:uid)生成链接,同时去掉doNotLinkIt=1,让TMENU自动生成正确的语言切换链接。
修改后的完整TypoScript代码
20 = HMENU 20 { special = language special.value = 0,1,2,3,4,5,6 special.normalWhenNoLanguage = 0 # 自动隐藏无对应语言翻译的菜单项 special.hideIfNoTranslation = 1 1 = TMENU 1 { wrap ( <div class="dropdown-menu" aria-labelledby="dropdownMenuLink"> | </div> </div> </div> ) NO = 1 NO { # 移除手动禁用链接的设置,让TMENU自动生成链接 # doNotLinkIt = 1 # linkWrap = | stdWrap { typolink { # 使用HMENU提供的对应语言页面UID,而非当前页面UID parameter.data = itemData:uid ATagParams = class="dropdown-item" addQueryString = 1 addQueryString.exclude = L,id,no_cache addQueryString.method = GET no_cache = 0 } } } ACT < .NO ACT { stdWrap { typolink { ATagParams = class="disable-link-content" } } } USERDEF1 < .NO USERDEF1 { noLink = 1 } USERDEF2 < .ACT USERDEF2 { noLink = 1 } } }
额外说明
- 如果需要保留无翻译语言的菜单项但不生成链接,可以给
USERDEF1添加条件判断:当itemData:uid为空时触发该状态,实现无翻译项仅显示文本不跳转。
内容的提问来源于stack exchange,提问作者Rustyjim
相关产品推荐
相关产品推荐

