qcminecraft/Carbon-Forum-F

View on GitHub
language/auto_translate.php

Summary

Maintainability
F
3 days
Test Coverage
<?php
if (PHP_SAPI !== "cli") {
    exit('error: 403 Access Denied');
}

if (PHP_OS === "WINNT") {
    exec('chcp 65001');
}

define('CURRENT_LANGUAGE', 'zh-cn');
require('../config.php');
require(LibraryPath . 'vendor/autoload.php');

use Stichoza\GoogleTranslate\TranslateClient;

$LanguageList = [
    'zh-cn',
    'zh-tw',
    'en',
    'pl',
    'ru'
];

/*
function RefreshLanguageList($input) {
    global $LanguageList;
    $language_name = explode("/", $input)[1];
    if (!empty($language_name) && !in_array($language_name, $LanguageList)) 
        $LanguageList[] = $language_name;
}
*/
function ListDir($dir)
{
    global $LanguageList;
    if (is_dir($dir)) {
        if ($dh = opendir($dir)) {
            while (($file = readdir($dh)) !== false) {
                if ((is_dir($dir . "/" . $file)) && $file != "." && $file != "..") {
                    // RefreshLanguageList($dir);
                    ListDir($dir . $file . "/");
                } else {
                    if ($file != "." && $file != "..") {
                        $file_path = $dir . $file;
                        $file_extension = pathinfo($file_path, PATHINFO_EXTENSION);
                        echo "\n\n\n\n\033[33m -------------------------------------------------------- \033[0m\n";
                        echo $file_path . "\n\n\n";

                        switch ($file_extension) {
                            // PHP语言文件翻译
                            case "php":
                                $template = __DIR__ . '/language_template.php';

                                require($file_path);
                                $ChineseLang = $Lang;
                                unset($Lang);

                                //var_export($ChineseLang);
                                //echo "\n\n";
                                foreach ($LanguageList as $language_name) {
                                    if ($language_name !== CURRENT_LANGUAGE) {
                                        $language_path = str_ireplace('/' . CURRENT_LANGUAGE . '/', '/' . $language_name . '/', $file_path);
                                        if ((@include $language_path) != 1) {
                                            copy($template, $language_path);
                                            include $language_path;
                                        }
                                        $CurrentLang = $Lang;
                                        unset($Lang);

                                        $CompareFlag = false;
                                        translate($ChineseLang, $CurrentLang, $CompareFlag, $language_name);
                                        if ($CompareFlag) {
                                            file_put_contents($language_path, str_replace('[]', var_export($CurrentLang, true), file_get_contents($template)));
                                        }
                                    }
                                }
                                break;
                            // JS语言文件翻译
                            case "js":
                                preg_match('/\{(.*)\}/s', file_get_contents($file_path), $matches);
                                if (empty($matches)) {
                                    echo "\033[31m   Source language file resolve failed. \033[0m\n";
                                    break;
                                }
                                $ChineseLang = json_decode($matches[0], true);
                                if ($ChineseLang === false || $ChineseLang === null) {
                                    echo "\033[31m   Source language file json decode failed. \033[0m\n";
                                    break;
                                }
                                //var_export($ChineseLang);
                                //echo "\n\n";
                                foreach ($LanguageList as $language_name) {
                                    if ($language_name !== CURRENT_LANGUAGE) {
                                        switch ($file) {
                                            case CURRENT_LANGUAGE . ".js":
                                                $language_path = str_ireplace('/' . CURRENT_LANGUAGE . '/' . CURRENT_LANGUAGE . ".js", '/' . $language_name . '/' . $language_name . '.js', $file_path);
                                                $template = __DIR__ . '/ue_template.js';
                                                break;
                                            default:
                                                $language_path = str_ireplace('/' . CURRENT_LANGUAGE . '/', '/' . $language_name . '/', $file_path);
                                                $template = __DIR__ . '/language_template.js';
                                                break;
                                        }

                                        if (!file_exists($language_path)) {
                                            copy($template, $language_path);
                                            $matches2 = [[]];
                                        } else {
                                            preg_match('/\{(.*)\}/s', file_get_contents($language_path), $matches2);
                                        }
                                        $CurrentLang = json_decode($matches2[0], true);
                                        if ($CurrentLang === false || $CurrentLang === null) {
                                            echo "\e[31m     Target ". $language_name . " file resolve failed. \033[0m\n";
                                            continue;
                                        }

                                        $CompareFlag = false;
                                        translate($ChineseLang, $CurrentLang, $CompareFlag, $language_name);
                                        if ($CompareFlag) {
                                            switch ($file) {
                                                case "global.js":
                                                    file_put_contents($language_path, str_replace('{}', json_encode($CurrentLang, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE), file_get_contents($template)));
                                                    break;
                                                case CURRENT_LANGUAGE . ".js":
                                                    file_put_contents($language_path, str_replace('{language}', $language_name, str_replace('{}', json_encode($CurrentLang, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE), file_get_contents($template))));
                                                    break;
                                                default:
                                                    break;
                                            }

                                        }
                                    }
                                }
                                break;
                            // 图片等其他语言文件无法翻译,直接复制
                            default:
                                echo "Static file\n\n";
                                foreach ($LanguageList as $language_name) {
                                    if ($language_name !== CURRENT_LANGUAGE) {
                                        $language_path = str_ireplace('/' . CURRENT_LANGUAGE . '/', '/' . $language_name . '/', $file_path);
                                        if (!file_exists($language_path)) {
                                            echo "\n\n\033[32m ---- Copy language file to $language_name ---- \033[0m\n\n";
                                            copy($file_path, $language_path);
                                        }
                                    }
                                }
                                break;
                        }

                    }
                }
            }
            closedir($dh);
        }
    }
}

function translate(&$ChineseLang, &$CurrentLang, &$CompareFlag, $language_name)
{
    $diff = array_diff_key($ChineseLang, $CurrentLang);
    if (!empty($diff)) {
        if ($CompareFlag === false) {
            echo "\n\n\033[32m ---- Translating to $language_name ---- \033[0m\n\n";
        }
        $tr = new TranslateClient(CURRENT_LANGUAGE, $language_name);
        foreach ($diff as $key => $value) {
            if (is_string($value)) {
                $pre_translated_string = $tr->translate($value);
                preg_match_all("/{{[^}]+}}/", $value, $matches);
                preg_match_all("/{{[^}]+}}/", $pre_translated_string, $matches2);
                $translated_string = str_replace($matches2[0], $matches[0], $pre_translated_string);
                echo "\n";
                echo $value . "        =>        " . $translated_string;
                echo "\n\n";
                $CurrentLang[$key] = $translated_string;
                $CompareFlag = true; //有差异标志位,要写入文件
            }
        }
    }
    foreach ($ChineseLang as $Key => &$SubLang) {
        if (is_array($SubLang)) {
            if (!isset($CurrentLang[$Key])) {
                $CurrentLang[$Key] = array();
            }
            translate($SubLang, $CurrentLang[$Key], $CompareFlag, $language_name);
        }
    }
    return $CompareFlag;
}

ListDir("./" . CURRENT_LANGUAGE . "/");
echo "\n\n\n";
echo "\n\n\033[32m -------------------------------------------------------- \033[0m\n\n";
var_export($LanguageList);