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";
执行脚本后,记得及时删除,避免安全风险。
注意事项
- 确保对扩展目录有读写权限,否则无法生成JSON文件
- 如果扩展包含多个语言文件(如分模块的
locallang_mod.xlf),需修改代码遍历所有语言文件 - 若使用旧版
locallang.xml格式,需调整DOM解析逻辑(TYPO3 10推荐使用XLF格式) JSON_UNESCAPED_UNICODE参数可保留中文等非ASCII字符的原始格式,避免转义
内容的提问来源于stack exchange,提问作者Parmar Kamalnayan
相关产品推荐
相关产品推荐

