Typo3 11中Extbase内联关联翻译失效问题咨询
TYPO3 11内联关联未翻译主条目时显示翻译内容的解决方案
针对你遇到的问题——主条目未翻译但关联内容已翻译时,仍显示关联的默认语言版本,可通过以下几个步骤解决:
1. 调整内联字段的TCA配置
在扩展的TCA配置文件中,为内联字段添加合适的语言过滤条件,并配置本地化行为,确保关联记录可以独立翻译:
// Configuration/TCA/tx_yourext_domain_model_main.php 'your_inline_field' => [ 'label' => '关联内容', 'config' => [ 'type' => 'inline', 'foreign_table' => 'tx_yourext_domain_model_related', 'foreign_table_where' => 'AND tx_yourext_domain_model_related.pid=###CURRENT_PID### AND tx_yourext_domain_model_related.sys_language_uid IN (-1, ###SYS_LANGUAGE_UID###, 0)', 'behaviour' => [ 'localizationMode' => 'select', // 允许关联记录独立于主条目翻译 'localizeChildrenAtParentLocalization' => false, // 主条目翻译时不强制同步关联记录 ], ], ],
sys_language_uid IN (-1, ###SYS_LANGUAGE_UID###, 0)的条件允许加载未本地化、当前语言和默认语言的关联记录,为后续优先取当前语言版本做基础。
2. 在控制器中自定义关联记录查询逻辑
默认情况下,Extbase会跟随主条目的语言加载关联记录,要打破这个逻辑,可在主控制器的显示方法中手动调用自定义查询获取关联记录:
// Classes/Controller/MainController.php public function showAction(\Vendor\YourExt\Domain\Model\Main $main) { $currentLangUid = $this->request->getAttribute('language')->getLanguageId(); // 调用自定义Repository方法获取对应语言的关联记录 $relatedObjects = $this->relatedRepository->findByMainAndPreferredLanguage($main, $currentLangUid); $this->view->assignMultiple([ 'main' => $main, 'relatedObjects' => $relatedObjects ]); }
3. 扩展关联记录Repository的查询方法
在关联记录的Repository中添加自定义方法,实现“优先当前语言,无则回退默认语言”的查询逻辑:
// Classes/Domain/Repository/RelatedRepository.php public function findByMainAndPreferredLanguage(\Vendor\YourExt\Domain\Model\Main $main, int $preferredLangUid) { $query = $this->createQuery(); $query->matching( $query->logicalAnd( $query->equals('main', $main), $query->in('sysLanguageUid', [$preferredLangUid, 0]) ) ); // 按语言ID倒序,确保当前语言记录排在前面 $query->setOrderings(['sysLanguageUid' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING]); return $query->execute(); }
4. 调整TYPO3前端语言配置
确保系统语言模式配置为内容回退,避免严格模式下未翻译主条目直接返回404:
// 在AdditionalConfiguration.php中添加 $GLOBALS['TYPO3_CONF_VARS']['FE']['sys_language_mode'] = 'content_fallback'; $GLOBALS['TYPO3_CONF_VARS']['FE']['sys_language_overlay'] = '1';
这样配置后,TYPO3会优先使用翻译后的内容,当无翻译时回退到默认语言,同时允许主条目未翻译时正常显示,并加载关联记录的翻译版本。
内容的提问来源于stack exchange,提问作者Mltno
相关产品推荐
相关产品推荐

