TYPO3:页面无翻译时如何在菜单显示原始语言版本链接?
TYPO3多语言菜单:无翻译时显示原始语言链接的现代实现方案
针对你提到的需求——页面无对应翻译版本时,菜单显示原始语言链接而非生成指向原始内容的翻译URL——目前有两种基于TYPO3现代特性的可行方案:
一、自定义DataProcessor(菜单专属处理)
TYPO3自带的MenuProcessor默认会生成当前语言的URL,即便页面没有翻译。我们可以通过扩展这个处理器,在菜单项处理阶段判断页面翻译是否存在,不存在则替换为原始语言的链接。
步骤1:编写自定义DataProcessor
创建一个继承自MenuProcessor的类,重写菜单项处理逻辑:
<?php namespace Vendor\YourExtension\DataProcessing; use TYPO3\CMS\Core\Site\Entity\SiteLanguage; use TYPO3\CMS\Frontend\DataProcessing\MenuProcessor; class FallbackLanguageMenuProcessor extends MenuProcessor { protected function processMenuItem(array $menuItem, SiteLanguage $siteLanguage): array { $processedItem = parent::processMenuItem($menuItem, $siteLanguage); // 检查当前语言是否存在该页面的翻译 $translatedPage = $this->pageRepository->getPageOverlay($menuItem['uid'], $siteLanguage->getLanguageId()); if (!$translatedPage) { // 获取站点默认语言(即原始语言,比如DE) $defaultLanguage = $this->site->getDefaultLanguage(); // 重新生成原始语言的页面链接 $processedItem['link'] = $this->uriBuilder->setTargetPageUid($menuItem['uid']) ->setLanguage($defaultLanguage) ->build(); // 可选:保留原始页面的标题,避免显示空或错误标题 $processedItem['title'] = $menuItem['title']; } return $processedItem; } }
步骤2:在TypoScript中配置使用
替换原有的MenuProcessor配置为自定义处理器:
page.10 = Vendor\YourExtension\DataProcessing\FallbackLanguageMenuProcessor page.10 { levels = 1 includeSpacer = 1 as = mainMenu // 其他原有配置保持不变 }
这个方案仅作用于菜单,不会影响全局页面链接的生成,适合只需要调整菜单行为的场景。
二、利用路由事件监听器(全局链接处理)
如果希望所有页面链接(不仅是菜单)在无翻译时都跳转到原始语言URL,可以通过TYPO3的路由事件ModifyPageLinkBuilderEvent来拦截并修改链接生成逻辑。
步骤1:编写事件监听器
创建事件处理类,检查页面翻译状态并切换链接语言:
<?php namespace Vendor\YourExtension\EventListener; use TYPO3\CMS\Core\Routing\ModifyPageLinkBuilderEvent; use TYPO3\CMS\Core\Site\Entity\SiteLanguage; class FallbackLanguageLinkListener { public function __invoke(ModifyPageLinkBuilderEvent $event): void { $pageUid = $event->getPageUid(); $currentLanguage = $event->getLanguage(); $pageRepository = $GLOBALS['TSFE']->sys_page; // 检查当前语言是否存在页面翻译 $translatedPage = $pageRepository->getPageOverlay($pageUid, $currentLanguage->getLanguageId()); if (!$translatedPage) { // 切换为站点默认语言生成链接 $defaultLanguage = $event->getSite()->getDefaultLanguage(); $event->setLanguage($defaultLanguage); } } }
步骤2:注册事件监听器
在扩展的Configuration/Services.yaml中添加监听器配置:
Vendor\YourExtension\EventListener\FallbackLanguageLinkListener: tags: - name: event.listener identifier: 'your-extension/fallback-language-link' event: TYPO3\CMS\Core\Routing\ModifyPageLinkBuilderEvent
这个方案会全局生效,所有通过TYPO3内置方法生成的页面链接都会遵循此规则,适合需要统一处理所有链接的场景。
注意事项
- 两种方案都需要确保站点的默认语言配置正确,且页面的语言权限、隐藏状态等逻辑在代码中得到处理,避免生成无效链接。
- 若使用自定义代码,记得在扩展激活后清除TYPO3缓存,确保类和配置生效。
内容的提问来源于stack exchange,提问作者Stefan Padberg
相关产品推荐
相关产品推荐

