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

TYPO3 10插件如何将所有locallang翻译值导出为JSON文件?

在TYPO3 10中导出扩展翻译为JSON文件的实现方法

下面提供两种实用方案,直接基于TYPO3核心能力实现,无需依赖第三方扩展:

方案1:编写CLI命令(适合批量/重复导出)

通过自定义TYPO3 CLI命令,可以灵活指定扩展和语言,一键导出翻译内容。

1.1 创建CLI命令类

在你的扩展目录下创建 Classes/Command/ExportTranslationsCommand.php:

<?php
namespace YourVendor\YourExtension\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use DOMDocument;
use DOMXPath;

class ExportTranslationsCommand extends Command
{
    protected function configure()
    {
        $this->setName('extension:export-translations')
             ->setDescription('Export all translations of an extension to JSON')
             ->addArgument('extensionKey', InputArgument::REQUIRED, '目标扩展的key')
             ->addArgument('language', InputArgument::OPTIONAL, '语言编码(如de/fr/zh)', 'en');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $extensionKey = $input->getArgument('extensionKey');
        $language = $input->getArgument('language');
        
        // 获取扩展语言文件路径
        $extensionLangPath = GeneralUtility::getFileAbsFileName("EXT:$extensionKey/Resources/Private/Language/");
        $languageFile = $extensionLangPath . 'locallang.xlf';
        
        // 优先使用对应语言的翻译文件
        if (file_exists($extensionLangPath . "locallang.$language.xlf")) {
            $languageFile = $extensionLangPath . "locallang.$language.xlf";
        }
        
        if (!file_exists($languageFile)) {
            $output->writeln("<error>未找到语言文件:$languageFile</error>");
            return Command::FAILURE;
        }
        
        // 解析XLF格式的语言文件
        $dom = new DOMDocument();
        $dom->load($languageFile);
        $xpath = new DOMXPath($dom);
        $xpath->registerNamespace('xlf', 'urn:oasis:names:tc:xliff:document:1.2');
        
        $translations = [];
        $units = $xpath->query('//xlf:trans-unit');
        
        foreach ($units as $unit) {
            $key = $unit->getAttribute('id');
            $source = $xpath->query('./xlf:source', $unit)->item(0)->nodeValue;
            $targetNode = $xpath->query('./xlf:target', $unit)->item(0);
            $translations[$key] = $targetNode ? $targetNode->nodeValue : $source;
        }
        
        // 生成并保存JSON文件
        $jsonContent = json_encode($translations, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
        $outputFile = GeneralUtility::getFileAbsFileName("EXT:$extensionKey/Resources/Public/Language/translations-$language.json");
        
        // 自动创建目录(如果不存在)
        GeneralUtility::mkdir_deep(dirname($outputFile));
        
        file_put_contents($outputFile, $jsonContent);
        
        $output->writeln("<info>翻译内容已成功导出到:$outputFile</info>");
        return Command::SUCCESS;
    }
}

1.2 注册CLI命令

在扩展的 ext_localconf.php 中添加注册代码:

$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['extbase']['commandControllers'][] = 
    \YourVendor\YourExtension\Command\ExportTranslationsCommand::class;

1.3 使用方法

在TYPO3项目根目录的终端中执行:

./typo3/sysext/core/bin/typo3 extension:export-translations your_extension_key zh

替换 your_extension_key 为你的扩展key,zh 为目标语言编码。

方案2:临时脚本(适合一次性导出)

如果只需要单次导出,可编写临时PHP脚本放在项目根目录,执行后即可生成JSON文件:

<?php
define('TYPO3_MODE', 'BE');
require __DIR__ . '/typo3_src/vendor/autoload.php';
require __DIR__ . '/typo3/index.php';

// 配置参数
$extensionKey = 'your_extension_key';
$language = 'zh';

$extensionLangPath = \TYPO3\CMS\Core\Utility\GeneralUtility::getFileAbsFileName("EXT:$extensionKey/Resources/Private/Language/");
$languageFile = $extensionLangPath . 'locallang.xlf';
if (file_exists($extensionLangPath . "locallang.$language.xlf")) {
    $languageFile = $extensionLangPath . "locallang.$language.xlf";
}

// 解析XLF文件
$dom = new DOMDocument();
$dom->load($languageFile);
$xpath = new DOMXPath($dom);
$xpath->registerNamespace('xlf', 'urn:oasis:names:tc:xliff:document:1.2');

$translations = [];
$units = $xpath->query('//xlf:trans-unit');
foreach ($units as $unit) {
    $key = $unit->getAttribute('id');
    $source = $xpath->query('./xlf:source', $unit)->item(0)->nodeValue;
    $targetNode = $xpath->query('./xlf:target', $unit)->item(0);
    $translations[$key] = $targetNode ? $targetNode->nodeValue : $source;
}

// 保存JSON文件
$jsonContent = json_encode($translations, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
$outputPath = __DIR__ . "/translations-$language.json";
file_put_contents($outputPath, $jsonContent);

echo "导出完成!JSON文件已保存到:$outputPath";

执行脚本后,记得及时删除,避免安全风险。

注意事项

  1. 确保对扩展目录有读写权限,否则无法生成JSON文件
  2. 如果扩展包含多个语言文件(如分模块的locallang_mod.xlf),需修改代码遍历所有语言文件
  3. 若使用旧版locallang.xml格式,需调整DOM解析逻辑(TYPO3 10推荐使用XLF格式)
  4. JSON_UNESCAPED_UNICODE参数可保留中文等非ASCII字符的原始格式,避免转义

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 11:20:24