You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 17:12:37