\r\n"; switch ($mode) { case 'list': $type = get_class($arr[0]); $output .= ""; foreach ($arr as $part) { $output .= "<{$type} "; foreach (get_object_vars($part) as $name => $value) { $output .= "{$name}=\"{$value}\" "; } $output .= '/>'; } $output .= ""; break; case 'do': $output .= " $value) { $value = htmlspecialchars($value); $output .= "{$name}=\"{$value}\" "; } $output .= '/>'; break; } break; case 'json': default: $mimeType = 'application/json'; $output = json_encode($arr, JSON_ARGS); break; } header("Content-Type: {$mimeType}; charset=utf-8"); die($output); } define('TRANSLATE_URL', 'https://translate.google.com/translate_a/single?ie=UTF-8&oe=UTF-8&multires=1&client=gtx&sl=%s&tl=%s&dt=t&q=%s'); define('CURL_USER_AGENT', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0'); define('MAX_TRANSL_LENGTH', 630); function curl_req($url) { $curl = curl_init($url); curl_setopt_array($curl, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_USERAGENT => CURL_USER_AGENT, ]); return curl_exec($curl); } class Language { public $code; public $name; public function __construct($code, $name) { $this->code = $code; $this->name = $name; } public static function fromCode($code) { return new Language($code, locale_get_display_name($code)); } } $languages = [ 'af', 'sq', 'ar', 'hy', 'az', 'eu', 'be', 'bn', 'bs', 'bg', 'ca', 'ny', 'co', 'hr', 'cs', 'da', 'nl', 'en', 'eo', 'tl', 'fi', 'fr', 'fy', 'gl', 'ka', 'de', 'el', 'gu', 'ht', 'ha', 'iw', 'hi', 'hu', 'is', 'ig', 'id', 'ga', 'ja', 'jw', 'kn', 'kk', 'km', 'ko', 'ku', 'ky', 'lo', 'la', 'lv', 'lt', 'lb', 'mk', 'mg', 'ms', 'ml', 'mt', 'mi', 'mr', 'mn', 'my', 'ne', 'no', 'ps', 'fa', 'pl', 'pt', 'ma', 'ro', 'ru', 'sm', 'gd', 'sr', 'st', 'sn', 'sd', 'si', 'sk', 'sl', 'so', 'es', 'su', 'sw', 'sv', 'tg', 'ta', 'te', 'th', 'tr', 'uk', 'ur', 'uz', 'vi', 'cy', 'xh', 'yi', 'yo', 'zu', 'it', 'ceb', 'haw', 'hmn', 'zh-cn', 'zh-tw', ]; $mode = $_GET['m'] ?? null; switch ($mode) { case 'list': $out = []; foreach ($languages as $lang) $out[] = Language::fromCode($lang); out($out, $mode); case 'do': $from = strtolower($_GET['f'] ?? 'auto'); $to = strtolower($_GET['t'] ?? 'en'); if ($from !== 'auto' && !in_array($from, $languages)) out(['error' => 'The given origin language is invalid.'], $mode); if (!in_array($to, $languages)) out(['error' => 'The given destination language is invalid.'], $mode); $text = isset($_GET['z']) ? $_GET['z'] : file_get_contents('php://input'); $t_len = strlen($text); if ($t_len < 1) out(['error' => 'Nothing to translate.'], $mode); if ($t_len > MAX_TRANSL_LENGTH) out(['error' => 'Too much text, please split some up.'], $mode); $google_txt = curl_req(sprintf(TRANSLATE_URL, $from, $to, rawurlencode($text))); $google = json_decode($google_txt); if (strlen($google_txt) < 1 || !$google) out(['error' => 'Something happened.'], $mode); $result = $google[0][0][0]; $original = $google[0][0][1]; $from = $google[2]; $from_text = locale_get_display_name($from); $to_text = locale_get_display_name($to); out(compact('from', 'from_text', 'to', 'to_text', 'original', 'result'), $mode); }