Typo3 11中Typoscript生成的分类菜单查询异常,无法获取翻译
问题分析与解决方案
核心问题
你的SQL查询里的错误条件是因为TYPO3 CONTENT对象默认的语言查询逻辑没有正确适配sys_category的翻译机制——分类翻译条目sys_language_uid≠0时,l10n_parent必然指向原语言分类的UID而非0,所以那部分OR条件确实恒为假,导致无法获取翻译内容。同时你的Typoscript还存在拼写错误,这也会影响查询结果。
步骤1:修正Typoscript拼写错误与添加语言配置
你的selectFields里把sys_category误写为sys_scategory,同时需要添加语言覆盖相关配置,让CONTENT对象正确处理多语言分类:
lib.productsMenu = CONTENT lib.productsMenu { table = sys_category select { pidInList = {$plugin.tx_products.productsCategoriesStoragePid} # 修正拼写错误:sys_scategory → sys_category selectFields = sys_category.uid AS category_uid, sys_category.title AS category_title where = sys_category.uid != 28 groupBy = sys_category.uid } # 关键配置:启用语言覆盖并遵循当前系统语言 languageOverlay = 1 respectSysLanguage = 1 # 可选:无翻译时回退显示默认语言内容 # languageMode = content_fallback }
步骤2:理解语言查询逻辑的修正
添加languageOverlay = 1和respectSysLanguage = 1后,TYPO3会自动调整SQL查询逻辑:
- 优先匹配当前语言的分类翻译条目(
sys_language_uid = 当前语言ID且l10n_parent对应原分类UID) - 若没有翻译条目,根据
languageMode配置决定是否回退到原语言条目 - 自动生成正确的语言过滤条件,替代你之前看到的错误OR逻辑
步骤3:验证分类翻译的正确性
确认你的分类翻译条目满足以下要求:
sys_language_uid设置为目标语言ID(比如1)l10n_parent正确关联原语言(默认语言)的分类UID- 翻译条目未被隐藏/删除,且生效时间(starttime/endtime)正常
步骤4:检查生成的SQL(可选)
配置修正后,生成的SQL语言条件会变为类似以下形式,能正确匹配翻译条目:
SELECT sys_category.uid AS category_uid, sys_category.title AS category_title... FROM sys_category WHERE (...) AND ((sys_category.sys_language_uid IN (0, -1)) OR (sys_category.l10n_parent IN (原分类UID列表) AND sys_category.sys_language_uid = 1))
额外提示
如果网站语言配置使用sys_language_mode = strict,需确保每个分类都有对应翻译条目才会显示;若想允许无翻译时显示原语言内容,设置languageMode = content_fallback即可。
内容的提问来源于stack exchange,提问作者arderoma
相关产品推荐
相关产品推荐

