批量生成多嵌套层级PHP语言文件的法语版本的实现方案求助
批量生成多嵌套层级PHP语言文件的法语版本的实现方案
针对你遇到的多嵌套PHP语言文件转法语版本的问题,我整理了一套完整的解决方案,基于你已有的递归查找代码,补充了文件生成和数组结构处理的核心逻辑,具体如下:
核心思路
- 读取原文件的所有自定义数组变量,递归定位所有
english语言节点 - 对每个
english节点,复制结构并替换为french,同时调用翻译API将字符串转为法语(预留API调用位置) - 生成与原文件结构完全一致的新PHP文件,写入指定目标目录
完整实现代码
<?php error_reporting(E_ALL); ini_set('display_errors', '1'); /** * 递归查找数组中指定语言键的节点,返回节点完整路径和对应值 */ function recursiveFind(array $haystack, string $needle): ?\Generator { $recursive = new \RecursiveIteratorIterator( new \RecursiveArrayIterator($haystack), \RecursiveIteratorIterator::SELF_FIRST ); foreach ($recursive as $key => $value) { if ($key === $needle) { $keys = [$key]; // 向上遍历迭代器,获取节点的完整嵌套路径 for ($i = $recursive->getDepth() - 1; $i >= 0; $i--) { array_unshift($keys, $recursive->getSubIterator($i)->key()); } yield [ 'path' => $keys, 'value' => $value ]; } } } /** * 从PHP文件中提取所有自定义变量(排除系统和临时变量) */ function getVarsFromFile(string $file): array { $currentVars = get_defined_vars(); include $file; $fileVars = array_diff_key(get_defined_vars(), $currentVars); unset($fileVars['currentVars']); // 移除函数内部临时变量 return $fileVars; } /** * 翻译函数:替换为你的实际翻译API调用(示例用硬编码模拟) */ function translateToFrench(string $englishText): string { // 实际项目中替换为Google Translate/DeepL等API调用 $translationMap = [ 'login' => 'Connexion', 'logout' => 'Déconnexion', 'Report Status: ' => 'Statut du rapport : ', 'Report is ready' => 'Le rapport est prêt', 'Incomplete' => 'Incomplet', 'Questions?' => 'Questions ?', 'The Answers!' => 'Les réponses !', 'see Product Demo ' => 'Voir la démonstration du produit ', 'Close' => 'Fermer', 'Demo Video' => 'Vidéo de démonstration', 'One text Blah A' => 'Un texte Blah A', 'two text Blah A' => 'Deux texte Blah A' ]; return $translationMap[$englishText] ?? $englishText; // 无翻译时返回原文本 } /** * 根据嵌套路径设置数组值(支持任意层级) */ function setArrayValueByPath(array &$array, array $path, $value): void { $current = &$array; $lastKey = array_pop($path); foreach ($path as $key) { if (!isset($current[$key]) || !is_array($current[$key])) { $current[$key] = []; } $current = &$current[$key]; } $current[$lastKey] = $value; } /** * 生成标准的PHP数组赋值代码字符串 */ function generatePhpArrayCode(array $vars): string { $code = "<?php\n\n"; foreach ($vars as $varName => $varValue) { // 用var_export生成语法正确的PHP数组代码 $code .= '$' . $varName . ' = ' . var_export($varValue, true) . ";\n\n"; } return $code; } /** * 处理单个源文件,生成对应法语版本文件 */ function processSingleFile(string $sourceFile, string $sourceLangDir, string $targetLangDir, string $targetLang = 'french'): void { if (!file_exists($sourceFile)) { echo "错误:源文件 {$sourceFile} 不存在!\n"; return; } // 读取源文件变量 $sourceVars = getVarsFromFile($sourceFile); if (empty($sourceVars)) { echo "警告:源文件 {$sourceFile} 无自定义变量!\n"; return; } // 初始化目标变量(复制源文件结构) $targetVars = $sourceVars; // 遍历所有english节点,替换为french并翻译 foreach (recursiveFind($sourceVars, 'english') as $result) { $sourcePath = $result['path']; $sourceValues = $result['value']; // 生成目标路径:替换最后一个键为french $targetPath = $sourcePath; $targetPath[array_key_last($targetPath)] = $targetLang; // 翻译所有文本 $translatedValues = array_map(fn($text) => translateToFrench($text), $sourceValues); // 将翻译后的值写入目标变量的对应路径 setArrayValueByPath($targetVars, $targetPath, $translatedValues); // 可选:如果需要删除原english节点,取消下面注释 // array_pop($sourcePath); // unset($targetVars[implode('][', $sourcePath)]['english']); } // 生成目标文件路径 $targetFile = str_replace($sourceLangDir, $targetLangDir, $sourceFile); $targetDir = dirname($targetFile); // 创建目标目录(支持多级子目录) if (!is_dir($targetDir)) { mkdir($targetDir, 0755, true); echo "已创建目录:{$targetDir}\n"; } // 写入目标文件 file_put_contents($targetFile, generatePhpArrayCode($targetVars)); echo "成功生成法语文件:{$targetFile}\n"; } // -------------------------- 执行入口 -------------------------- $sourceLangDir = __DIR__ . '/input/english'; $targetLangDir = __DIR__ . '/output/french'; // 递归遍历所有源目录下的PHP文件(支持子目录) $fileIterator = new \RecursiveIteratorIterator( new \RecursiveDirectoryIterator($sourceLangDir, \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::LEAVES_ONLY ); foreach ($fileIterator as $file) { if ($file->getExtension() === 'php') { processSingleFile($file->getRealPath(), $sourceLangDir, $targetLangDir); } }
关键说明
- 动态嵌套处理:
setArrayValueByPath函数解决了任意层级数组的赋值问题,不管english键在第几层都能准确定位并替换为french - 文件结构一致性:用
var_export生成标准PHP数组代码,保证生成的法语文件结构和原英文文件完全一致 - 翻译扩展:
translateToFrench是模拟函数,实际只需替换为你的翻译API调用即可 - 批量处理:用递归迭代器遍历所有子目录的PHP文件,支持大规模文件批量转换
使用步骤
- 将所有英文语言文件放入
input/english目录(支持多级子目录) - 运行该脚本,自动在
output/french目录生成对应法语版本文件 - 替换翻译函数为实际API调用,完成真实文本翻译
内容来源于stack exchange




