150 lines
4.6 KiB
PHP
150 lines
4.6 KiB
PHP
<?php
|
|
define('TL_FORMAT', strtolower($_GET['fmt'] ?? 'json'));
|
|
|
|
if (isset($_SERVER['HTTP_USER_AGENT'], $_GET['pretty']) && strpos($_SERVER['HTTP_USER_AGENT'], 'Mozilla/') !== false)
|
|
define('JSON_ARGS', JSON_PRETTY_PRINT);
|
|
else
|
|
define('JSON_ARGS', 0);
|
|
|
|
function out($arr, $mode) {
|
|
$output = '';
|
|
$mimeType = 'text/plain';
|
|
|
|
switch (TL_FORMAT) {
|
|
case 'xml':
|
|
$mimeType = 'application/xml';
|
|
$output = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n";
|
|
|
|
switch ($mode) {
|
|
case 'list':
|
|
$type = get_class($arr[0]);
|
|
$output .= "<ArrayOf{$type}>";
|
|
foreach ($arr as $part) {
|
|
$output .= "<{$type} ";
|
|
|
|
foreach (get_object_vars($part) as $name => $value) {
|
|
$output .= "{$name}=\"{$value}\" ";
|
|
}
|
|
|
|
$output .= '/>';
|
|
}
|
|
$output .= "</ArrayOf{$type}>";
|
|
break;
|
|
|
|
case 'do':
|
|
$output .= "<Translation ";
|
|
|
|
foreach ($arr as $name => $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);
|
|
}
|