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

TYPO3 9 LTS:如何通过PHP API获取内容元素的翻译UID?

当然有合适的TYPO3 PHP API能帮你搞定这个需求!我之前在处理多语言内容批量更新的任务时,正好用过类似的逻辑,分享两种实用方案给你:

方法1:使用TYPO3官方的LocalizationRepository(推荐,符合架构规范)

TYPO3提供了专门处理本地化关联的LocalizationRepository,可以直接用它查询翻译后的内容元素:

use TYPO3\CMS\Core\Domain\Repository\LocalizationRepository;
use TYPO3\CMS\Core\Utility\GeneralUtility;

// 初始化Repository实例
$localizationRepository = GeneralUtility::makeInstance(LocalizationRepository::class);

// 你的业务参数
$originalContentElementUidDe = 1234;
$languageIdEn = 1;

// 查询目标语言的翻译记录
$translatedRecords = $localizationRepository->findLocalizedRecord(
    'tt_content', // 内容元素对应的数据库表名
    $originalContentElementUidDe,
    $languageIdEn
);

// 提取翻译元素的UID(关联模式下通常只有一条匹配记录)
$translatedContentElementUidEn = !empty($translatedRecords) ? (int)reset($translatedRecords)['uid'] : null;

这个方法是TYPO3官方推荐的面向对象方式,会自动处理本地化的关联逻辑,不用自己拼接复杂的查询条件。

方法2:直接数据库查询(高效适合批处理场景)

如果你的脚本需要处理大量内容元素,直接用数据库查询会更高效。利用TYPO3的ConnectionPool操作数据库:

use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Utility\GeneralUtility;

// 你的业务参数
$originalContentElementUidDe = 1234;
$languageIdEn = 1;

// 获取tt_content表的数据库连接
$connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tt_content');

// 查询翻译元素UID
$translatedUid = $connection->select(
    ['uid'],
    'tt_content',
    [
        'l10n_parent' => $originalContentElementUidDe, // 关联原始元素的UID
        'sys_language_uid' => $languageIdEn, // 目标语言ID
        'deleted' => 0, // 排除已删除的记录
        'hidden' => 0 // 可选:如果只需要未隐藏的有效内容
    ]
)->fetchOne();

$translatedContentElementUidEn = $translatedUid ? (int)$translatedUid : null;

这种方式跳过了Repository的封装层,性能更优,非常适合批量处理的场景。

封装成工具类(匹配你的示例代码)

你可以把查询逻辑封装成工具类,方便在CommandController里复用:

namespace Your\Extension\Utility;

use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Utility\GeneralUtility;

class ContentElementTranslationUtil
{
    /**
     * 通过原始内容元素UID获取对应语言的翻译元素UID
     *
     * @param int $originalUid 原始内容元素UID(德语)
     * @param int $targetLanguageId 目标语言ID(英语)
     * @return int|null 翻译后的UID,不存在则返回null
     */
    public static function getTranslatedContentElementUid(int $originalUid, int $targetLanguageId): ?int
    {
        $connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tt_content');
        $translatedUid = $connection->select(
            ['uid'],
            'tt_content',
            [
                'l10n_parent' => $originalUid,
                'sys_language_uid' => $targetLanguageId,
                'deleted' => 0
            ]
        )->fetchOne();

        return $translatedUid ? (int)$translatedUid : null;
    }
}

之后就可以像你示例里那样直接调用:

$languageIdDe = 0;
$languageIdEn = 1;
$originalContentElementUidDe = 1234;
$translatedContentElementUidEn = \Your\Extension\Utility\ContentElementTranslationUtil::getTranslatedContentElementUid($originalContentElementUidDe, $languageIdEn);

注意事项

  • 因为你的实例是关联模式,翻译元素的l10n_parent字段会直接指向原始元素的UID,所以上述两种方法都有效;如果是自由模式,逻辑会有所不同。
  • 记得处理$translatedContentElementUidEn为null的情况(比如原始元素没有对应翻译),避免后续DataHandler操作报错。

内容的提问来源于stack exchange,提问作者Abdull

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:10:11