Skip to content

Instantly share code, notes, and snippets.

@YamlEngineer
Last active December 11, 2021 09:47
Show Gist options
  • Save YamlEngineer/8a1b034a0375fe58615ae6cc8a30b0dd to your computer and use it in GitHub Desktop.
Save YamlEngineer/8a1b034a0375fe58615ae6cc8a30b0dd to your computer and use it in GitHub Desktop.
php Subtitle translator
#!/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