You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

批量生成多嵌套层级PHP语言文件的法语版本的实现方案求助

批量生成多嵌套层级PHP语言文件的法语版本的实现方案

针对你遇到的多嵌套PHP语言文件转法语版本的问题,我整理了一套完整的解决方案,基于你已有的递归查找代码,补充了文件生成和数组结构处理的核心逻辑,具体如下:

核心思路

  1. 读取原文件的所有自定义数组变量,递归定位所有english语言节点
  2. 对每个english节点,复制结构并替换为french,同时调用翻译API将字符串转为法语(预留API调用位置)
  3. 生成与原文件结构完全一致的新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);
    }
}

关键说明

  1. 动态嵌套处理setArrayValueByPath函数解决了任意层级数组的赋值问题,不管english键在第几层都能准确定位并替换为french
  2. 文件结构一致性:用var_export生成标准PHP数组代码,保证生成的法语文件结构和原英文文件完全一致
  3. 翻译扩展translateToFrench是模拟函数,实际只需替换为你的翻译API调用即可
  4. 批量处理:用递归迭代器遍历所有子目录的PHP文件,支持大规模文件批量转换

使用步骤

  1. 将所有英文语言文件放入input/english目录(支持多级子目录)
  2. 运行该脚本,自动在output/french目录生成对应法语版本文件
  3. 替换翻译函数为实际API调用,完成真实文本翻译

内容来源于stack exchange

火山引擎 最新活动