Last active
December 11, 2021 09:47
-
-
Save YamlEngineer/8a1b034a0375fe58615ae6cc8a30b0dd to your computer and use it in GitHub Desktop.
php Subtitle translator
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env php | |
<?php | |
error_reporting(0); | |
$languages = [ | |
"af" => "Afrikaans", | |
"sq" => "Albanian", | |
"am" => "Amharic", | |
"ar" => "Arabic", | |
"hy" => "Armenian", | |
"az" => "Azerbaijani", | |
"eu" => "Basque", | |
"be" => "Belarusian", | |
"bn" => "Bengali", | |
"bs" => "Bosnian", | |
"bg" => "Bulgarian", | |
"ca" => "Catalan", | |
"ceb" => "Cebuano", | |
"zh-CN" => "Chinese (Simplified)", | |
"zh-TW" => "Chinese (Traditional)", | |
"co" => "Corsican", | |
"hr" => "Croatian", | |
"cs" => "Czech", | |
"da" => "Danish", | |
"nl" => "Dutch", | |
"en" => "English", | |
"eo" => "Esperanto", | |
"et" => "Estonian", | |
"fi" => "Finnish", | |
"fr" => "French", | |
"fy" => "Frisian", | |
"gl" => "Galician", | |
"ka" => "Georgian", | |
"de" => "German", | |
"el" => "Greek", | |
"gu" => "Gujarati", | |
"ht" => "Haitian Creole", | |
"ha" => "Hausa", | |
"haw" => "Hawaiian", | |
"he" => "Hebrew", | |
"hi" => "Hindi", | |
"hmn" => "Hmong", | |
"hu" => "Hungarian", | |
"is" => "Icelandic", | |
"ig" => "Igbo", | |
"id" => "Indonesian", | |
"ga" => "Irish", | |
"it" => "Italian", | |
"ja" => "Japanese", | |
"jv" => "Javanese", | |
"kn" => "Kannada", | |
"kk" => "Kazakh", | |
"km" => "Khmer", | |
"rw" => "Kinyarwanda", | |
"ko" => "Korean", | |
"ku" => "Kurdish", | |
"ky" => "Kyrgyz", | |
"lo" => "Lao", | |
"la" => "Latin", | |
"lv" => "Latvian", | |
"lt" => "Lithuanian", | |
"lb" => "Luxembourgish", | |
"mk" => "Macedonian", | |
"mg" => "Malagasy", | |
"ms" => "Malay", | |
"ml" => "Malayalam", | |
"mt" => "Maltese", | |
"mi" => "Maori", | |
"mr" => "Marathi", | |
"mn" => "Mongolian", | |
"my" => "Myanmar (Burmese)", | |
"ne" => "Nepali", | |
"no" => "Norwegian", | |
"ny" => "Nyanja (Chichewa)", | |
"or" => "Odia (Oriya) ", | |
"ps" => "Pashto", | |
"fa" => "Persian", | |
"pl" => "Polish", | |
"pt" => "Portuguese (Portugal, Brazil)", | |
"pa" => "Punjabi", | |
"ro" => "Romanian", | |
"ru" => "Russian", | |
"sm" => "Samoan", | |
"gd" => "Scots Gaelic", | |
"sr" => "Serbian", | |
"st" => "Sesotho", | |
"sn" => "Shona", | |
"sd" => "Sindhi", | |
"si" => "Sinhala (Sinhalese)", | |
"sk" => "Slovak", | |
"sl" => "Slovenian", | |
"so" => "Somali", | |
"es" => "Spanish", | |
"su" => "Sundanese", | |
"sw" => "Swahili", | |
"sv" => "Swedish", | |
"tl" => "Tagalog (Filipino)", | |
"tg" => "Tajik", | |
"ta" => "Tamil", | |
"tt" => "Tatar", | |
"te" => "Telugu", | |
"th" => "Thai", | |
"tr" => "Turkish", | |
"tk" => "Turkmen", | |
"uk" => "Ukrainian", | |
"ur" => "Urdu", | |
"ug" => "Uyghur", | |
"uz" => "Uzbek", | |
"vi" => "Vietnamese", | |
"cy" => "Welsh", | |
"xh" => "Xhosa", | |
"yi" => "Yiddish", | |
"yo" => "Yoruba", | |
"zu" => "Zulu" | |
]; | |
if (!empty($argv[1])) { | |
if ($argv[1] == "--help" or $argv[1] == "-h") { | |
echo "Usage: | |
subtranslator <operation> [...] | |
subtranslator operations: | |
subtranslator {-h --help} | |
subtranslator {-l --languages} | |
subtranslator {-t --translate} [file] | |
\r"; | |
} elseif ($argv[1] == "--translate" or $argv[1] == "-t") { | |
if (!empty($argv[2])) { | |
$fileinfo = pathinfo($argv[2]); | |
$extension = ["srt", "vtt"]; | |
if (!in_array($fileinfo['extension'], $extension)) { | |
echo "Your Subtitle Not Supported\n\r"; | |
} else { | |
while (!array_key_exists($sublanguage = readline("\e[0;33mSubtitle language (languages operations -> -l): "), $languages)) { | |
echo "Your language not Supported \n"; | |
} | |
while (!array_key_exists($tolanguage = readline("\e[0;33mTo language (languages operations -> -l): "), $languages)) { | |
echo "Your language not Supported \n"; | |
} | |
$subtitle = fopen($argv[2], "r"); | |
echo "Translating to $languages[$tolanguage]..."; | |
while (!feof($subtitle)) { | |
$text = fgets($subtitle); | |
$new = fopen("{$fileinfo['filename']}-{$tolanguage}.{$fileinfo['extension']}", "a"); | |
if (strpos($text, "-->") or $text == "\n" or empty($text) or is_numeric($text)) { | |
fwrite($new, $text); | |
} else { | |
$trans = new GoogleTranslate(); | |
$result = $trans->translate($sublanguage, $tolanguage, $text, $type = 'intl'); | |
fwrite($new, "$result\n"); | |
} | |
} | |
echo "\rYour Subtitle Translated To $languages[$tolanguage]\n\r"; | |
} | |
} else { | |
echo "please Select Subtitle File | |
\r"; | |
} | |
} elseif ($argv[1] == "--languages" or $argv[1] == "-l") { | |
foreach ($languages as $key => $val) { | |
echo "[$key] => $val \n\r"; | |
} | |
} else { | |
echo "Usage: | |
subtranslator <operation> [...] | |
subtranslator operations: | |
subtranslator {-h --help} | |
subtranslator {-l --languages} | |
subtranslator {-t --translate} [file] | |
\r"; | |
} | |
} else { | |
echo "Usage: | |
subtranslator <operation> [...] | |
subtranslator operations: | |
subtranslator {-h --help} | |
subtranslator {-l --languages} | |
subtranslator {-t --translate} [file] | |
\r"; | |
} | |
class GoogleTranslate | |
{ | |
public static function translate($source, $target, $text, $type) | |
{ | |
$response = self::requestTranslation($source, $target, $text, $type); | |
$translation = self::getSentencesFromJSON($response); | |
return $translation; | |
} | |
protected static function requestTranslation($source, $target, $text, $type = 'intl') | |
{ | |
if ($type == 'intl') { | |
$host = 'translate.google.com'; | |
} else { | |
$host = 'translate.google.cn'; | |
} | |
$url = "https://{$host}/translate_a/single?client=at&dt=t&dt=ld&dt=qca&dt=rm&dt=bd&dj=1&hl=es-ES&ie=UTF-8&oe=UTF-8&inputm=2&otf=2&iid=1dd3b944-fa62-4b55-b330-74909a99969e"; | |
$fields = array( | |
'sl' => urlencode($source), | |
'tl' => urlencode($target), | |
'q' => urlencode($text) | |
); | |
$fields_string = ""; | |
foreach ($fields as $key => $value) { | |
$fields_string .= $key . '=' . $value . '&'; | |
} | |
rtrim($fields_string, '&'); | |
$ch = curl_init(); | |
curl_setopt($ch, CURLOPT_URL, $url); | |
curl_setopt($ch, CURLOPT_POST, count($fields)); | |
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string); | |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); | |
curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8'); | |
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); | |
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); | |
curl_setopt($ch, CURLOPT_USERAGENT, 'AndroidTranslate/5.3.0.RC02.130475354-53000263 5.1 phone TRANSLATE_OPM5_TEST_1'); | |
$result = curl_exec($ch); | |
curl_close($ch); | |
return $result; | |
} | |
protected static function getSentencesFromJSON($json) | |
{ | |
$sentencesArray = json_decode($json, true); | |
$sentences = ""; | |
foreach ($sentencesArray["sentences"] as $s) { | |
$sentences .= isset($s["trans"]) ? $s["trans"] : ''; | |
} | |
return $sentences; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment