Last active
September 14, 2019 10:59
-
-
Save tranghaviet/23c5b8b1501472ea135e5e4e8e3bd494 to your computer and use it in GitHub Desktop.
Englist to Vietnamese translation script (can use in GoldenDict)
This file contains hidden or 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
<?php | |
// Usage | |
// php -f /path/to/google-goldendict.php "words you want to translate | |
// In GoldenDict go to Dictionaries/Programs, choose "Add..." | |
// name: Google translation | |
// Type: HTML | |
// Command Line: php -f /path/to/google-goldendict.php %GDWORD% | |
$text = $argv[1]; | |
$postdata = http_build_query(['q' => $text]); | |
$opts = [ | |
'http' => [ | |
'method' => 'POST', | |
'header' => 'Content-type: application/x-www-form-urlencoded', | |
'content' => $postdata, | |
], | |
]; | |
$context = stream_context_create($opts); | |
$url = 'http://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=vi&dt=t&ie=UTF-8&oe=UTF-8'; | |
$resultText = file_get_contents($url, false, $context); | |
$resultText = preg_replace('/,+/', ',', $resultText); | |
$results = json_decode($resultText); | |
if (is_array($results) && count($results) > 0) { | |
foreach ($results[0] as $result) { | |
echo str_replace("\n", ' | |
', $result[0]); | |
} | |
} | |
echo "<hr><a href='https://translate.google.com/#auto/en/$text'>Open in Google Translate</a>"; |
This file contains hidden or 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 bash | |
# Usage ./trans :vi "words" | |
# GoldenDict: type is Plain Text, command line "/path/to/trans :vi -b %GDWORD%" | |
export TRANS_ENTRY="$0" | |
if [[ ! $LANG =~ (UTF|utf)-?8$ ]]; then export LANG=en_US.UTF-8; fi | |
read -r -d '' TRANS_PROGRAM << 'EOF' | |
BEGIN { | |
Name = "Translate Shell" | |
Description = "Command-line translator using Google Translate, Bing Translator, Yandex.Translate, etc." | |
Version = "0.9.6.6" | |
ReleaseDate = "2017-12-17" | |
Command = "trans" | |
EntryPoint = "translate.awk" | |
EntryScript = "translate" | |
} | |
function initConst() { | |
NULLSTR = "" | |
TRUE = 1 | |
STDIN = "/dev/stdin" | |
STDOUT = "/dev/stdout" | |
STDERR = "/dev/stderr" | |
SUPOUT = " > /dev/null " | |
SUPERR = " 2> /dev/null " | |
PIPE = " | " | |
} | |
function anything(array, | |
i) { | |
for (i in array) | |
if (array[i]) return 1 | |
return 0 | |
} | |
function exists(value) { | |
if (isarray(value)) | |
return anything(value) | |
else | |
return value ? 1 : 0 | |
} | |
function belongsTo(element, array, | |
i) { | |
for (i in array) | |
if (element == array[i]) return element | |
return NULLSTR | |
} | |
function identical(x, y, | |
i) { | |
if (!isarray(x) && !isarray(y)) | |
return x == y | |
else if (isarray(x) && isarray(y)) { | |
if (length(x) != length(y)) return 0 | |
for (i in x) | |
if (!identical(x[i], y[i])) return 0 | |
return 1 | |
} else | |
return 0 | |
} | |
function append(array, element) { | |
array[anything(array) ? length(array) : 0] = element | |
} | |
function compareByIndexFields(i1, v1, i2, v2, | |
t1, t2, tl, j) { | |
split(i1, t1, SUBSEP) | |
split(i2, t2, SUBSEP) | |
tl = length(t1) < length(t2) ? length(t1) : length(t2) | |
for (j = 1; j <= tl; j++) { | |
if (t1[j] < t2[j]) | |
return -1 | |
else if (t1[j] > t2[j]) | |
return 1 | |
} | |
return 0 | |
} | |
function isnum(string) { | |
return string == string + 0 | |
} | |
function startsWithAny(string, substrings, | |
i) { | |
for (i in substrings) | |
if (index(string, substrings[i]) == 1) return substrings[i] | |
return NULLSTR | |
} | |
function matchesAny(string, patterns, | |
i) { | |
for (i in patterns) | |
if (string ~ "^" patterns[i]) return patterns[i] | |
return NULLSTR | |
} | |
function replicate(string, len, | |
i, temp) { | |
temp = NULLSTR | |
for (i = 0; i < len; i++) | |
temp = temp string | |
return temp | |
} | |
function reverse(string, | |
i, temp) { | |
temp = NULLSTR | |
for (i = length(string); i > 0; i--) | |
temp = temp substr(string, i, 1); | |
return temp | |
} | |
function join(array, separator, sortedIn, preserveNull, | |
i, j, saveSortedIn, temp) { | |
if (!sortedIn) | |
sortedIn = "compareByIndexFields" | |
temp = NULLSTR | |
j = 0 | |
if (isarray(array)) { | |
saveSortedIn = PROCINFO["sorted_in"] | |
PROCINFO["sorted_in"] = sortedIn | |
for (i in array) | |
if (preserveNull || array[i] != NULLSTR) | |
temp = j++ ? temp separator array[i] : array[i] | |
PROCINFO["sorted_in"] = saveSortedIn | |
} else | |
temp = array | |
return temp | |
} | |
function explode(string, array) { | |
split(string, array, NULLSTR) | |
} | |
function escapeChar(char) { | |
switch (char) { | |
case "b": | |
return "\b" | |
case "f": | |
return "\f" | |
case "n": | |
return "\n" | |
case "r": | |
return "\r" | |
case "t": | |
return "\t" | |
case "v": | |
return "\v" | |
case "u0026": | |
return "&" | |
case "u003c": | |
return "<" | |
case "u003e": | |
return ">" | |
default: | |
return char | |
} | |
} | |
function literal(string, | |
c, cc, escaping, i, s) { | |
if (string !~ /^".*"$/) | |
return string | |
explode(string, s) | |
string = NULLSTR | |
escaping = 0 | |
for (i = 2; i < length(s); i++) { | |
c = s[i] | |
if (escaping) { | |
if (cc) { | |
cc = cc c | |
if (length(cc) == 5) { | |
string = string escapeChar(cc) | |
escaping = 0 | |
cc = NULLSTR | |
} | |
} else if (c == "u") { | |
cc = c | |
} else { | |
string = string escapeChar(c) | |
escaping = 0 | |
} | |
} else { | |
if (c == "\\") | |
escaping = 1 | |
else | |
string = string c | |
} | |
} | |
return string | |
} | |
function escape(string) { | |
gsub(/\\/, "\\\\", string) | |
gsub(/"/, "\\\"", string) | |
return string | |
} | |
function unescape(string) { | |
gsub(/\\\"/, "\"", string) | |
gsub(/\\\\/, "\\", string) | |
return string | |
} | |
function parameterize(string, quotationMark) { | |
if (!quotationMark) | |
quotationMark = "'" | |
if (quotationMark == "'") { | |
gsub(/'/, "'\\''", string) | |
return "'" string "'" | |
} else { | |
return "\"" escape(string) "\"" | |
} | |
} | |
function unparameterize(string, temp) { | |
match(string, /^'(.*)'$/, temp) | |
if (temp[0]) { | |
string = temp[1] | |
gsub(/'\\''/, "'", string) | |
return string | |
} | |
match(string, /^"(.*)"$/, temp) | |
if (temp[0]) { | |
string = temp[1] | |
return unescape(string) | |
} | |
return string | |
} | |
function toString(value, inline, heredoc, valOnly, numSub, level, sortedIn, | |
i, items, j, k, p, saveSortedIn, temp, v) { | |
if (!level) level = 0 | |
if (!sortedIn) | |
sortedIn = "compareByIndexFields" | |
if (isarray(value)) { | |
saveSortedIn = PROCINFO["sorted_in"] | |
PROCINFO["sorted_in"] = sortedIn | |
p = 0 | |
for (i in value) { | |
split(i, j, SUBSEP); k = join(j, ",") | |
if (!numSub || !isnum(k)) k = parameterize(k, "\"") | |
v = toString(value[i], inline, heredoc, valOnly, numSub, level + 1, sortedIn) | |
if (!isarray(value[i])) v = parameterize(v, "\"") | |
if (valOnly) | |
items[p++] = inline ? v : (replicate("\t", level) v) | |
else | |
items[p++] = inline ? (k ": " v) : | |
(replicate("\t", level) k "\t" v) | |
} | |
PROCINFO["sorted_in"] = saveSortedIn | |
temp = inline ? join(items, ", ") : | |
("\n" join(items, "\n") "\n" replicate("\t", level)) | |
temp = valOnly ? ("[" temp "]") : ("{" temp "}") | |
return temp | |
} else { | |
if (heredoc) | |
return "'''\n" value "\n'''" | |
else | |
return value | |
} | |
} | |
function squeeze(line, preserveIndent) { | |
if (!preserveIndent) | |
gsub(/^[[:space:]]+/, NULLSTR, line) | |
gsub(/^[[:space:]]*#.*$/, NULLSTR, line) | |
gsub(/#[^"/]*$/, NULLSTR, line) | |
gsub(/[[:space:]]+$/, NULLSTR, line) | |
gsub(/[[:space:]]+\\$/, "\\", line) | |
return line | |
} | |
function yn(string) { | |
return (tolower(string) ~ /^([0fn]|off)/) ? 0 : 1 | |
} | |
function initAnsiCode() { | |
if (ENVIRON["TERM"] == "dumb") return | |
AnsiCode["reset"] = AnsiCode[0] = "\33[0m" | |
AnsiCode["bold"] = "\33[1m" | |
AnsiCode["underline"] = "\33[4m" | |
AnsiCode["negative"] = "\33[7m" | |
AnsiCode["no bold"] = "\33[22m" | |
AnsiCode["no underline"] = "\33[24m" | |
AnsiCode["positive"] = "\33[27m" | |
AnsiCode["black"] = "\33[30m" | |
AnsiCode["red"] = "\33[31m" | |
AnsiCode["green"] = "\33[32m" | |
AnsiCode["yellow"] = "\33[33m" | |
AnsiCode["blue"] = "\33[34m" | |
AnsiCode["magenta"] = "\33[35m" | |
AnsiCode["cyan"] = "\33[36m" | |
AnsiCode["gray"] = "\33[37m" | |
AnsiCode["default"] = "\33[39m" | |
AnsiCode["dark gray"] = "\33[90m" | |
AnsiCode["light red"] = "\33[91m" | |
AnsiCode["light green"] = "\33[92m" | |
AnsiCode["light yellow"] = "\33[93m" | |
AnsiCode["light blue"] = "\33[94m" | |
AnsiCode["light magenta"] = "\33[95m" | |
AnsiCode["light cyan"] = "\33[96m" | |
AnsiCode["white"] = "\33[97m" | |
} | |
function ansi(code, text) { | |
switch (code) { | |
case "bold": | |
return AnsiCode[code] text AnsiCode["no bold"] | |
case "underline": | |
return AnsiCode[code] text AnsiCode["no underline"] | |
case "negative": | |
return AnsiCode[code] text AnsiCode["positive"] | |
default: | |
return AnsiCode[code] text AnsiCode[0] | |
} | |
} | |
function w(text) { | |
print ansi("yellow", text) > STDERR | |
} | |
function e(text) { | |
print ansi("bold", ansi("yellow", text)) > STDERR | |
} | |
function wtf(text) { | |
print ansi("bold", ansi("red", text)) > STDERR | |
} | |
function d(text) { | |
print ansi("gray", text) > STDERR | |
} | |
function da(value, name, inline, heredoc, valOnly, numSub, sortedIn, | |
i, j, saveSortedIn) { | |
if (!name) | |
name = "_" | |
if (!sortedIn) | |
sortedIn = "compareByIndexFields" | |
d(name " = " toString(value, inline, heredoc, valOnly, numSub, 0, sortedIn)) | |
} | |
function assert(x, message) { | |
if (!message) | |
message = "[ERROR] Assertion failed." | |
if (x) | |
return x | |
else | |
e(message) | |
} | |
function initUrlEncoding() { | |
UrlEncoding["\t"] = "%09" | |
UrlEncoding["\n"] = "%0A" | |
UrlEncoding[" "] = "%20" | |
UrlEncoding["!"] = "%21" | |
UrlEncoding["\""] = "%22" | |
UrlEncoding["#"] = "%23" | |
UrlEncoding["$"] = "%24" | |
UrlEncoding["%"] = "%25" | |
UrlEncoding["&"] = "%26" | |
UrlEncoding["'"] = "%27" | |
UrlEncoding["("] = "%28" | |
UrlEncoding[")"] = "%29" | |
UrlEncoding["*"] = "%2A" | |
UrlEncoding["+"] = "%2B" | |
UrlEncoding[","] = "%2C" | |
UrlEncoding["-"] = "%2D" | |
UrlEncoding["."] = "%2E" | |
UrlEncoding["/"] = "%2F" | |
UrlEncoding[":"] = "%3A" | |
UrlEncoding[";"] = "%3B" | |
UrlEncoding["<"] = "%3C" | |
UrlEncoding["="] = "%3D" | |
UrlEncoding[">"] = "%3E" | |
UrlEncoding["?"] = "%3F" | |
UrlEncoding["@"] = "%40" | |
UrlEncoding["["] = "%5B" | |
UrlEncoding["\\"] = "%5C" | |
UrlEncoding["]"] = "%5D" | |
UrlEncoding["^"] = "%5E" | |
UrlEncoding["_"] = "%5F" | |
UrlEncoding["`"] = "%60" | |
UrlEncoding["{"] = "%7B" | |
UrlEncoding["|"] = "%7C" | |
UrlEncoding["}"] = "%7D" | |
UrlEncoding["~"] = "%7E" | |
} | |
function quote(string, i, r, s) { | |
r = NULLSTR | |
explode(string, s) | |
for (i = 1; i <= length(s); i++) | |
r = r (s[i] in UrlEncoding ? UrlEncoding[s[i]] : s[i]) | |
return r | |
} | |
function unquote(string, i, k, r, s, temp) { | |
r = NULLSTR | |
explode(string, s) | |
temp = NULLSTR | |
for (i = 1; i <= length(s); i++) | |
if (temp) { | |
temp = temp s[i] | |
if (length(temp) > 2) { | |
for (k in UrlEncoding) | |
if (temp == UrlEncoding[k]) { | |
r = r k | |
temp = NULLSTR | |
break | |
} | |
if (temp) { | |
r = r temp | |
temp = NULLSTR | |
} | |
} | |
} else { | |
if (s[i] != "%") | |
r = r s[i] | |
else | |
temp = s[i] | |
} | |
if (temp) | |
r = r temp | |
return r | |
} | |
function initUriSchemes() { | |
UriSchemes[0] = "file://" | |
UriSchemes[1] = "http://" | |
UriSchemes[2] = "https://" | |
} | |
function readFrom(file, line, text) { | |
if (!file) file = "/dev/stdin" | |
text = NULLSTR | |
while (getline line < file) | |
text = (text ? text "\n" : NULLSTR) line | |
return text | |
} | |
function writeTo(text, file) { | |
if (!file) file = "/dev/stdout" | |
print text > file | |
} | |
function getOutput(command, content, line) { | |
content = NULLSTR | |
while ((command |& getline line) > 0) | |
content = (content ? content "\n" : NULLSTR) line | |
return content | |
} | |
function fileExists(file) { | |
return !system("test -f " parameterize(file)) | |
} | |
function dirExists(file) { | |
return !system("test -d " parameterize(file)) | |
} | |
function detectProgram(prog, arg, returnOutput, temp) { | |
if (returnOutput) { | |
prog " " arg SUPERR | getline temp | |
return temp | |
} else | |
return (prog " " arg SUPERR | getline) ? prog : NULLSTR | |
} | |
function getGitHead( line, group) { | |
if (fileExists(".git/HEAD")) { | |
getline line < ".git/HEAD" | |
match(line, /^ref: (.*)$/, group) | |
if (fileExists(".git/" group[1])) { | |
getline line < (".git/" group[1]) | |
return substr(line, 1, 7) | |
} else | |
return NULLSTR | |
} else | |
return NULLSTR | |
} | |
BEGIN { | |
initConst() | |
initAnsiCode() | |
initUrlEncoding() | |
initUriSchemes() | |
} | |
function initGawk( group) { | |
Gawk = "gawk" | |
GawkVersion = PROCINFO["version"] | |
split(PROCINFO["version"], group, ".") | |
if (group[1] < 4) { | |
e("[ERROR] Oops! Your gawk (version " GawkVersion ") "\ | |
"appears to be too old.\n"\ | |
" You need at least gawk 4.0.0 to run this program.") | |
exit 1 | |
} | |
} | |
function initBiDi() { | |
FriBidi = detectProgram("fribidi", "--version", 1) | |
BiDiNoPad = FriBidi ? "fribidi --nopad" : "rev" SUPERR | |
BiDi = FriBidi ? "fribidi --width %s" : | |
"rev" SUPERR "| sed \"s/'/\\\\\\'/\" | xargs printf '%%s '" | |
} | |
function initRlwrap() { | |
Rlwrap = detectProgram("rlwrap", "--version") | |
} | |
function initEmacs() { | |
Emacs = detectProgram("emacs", "--version") | |
} | |
function initCurl() { | |
Curl = detectProgram("curl", "--version") | |
} | |
function l(value, name, inline, heredoc, valOnly, numSub, sortedIn) { | |
if (Option["debug"]) { | |
if (name) | |
da(value, name, inline, heredoc, valOnly, numSub, sortedIn) | |
else | |
d(value) | |
} | |
} | |
function m(string) { | |
if (Option["debug"]) | |
return ansi("cyan", string) RS | |
} | |
function newerVersion(ver1, ver2, i, group1, group2) { | |
split(ver1, group1, ".") | |
split(ver2, group2, ".") | |
for (i = 1; i <= 4; i++) { | |
if (group1[i] + 0 > group2[i] + 0) | |
return 1 | |
else if (group1[i] + 0 < group2[i] + 0) | |
return 0 | |
} | |
return 0 | |
} | |
function rlwrapMe( i, command) { | |
initRlwrap() | |
if (!Rlwrap) { | |
l(">> not found: rlwrap") | |
return 1 | |
} | |
if (ENVIRON["TRANS_ENTRY"]) { | |
command = Rlwrap " " ENVIRON["TRANS_ENTRY"] " "\ | |
parameterize("-no-rlwrap") | |
} else if (fileExists(ENVIRON["TRANS_DIR"] "/" EntryScript)) { | |
command = Rlwrap " sh "\ | |
parameterize(ENVIRON["TRANS_DIR"] "/" EntryScript)\ | |
" - " parameterize("-no-rlwrap") | |
} else { | |
l(">> not found: $TRANS_ENTRY or EntryPoint") | |
return 1 | |
} | |
for (i = 1; i < length(ARGV); i++) | |
if (ARGV[i]) | |
command = command " " parameterize(ARGV[i]) | |
l(">> forking: " command) | |
if (!system(command)) { | |
l(">> process exited with code 0") | |
exit ExitCode | |
} else { | |
l(">> process exited with non-zero return code") | |
return 1 | |
} | |
} | |
function emacsMe( i, params, el, command) { | |
initEmacs() | |
if (!Emacs) { | |
l(">> not found: emacs") | |
return 1 | |
} | |
params = "" | |
for (i = 1; i < length(ARGV); i++) | |
if (ARGV[i]) | |
params = params " " parameterize(ARGV[i], "\"") | |
if (ENVIRON["TRANS_ENTRY"]) { | |
el = "(progn (setq explicit-shell-file-name \"" ENVIRON["TRANS_ENTRY"] "\") "\ | |
"(setq explicit-" Command "-args '(\"-I\" \"-no-rlwrap\"" params ")) "\ | |
"(command-execute 'shell) (rename-buffer \"" Name "\"))" | |
} else if (fileExists(ENVIRON["TRANS_DIR"] "/" EntryScript)) { | |
el = "(progn (setq explicit-shell-file-name \"" "sh" "\") "\ | |
"(setq explicit-" "sh" "-args '(\"" ENVIRON["TRANS_DIR"] "/" EntryScript "\" \"-I\" \"-no-rlwrap\"" params ")) "\ | |
"(command-execute 'shell) (rename-buffer \"" Name "\"))" | |
} else { | |
l(">> not found: $TRANS_ENTRY or EntryPoint") | |
return 1 | |
} | |
command = Emacs " --eval " parameterize(el) | |
l(">> forking: " command) | |
if (!system(command)) { | |
l(">> process exited with code 0") | |
exit ExitCode | |
} else { | |
l(">> process exited with non-zero return code") | |
return 1 | |
} | |
} | |
function curl(url, output, command, content, line) { | |
initCurl() | |
if (!Curl) { | |
l(">> not found: curl") | |
w("[WARNING] curl is not found.") | |
return NULLSTR | |
} | |
command = Curl " --location --silent" | |
if (Option["user-agent"]) | |
command = command " --user-agent " parameterize(Option["user-agent"]) | |
command = command " " parameterize(url) | |
if (output) { | |
command = command " --output " parameterize(output) | |
system(command) | |
return NULLSTR | |
} | |
content = NULLSTR | |
while ((command |& getline line) > 0) | |
content = (content ? content "\n" : NULLSTR) line | |
return content | |
} | |
function curlPost(url, data, output, command, content, line) { | |
initCurl() | |
if (!Curl) { | |
l(">> not found: curl") | |
w("[WARNING] curl is not found.") | |
return NULLSTR | |
} | |
command = Curl " --location --silent" | |
if (Option["user-agent"]) | |
command = command " --user-agent " parameterize(Option["user-agent"]) | |
command = command " --request POST --data " parameterize(data) | |
command = command " " parameterize(url) | |
if (output) { | |
command = command " --output " parameterize(output) | |
system(command) | |
return NULLSTR | |
} | |
content = NULLSTR | |
while ((command |& getline line) > 0) | |
content = (content ? content "\n" : NULLSTR) line | |
return content | |
} | |
function dump(text, group, command, temp) { | |
command = "hexdump" " -v -e'1/1 \"%03u\" \" \"'" | |
("echo " parameterize(text) PIPE command) | getline temp | |
split(temp, group, " ") | |
return length(group) - 1 | |
} | |
function base64(text, command, temp) { | |
command = "base64" | |
("echo -n " parameterize(text) PIPE command) | getline temp | |
return temp | |
} | |
function uprintf(text, command, temp) { | |
command = "echo -en " parameterize(text) | |
("bash -c " parameterize(command, "\"")) | getline temp | |
return temp | |
} | |
function initLocale( i) { | |
Locale["af"]["name"] = "Afrikaans" | |
Locale["af"]["endonym"] = "Afrikaans" | |
Locale["af"]["translations-of"] = "Vertalings van %s" | |
Locale["af"]["definitions-of"] = "Definisies van %s" | |
Locale["af"]["synonyms"] = "Sinonieme" | |
Locale["af"]["examples"] = "Voorbeelde" | |
Locale["af"]["see-also"] = "Sien ook" | |
Locale["af"]["family"] = "Indo-European" | |
Locale["af"]["iso"] = "afr" | |
Locale["af"]["glotto"] = "afri1274" | |
Locale["af"]["script"] = "Latn" | |
Locale["sq"]["name"] = "Albanian" | |
Locale["sq"]["endonym"] = "Shqip" | |
Locale["sq"]["translations-of"] = "Përkthimet e %s" | |
Locale["sq"]["definitions-of"] = "Përkufizime të %s" | |
Locale["sq"]["synonyms"] = "Sinonime" | |
Locale["sq"]["examples"] = "Shembuj" | |
Locale["sq"]["see-also"] = "Shihni gjithashtu" | |
Locale["sq"]["family"] = "Indo-European" | |
Locale["sq"]["iso"] = "sqi" | |
Locale["sq"]["glotto"] = "alba1267" | |
Locale["sq"]["script"] = "Latn" | |
Locale["am"]["name"] = "Amharic" | |
Locale["am"]["endonym"] = "አማርኛ" | |
Locale["am"]["translations-of"] = "የ %s ትርጉሞች" | |
Locale["am"]["definitions-of"] = "የ %s ቃላት ፍችዎች" | |
Locale["am"]["synonyms"] = "ተመሳሳይ ቃላት" | |
Locale["am"]["examples"] = "ምሳሌዎች" | |
Locale["am"]["see-also"] = "የሚከተለውንም ይመልከቱ" | |
Locale["am"]["family"] = "Afro-Asiatic" | |
Locale["am"]["iso"] = "amh" | |
Locale["am"]["glotto"] = "amha1245" | |
Locale["am"]["script"] = "Ethi" | |
Locale["ar"]["name"] = "Arabic" | |
Locale["ar"]["endonym"] = "العربية" | |
Locale["ar"]["translations-of"] = "ترجمات %s" | |
Locale["ar"]["definitions-of"] = "تعريفات %s" | |
Locale["ar"]["synonyms"] = "مرادفات" | |
Locale["ar"]["examples"] = "أمثلة" | |
Locale["ar"]["see-also"] = "انظر أيضًا" | |
Locale["ar"]["family"] = "Afro-Asiatic" | |
Locale["ar"]["iso"] = "ara" | |
Locale["ar"]["glotto"] = "stan1318" | |
Locale["ar"]["script"] = "Arab" | |
Locale["ar"]["rtl"] = "true" | |
Locale["hy"]["name"] = "Armenian" | |
Locale["hy"]["endonym"] = "Հայերեն" | |
Locale["hy"]["translations-of"] = "%s-ի թարգմանությունները" | |
Locale["hy"]["definitions-of"] = "%s-ի սահմանումները" | |
Locale["hy"]["synonyms"] = "Հոմանիշներ" | |
Locale["hy"]["examples"] = "Օրինակներ" | |
Locale["hy"]["see-also"] = "Տես նաև" | |
Locale["hy"]["family"] = "Indo-European" | |
Locale["hy"]["iso"] = "hye" | |
Locale["hy"]["glotto"] = "nucl1235" | |
Locale["hy"]["script"] = "Armn" | |
Locale["az"]["name"] = "Azerbaijani" | |
Locale["az"]["endonym"] = "Azərbaycanca" | |
Locale["az"]["translations-of"] = "%s sözünün tərcüməsi" | |
Locale["az"]["definitions-of"] = "%s sözünün tərifləri" | |
Locale["az"]["synonyms"] = "Sinonimlər" | |
Locale["az"]["examples"] = "Nümunələr" | |
Locale["az"]["see-also"] = "Həmçinin, baxın:" | |
Locale["az"]["family"] = "Turkic" | |
Locale["az"]["iso"] = "aze" | |
Locale["az"]["glotto"] = "nort2697" | |
Locale["az"]["script"] = "Latn" | |
Locale["eu"]["name"] = "Basque" | |
Locale["eu"]["endonym"] = "Euskara" | |
Locale["eu"]["translations-of"] = "%s esapidearen itzulpena" | |
Locale["eu"]["definitions-of"] = "Honen definizioak: %s" | |
Locale["eu"]["synonyms"] = "Sinonimoak" | |
Locale["eu"]["examples"] = "Adibideak" | |
Locale["eu"]["see-also"] = "Ikusi hauek ere" | |
Locale["eu"]["family"] = "Language Isolate" | |
Locale["eu"]["iso"] = "eus" | |
Locale["eu"]["glotto"] = "basq1248" | |
Locale["eu"]["script"] = "Latn" | |
Locale["be"]["name"] = "Belarusian" | |
Locale["be"]["endonym"] = "беларуская" | |
Locale["be"]["translations-of"] = "Пераклады %s" | |
Locale["be"]["definitions-of"] = "Вызначэннi %s" | |
Locale["be"]["synonyms"] = "Сінонімы" | |
Locale["be"]["examples"] = "Прыклады" | |
Locale["be"]["see-also"] = "Гл. таксама" | |
Locale["be"]["family"] = "Indo-European" | |
Locale["be"]["iso"] = "bel" | |
Locale["be"]["glotto"] = "bela1254" | |
Locale["be"]["script"] = "Cyrl" | |
Locale["bn"]["name"] = "Bengali" | |
Locale["bn"]["endonym"] = "বাংলা" | |
Locale["bn"]["translations-of"] = "%s এর অনুবাদ" | |
Locale["bn"]["definitions-of"] = "%s এর সংজ্ঞা" | |
Locale["bn"]["synonyms"] = "প্রতিশব্দ" | |
Locale["bn"]["examples"] = "উদাহরণ" | |
Locale["bn"]["see-also"] = "আরো দেখুন" | |
Locale["bn"]["family"] = "Indo-European" | |
Locale["bn"]["iso"] = "ben" | |
Locale["bn"]["glotto"] = "beng1280" | |
Locale["bn"]["script"] = "Beng" | |
Locale["bs"]["name"] = "Bosnian" | |
Locale["bs"]["endonym"] = "Bosanski" | |
Locale["bs"]["translations-of"] = "Prijevod za: %s" | |
Locale["bs"]["definitions-of"] = "Definicije za %s" | |
Locale["bs"]["synonyms"] = "Sinonimi" | |
Locale["bs"]["examples"] = "Primjeri" | |
Locale["bs"]["see-also"] = "Pogledajte i" | |
Locale["bs"]["family"] = "Indo-European" | |
Locale["bs"]["iso"] = "bos" | |
Locale["bs"]["glotto"] = "bosn1245" | |
Locale["bs"]["script"] = "Latn" | |
Locale["bg"]["name"] = "Bulgarian" | |
Locale["bg"]["endonym"] = "български" | |
Locale["bg"]["translations-of"] = "Преводи на %s" | |
Locale["bg"]["definitions-of"] = "Дефиниции за %s" | |
Locale["bg"]["synonyms"] = "Синоними" | |
Locale["bg"]["examples"] = "Примери" | |
Locale["bg"]["see-also"] = "Вижте също" | |
Locale["bg"]["family"] = "Indo-European" | |
Locale["bg"]["iso"] = "bul" | |
Locale["bg"]["glotto"] = "bulg1262" | |
Locale["bg"]["script"] = "Cyrl" | |
Locale["ca"]["name"] = "Catalan" | |
Locale["ca"]["endonym"] = "Català" | |
Locale["ca"]["translations-of"] = "Traduccions per a %s" | |
Locale["ca"]["definitions-of"] = "Definicions de: %s" | |
Locale["ca"]["synonyms"] = "Sinònims" | |
Locale["ca"]["examples"] = "Exemples" | |
Locale["ca"]["see-also"] = "Vegeu també" | |
Locale["ca"]["family"] = "Indo-European" | |
Locale["ca"]["iso"] = "cat" | |
Locale["ca"]["glotto"] = "stan1289" | |
Locale["ca"]["script"] = "Latn" | |
Locale["ceb"]["name"] = "Cebuano" | |
Locale["ceb"]["endonym"] = "Cebuano" | |
Locale["ceb"]["translations-of"] = "%s Mga Paghubad sa PULONG_O_HUGPONG SA PAMULONG" | |
Locale["ceb"]["definitions-of"] = "Mga kahulugan sa %s" | |
Locale["ceb"]["synonyms"] = "Mga Kapulong" | |
Locale["ceb"]["examples"] = "Mga pananglitan:" | |
Locale["ceb"]["see-also"] = "Kitaa pag-usab" | |
Locale["ceb"]["family"] = "Austronesian" | |
Locale["ceb"]["iso"] = "ceb" | |
Locale["ceb"]["glotto"] = "cebu1242" | |
Locale["ceb"]["script"] = "Latn" | |
Locale["ny"]["name"] = "Chichewa" | |
Locale["ny"]["endonym"] = "Nyanja" | |
Locale["ny"]["translations-of"] = "Matanthauzidwe a %s" | |
Locale["ny"]["definitions-of"] = "Mamasulidwe a %s" | |
Locale["ny"]["synonyms"] = "Mau ofanana" | |
Locale["ny"]["examples"] = "Zitsanzo" | |
Locale["ny"]["see-also"] = "Onaninso" | |
Locale["ny"]["family"] = "Atlantic-Congo" | |
Locale["ny"]["iso"] = "nya" | |
Locale["ny"]["glotto"] = "nyan1308" | |
Locale["ny"]["script"] = "Latn" | |
Locale["zh-CN"]["name"] = "Chinese Simplified" | |
Locale["zh-CN"]["endonym"] = "简体中文" | |
Locale["zh-CN"]["translations-of"] = "%s 的翻译" | |
Locale["zh-CN"]["definitions-of"] = "%s的定义" | |
Locale["zh-CN"]["synonyms"] = "同义词" | |
Locale["zh-CN"]["examples"] = "示例" | |
Locale["zh-CN"]["see-also"] = "另请参阅" | |
Locale["zh-CN"]["family"] = "Sino-Tibetan" | |
Locale["zh-CN"]["iso"] = "zho-CN" | |
Locale["zh-CN"]["glotto"] = "mand1415" | |
Locale["zh-CN"]["script"] = "Hans" | |
Locale["zh-CN"]["dictionary"] = "true" | |
Locale["zh-TW"]["name"] = "Chinese Traditional" | |
Locale["zh-TW"]["endonym"] = "正體中文" | |
Locale["zh-TW"]["translations-of"] = "「%s」的翻譯" | |
Locale["zh-TW"]["definitions-of"] = "「%s」的定義" | |
Locale["zh-TW"]["synonyms"] = "同義詞" | |
Locale["zh-TW"]["examples"] = "例句" | |
Locale["zh-TW"]["see-also"] = "另請參閱" | |
Locale["zh-TW"]["family"] = "Sino-Tibetan" | |
Locale["zh-TW"]["iso"] = "zho-TW" | |
Locale["zh-TW"]["glotto"] = "mand1415" | |
Locale["zh-TW"]["script"] = "Hant" | |
Locale["zh-TW"]["dictionary"] = "true" | |
Locale["co"]["name"] = "Corsican" | |
Locale["co"]["endonym"] = "Corsu" | |
Locale["co"]["translations-of"] = "Traductions de %s" | |
Locale["co"]["definitions-of"] = "Définitions de %s" | |
Locale["co"]["synonyms"] = "Synonymes" | |
Locale["co"]["examples"] = "Exemples" | |
Locale["co"]["see-also"] = "Voir aussi" | |
Locale["co"]["family"] = "Indo-European" | |
Locale["co"]["iso"] = "cos" | |
Locale["co"]["glotto"] = "cors1242" | |
Locale["co"]["script"] = "Latn" | |
Locale["hr"]["name"] = "Croatian" | |
Locale["hr"]["endonym"] = "Hrvatski" | |
Locale["hr"]["translations-of"] = "Prijevodi riječi ili izraza %s" | |
Locale["hr"]["definitions-of"] = "Definicije riječi ili izraza %s" | |
Locale["hr"]["synonyms"] = "Sinonimi" | |
Locale["hr"]["examples"] = "Primjeri" | |
Locale["hr"]["see-also"] = "Također pogledajte" | |
Locale["hr"]["family"] = "Indo-European" | |
Locale["hr"]["iso"] = "hrv" | |
Locale["hr"]["glotto"] = "croa1245" | |
Locale["hr"]["script"] = "Latn" | |
Locale["cs"]["name"] = "Czech" | |
Locale["cs"]["endonym"] = "Čeština" | |
Locale["cs"]["translations-of"] = "Překlad výrazu %s" | |
Locale["cs"]["definitions-of"] = "Definice výrazu %s" | |
Locale["cs"]["synonyms"] = "Synonyma" | |
Locale["cs"]["examples"] = "Příklady" | |
Locale["cs"]["see-also"] = "Viz také" | |
Locale["cs"]["family"] = "Indo-European" | |
Locale["cs"]["iso"] = "ces" | |
Locale["cs"]["glotto"] = "czec1258" | |
Locale["cs"]["script"] = "Latn" | |
Locale["da"]["name"] = "Danish" | |
Locale["da"]["endonym"] = "Dansk" | |
Locale["da"]["translations-of"] = "Oversættelser af %s" | |
Locale["da"]["definitions-of"] = "Definitioner af %s" | |
Locale["da"]["synonyms"] = "Synonymer" | |
Locale["da"]["examples"] = "Eksempler" | |
Locale["da"]["see-also"] = "Se også" | |
Locale["da"]["family"] = "Indo-European" | |
Locale["da"]["iso"] = "dan" | |
Locale["da"]["glotto"] = "dani1285" | |
Locale["da"]["script"] = "Latn" | |
Locale["nl"]["name"] = "Dutch" | |
Locale["nl"]["endonym"] = "Nederlands" | |
Locale["nl"]["translations-of"] = "Vertalingen van %s" | |
Locale["nl"]["definitions-of"] = "Definities van %s" | |
Locale["nl"]["synonyms"] = "Synoniemen" | |
Locale["nl"]["examples"] = "Voorbeelden" | |
Locale["nl"]["see-also"] = "Zie ook" | |
Locale["nl"]["family"] = "Indo-European" | |
Locale["nl"]["iso"] = "nld" | |
Locale["nl"]["glotto"] = "dutc1256" | |
Locale["nl"]["script"] = "Latn" | |
Locale["nl"]["dictionary"] = "true" | |
Locale["en"]["name"] = "English" | |
Locale["en"]["endonym"] = "English" | |
Locale["en"]["translations-of"] = "Translations of %s" | |
Locale["en"]["definitions-of"] = "Definitions of %s" | |
Locale["en"]["synonyms"] = "Synonyms" | |
Locale["en"]["examples"] = "Examples" | |
Locale["en"]["see-also"] = "See also" | |
Locale["en"]["family"] = "Indo-European" | |
Locale["en"]["iso"] = "eng" | |
Locale["en"]["glotto"] = "stan1293" | |
Locale["en"]["script"] = "Latn" | |
Locale["en"]["dictionary"] = "true" | |
Locale["eo"]["name"] = "Esperanto" | |
Locale["eo"]["endonym"] = "Esperanto" | |
Locale["eo"]["translations-of"] = "Tradukoj de %s" | |
Locale["eo"]["definitions-of"] = "Difinoj de %s" | |
Locale["eo"]["synonyms"] = "Sinonimoj" | |
Locale["eo"]["examples"] = "Ekzemploj" | |
Locale["eo"]["see-also"] = "Vidu ankaŭ" | |
Locale["eo"]["family"] = "Artificial Language" | |
Locale["eo"]["iso"] = "epo" | |
Locale["eo"]["glotto"] = "espe1235" | |
Locale["eo"]["script"] = "Latn" | |
Locale["et"]["name"] = "Estonian" | |
Locale["et"]["endonym"] = "Eesti" | |
Locale["et"]["translations-of"] = "Sõna(de) %s tõlked" | |
Locale["et"]["definitions-of"] = "Sõna(de) %s definitsioonid" | |
Locale["et"]["synonyms"] = "Sünonüümid" | |
Locale["et"]["examples"] = "Näited" | |
Locale["et"]["see-also"] = "Vt ka" | |
Locale["et"]["family"] = "Uralic" | |
Locale["et"]["iso"] = "est" | |
Locale["et"]["glotto"] = "esto1258" | |
Locale["et"]["script"] = "Latn" | |
Locale["tl"]["name"] = "Filipino" | |
Locale["tl"]["endonym"] = "Tagalog" | |
Locale["tl"]["translations-of"] = "Mga pagsasalin ng %s" | |
Locale["tl"]["definitions-of"] = "Mga kahulugan ng %s" | |
Locale["tl"]["synonyms"] = "Mga Kasingkahulugan" | |
Locale["tl"]["examples"] = "Mga Halimbawa" | |
Locale["tl"]["see-also"] = "Tingnan rin ang" | |
Locale["tl"]["family"] = "Austronesian" | |
Locale["tl"]["iso"] = "tgl" | |
Locale["tl"]["glotto"] = "taga1270" | |
Locale["tl"]["script"] = "Latn" | |
Locale["fi"]["name"] = "Finnish" | |
Locale["fi"]["endonym"] = "Suomi" | |
Locale["fi"]["translations-of"] = "Käännökset tekstille %s" | |
Locale["fi"]["definitions-of"] = "Määritelmät kohteelle %s" | |
Locale["fi"]["synonyms"] = "Synonyymit" | |
Locale["fi"]["examples"] = "Esimerkkejä" | |
Locale["fi"]["see-also"] = "Katso myös" | |
Locale["fi"]["family"] = "Uralic" | |
Locale["fi"]["iso"] = "fin" | |
Locale["fi"]["glotto"] = "finn1318" | |
Locale["fi"]["script"] = "Latn" | |
Locale["fr"]["name"] = "French" | |
Locale["fr"]["endonym"] = "Français" | |
Locale["fr"]["translations-of"] = "Traductions de %s" | |
Locale["fr"]["definitions-of"] = "Définitions de %s" | |
Locale["fr"]["synonyms"] = "Synonymes" | |
Locale["fr"]["examples"] = "Exemples" | |
Locale["fr"]["see-also"] = "Voir aussi" | |
Locale["fr"]["family"] = "Indo-European" | |
Locale["fr"]["iso"] = "fra" | |
Locale["fr"]["glotto"] = "stan1290" | |
Locale["fr"]["script"] = "Latn" | |
Locale["fr"]["dictionary"] = "true" | |
Locale["gl"]["name"] = "Galician" | |
Locale["gl"]["endonym"] = "Galego" | |
Locale["gl"]["translations-of"] = "Traducións de %s" | |
Locale["gl"]["definitions-of"] = "Definicións de %s" | |
Locale["gl"]["synonyms"] = "Sinónimos" | |
Locale["gl"]["examples"] = "Exemplos" | |
Locale["gl"]["see-also"] = "Ver tamén" | |
Locale["gl"]["family"] = "Indo-European" | |
Locale["gl"]["iso"] = "glg" | |
Locale["gl"]["glotto"] = "gali1258" | |
Locale["gl"]["script"] = "Latn" | |
Locale["ka"]["name"] = "Georgian" | |
Locale["ka"]["endonym"] = "ქართული" | |
Locale["ka"]["translations-of"] = "%s-ის თარგმანები" | |
Locale["ka"]["definitions-of"] = "%s-ის განსაზღვრებები" | |
Locale["ka"]["synonyms"] = "სინონიმები" | |
Locale["ka"]["examples"] = "მაგალითები" | |
Locale["ka"]["see-also"] = "ასევე იხილეთ" | |
Locale["ka"]["family"] = "Kartvelian" | |
Locale["ka"]["iso"] = "kat" | |
Locale["ka"]["glotto"] = "nucl1302" | |
Locale["ka"]["script"] = "Geor" | |
Locale["de"]["name"] = "German" | |
Locale["de"]["endonym"] = "Deutsch" | |
Locale["de"]["translations-of"] = "Übersetzungen für %s" | |
Locale["de"]["definitions-of"] = "Definitionen von %s" | |
Locale["de"]["synonyms"] = "Synonyme" | |
Locale["de"]["examples"] = "Beispiele" | |
Locale["de"]["see-also"] = "Siehe auch" | |
Locale["de"]["family"] = "Indo-European" | |
Locale["de"]["iso"] = "deu" | |
Locale["de"]["glotto"] = "stan1295" | |
Locale["de"]["script"] = "Latn" | |
Locale["de"]["dictionary"] = "true" | |
Locale["el"]["name"] = "Greek" | |
Locale["el"]["endonym"] = "Ελληνικά" | |
Locale["el"]["translations-of"] = "Μεταφράσεις του %s" | |
Locale["el"]["definitions-of"] = "Όρισμοί %s" | |
Locale["el"]["synonyms"] = "Συνώνυμα" | |
Locale["el"]["examples"] = "Παραδείγματα" | |
Locale["el"]["see-also"] = "Δείτε επίσης" | |
Locale["el"]["family"] = "Indo-European" | |
Locale["el"]["iso"] = "ell" | |
Locale["el"]["glotto"] = "mode1248" | |
Locale["el"]["script"] = "Grek" | |
Locale["gu"]["name"] = "Gujarati" | |
Locale["gu"]["endonym"] = "ગુજરાતી" | |
Locale["gu"]["translations-of"] = "%s ના અનુવાદ" | |
Locale["gu"]["definitions-of"] = "%s ની વ્યાખ્યાઓ" | |
Locale["gu"]["synonyms"] = "સમાનાર્થી" | |
Locale["gu"]["examples"] = "ઉદાહરણો" | |
Locale["gu"]["see-also"] = "આ પણ જુઓ" | |
Locale["gu"]["family"] = "Indo-European" | |
Locale["gu"]["iso"] = "guj" | |
Locale["gu"]["glotto"] = "guja1252" | |
Locale["gu"]["script"] = "Gujr" | |
Locale["ht"]["name"] = "Haitian Creole" | |
Locale["ht"]["endonym"] = "Kreyòl Ayisyen" | |
Locale["ht"]["translations-of"] = "Tradiksyon %s" | |
Locale["ht"]["definitions-of"] = "Definisyon nan %s" | |
Locale["ht"]["synonyms"] = "Sinonim" | |
Locale["ht"]["examples"] = "Egzanp:" | |
Locale["ht"]["see-also"] = "Wè tou" | |
Locale["ht"]["family"] = "Indo-European" | |
Locale["ht"]["iso"] = "hat" | |
Locale["ht"]["glotto"] = "hait1244" | |
Locale["ht"]["script"] = "Latn" | |
Locale["haw"]["name"] = "Hawaiian" | |
Locale["haw"]["endonym"] = "ʻŌlelo Hawaiʻi" | |
Locale["haw"]["family"] = "Austronesian" | |
Locale["haw"]["iso"] = "haw" | |
Locale["haw"]["glotto"] = "hawa1245" | |
Locale["haw"]["script"] = "Latn" | |
Locale["ha"]["name"] = "Hausa" | |
Locale["ha"]["endonym"] = "Hausa" | |
Locale["ha"]["translations-of"] = "Fassarar %s" | |
Locale["ha"]["definitions-of"] = "Ma'anoni na %s" | |
Locale["ha"]["synonyms"] = "Masu kamancin ma'ana" | |
Locale["ha"]["examples"] = "Misalai" | |
Locale["ha"]["see-also"] = "Duba kuma" | |
Locale["ha"]["family"] = "Afro-Asiatic" | |
Locale["ha"]["iso"] = "hau" | |
Locale["ha"]["glotto"] = "haus1257" | |
Locale["ha"]["script"] = "Latn" | |
Locale["he"]["name"] = "Hebrew" | |
Locale["he"]["endonym"] = "עִבְרִית" | |
Locale["he"]["translations-of"] = "תרגומים של %s" | |
Locale["he"]["definitions-of"] = "הגדרות של %s" | |
Locale["he"]["synonyms"] = "מילים נרדפות" | |
Locale["he"]["examples"] = "דוגמאות" | |
Locale["he"]["see-also"] = "ראה גם" | |
Locale["he"]["family"] = "Afro-Asiatic" | |
Locale["he"]["iso"] = "heb" | |
Locale["he"]["glotto"] = "hebr1245" | |
Locale["he"]["script"] = "Hebr" | |
Locale["he"]["rtl"] = "true" | |
Locale["hi"]["name"] = "Hindi" | |
Locale["hi"]["endonym"] = "हिन्दी" | |
Locale["hi"]["translations-of"] = "%s के अनुवाद" | |
Locale["hi"]["definitions-of"] = "%s की परिभाषाएं" | |
Locale["hi"]["synonyms"] = "समानार्थी" | |
Locale["hi"]["examples"] = "उदाहरण" | |
Locale["hi"]["see-also"] = "यह भी देखें" | |
Locale["hi"]["family"] = "Indo-European" | |
Locale["hi"]["iso"] = "hin" | |
Locale["hi"]["glotto"] = "hind1269" | |
Locale["hi"]["script"] = "Deva" | |
Locale["hmn"]["name"] = "Hmong" | |
Locale["hmn"]["endonym"] = "Hmoob" | |
Locale["hmn"]["translations-of"] = "Lus txhais: %s" | |
Locale["hmn"]["family"] = "Hmong-Mien" | |
Locale["hmn"]["iso"] = "hmn" | |
Locale["hmn"]["glotto"] = "firs1234" | |
Locale["hmn"]["script"] = "Latn" | |
Locale["hu"]["name"] = "Hungarian" | |
Locale["hu"]["endonym"] = "Magyar" | |
Locale["hu"]["translations-of"] = "%s fordításai" | |
Locale["hu"]["definitions-of"] = "%s jelentései" | |
Locale["hu"]["synonyms"] = "Szinonimák" | |
Locale["hu"]["examples"] = "Példák" | |
Locale["hu"]["see-also"] = "Lásd még" | |
Locale["hu"]["family"] = "Uralic" | |
Locale["hu"]["iso"] = "hun" | |
Locale["hu"]["glotto"] = "hung1274" | |
Locale["hu"]["script"] = "Latn" | |
Locale["is"]["name"] = "Icelandic" | |
Locale["is"]["endonym"] = "Íslenska" | |
Locale["is"]["translations-of"] = "Þýðingar á %s" | |
Locale["is"]["definitions-of"] = "Skilgreiningar á" | |
Locale["is"]["synonyms"] = "Samheiti" | |
Locale["is"]["examples"] = "Dæmi" | |
Locale["is"]["see-also"] = "Sjá einnig" | |
Locale["is"]["family"] = "Indo-European" | |
Locale["is"]["iso"] = "isl" | |
Locale["is"]["glotto"] = "icel1247" | |
Locale["is"]["script"] = "Latn" | |
Locale["ig"]["name"] = "Igbo" | |
Locale["ig"]["endonym"] = "Igbo" | |
Locale["ig"]["translations-of"] = "Ntụgharị asụsụ nke %s" | |
Locale["ig"]["definitions-of"] = "Nkọwapụta nke %s" | |
Locale["ig"]["synonyms"] = "Okwu oyiri" | |
Locale["ig"]["examples"] = "Ọmụmaatụ" | |
Locale["ig"]["see-also"] = "Hụkwuo" | |
Locale["ig"]["family"] = "Atlantic-Congo" | |
Locale["ig"]["iso"] = "ibo" | |
Locale["ig"]["glotto"] = "nucl1417" | |
Locale["ig"]["script"] = "Latn" | |
Locale["id"]["name"] = "Indonesian" | |
Locale["id"]["endonym"] = "Bahasa Indonesia" | |
Locale["id"]["translations-of"] = "Terjemahan dari %s" | |
Locale["id"]["definitions-of"] = "Definisi %s" | |
Locale["id"]["synonyms"] = "Sinonim" | |
Locale["id"]["examples"] = "Contoh" | |
Locale["id"]["see-also"] = "Lihat juga" | |
Locale["id"]["family"] = "Austronesian" | |
Locale["id"]["iso"] = "ind" | |
Locale["id"]["glotto"] = "indo1316" | |
Locale["id"]["script"] = "Latn" | |
Locale["ga"]["name"] = "Irish" | |
Locale["ga"]["endonym"] = "Gaeilge" | |
Locale["ga"]["translations-of"] = "Aistriúcháin ar %s" | |
Locale["ga"]["definitions-of"] = "Sainmhínithe ar %s" | |
Locale["ga"]["synonyms"] = "Comhchiallaigh" | |
Locale["ga"]["examples"] = "Samplaí" | |
Locale["ga"]["see-also"] = "féach freisin" | |
Locale["ga"]["family"] = "Indo-European" | |
Locale["ga"]["iso"] = "gle" | |
Locale["ga"]["glotto"] = "iris1253" | |
Locale["ga"]["script"] = "Latn" | |
Locale["it"]["name"] = "Italian" | |
Locale["it"]["endonym"] = "Italiano" | |
Locale["it"]["translations-of"] = "Traduzioni di %s" | |
Locale["it"]["definitions-of"] = "Definizioni di %s" | |
Locale["it"]["synonyms"] = "Sinonimi" | |
Locale["it"]["examples"] = "Esempi" | |
Locale["it"]["see-also"] = "Vedi anche" | |
Locale["it"]["family"] = "Indo-European" | |
Locale["it"]["iso"] = "ita" | |
Locale["it"]["glotto"] = "ital1282" | |
Locale["it"]["script"] = "Latn" | |
Locale["it"]["dictionary"] = "true" | |
Locale["ja"]["name"] = "Japanese" | |
Locale["ja"]["endonym"] = "日本語" | |
Locale["ja"]["translations-of"] = "「%s」の翻訳" | |
Locale["ja"]["definitions-of"] = "%s の定義" | |
Locale["ja"]["synonyms"] = "同義語" | |
Locale["ja"]["examples"] = "例" | |
Locale["ja"]["see-also"] = "関連項目" | |
Locale["ja"]["family"] = "Japonic" | |
Locale["ja"]["iso"] = "jpn" | |
Locale["ja"]["glotto"] = "nucl1643" | |
Locale["ja"]["script"] = "Jpan" | |
Locale["ja"]["dictionary"] = "true" | |
Locale["jv"]["name"] = "Javanese" | |
Locale["jv"]["endonym"] = "Basa Jawa" | |
Locale["jv"]["translations-of"] = "Terjemahan %s" | |
Locale["jv"]["definitions-of"] = "Arti %s" | |
Locale["jv"]["synonyms"] = "Sinonim" | |
Locale["jv"]["examples"] = "Conto" | |
Locale["jv"]["see-also"] = "Deleng uga" | |
Locale["jv"]["family"] = "Austronesian" | |
Locale["jv"]["iso"] = "jav" | |
Locale["jv"]["glotto"] = "java1254" | |
Locale["jv"]["script"] = "Latn" | |
Locale["kn"]["name"] = "Kannada" | |
Locale["kn"]["endonym"] = "ಕನ್ನಡ" | |
Locale["kn"]["translations-of"] = "%s ನ ಅನುವಾದಗಳು" | |
Locale["kn"]["definitions-of"] = "%s ನ ವ್ಯಾಖ್ಯಾನಗಳು" | |
Locale["kn"]["synonyms"] = "ಸಮಾನಾರ್ಥಕಗಳು" | |
Locale["kn"]["examples"] = "ಉದಾಹರಣೆಗಳು" | |
Locale["kn"]["see-also"] = "ಇದನ್ನೂ ಗಮನಿಸಿ" | |
Locale["kn"]["family"] = "Dravidian" | |
Locale["kn"]["iso"] = "kan" | |
Locale["kn"]["glotto"] = "nucl1305" | |
Locale["kn"]["script"] = "Knda" | |
Locale["kk"]["name"] = "Kazakh" | |
Locale["kk"]["endonym"] = "Қазақ тілі" | |
Locale["kk"]["translations-of"] = "%s аудармалары" | |
Locale["kk"]["definitions-of"] = "%s анықтамалары" | |
Locale["kk"]["synonyms"] = "Синонимдер" | |
Locale["kk"]["examples"] = "Мысалдар" | |
Locale["kk"]["see-also"] = "Келесі тізімді де көріңіз:" | |
Locale["kk"]["family"] = "Turkic" | |
Locale["kk"]["iso"] = "kaz" | |
Locale["kk"]["glotto"] = "kaza1248" | |
Locale["kk"]["script"] = "Cyrl" | |
Locale["km"]["name"] = "Khmer" | |
Locale["km"]["endonym"] = "ភាសាខ្មែរ" | |
Locale["km"]["translations-of"] = "ការបកប្រែនៃ %s" | |
Locale["km"]["definitions-of"] = "និយមន័យនៃ %s" | |
Locale["km"]["synonyms"] = "សទិសន័យ" | |
Locale["km"]["examples"] = "ឧទាហរណ៍" | |
Locale["km"]["see-also"] = "មើលផងដែរ" | |
Locale["km"]["family"] = "Austroasiatic" | |
Locale["km"]["iso"] = "khm" | |
Locale["km"]["glotto"] = "cent1989" | |
Locale["km"]["script"] = "Khmr" | |
Locale["ko"]["name"] = "Korean" | |
Locale["ko"]["endonym"] = "한국어" | |
Locale["ko"]["translations-of"] = "%s의 번역" | |
Locale["ko"]["definitions-of"] = "%s의 정의" | |
Locale["ko"]["synonyms"] = "동의어" | |
Locale["ko"]["examples"] = "예문" | |
Locale["ko"]["see-also"] = "참조" | |
Locale["ko"]["family"] = "Koreanic" | |
Locale["ko"]["iso"] = "kor" | |
Locale["ko"]["glotto"] = "kore1280" | |
Locale["ko"]["script"] = "Kore" | |
Locale["ko"]["dictionary"] = "true" | |
Locale["ku"]["name"] = "Kurdish" | |
Locale["ku"]["endonym"] = "Kurdî" | |
Locale["ku"]["family"] = "Indo-European" | |
Locale["ku"]["iso"] = "kur" | |
Locale["ku"]["glotto"] = "kurd1259" | |
Locale["ku"]["script"] = "Latn" | |
Locale["ky"]["name"] = "Kyrgyz" | |
Locale["ky"]["endonym"] = "Кыргызча" | |
Locale["ky"]["translations-of"] = "%s котормосу" | |
Locale["ky"]["definitions-of"] = "%s аныктамасы" | |
Locale["ky"]["synonyms"] = "Синонимдер" | |
Locale["ky"]["examples"] = "Мисалдар" | |
Locale["ky"]["see-also"] = "Дагы караңыз" | |
Locale["ky"]["family"] = "Turkic" | |
Locale["ky"]["iso"] = "kir" | |
Locale["ky"]["glotto"] = "kirg1245" | |
Locale["ky"]["script"] = "Cyrl" | |
Locale["lo"]["name"] = "Lao" | |
Locale["lo"]["endonym"] = "ລາວ" | |
Locale["lo"]["translations-of"] = "ຄຳແປສຳລັບ %s" | |
Locale["lo"]["definitions-of"] = "ຄວາມໝາຍຂອງ %s" | |
Locale["lo"]["synonyms"] = "ຄຳທີ່ຄ້າຍກັນ %s" | |
Locale["lo"]["examples"] = "ຕົວຢ່າງ" | |
Locale["lo"]["see-also"] = "ເບິ່ງເພີ່ມເຕີມ" | |
Locale["lo"]["family"] = "Tai-Kadai" | |
Locale["lo"]["iso"] = "lao" | |
Locale["lo"]["glotto"] = "laoo1244" | |
Locale["lo"]["script"] = "Laoo" | |
Locale["la"]["name"] = "Latin" | |
Locale["la"]["endonym"] = "Latina" | |
Locale["la"]["translations-of"] = "Versio de %s" | |
Locale["la"]["family"] = "Indo-European" | |
Locale["la"]["iso"] = "lat" | |
Locale["la"]["glotto"] = "lati1261" | |
Locale["la"]["script"] = "Latn" | |
Locale["lv"]["name"] = "Latvian" | |
Locale["lv"]["endonym"] = "Latviešu" | |
Locale["lv"]["translations-of"] = "%s tulkojumi" | |
Locale["lv"]["definitions-of"] = "%s definīcijas" | |
Locale["lv"]["synonyms"] = "Sinonīmi" | |
Locale["lv"]["examples"] = "Piemēri" | |
Locale["lv"]["see-also"] = "Skatiet arī" | |
Locale["lv"]["family"] = "Indo-European" | |
Locale["lv"]["iso"] = "lav" | |
Locale["lv"]["glotto"] = "latv1249" | |
Locale["lv"]["script"] = "Latn" | |
Locale["lt"]["name"] = "Lithuanian" | |
Locale["lt"]["endonym"] = "Lietuvių" | |
Locale["lt"]["translations-of"] = "„%s“ vertimai" | |
Locale["lt"]["definitions-of"] = "„%s“ apibrėžimai" | |
Locale["lt"]["synonyms"] = "Sinonimai" | |
Locale["lt"]["examples"] = "Pavyzdžiai" | |
Locale["lt"]["see-also"] = "Taip pat žiūrėkite" | |
Locale["lt"]["family"] = "Indo-European" | |
Locale["lt"]["iso"] = "lit" | |
Locale["lt"]["glotto"] = "lith1251" | |
Locale["lt"]["script"] = "Latn" | |
Locale["lb"]["name"] = "Luxembourgish" | |
Locale["lb"]["endonym"] = "Lëtzebuergesch" | |
Locale["lb"]["family"] = "Indo-European" | |
Locale["lb"]["iso"] = "ltz" | |
Locale["lb"]["glotto"] = "luxe1241" | |
Locale["lb"]["script"] = "Latn" | |
Locale["mk"]["name"] = "Macedonian" | |
Locale["mk"]["endonym"] = "Македонски" | |
Locale["mk"]["translations-of"] = "Преводи на %s" | |
Locale["mk"]["definitions-of"] = "Дефиниции на %s" | |
Locale["mk"]["synonyms"] = "Синоними" | |
Locale["mk"]["examples"] = "Примери" | |
Locale["mk"]["see-also"] = "Види и" | |
Locale["mk"]["family"] = "Indo-European" | |
Locale["mk"]["iso"] = "mkd" | |
Locale["mk"]["glotto"] = "mace1250" | |
Locale["mk"]["script"] = "Cyrl" | |
Locale["mg"]["name"] = "Malagasy" | |
Locale["mg"]["endonym"] = "Malagasy" | |
Locale["mg"]["translations-of"] = "Dikan'ny %s" | |
Locale["mg"]["definitions-of"] = "Famaritana ny %s" | |
Locale["mg"]["synonyms"] = "Mitovy hevitra" | |
Locale["mg"]["examples"] = "Ohatra" | |
Locale["mg"]["see-also"] = "Jereo ihany koa" | |
Locale["mg"]["family"] = "Austronesian" | |
Locale["mg"]["iso"] = "mlg" | |
Locale["mg"]["glotto"] = "plat1254" | |
Locale["mg"]["script"] = "Latn" | |
Locale["ms"]["name"] = "Malay" | |
Locale["ms"]["endonym"] = "Bahasa Melayu" | |
Locale["ms"]["translations-of"] = "Terjemahan %s" | |
Locale["ms"]["definitions-of"] = "Takrif %s" | |
Locale["ms"]["synonyms"] = "Sinonim" | |
Locale["ms"]["examples"] = "Contoh" | |
Locale["ms"]["see-also"] = "Lihat juga" | |
Locale["ms"]["family"] = "Austronesian" | |
Locale["ms"]["iso"] = "msa" | |
Locale["ms"]["glotto"] = "stan1306" | |
Locale["ms"]["script"] = "Latn" | |
Locale["ml"]["name"] = "Malayalam" | |
Locale["ml"]["endonym"] = "മലയാളം" | |
Locale["ml"]["translations-of"] = "%s എന്നതിന്റെ വിവർത്തനങ്ങൾ" | |
Locale["ml"]["definitions-of"] = "%s എന്നതിന്റെ നിർവ്വചനങ്ങൾ" | |
Locale["ml"]["synonyms"] = "പര്യായങ്ങള്" | |
Locale["ml"]["examples"] = "ഉദാഹരണങ്ങള്" | |
Locale["ml"]["see-also"] = "ഇതും കാണുക" | |
Locale["ml"]["family"] = "Dravidian" | |
Locale["ml"]["iso"] = "mal" | |
Locale["ml"]["glotto"] = "mala1464" | |
Locale["ml"]["script"] = "Mlym" | |
Locale["mt"]["name"] = "Maltese" | |
Locale["mt"]["endonym"] = "Malti" | |
Locale["mt"]["translations-of"] = "Traduzzjonijiet ta' %s" | |
Locale["mt"]["definitions-of"] = "Definizzjonijiet ta' %s" | |
Locale["mt"]["synonyms"] = "Sinonimi" | |
Locale["mt"]["examples"] = "Eżempji" | |
Locale["mt"]["see-also"] = "Ara wkoll" | |
Locale["mt"]["family"] = "Afro-Asiatic" | |
Locale["mt"]["iso"] = "mlt" | |
Locale["mt"]["glotto"] = "malt1254" | |
Locale["mt"]["script"] = "Latn" | |
Locale["mi"]["name"] = "Maori" | |
Locale["mi"]["endonym"] = "Māori" | |
Locale["mi"]["translations-of"] = "Ngā whakamāoritanga o %s" | |
Locale["mi"]["definitions-of"] = "Ngā whakamārama o %s" | |
Locale["mi"]["synonyms"] = "Ngā Kupu Taurite" | |
Locale["mi"]["examples"] = "Ngā Tauira:" | |
Locale["mi"]["see-also"] = "Tiro hoki:" | |
Locale["mi"]["family"] = "Austronesian" | |
Locale["mi"]["iso"] = "mri" | |
Locale["mi"]["glotto"] = "maor1246" | |
Locale["mi"]["script"] = "Latn" | |
Locale["mr"]["name"] = "Marathi" | |
Locale["mr"]["endonym"] = "मराठी" | |
Locale["mr"]["translations-of"] = "%s ची भाषांतरे" | |
Locale["mr"]["definitions-of"] = "%s च्या व्याख्या" | |
Locale["mr"]["synonyms"] = "समानार्थी शब्द" | |
Locale["mr"]["examples"] = "उदाहरणे" | |
Locale["mr"]["see-also"] = "हे देखील पहा" | |
Locale["mr"]["family"] = "Indo-European" | |
Locale["mr"]["iso"] = "mar" | |
Locale["mr"]["glotto"] = "mara1378" | |
Locale["mr"]["script"] = "Deva" | |
Locale["mn"]["name"] = "Mongolian" | |
Locale["mn"]["endonym"] = "Монгол" | |
Locale["mn"]["translations-of"] = "%s-н орчуулга" | |
Locale["mn"]["definitions-of"] = "%s үгийн тодорхойлолт" | |
Locale["mn"]["synonyms"] = "Ойролцоо утгатай" | |
Locale["mn"]["examples"] = "Жишээнүүд" | |
Locale["mn"]["see-also"] = "Мөн харах" | |
Locale["mn"]["family"] = "Mongolic" | |
Locale["mn"]["iso"] = "mon" | |
Locale["mn"]["glotto"] = "mong1331" | |
Locale["mn"]["script"] = "Cyrl" | |
Locale["my"]["name"] = "Myanmar" | |
Locale["my"]["endonym"] = "မြန်မာစာ" | |
Locale["my"]["translations-of"] = "%s၏ ဘာသာပြန်ဆိုချက်များ" | |
Locale["my"]["definitions-of"] = "%s၏ အနက်ဖွင့်ဆိုချက်များ" | |
Locale["my"]["synonyms"] = "ကြောင်းတူသံကွဲများ" | |
Locale["my"]["examples"] = "ဥပမာ" | |
Locale["my"]["see-also"] = "ဖော်ပြပါများကိုလဲ ကြည့်ပါ" | |
Locale["my"]["family"] = "Sino-Tibetan" | |
Locale["my"]["iso"] = "mya" | |
Locale["my"]["glotto"] = "nucl1310" | |
Locale["my"]["script"] = "Mymr" | |
Locale["ne"]["name"] = "Nepali" | |
Locale["ne"]["endonym"] = "नेपाली" | |
Locale["ne"]["translations-of"] = "%sका अनुवाद" | |
Locale["ne"]["definitions-of"] = "%sको परिभाषा" | |
Locale["ne"]["synonyms"] = "समानार्थीहरू" | |
Locale["ne"]["examples"] = "उदाहरणहरु" | |
Locale["ne"]["see-also"] = "यो पनि हेर्नुहोस्" | |
Locale["ne"]["family"] = "Indo-European" | |
Locale["ne"]["iso"] = "nep" | |
Locale["ne"]["glotto"] = "nepa1254" | |
Locale["ne"]["script"] = "Deva" | |
Locale["no"]["name"] = "Norwegian" | |
Locale["no"]["endonym"] = "Norsk" | |
Locale["no"]["translations-of"] = "Oversettelser av %s" | |
Locale["no"]["definitions-of"] = "Definisjoner av %s" | |
Locale["no"]["synonyms"] = "Synonymer" | |
Locale["no"]["examples"] = "Eksempler" | |
Locale["no"]["see-also"] = "Se også" | |
Locale["no"]["family"] = "Indo-European" | |
Locale["no"]["iso"] = "nor" | |
Locale["no"]["glotto"] = "norw1258" | |
Locale["no"]["script"] = "Latn" | |
Locale["ps"]["name"] = "Pashto" | |
Locale["ps"]["endonym"] = "پښتو" | |
Locale["ps"]["translations-of"] = "د %sژباړې" | |
Locale["ps"]["definitions-of"] = "د%s تعریفونه" | |
Locale["ps"]["synonyms"] = "مترادف لغتونه" | |
Locale["ps"]["examples"] = "بېلګې" | |
Locale["ps"]["see-also"] = "دا هم ووینئ" | |
Locale["ps"]["family"] = "Indo-European" | |
Locale["ps"]["iso"] = "pus" | |
Locale["ps"]["glotto"] = "pash1269" | |
Locale["ps"]["script"] = "Arab" | |
Locale["ps"]["rtl"] = "true" | |
Locale["fa"]["name"] = "Persian" | |
Locale["fa"]["endonym"] = "فارسی" | |
Locale["fa"]["translations-of"] = "ترجمههای %s" | |
Locale["fa"]["definitions-of"] = "تعریفهای %s" | |
Locale["fa"]["synonyms"] = "مترادفها" | |
Locale["fa"]["examples"] = "مثالها" | |
Locale["fa"]["see-also"] = "همچنین مراجعه کنید به" | |
Locale["fa"]["family"] = "Indo-European" | |
Locale["fa"]["iso"] = "fas" | |
Locale["fa"]["glotto"] = "west2369" | |
Locale["fa"]["script"] = "Arab" | |
Locale["fa"]["rtl"] = "true" | |
Locale["pl"]["name"] = "Polish" | |
Locale["pl"]["endonym"] = "Polski" | |
Locale["pl"]["translations-of"] = "Tłumaczenia %s" | |
Locale["pl"]["definitions-of"] = "%s – definicje" | |
Locale["pl"]["synonyms"] = "Synonimy" | |
Locale["pl"]["examples"] = "Przykłady" | |
Locale["pl"]["see-also"] = "Zobacz też" | |
Locale["pl"]["family"] = "Indo-European" | |
Locale["pl"]["iso"] = "pol" | |
Locale["pl"]["glotto"] = "poli1260" | |
Locale["pl"]["script"] = "Latn" | |
Locale["pt"]["name"] = "Portuguese" | |
Locale["pt"]["endonym"] = "Português" | |
Locale["pt"]["translations-of"] = "Traduções de %s" | |
Locale["pt"]["definitions-of"] = "Definições de %s" | |
Locale["pt"]["synonyms"] = "Sinônimos" | |
Locale["pt"]["examples"] = "Exemplos" | |
Locale["pt"]["see-also"] = "Veja também" | |
Locale["pt"]["family"] = "Indo-European" | |
Locale["pt"]["iso"] = "por" | |
Locale["pt"]["glotto"] = "port1283" | |
Locale["pt"]["script"] = "Latn" | |
Locale["pt"]["dictionary"] = "true" | |
Locale["pa"]["name"] = "Punjabi" | |
Locale["pa"]["endonym"] = "ਪੰਜਾਬੀ" | |
Locale["pa"]["translations-of"] = "ਦੇ ਅਨੁਵਾਦ%s" | |
Locale["pa"]["definitions-of"] = "ਦੀਆਂ ਪਰਿਭਾਸ਼ਾ %s" | |
Locale["pa"]["synonyms"] = "ਸਮਾਨਾਰਥਕ ਸ਼ਬਦ" | |
Locale["pa"]["examples"] = "ਉਦਾਹਰਣਾਂ" | |
Locale["pa"]["see-also"] = "ਇਹ ਵੀ ਵੇਖੋ" | |
Locale["pa"]["family"] = "Indo-European" | |
Locale["pa"]["iso"] = "pan" | |
Locale["pa"]["glotto"] = "panj1256" | |
Locale["pa"]["script"] = "Guru" | |
Locale["ro"]["name"] = "Romanian" | |
Locale["ro"]["endonym"] = "Română" | |
Locale["ro"]["translations-of"] = "Traduceri pentru %s" | |
Locale["ro"]["definitions-of"] = "Definiții pentru %s" | |
Locale["ro"]["synonyms"] = "Sinonime" | |
Locale["ro"]["examples"] = "Exemple" | |
Locale["ro"]["see-also"] = "Vedeți și" | |
Locale["ro"]["family"] = "Indo-European" | |
Locale["ro"]["iso"] = "ron" | |
Locale["ro"]["glotto"] = "roma1327" | |
Locale["ro"]["script"] = "Latn" | |
Locale["ru"]["name"] = "Russian" | |
Locale["ru"]["endonym"] = "Русский" | |
Locale["ru"]["translations-of"] = "%s: варианты перевода" | |
Locale["ru"]["definitions-of"] = "%s – определения" | |
Locale["ru"]["synonyms"] = "Синонимы" | |
Locale["ru"]["examples"] = "Примеры" | |
Locale["ru"]["see-also"] = "Похожие слова" | |
Locale["ru"]["family"] = "Indo-European" | |
Locale["ru"]["iso"] = "rus" | |
Locale["ru"]["glotto"] = "russ1263" | |
Locale["ru"]["script"] = "Cyrl" | |
Locale["ru"]["dictionary"] = "true" | |
Locale["sm"]["name"] = "Samoan" | |
Locale["sm"]["endonym"] = "Gagana Sāmoa" | |
Locale["sm"]["family"] = "Austronesian" | |
Locale["sm"]["iso"] = "smo" | |
Locale["sm"]["glotto"] = "samo1305" | |
Locale["sm"]["script"] = "Latn" | |
Locale["gd"]["name"] = "Scots Gaelic" | |
Locale["gd"]["endonym"] = "Gàidhlig" | |
Locale["gd"]["translations-of"] = "Eadar-theangachadh airson %s" | |
Locale["gd"]["definitions-of"] = "Deifiniseanan airson %s" | |
Locale["gd"]["synonyms"] = "Co-fhaclan" | |
Locale["gd"]["examples"] = "Buill-eisimpleir" | |
Locale["gd"]["see-also"] = "Faic na leanas cuideachd" | |
Locale["gd"]["family"] = "Indo-European" | |
Locale["gd"]["iso"] = "gla" | |
Locale["gd"]["glotto"] = "scot1245" | |
Locale["gd"]["script"] = "Latn" | |
Locale["sr-Cyrl"]["name"] = "Serbian (Cyrillic)" | |
Locale["sr-Cyrl"]["endonym"] = "српски" | |
Locale["sr-Cyrl"]["translations-of"] = "Преводи за „%s“" | |
Locale["sr-Cyrl"]["definitions-of"] = "Дефиниције за %s" | |
Locale["sr-Cyrl"]["synonyms"] = "Синоними" | |
Locale["sr-Cyrl"]["examples"] = "Примери" | |
Locale["sr-Cyrl"]["see-also"] = "Погледајте такође" | |
Locale["sr-Cyrl"]["family"] = "Indo-European" | |
Locale["sr-Cyrl"]["iso"] = "srp-Cyrl" | |
Locale["sr-Cyrl"]["glotto"] = "serb1264" | |
Locale["sr-Cyrl"]["script"] = "Cyrl" | |
Locale["sr-Latn"]["name"] = "Serbian (Latin)" | |
Locale["sr-Latn"]["endonym"] = "srpski" | |
Locale["sr-Latn"]["translations-of"] = "Prevodi za „%s“" | |
Locale["sr-Latn"]["definitions-of"] = "Definicije za %s" | |
Locale["sr-Latn"]["synonyms"] = "Sinonimi" | |
Locale["sr-Latn"]["examples"] = "Primeri" | |
Locale["sr-Latn"]["see-also"] = "Pogledajte takođe" | |
Locale["sr-Latn"]["family"] = "Indo-European" | |
Locale["sr-Latn"]["iso"] = "srp-Latn" | |
Locale["sr-Latn"]["glotto"] = "serb1264" | |
Locale["sr-Latn"]["script"] = "Latn" | |
Locale["st"]["name"] = "Sesotho" | |
Locale["st"]["endonym"] = "Sesotho" | |
Locale["st"]["translations-of"] = "Liphetolelo tsa %s" | |
Locale["st"]["definitions-of"] = "Meelelo ea %s" | |
Locale["st"]["synonyms"] = "Mantsoe a tšoanang ka moelelo" | |
Locale["st"]["examples"] = "Mehlala" | |
Locale["st"]["see-also"] = "Bona hape" | |
Locale["st"]["family"] = "Atlantic-Congo" | |
Locale["st"]["iso"] = "sot" | |
Locale["st"]["glotto"] = "sout2807" | |
Locale["st"]["script"] = "Latn" | |
Locale["sn"]["name"] = "Shona" | |
Locale["sn"]["endonym"] = "chiShona" | |
Locale["sn"]["translations-of"] = "Shanduro dze %s" | |
Locale["sn"]["definitions-of"] = "Zvinoreva %s" | |
Locale["sn"]["synonyms"] = "Mashoko anoreva zvakafana nemamwe" | |
Locale["sn"]["examples"] = "Mienzaniso" | |
Locale["sn"]["see-also"] = "Onawo" | |
Locale["sn"]["family"] = "Atlantic-Congo" | |
Locale["sn"]["iso"] = "sna" | |
Locale["sn"]["glotto"] = "core1255" | |
Locale["sn"]["script"] = "Latn" | |
Locale["sd"]["name"] = "Sindhi" | |
Locale["sd"]["endonym"] = "سنڌي" | |
Locale["sd"]["translations-of"] = "%s جو ترجمو" | |
Locale["sd"]["definitions-of"] = "%s جون وصفون" | |
Locale["sd"]["synonyms"] = "هم معني" | |
Locale["sd"]["examples"] = "مثالون" | |
Locale["sd"]["see-also"] = "به ڏسو" | |
Locale["sd"]["family"] = "Indo-European" | |
Locale["sd"]["iso"] = "snd" | |
Locale["sd"]["glotto"] = "sind1272" | |
Locale["sd"]["script"] = "Arab" | |
Locale["sd"]["rtl"] = "true" | |
Locale["si"]["name"] = "Sinhala" | |
Locale["si"]["endonym"] = "සිංහල" | |
Locale["si"]["translations-of"] = "%s හි පරිවර්තන" | |
Locale["si"]["definitions-of"] = "%s හි නිර්වචන" | |
Locale["si"]["synonyms"] = "සමානාර්ථ පද" | |
Locale["si"]["examples"] = "උදාහරණ" | |
Locale["si"]["see-also"] = "මෙයත් බලන්න" | |
Locale["si"]["family"] = "Indo-European" | |
Locale["si"]["iso"] = "sin" | |
Locale["si"]["glotto"] = "sinh1246" | |
Locale["si"]["script"] = "Sinh" | |
Locale["sk"]["name"] = "Slovak" | |
Locale["sk"]["endonym"] = "Slovenčina" | |
Locale["sk"]["translations-of"] = "Preklady výrazu: %s" | |
Locale["sk"]["definitions-of"] = "Definície výrazu %s" | |
Locale["sk"]["synonyms"] = "Synonymá" | |
Locale["sk"]["examples"] = "Príklady" | |
Locale["sk"]["see-also"] = "Pozrite tiež" | |
Locale["sk"]["family"] = "Indo-European" | |
Locale["sk"]["iso"] = "slk" | |
Locale["sk"]["glotto"] = "slov1269" | |
Locale["sk"]["script"] = "Latn" | |
Locale["sl"]["name"] = "Slovenian" | |
Locale["sl"]["endonym"] = "Slovenščina" | |
Locale["sl"]["translations-of"] = "Prevodi za %s" | |
Locale["sl"]["definitions-of"] = "Razlage za %s" | |
Locale["sl"]["synonyms"] = "Sopomenke" | |
Locale["sl"]["examples"] = "Primeri" | |
Locale["sl"]["see-also"] = "Glejte tudi" | |
Locale["sl"]["family"] = "Indo-European" | |
Locale["sl"]["iso"] = "slv" | |
Locale["sl"]["glotto"] = "slov1268" | |
Locale["sl"]["script"] = "Latn" | |
Locale["so"]["name"] = "Somali" | |
Locale["so"]["endonym"] = "Soomaali" | |
Locale["so"]["translations-of"] = "Turjumaada %s" | |
Locale["so"]["definitions-of"] = "Qeexitaannada %s" | |
Locale["so"]["synonyms"] = "La micne ah" | |
Locale["so"]["examples"] = "Tusaalooyin" | |
Locale["so"]["see-also"] = "Sidoo kale eeg" | |
Locale["so"]["family"] = "Afro-Asiatic" | |
Locale["so"]["iso"] = "som" | |
Locale["so"]["glotto"] = "soma1255" | |
Locale["so"]["script"] = "Latn" | |
Locale["es"]["name"] = "Spanish" | |
Locale["es"]["endonym"] = "Español" | |
Locale["es"]["translations-of"] = "Traducciones de %s" | |
Locale["es"]["definitions-of"] = "Definiciones de %s" | |
Locale["es"]["synonyms"] = "Sinónimos" | |
Locale["es"]["examples"] = "Ejemplos" | |
Locale["es"]["see-also"] = "Ver también" | |
Locale["es"]["family"] = "Indo-European" | |
Locale["es"]["iso"] = "spa" | |
Locale["es"]["glotto"] = "stan1288" | |
Locale["es"]["script"] = "Latn" | |
Locale["es"]["dictionary"] = "true" | |
Locale["su"]["name"] = "Sundanese" | |
Locale["su"]["endonym"] = "Basa Sunda" | |
Locale["su"]["translations-of"] = "Tarjamahan tina %s" | |
Locale["su"]["definitions-of"] = "Panjelasan tina %s" | |
Locale["su"]["synonyms"] = "Sinonim" | |
Locale["su"]["examples"] = "Conto" | |
Locale["su"]["see-also"] = "Tingali ogé" | |
Locale["su"]["family"] = "Austronesian" | |
Locale["su"]["iso"] = "sun" | |
Locale["su"]["glotto"] = "sund1252" | |
Locale["su"]["script"] = "Latn" | |
Locale["sw"]["name"] = "Swahili" | |
Locale["sw"]["endonym"] = "Kiswahili" | |
Locale["sw"]["translations-of"] = "Tafsiri ya %s" | |
Locale["sw"]["definitions-of"] = "Ufafanuzi wa %s" | |
Locale["sw"]["synonyms"] = "Visawe" | |
Locale["sw"]["examples"] = "Mifano" | |
Locale["sw"]["see-also"] = "Angalia pia" | |
Locale["sw"]["family"] = "Atlantic-Congo" | |
Locale["sw"]["iso"] = "swa" | |
Locale["sw"]["glotto"] = "swah1253" | |
Locale["sw"]["script"] = "Latn" | |
Locale["sv"]["name"] = "Swedish" | |
Locale["sv"]["endonym"] = "Svenska" | |
Locale["sv"]["translations-of"] = "Översättningar av %s" | |
Locale["sv"]["definitions-of"] = "Definitioner av %s" | |
Locale["sv"]["synonyms"] = "Synonymer" | |
Locale["sv"]["examples"] = "Exempel" | |
Locale["sv"]["see-also"] = "Se även" | |
Locale["sv"]["family"] = "Indo-European" | |
Locale["sv"]["iso"] = "swe" | |
Locale["sv"]["glotto"] = "swed1254" | |
Locale["sv"]["script"] = "Latn" | |
Locale["tg"]["name"] = "Tajik" | |
Locale["tg"]["endonym"] = "Тоҷикӣ" | |
Locale["tg"]["translations-of"] = "Тарҷумаҳои %s" | |
Locale["tg"]["definitions-of"] = "Таърифҳои %s" | |
Locale["tg"]["synonyms"] = "Муродифҳо" | |
Locale["tg"]["examples"] = "Намунаҳо:" | |
Locale["tg"]["see-also"] = "Ҳамчунин Бинед" | |
Locale["tg"]["family"] = "Indo-European" | |
Locale["tg"]["iso"] = "tgk" | |
Locale["tg"]["glotto"] = "taji1245" | |
Locale["tg"]["script"] = "Cyrl" | |
Locale["ta"]["name"] = "Tamil" | |
Locale["ta"]["endonym"] = "தமிழ்" | |
Locale["ta"]["translations-of"] = "%s இன் மொழிபெயர்ப்புகள்" | |
Locale["ta"]["definitions-of"] = "%s இன் வரையறைகள்" | |
Locale["ta"]["synonyms"] = "இணைச்சொற்கள்" | |
Locale["ta"]["examples"] = "எடுத்துக்காட்டுகள்" | |
Locale["ta"]["see-also"] = "இதையும் காண்க" | |
Locale["ta"]["family"] = "Dravidian" | |
Locale["ta"]["iso"] = "tam" | |
Locale["ta"]["glotto"] = "tami1289" | |
Locale["ta"]["script"] = "Taml" | |
Locale["te"]["name"] = "Telugu" | |
Locale["te"]["endonym"] = "తెలుగు" | |
Locale["te"]["translations-of"] = "%s యొక్క అనువాదాలు" | |
Locale["te"]["definitions-of"] = "%s యొక్క నిర్వచనాలు" | |
Locale["te"]["synonyms"] = "పర్యాయపదాలు" | |
Locale["te"]["examples"] = "ఉదాహరణలు" | |
Locale["te"]["see-also"] = "వీటిని కూడా చూడండి" | |
Locale["te"]["family"] = "Dravidian" | |
Locale["te"]["iso"] = "tel" | |
Locale["te"]["glotto"] = "telu1262" | |
Locale["te"]["script"] = "Telu" | |
Locale["th"]["name"] = "Thai" | |
Locale["th"]["endonym"] = "ไทย" | |
Locale["th"]["translations-of"] = "คำแปลของ %s" | |
Locale["th"]["definitions-of"] = "คำจำกัดความของ %s" | |
Locale["th"]["synonyms"] = "คำพ้องความหมาย" | |
Locale["th"]["examples"] = "ตัวอย่าง" | |
Locale["th"]["see-also"] = "ดูเพิ่มเติม" | |
Locale["th"]["family"] = "Tai-Kadai" | |
Locale["th"]["iso"] = "tha" | |
Locale["th"]["glotto"] = "thai1261" | |
Locale["th"]["script"] = "Thai" | |
Locale["tr"]["name"] = "Turkish" | |
Locale["tr"]["endonym"] = "Türkçe" | |
Locale["tr"]["translations-of"] = "%s çevirileri" | |
Locale["tr"]["definitions-of"] = "%s için tanımlar" | |
Locale["tr"]["synonyms"] = "Eş anlamlılar" | |
Locale["tr"]["examples"] = "Örnekler" | |
Locale["tr"]["see-also"] = "Ayrıca bkz." | |
Locale["tr"]["family"] = "Turkic" | |
Locale["tr"]["iso"] = "tur" | |
Locale["tr"]["glotto"] = "nucl1301" | |
Locale["tr"]["script"] = "Latn" | |
Locale["uk"]["name"] = "Ukrainian" | |
Locale["uk"]["endonym"] = "Українська" | |
Locale["uk"]["translations-of"] = "Переклади слова або виразу \"%s\"" | |
Locale["uk"]["definitions-of"] = "\"%s\" – визначення" | |
Locale["uk"]["synonyms"] = "Синоніми" | |
Locale["uk"]["examples"] = "Приклади" | |
Locale["uk"]["see-also"] = "Дивіться також" | |
Locale["uk"]["family"] = "Indo-European" | |
Locale["uk"]["iso"] = "ukr" | |
Locale["uk"]["glotto"] = "ukra1253" | |
Locale["uk"]["script"] = "Cyrl" | |
Locale["ur"]["name"] = "Urdu" | |
Locale["ur"]["endonym"] = "اُردُو" | |
Locale["ur"]["translations-of"] = "کے ترجمے %s" | |
Locale["ur"]["definitions-of"] = "کی تعریفات %s" | |
Locale["ur"]["synonyms"] = "مترادفات" | |
Locale["ur"]["examples"] = "مثالیں" | |
Locale["ur"]["see-also"] = "نیز دیکھیں" | |
Locale["ur"]["family"] = "Indo-European" | |
Locale["ur"]["iso"] = "urd" | |
Locale["ur"]["glotto"] = "urdu1245" | |
Locale["ur"]["script"] = "Arab" | |
Locale["ur"]["rtl"] = "true" | |
Locale["uz"]["name"] = "Uzbek" | |
Locale["uz"]["endonym"] = "Oʻzbek tili" | |
Locale["uz"]["translations-of"] = "%s: tarjima variantlari" | |
Locale["uz"]["definitions-of"] = "%s – ta’riflar" | |
Locale["uz"]["synonyms"] = "Sinonimlar" | |
Locale["uz"]["examples"] = "Namunalar" | |
Locale["uz"]["see-also"] = "O‘xshash so‘zlar" | |
Locale["uz"]["family"] = "Turkic" | |
Locale["uz"]["iso"] = "uzb" | |
Locale["uz"]["glotto"] = "uzbe1247" | |
Locale["uz"]["script"] = "Latn" | |
Locale["vi"]["name"] = "Vietnamese" | |
Locale["vi"]["endonym"] = "Tiếng Việt" | |
Locale["vi"]["translations-of"] = "Bản dịch của %s" | |
Locale["vi"]["definitions-of"] = "Nghĩa của %s" | |
Locale["vi"]["synonyms"] = "Từ đồng nghĩa" | |
Locale["vi"]["examples"] = "Ví dụ" | |
Locale["vi"]["see-also"] = "Xem thêm" | |
Locale["vi"]["family"] = "Austroasiatic" | |
Locale["vi"]["iso"] = "vie" | |
Locale["vi"]["glotto"] = "viet1252" | |
Locale["vi"]["script"] = "Latn" | |
Locale["cy"]["name"] = "Welsh" | |
Locale["cy"]["endonym"] = "Cymraeg" | |
Locale["cy"]["translations-of"] = "Cyfieithiadau %s" | |
Locale["cy"]["definitions-of"] = "Diffiniadau %s" | |
Locale["cy"]["synonyms"] = "Cyfystyron" | |
Locale["cy"]["examples"] = "Enghreifftiau" | |
Locale["cy"]["see-also"] = "Gweler hefyd" | |
Locale["cy"]["family"] = "Indo-European" | |
Locale["cy"]["iso"] = "cym" | |
Locale["cy"]["glotto"] = "wels1247" | |
Locale["cy"]["script"] = "Latn" | |
Locale["fy"]["name"] = "Frisian" | |
Locale["fy"]["endonym"] = "Frysk" | |
Locale["fy"]["translations-of"] = "Oersettings fan %s" | |
Locale["fy"]["definitions-of"] = "Definysjes fan %s" | |
Locale["fy"]["synonyms"] = "Synonimen" | |
Locale["fy"]["examples"] = "Foarbylden" | |
Locale["fy"]["see-also"] = "Sjoch ek" | |
Locale["fy"]["family"] = "Indo-European" | |
Locale["fy"]["iso"] = "fry" | |
Locale["fy"]["glotto"] = "west2354" | |
Locale["fy"]["script"] = "Latn" | |
Locale["xh"]["name"] = "Xhosa" | |
Locale["xh"]["endonym"] = "isiXhosa" | |
Locale["xh"]["translations-of"] = "Iinguqulelo zika-%s" | |
Locale["xh"]["definitions-of"] = "Iingcaciso zika-%s" | |
Locale["xh"]["synonyms"] = "Izithethantonye" | |
Locale["xh"]["examples"] = "Imizekelo" | |
Locale["xh"]["see-also"] = "Kwakhona bona" | |
Locale["xh"]["family"] = "Atlantic-Congo" | |
Locale["xh"]["iso"] = "xho" | |
Locale["xh"]["glotto"] = "xhos1239" | |
Locale["xh"]["script"] = "Latn" | |
Locale["yi"]["name"] = "Yiddish" | |
Locale["yi"]["endonym"] = "ייִדיש" | |
Locale["yi"]["translations-of"] = "איבערזעצונגען פון %s" | |
Locale["yi"]["definitions-of"] = "דפיניציונען %s" | |
Locale["yi"]["synonyms"] = "סינאָנימען" | |
Locale["yi"]["examples"] = "ביישפילע" | |
Locale["yi"]["see-also"] = "זייען אויך" | |
Locale["yi"]["family"] = "Indo-European" | |
Locale["yi"]["iso"] = "yid" | |
Locale["yi"]["glotto"] = "yidd1255" | |
Locale["yi"]["script"] = "Hebr" | |
Locale["yi"]["rtl"] = "true" | |
Locale["yo"]["name"] = "Yoruba" | |
Locale["yo"]["endonym"] = "Yorùbá" | |
Locale["yo"]["translations-of"] = "Awọn itumọ ti %s" | |
Locale["yo"]["definitions-of"] = "Awọn itumọ ti %s" | |
Locale["yo"]["synonyms"] = "Awọn ọrọ onitumọ" | |
Locale["yo"]["examples"] = "Awọn apẹrẹ" | |
Locale["yo"]["see-also"] = "Tun wo" | |
Locale["yo"]["family"] = "Atlantic-Congo" | |
Locale["yo"]["iso"] = "yor" | |
Locale["yo"]["glotto"] = "yoru1245" | |
Locale["yo"]["script"] = "Latn" | |
Locale["zu"]["name"] = "Zulu" | |
Locale["zu"]["endonym"] = "isiZulu" | |
Locale["zu"]["translations-of"] = "Ukuhumusha i-%s" | |
Locale["zu"]["definitions-of"] = "Izincazelo ze-%s" | |
Locale["zu"]["synonyms"] = "Amagama afanayo" | |
Locale["zu"]["examples"] = "Izibonelo" | |
Locale["zu"]["see-also"] = "Bheka futhi" | |
Locale["zu"]["family"] = "Atlantic-Congo" | |
Locale["zu"]["iso"] = "zul" | |
Locale["zu"]["glotto"] = "zulu1248" | |
Locale["zu"]["script"] = "Latn" | |
Locale["yue"]["support"] = "bing-only" | |
Locale["yue"]["name"] = "Cantonese" | |
Locale["yue"]["endonym"] = "粵語" | |
Locale["yue"]["family"] = "Sino-Tibetan" | |
Locale["yue"]["iso"] = "yue" | |
Locale["yue"]["glotto"] = "cant1236" | |
Locale["yue"]["script"] = "Hant" | |
Locale["fj"]["support"] = "bing-only" | |
Locale["fj"]["name"] = "Fijian" | |
Locale["fj"]["endonym"] = "Vosa Vakaviti" | |
Locale["fj"]["family"] = "Austronesian" | |
Locale["fj"]["iso"] = "fij" | |
Locale["fj"]["glotto"] = "fiji1243" | |
Locale["fj"]["script"] = "Latn" | |
Locale["mww"]["support"] = "bing-only" | |
Locale["mww"]["name"] = "Hmong Daw" | |
Locale["mww"]["endonym"] = "Hmoob Daw" | |
Locale["mww"]["family"] = "Hmong-Mien" | |
Locale["mww"]["iso"] = "mww" | |
Locale["mww"]["glotto"] = "hmon1333" | |
Locale["mww"]["script"] = "Latn" | |
Locale["otq"]["support"] = "bing-only" | |
Locale["otq"]["name"] = "Querétaro Otomi" | |
Locale["otq"]["endonym"] = "Hñąñho" | |
Locale["otq"]["family"] = "Oto-Manguean" | |
Locale["otq"]["iso"] = "otq" | |
Locale["otq"]["glotto"] = "quer1236" | |
Locale["otq"]["script"] = "Latn" | |
Locale["ty"]["support"] = "bing-only" | |
Locale["ty"]["name"] = "Tahitian" | |
Locale["ty"]["endonym"] = "Reo Tahiti" | |
Locale["ty"]["family"] = "Austronesian" | |
Locale["ty"]["iso"] = "tah" | |
Locale["ty"]["glotto"] = "tahi1242" | |
Locale["ty"]["script"] = "Latn" | |
Locale["to"]["support"] = "bing-only" | |
Locale["to"]["name"] = "Tongan" | |
Locale["to"]["endonym"] = "Lea faka-Tonga" | |
Locale["to"]["family"] = "Austronesian" | |
Locale["to"]["iso"] = "ton" | |
Locale["to"]["glotto"] = "tong1325" | |
Locale["to"]["script"] = "Latn" | |
Locale["yua"]["support"] = "bing-only" | |
Locale["yua"]["name"] = "Yucatec Maya" | |
Locale["yua"]["endonym"] = "Màaya T'àan" | |
Locale["yua"]["family"] = "Mayan" | |
Locale["yua"]["iso"] = "yua" | |
Locale["yua"]["glotto"] = "yuca1254" | |
Locale["yua"]["script"] = "Latn" | |
Locale["tlh"]["support"] = "bing-only" | |
Locale["tlh"]["name"] = "Klingon" | |
Locale["tlh"]["endonym"] = "tlhIngan Hol" | |
Locale["tlh"]["family"] = "Artificial Language" | |
Locale["tlh"]["iso"] = "tlh" | |
Locale["tlh"]["script"] = "Latn" | |
Locale["tlh-Qaak"]["support"] = "bing-only" | |
Locale["tlh-Qaak"]["name"] = "Klingon (pIqaD)" | |
Locale["tlh-Qaak"]["endonym"] = " " | |
Locale["tlh-Qaak"]["family"] = "Artificial Language" | |
Locale["tlh-Qaak"]["iso"] = "tlh" | |
Locale["tlh-Qaak"]["script"] = "Piqd" | |
Locale["as"]["support"] = "unstable" | |
Locale["as"]["name"] = "Assamese" | |
Locale["as"]["endonym"] = "অসমীয়া" | |
Locale["as"]["family"] = "Indo-European" | |
Locale["as"]["iso"] = "asm" | |
Locale["as"]["glotto"] = "assa1263" | |
Locale["as"]["script"] = "Beng" | |
Locale["ba"]["support"] = "unstable" | |
Locale["ba"]["name"] = "Bashkir" | |
Locale["ba"]["endonym"] = "башҡорт теле" | |
Locale["ba"]["family"] = "Turkic" | |
Locale["ba"]["iso"] = "bak" | |
Locale["ba"]["glotto"] = "bash1264" | |
Locale["ba"]["script"] = "Cyrl" | |
Locale["br"]["support"] = "unstable" | |
Locale["br"]["name"] = "Breton" | |
Locale["br"]["endonym"] = "Brezhoneg" | |
Locale["br"]["family"] = "Indo-European" | |
Locale["br"]["iso"] = "bre" | |
Locale["br"]["glotto"] = "bret1244" | |
Locale["br"]["script"] = "Latn" | |
Locale["dz"]["support"] = "unstable" | |
Locale["dz"]["name"] = "Dzongkha" | |
Locale["dz"]["endonym"] = "རྫོང་ཁ" | |
Locale["dz"]["family"] = "Sino-Tibetan" | |
Locale["dz"]["iso"] = "dzo" | |
Locale["dz"]["glotto"] = "nucl1307" | |
Locale["dz"]["script"] = "Tibt" | |
Locale["fo"]["support"] = "unstable" | |
Locale["fo"]["name"] = "Faroese" | |
Locale["fo"]["endonym"] = "Føroyskt" | |
Locale["fo"]["family"] = "Indo-European" | |
Locale["fo"]["iso"] = "fao" | |
Locale["fo"]["glotto"] = "faro1244" | |
Locale["fo"]["script"] = "Latn" | |
Locale["gn"]["support"] = "unstable" | |
Locale["gn"]["name"] = "Guarani" | |
Locale["gn"]["endonym"] = "Avañe'ẽ" | |
Locale["gn"]["family"] = "Tupian" | |
Locale["gn"]["iso"] = "grn" | |
Locale["gn"]["glotto"] = "para1311" | |
Locale["gn"]["script"] = "Latn" | |
Locale["ie"]["support"] = "unstable" | |
Locale["ie"]["name"] = "Interlingue" | |
Locale["ie"]["endonym"] = "Interlingue" | |
Locale["ie"]["family"] = "Artificial Language" | |
Locale["ie"]["iso"] = "ile" | |
Locale["ie"]["glotto"] = "occi1241" | |
Locale["ie"]["script"] = "Latn" | |
Locale["rw"]["support"] = "unstable" | |
Locale["rw"]["name"] = "Kinyarwanda" | |
Locale["rw"]["endonym"] = "Ikinyarwanda" | |
Locale["rw"]["family"] = "Atlantic-Congo" | |
Locale["rw"]["iso"] = "kin" | |
Locale["rw"]["glotto"] = "kiny1244" | |
Locale["rw"]["script"] = "Latn" | |
Locale["oc"]["support"] = "unstable" | |
Locale["oc"]["name"] = "Occitan" | |
Locale["oc"]["endonym"] = "Occitan" | |
Locale["oc"]["family"] = "Indo-European" | |
Locale["oc"]["iso"] = "oci" | |
Locale["oc"]["glotto"] = "occi1239" | |
Locale["oc"]["script"] = "Latn" | |
Locale["om"]["support"] = "unstable" | |
Locale["om"]["name"] = "Oromo" | |
Locale["om"]["endonym"] = "Afaan Oromoo" | |
Locale["om"]["family"] = "Afro-Asiatic" | |
Locale["om"]["iso"] = "orm" | |
Locale["om"]["glotto"] = "nucl1736" | |
Locale["om"]["script"] = "Latn" | |
Locale["or"]["support"] = "unstable" | |
Locale["or"]["name"] = "Oriya" | |
Locale["or"]["endonym"] = "ଓଡ଼ିଆ" | |
Locale["or"]["family"] = "Indo-European" | |
Locale["or"]["iso"] = "ori" | |
Locale["or"]["glotto"] = "macr1269" | |
Locale["or"]["script"] = "Orya" | |
Locale["rm"]["support"] = "unstable" | |
Locale["rm"]["name"] = "Romansh" | |
Locale["rm"]["endonym"] = "Rumantsch" | |
Locale["rm"]["family"] = "Indo-European" | |
Locale["rm"]["iso"] = "roh" | |
Locale["rm"]["glotto"] = "roma1326" | |
Locale["rm"]["script"] = "Latn" | |
Locale["ti"]["support"] = "unstable" | |
Locale["ti"]["name"] = "Tigrinya" | |
Locale["ti"]["endonym"] = "ትግርኛ" | |
Locale["ti"]["family"] = "Afro-Asiatic" | |
Locale["ti"]["iso"] = "tir" | |
Locale["ti"]["glotto"] = "tigr1271" | |
Locale["ti"]["script"] = "Ethi" | |
Locale["bo"]["support"] = "unstable" | |
Locale["bo"]["name"] = "Tibetan" | |
Locale["bo"]["endonym"] = "བོད་ཡིག" | |
Locale["bo"]["family"] = "Sino-Tibetan" | |
Locale["bo"]["iso"] = "bod" | |
Locale["bo"]["glotto"] = "tibe1272" | |
Locale["bo"]["script"] = "Tibt" | |
Locale["tk"]["support"] = "unstable" | |
Locale["tk"]["name"] = "Turkmen" | |
Locale["tk"]["endonym"] = "Türkmen" | |
Locale["tk"]["family"] = "Turkic" | |
Locale["tk"]["iso"] = "tuk" | |
Locale["tk"]["glotto"] = "turk1304" | |
Locale["tk"]["script"] = "Latn" | |
Locale["tt"]["support"] = "yandex-only" | |
Locale["tt"]["name"] = "Tatar" | |
Locale["tt"]["endonym"] = "татарча" | |
Locale["tt"]["family"] = "Turkic" | |
Locale["tt"]["iso"] = "tat" | |
Locale["tt"]["glotto"] = "tata1255" | |
Locale["tt"]["script"] = "Cyrl" | |
Locale["udm"]["support"] = "yandex-only" | |
Locale["udm"]["name"] = "Udmurt" | |
Locale["udm"]["endonym"] = "удмурт" | |
Locale["udm"]["family"] = "Uralic" | |
Locale["udm"]["iso"] = "udm" | |
Locale["udm"]["glotto"] = "udmu1245" | |
Locale["udm"]["script"] = "Cyrl" | |
Locale["ug"]["support"] = "unstable" | |
Locale["ug"]["name"] = "Uyghur" | |
Locale["ug"]["endonym"] = "ئۇيغۇر تىلى" | |
Locale["ug"]["family"] = "Turkic" | |
Locale["ug"]["iso"] = "uig" | |
Locale["ug"]["glotto"] = "uigh1240" | |
Locale["ug"]["script"] = "Arab" | |
Locale["ug"]["rtl"] = "true" | |
Locale["vo"]["support"] = "unstable" | |
Locale["vo"]["name"] = "Volapük" | |
Locale["vo"]["endonym"] = "Volapük" | |
Locale["vo"]["family"] = "Artificial Language" | |
Locale["vo"]["iso"] = "vol" | |
Locale["vo"]["script"] = "Latn" | |
Locale["wo"]["support"] = "unstable" | |
Locale["wo"]["name"] = "Wolof" | |
Locale["wo"]["endonym"] = "Wollof" | |
Locale["wo"]["family"] = "Atlantic-Congo" | |
Locale["wo"]["iso"] = "wol" | |
Locale["wo"]["glotto"] = "wolo1247" | |
Locale["wo"]["script"] = "Latn" | |
Locale["chr"]["support"] = "unstable" | |
Locale["chr"]["name"] = "Cherokee" | |
Locale["chr"]["endonym"] = "ᏣᎳᎩ" | |
Locale["chr"]["family"] = "Iroquoian" | |
Locale["chr"]["iso"] = "chr" | |
Locale["chr"]["glotto"] = "cher1273" | |
Locale["chr"]["script"] = "Cher" | |
for (i in Locale) { | |
Locale[i]["display"] = show(Locale[i]["endonym"], i) | |
LocaleAlias[Locale[i]["iso"]] = i | |
LocaleAlias[tolower(Locale[i]["name"])] = i | |
LocaleAlias[tolower(Locale[i]["endonym"])] = i | |
} | |
LocaleAlias["in"] = "id" | |
LocaleAlias["iw"] = "he" | |
LocaleAlias["ji"] = "yi" | |
LocaleAlias["jw"] = "jv" | |
LocaleAlias["mo"] = "ro" | |
LocaleAlias["nb"] = "no" | |
LocaleAlias["nn"] = "no" | |
LocaleAlias["sh"] = "sr-Cyrl" | |
LocaleAlias["sr"] = "sr-Cyrl" | |
LocaleAlias["srp"] = "sr-Cyrl" | |
LocaleAlias["serbian"] = "sr-Cyrl" | |
LocaleAlias["zh"] = "zh-CN" | |
LocaleAlias["zh-CHS"] = "zh-CN" | |
LocaleAlias["zh-CHT"] = "zh-TW" | |
LocaleAlias["zho"] = "zh-CN" | |
LocaleAlias["chinese"] = "zh-CN" | |
LocaleAlias["tlh-Latn"] = "tlh" | |
LocaleAlias["tlh-Piqd"] = "tlh-Qaak" | |
} | |
function getCode(code, group) { | |
if (code == "auto" || code in Locale) | |
return code | |
else if (code in LocaleAlias) | |
return LocaleAlias[code] | |
else if (tolower(code) in LocaleAlias) | |
return LocaleAlias[tolower(code)] | |
match(code, /^([[:alpha:]][[:alpha:]][[:alpha:]]?)-(.*)$/, group) | |
if (group[1]) | |
return group[1] | |
return | |
} | |
function getName(code) { | |
return Locale[getCode(code)]["name"] | |
} | |
function getEndonym(code) { | |
return Locale[getCode(code)]["endonym"] | |
} | |
function getDisplay(code) { | |
return Locale[getCode(code)]["display"] | |
} | |
function showTranslationsOf(code, text, fmt) { | |
fmt = Locale[getCode(code)]["translations-of"] | |
if (!fmt) fmt = Locale["en"]["translations-of"] | |
return sprintf(fmt, text) | |
} | |
function showDefinitionsOf(code, text, fmt) { | |
fmt = Locale[getCode(code)]["definitions-of"] | |
if (!fmt) fmt = Locale["en"]["definitions-of"] | |
return sprintf(fmt, text) | |
} | |
function showSynonyms(code, tmp) { | |
tmp = Locale[getCode(code)]["synonyms"] | |
if (!tmp) tmp = Locale["en"]["synonyms"] | |
return tmp | |
} | |
function showExamples(code, tmp) { | |
tmp = Locale[getCode(code)]["examples"] | |
if (!tmp) tmp = Locale["en"]["examples"] | |
return tmp | |
} | |
function showSeeAlso(code, tmp) { | |
tmp = Locale[getCode(code)]["see-also"] | |
if (!tmp) tmp = Locale["en"]["see-also"] | |
return tmp | |
} | |
function getFamily(code) { | |
return Locale[getCode(code)]["family"] | |
} | |
function getISO(code) { | |
return Locale[getCode(code)]["iso"] | |
} | |
function getGlotto(code) { | |
return Locale[getCode(code)]["glotto"] | |
} | |
function getScript(code) { | |
return Locale[getCode(code)]["script"] | |
} | |
function isRTL(code) { | |
return Locale[getCode(code)]["rtl"] ? 1 : 0 | |
} | |
function hasDictionary(code) { | |
return Locale[getCode(code)]["dictionary"] ? 1 : 0 | |
} | |
function compName(i1, v1, i2, v2) { | |
if (getName(i1) < getName(i2)) | |
return -1 | |
else | |
return (getName(i1) != getName(i2)) | |
} | |
function scriptName(code) { | |
switch (code) { | |
case "Arab": return "Arabic" | |
case "Armn": return "Armenian" | |
case "Beng": return "Bengali" | |
case "Cher": return "Cherokee" | |
case "Cyrl": return "Cyrillic" | |
case "Deva": return "Devanagari" | |
case "Ethi": return "Ethiopic (Geʻez)" | |
case "Geor": return "Georgian (Mkhedruli)" | |
case "Grek": return "Greek" | |
case "Gujr": return "Gujarati" | |
case "Guru": return "Gurmukhi" | |
case "Hani": return "Han" | |
case "Hans": return "Han (Simplified)" | |
case "Hant": return "Han (Traditional)" | |
case "Hebr": return "Hebrew" | |
case "Jpan": return "Japanese (Han + Hiragana + Katakana)" | |
case "Khmr": return "Khmer" | |
case "Knda": return "Kannada" | |
case "Kore": return "Korean (Hangul + Han)" | |
case "Laoo": return "Lao" | |
case "Latn": return "Latin" | |
case "Mlym": return "Malayalam" | |
case "Mymr": return "Myanmar" | |
case "Orya": return "Oriya" | |
case "Piqd": return "Klingon (pIqaD)" | |
case "Sinh": return "Sinhala" | |
case "Taml": return "Tamil" | |
case "Telu": return "Telugu" | |
case "Thai": return "Thai" | |
case "Tibt": return "Tibetan" | |
default: return "Unknown" | |
} | |
} | |
function getDetails(code, group, iso, language, script) { | |
if (code == "auto" || !getCode(code)) { | |
e("[ERROR] Language not found: " code "\n"\ | |
" Run '-reference / -R' to see a list of available languages.") | |
exit 1 | |
} | |
script = scriptName(getScript(code)) | |
if (isRTL(code)) script = script " (R-to-L)" | |
split(getISO(code), group, "-") | |
iso = group[1] | |
split(getName(code), group, " ") | |
language = length(group) == 1 ? group[1] "_language" : | |
group[2] ~ /^\(.*\)$/ ? group[1] "_language" : join(group, "_") | |
return ansi("bold", sprintf("%s\n", getDisplay(code)))\ | |
sprintf("%-22s%s\n", "Name", ansi("bold", getName(code)))\ | |
sprintf("%-22s%s\n", "Family", ansi("bold", getFamily(code)))\ | |
sprintf("%-22s%s\n", "Writing system", ansi("bold", script))\ | |
sprintf("%-22s%s\n", "Code", ansi("bold", getCode(code)))\ | |
sprintf("%-22s%s\n", "ISO 639-3", ansi("bold", iso))\ | |
sprintf("%-22s%s\n", "SIL", ansi("bold", "http://www-01.sil.org/iso639-3/documentation.asp?id=" iso))\ | |
sprintf("%-22s%s\n", "Glottolog", getGlotto(code) ? | |
ansi("bold", "http://glottolog.org/resource/languoid/id/" getGlotto(code)) : "")\ | |
sprintf("%-22s%s", "Wikipedia", ansi("bold", "http://en.wikipedia.org/wiki/" language)) | |
} | |
function showPhonetics(phonetics, code) { | |
if (code && getCode(code) == "en") | |
return "/" phonetics "/" | |
else | |
return "(" phonetics ")" | |
} | |
function show(text, code, temp) { | |
if (!code || isRTL(code)) { | |
if (Cache[text][0]) | |
return Cache[text][0] | |
else { | |
if ((FriBidi || (code && isRTL(code))) && BiDiNoPad) | |
("echo " parameterize(text) PIPE BiDiNoPad) | getline temp | |
else | |
temp = text | |
return Cache[text][0] = temp | |
} | |
} else | |
return text | |
} | |
function s(text, code, width, temp) { | |
if (!code || isRTL(code)) { | |
if (!width) width = Option["width"] | |
if (Cache[text][width]) | |
return Cache[text][width] | |
else { | |
if ((FriBidi || (code && isRTL(code))) && BiDi) | |
("echo " parameterize(text) PIPE sprintf(BiDi, width)) | getline temp | |
else | |
temp = text | |
return Cache[text][width] = temp | |
} | |
} else | |
return text | |
} | |
function ins(level, text, code, width, i, temp) { | |
if (code && isRTL(code)) { | |
if (!width) width = Option["width"] | |
return s(text, code, width - Option["indent"] * level) | |
} else | |
return replicate(" ", Option["indent"] * level) text | |
} | |
function parseLang(lang, code, group) { | |
match(lang, /^([a-z][a-z][a-z]?)(_|$)/, group) | |
code = getCode(group[1]) | |
if (lang ~ /^zh_(CN|SG)/) code = "zh-CN" | |
else if (lang ~ /^zh_(TW|HK)/) code = "zh-TW" | |
if (!code) code = "en" | |
return code | |
} | |
function initUserLang( lang, utf) { | |
if (lang = ENVIRON["LANGUAGE"]) { | |
if (!UserLocale) UserLocale = lang | |
utf = utf || tolower(lang) ~ /utf-?8$/ | |
} | |
if (lang = ENVIRON["LC_ALL"]) { | |
if (!UserLocale) UserLocale = lang | |
utf = utf || tolower(lang) ~ /utf-?8$/ | |
} | |
if (lang = ENVIRON["LANG"]) { | |
if (!UserLocale) UserLocale = lang | |
utf = utf || tolower(lang) ~ /utf-?8$/ | |
} | |
if (!UserLocale) { | |
UserLocale = "en_US.UTF-8" | |
utf = 1 | |
} | |
if (!utf) | |
w("[WARNING] Your locale codeset (" UserLocale ") is not UTF-8.") | |
UserLang = parseLang(UserLocale) | |
} | |
function getVersion( build, gitHead, platform) { | |
initAudioPlayer() | |
initPager() | |
platform = detectProgram("uname", "-s", 1) | |
if (ENVIRON["TRANS_BUILD"]) | |
build = "-" ENVIRON["TRANS_BUILD"] | |
else { | |
gitHead = getGitHead() | |
build = gitHead ? "-git:" gitHead : "" | |
} | |
return ansi("bold", sprintf("%-22s%s%s\n\n", Name, Version, build))\ | |
sprintf("%-22s%s\n", "platform", platform)\ | |
sprintf("%-22s%s\n", "gawk (GNU Awk)", PROCINFO["version"])\ | |
sprintf("%s\n", FriBidi ? FriBidi : | |
"fribidi (GNU FriBidi) [NOT INSTALLED]")\ | |
sprintf("%-22s%s\n", "audio player", AudioPlayer ? AudioPlayer : | |
"[NOT INSTALLED]")\ | |
sprintf("%-22s%s\n", "terminal pager", Pager ? Pager : | |
"[NOT INSTALLED]")\ | |
sprintf("%-22s%s\n", "terminal type", ENVIRON["TERM"])\ | |
sprintf("%-22s%s (%s)\n", "user locale", UserLocale, getName(UserLang))\ | |
sprintf("%-22s%s\n", "home language", Option["hl"])\ | |
sprintf("%-22s%s\n", "source language", Option["sl"])\ | |
sprintf("%-22s%s\n", "target language", join(Option["tl"], "+"))\ | |
sprintf("%-22s%s\n", "translation engine", Option["engine"])\ | |
sprintf("%-22s%s\n", "proxy", Option["proxy"] ? Option["proxy"] : | |
"[NONE]")\ | |
sprintf("%-22s%s\n", "user-agent", Option["user-agent"] ? Option["user-agent"] : | |
"[NONE]")\ | |
sprintf("%-22s%s\n", "theme", Option["theme"])\ | |
sprintf("%-22s%s\n", "init file", InitScript ? InitScript : "[NONE]")\ | |
sprintf("\n%-22s%s", "Report bugs to:", "https://github.com/soimort/translate-shell/issues") | |
} | |
function getHelp() { | |
return "Usage: " ansi("bold", Command)\ | |
" [" ansi("underline", "OPTIONS") "]"\ | |
" [" ansi("underline", "SOURCE") "]"\ | |
":[" ansi("underline", "TARGETS") "]"\ | |
" [" ansi("underline", "TEXT") "]..." RS\ | |
RS "Information options:" RS\ | |
ins(1, ansi("bold", "-V") ", " ansi("bold", "-version")) RS\ | |
ins(2, "Print version and exit.") RS\ | |
ins(1, ansi("bold", "-H") ", " ansi("bold", "-help")) RS\ | |
ins(2, "Print help message and exit.") RS\ | |
ins(1, ansi("bold", "-M") ", " ansi("bold", "-man")) RS\ | |
ins(2, "Show man page and exit.") RS\ | |
ins(1, ansi("bold", "-T") ", " ansi("bold", "-reference")) RS\ | |
ins(2, "Print reference table of languages and exit.") RS\ | |
ins(1, ansi("bold", "-R") ", " ansi("bold", "-reference-english")) RS\ | |
ins(2, "Print reference table of languages (in English names) and exit.") RS\ | |
ins(1, ansi("bold", "-L ") ansi("underline", "CODES")\ | |
", " ansi("bold", "-list ") ansi("underline", "CODES")) RS\ | |
ins(2, "Print details of languages and exit.") RS\ | |
ins(1, ansi("bold", "-S") ", " ansi("bold", "-list-engines")) RS\ | |
ins(2, "List available translation engines and exit.") RS\ | |
ins(1, ansi("bold", "-U") ", " ansi("bold", "-upgrade")) RS\ | |
ins(2, "Check for upgrade of this program.") RS\ | |
RS "Translator options:" RS\ | |
ins(1, ansi("bold", "-e ") ansi("underline", "ENGINE")\ | |
", " ansi("bold", "-engine ") ansi("underline", "ENGINE")) RS\ | |
ins(2, "Specify the translation engine to use.") RS\ | |
RS "Display options:" RS\ | |
ins(1, ansi("bold", "-verbose")) RS\ | |
ins(2, "Verbose mode. (default)") RS\ | |
ins(1, ansi("bold", "-b") ", " ansi("bold", "-brief")) RS\ | |
ins(2, "Brief mode.") RS\ | |
ins(1, ansi("bold", "-d") ", " ansi("bold", "-dictionary")) RS\ | |
ins(2, "Dictionary mode.") RS\ | |
ins(1, ansi("bold", "-identify")) RS\ | |
ins(2, "Language identification.") RS\ | |
ins(1, ansi("bold", "-show-original ") ansi("underline", "Y/n")) RS\ | |
ins(2, "Show original text or not.") RS\ | |
ins(1, ansi("bold", "-show-original-phonetics ") ansi("underline", "Y/n")) RS\ | |
ins(2, "Show phonetic notation of original text or not.") RS\ | |
ins(1, ansi("bold", "-show-translation ") ansi("underline", "Y/n")) RS\ | |
ins(2, "Show translation or not.") RS\ | |
ins(1, ansi("bold", "-show-translation-phonetics ") ansi("underline", "Y/n")) RS\ | |
ins(2, "Show phonetic notation of translation or not.") RS\ | |
ins(1, ansi("bold", "-show-prompt-message ") ansi("underline", "Y/n")) RS\ | |
ins(2, "Show prompt message or not.") RS\ | |
ins(1, ansi("bold", "-show-languages ") ansi("underline", "Y/n")) RS\ | |
ins(2, "Show source and target languages or not.") RS\ | |
ins(1, ansi("bold", "-show-original-dictionary ") ansi("underline", "y/N")) RS\ | |
ins(2, "Show dictionary entry of original text or not.") RS\ | |
ins(1, ansi("bold", "-show-dictionary ") ansi("underline", "Y/n")) RS\ | |
ins(2, "Show dictionary entry of translation or not.") RS\ | |
ins(1, ansi("bold", "-show-alternatives ") ansi("underline", "Y/n")) RS\ | |
ins(2, "Show alternative translations or not.") RS\ | |
ins(1, ansi("bold", "-w ") ansi("underline", "NUM")\ | |
", " ansi("bold", "-width ") ansi("underline", "NUM")) RS\ | |
ins(2, "Specify the screen width for padding.") RS\ | |
ins(1, ansi("bold", "-indent ") ansi("underline", "NUM")) RS\ | |
ins(2, "Specify the size of indent (number of spaces).") RS\ | |
ins(1, ansi("bold", "-theme ") ansi("underline", "FILENAME")) RS\ | |
ins(2, "Specify the theme to use.") RS\ | |
ins(1, ansi("bold", "-no-theme")) RS\ | |
ins(2, "Do not use any other theme than default.") RS\ | |
ins(1, ansi("bold", "-no-ansi")) RS\ | |
ins(2, "Do not use ANSI escape codes.") RS\ | |
ins(1, ansi("bold", "-no-autocorrect")) RS\ | |
ins(2, "Do not autocorrect. (if defaulted by the translation engine)") RS\ | |
ins(1, ansi("bold", "-no-bidi")) RS\ | |
ins(2, "Do not convert bidirectional texts.") RS\ | |
ins(1, ansi("bold", "-no-warn")) RS\ | |
ins(2, "Do not write warning messages to stderr.") RS\ | |
ins(1, ansi("bold", "-dump")) RS\ | |
ins(2, "Print raw API response instead.") RS\ | |
RS "Audio options:" RS\ | |
ins(1, ansi("bold", "-p, -play")) RS\ | |
ins(2, "Listen to the translation.") RS\ | |
ins(1, ansi("bold", "-speak")) RS\ | |
ins(2, "Listen to the original text.") RS\ | |
ins(1, ansi("bold", "-n ") ansi("underline", "VOICE")\ | |
", " ansi("bold", "-narrator ") ansi("underline", "VOICE")) RS\ | |
ins(2, "Specify the narrator, and listen to the translation.") RS\ | |
ins(1, ansi("bold", "-player ") ansi("underline", "PROGRAM")) RS\ | |
ins(2, "Specify the audio player to use, and listen to the translation.") RS\ | |
ins(1, ansi("bold", "-no-play")) RS\ | |
ins(2, "Do not listen to the translation.") RS\ | |
ins(1, ansi("bold", "-no-translate")) RS\ | |
ins(2, "Do not translate anything when using -speak.") RS\ | |
ins(1, ansi("bold", "-download-audio")) RS\ | |
ins(2, "Download the audio to the current directory.") RS\ | |
ins(1, ansi("bold", "-download-audio-as ") ansi("underline", "FILENAME")) RS\ | |
ins(2, "Download the audio to the specified file.") RS\ | |
RS "Terminal paging and browsing options:" RS\ | |
ins(1, ansi("bold", "-v") ", " ansi("bold", "-view")) RS\ | |
ins(2, "View the translation in a terminal pager.") RS\ | |
ins(1, ansi("bold", "-pager ") ansi("underline", "PROGRAM")) RS\ | |
ins(2, "Specify the terminal pager to use, and view the translation.") RS\ | |
ins(1, ansi("bold", "-no-view")) RS\ | |
ins(2, "Do not view the translation in a terminal pager.") RS\ | |
ins(1, ansi("bold", "-browser ") ansi("underline", "PROGRAM")) RS\ | |
ins(2, "Specify the web browser to use.") RS\ | |
RS "Networking options:" RS\ | |
ins(1, ansi("bold", "-x ") ansi("underline", "HOST:PORT")\ | |
", " ansi("bold", "-proxy ") ansi("underline", "HOST:PORT")) RS\ | |
ins(2, "Use HTTP proxy on given port.") RS\ | |
ins(1, ansi("bold", "-u ") ansi("underline", "STRING")\ | |
", " ansi("bold", "-user-agent ") ansi("underline", "STRING")) RS\ | |
ins(2, "Specify the User-Agent to identify as.") RS\ | |
RS "Interactive shell options:" RS\ | |
ins(1, ansi("bold", "-I") ", " ansi("bold", "-interactive") ", " ansi("bold", "-shell")) RS\ | |
ins(2, "Start an interactive shell.") RS\ | |
ins(1, ansi("bold", "-E") ", " ansi("bold", "-emacs")) RS\ | |
ins(2, "Start the GNU Emacs front-end for an interactive shell.") RS\ | |
ins(1, ansi("bold", "-no-rlwrap")) RS\ | |
ins(2, "Do not invoke rlwrap when starting an interactive shell.") RS\ | |
RS "I/O options:" RS\ | |
ins(1, ansi("bold", "-i ") ansi("underline", "FILENAME")\ | |
", " ansi("bold", "-input ") ansi("underline", "FILENAME")) RS\ | |
ins(2, "Specify the input file.") RS\ | |
ins(1, ansi("bold", "-o ") ansi("underline", "FILENAME")\ | |
", " ansi("bold", "-output ") ansi("underline", "FILENAME")) RS\ | |
ins(2, "Specify the output file.") RS\ | |
RS "Language preference options:" RS\ | |
ins(1, ansi("bold", "-l ") ansi("underline", "CODE")\ | |
", " ansi("bold", "-hl ") ansi("underline", "CODE")\ | |
", " ansi("bold", "-lang ") ansi("underline", "CODE")) RS\ | |
ins(2, "Specify your home language.") RS\ | |
ins(1, ansi("bold", "-s ") ansi("underline", "CODE")\ | |
", " ansi("bold", "-sl ") ansi("underline", "CODE")\ | |
", " ansi("bold", "-source ") ansi("underline", "CODE")\ | |
", " ansi("bold", "-from ") ansi("underline", "CODE")) RS\ | |
ins(2, "Specify the source language.") RS\ | |
ins(1, ansi("bold", "-t ") ansi("underline", "CODES")\ | |
", " ansi("bold", "-tl ") ansi("underline", "CODE")\ | |
", " ansi("bold", "-target ") ansi("underline", "CODES")\ | |
", " ansi("bold", "-to ") ansi("underline", "CODES")) RS\ | |
ins(2, "Specify the target language(s), joined by '+'.") RS\ | |
RS "Other options:" RS\ | |
ins(1, ansi("bold", "-no-init")) RS\ | |
ins(2, "Do not load any initialization script.") RS\ | |
RS "See the man page " Command "(1) for more information." | |
} | |
function showMan( temp) { | |
if (ENVIRON["TRANS_MANPAGE"]) { | |
initPager() | |
Groff = detectProgram("groff", "--version") | |
if (Pager && Groff) { | |
temp = "echo -E \"${TRANS_MANPAGE}\"" | |
temp = temp PIPE\ | |
Groff " -Wall -mtty-char -mandoc -Tutf8 "\ | |
"-rLL=" Option["width"] "n -rLT=" Option["width"] "n" | |
switch (Pager) { | |
case "less": | |
temp = temp PIPE\ | |
Pager " -s -P\"\\ \\Manual page " Command "(1) line %lt (press h for help or q to quit)\"" | |
break | |
case "most": | |
temp = temp PIPE Pager " -Cs" | |
break | |
default: | |
temp = temp PIPE Pager | |
} | |
system(temp) | |
return | |
} | |
} | |
if (fileExists("man/" Command ".1")) | |
system("man man/" Command ".1" SUPERR) | |
else if (system("man " Command SUPERR)) | |
print getHelp() | |
} | |
function getReference(displayName, | |
code, col, cols, i, j, name, num, r, rows, saveSortedIn, | |
t1, t2) { | |
num = 0 | |
for (code in Locale) | |
if (Locale[code]["support"] != "unstable") | |
num++ | |
rows = int(num / 3) + (num % 3 ? 1 : 0) | |
cols[0][0] = cols[1][0] = cols[2][0] = NULLSTR | |
i = 0 | |
saveSortedIn = PROCINFO["sorted_in"] | |
PROCINFO["sorted_in"] = displayName == "endonym" ? "@ind_num_asc" : | |
"compName" | |
for (code in Locale) { | |
if (Locale[code]["support"] != "unstable") { | |
col = int(i / rows) | |
append(cols[col], code) | |
i++ | |
} | |
} | |
PROCINFO["sorted_in"] = saveSortedIn | |
if (displayName == "endonym") { | |
r = "┌" replicate("─", 23) "┬" replicate("─", 23) "┬" replicate("─", 23) "┐" RS | |
for (i = 0; i < rows; i++) { | |
r = r "│" | |
for (j = 0; j < 3; j++) { | |
if (cols[j][i]) { | |
t1 = getDisplay(cols[j][i]) | |
switch (cols[j][i]) { | |
case "he": | |
t1 = sprintf(" %-18s", t1) | |
break | |
case "ur": | |
t1 = sprintf(" %-17s", t1) | |
break | |
case "hi": case "gu": case "km": case "kn": | |
case "my": case "ne": case "pa": case "si": | |
case "ta": case "te": case "yi": | |
t1 = sprintf(" %-16s", t1) | |
break | |
case "yue": | |
t1 = sprintf(" %-13s", t1) | |
break | |
case "ja": case "ko": | |
t1 = sprintf(" %-12s", t1) | |
break | |
case "zh-CN": case "zh-TW": | |
t1 = sprintf(" %-11s", t1) | |
break | |
default: | |
if (length(t1) <= 15) | |
t1 = sprintf(" %-15s", t1) | |
} | |
switch (length(cols[j][i])) { | |
case 1: case 2: case 3: case 4: | |
t2 = sprintf("- %s │", ansi("bold", sprintf("%4s", cols[j][i]))) | |
break | |
case 5: | |
t2 = sprintf("- %s│", ansi("bold", cols[j][i])) | |
break | |
case 6: | |
t2 = sprintf("-%s│", ansi("bold", cols[j][i])) | |
break | |
case 7: | |
t2 = sprintf("-%s", ansi("bold", cols[j][i])) | |
break | |
default: | |
t2 = ansi("bold", cols[j][i]) | |
} | |
r = r t1 t2 | |
} else | |
r = r sprintf("%23s│", NULLSTR) | |
} | |
r = r RS | |
} | |
r = r "└" replicate("─", 23) "┴" replicate("─", 23) "┴" replicate("─", 23) "┘" | |
} else { | |
r = "┌" replicate("─", 23) "┬" replicate("─", 23) "┬" replicate("─", 23) "┐" RS | |
for (i = 0; i < rows; i++) { | |
r = r "│" | |
for (j = 0; j < 3; j++) { | |
if (cols[j][i]) { | |
t1 = getName(cols[j][i]) | |
if (length(t1) > 15) | |
t1 = substr(t1, 1, 12) "..." | |
t1 = sprintf(" %-15s", t1) | |
switch (length(cols[j][i])) { | |
case 1: case 2: case 3: case 4: | |
t2 = sprintf("- %s │", ansi("bold", sprintf("%4s", cols[j][i]))) | |
break | |
case 5: | |
t2 = sprintf("- %s│", ansi("bold", cols[j][i])) | |
break | |
case 6: | |
t2 = sprintf("-%s│", ansi("bold", cols[j][i])) | |
break | |
case 7: | |
t2 = sprintf("-%s", ansi("bold", cols[j][i])) | |
break | |
default: | |
t2 = ansi("bold", cols[j][i]) | |
} | |
r = r t1 t2 | |
} else | |
r = r sprintf("%23s│", NULLSTR) | |
} | |
r = r RS | |
} | |
r = r "└" replicate("─", 23) "┴" replicate("─", 23) "┴" replicate("─", 23) "┘" | |
} | |
return r | |
} | |
function getList(codes, code, i, r, saveSortedIn) { | |
r = NULLSTR | |
if (!isarray(codes)) | |
r = getDetails(codes) | |
else if (anything(codes)) { | |
saveSortedIn = PROCINFO["sorted_in"] | |
PROCINFO["sorted_in"] = "@ind_num_asc" | |
for (i in codes) | |
r = (r ? r RS prettify("target-seperator", replicate(Option["chr-target-seperator"], Option["width"])) RS\ | |
: r) getDetails(codes[i]) | |
PROCINFO["sorted_in"] = saveSortedIn | |
} else | |
r = getDetails(Option["hl"]) | |
return r | |
} | |
function tokenize(returnTokens, string, | |
delimiters, | |
newlines, | |
quotes, | |
escapeChars, | |
leftBlockComments, | |
rightBlockComments, | |
lineComments, | |
reservedOperators, | |
reservedPatterns, | |
blockCommenting, | |
c, | |
currentToken, | |
escaping, | |
i, | |
lineCommenting, | |
p, | |
quoting, | |
r, | |
s, | |
tempGroup, | |
tempPattern, | |
tempString) { | |
if (!delimiters[0]) { | |
delimiters[0] = " " | |
delimiters[1] = "\t" | |
delimiters[2] = "\v" | |
} | |
if (!newlines[0]) { | |
newlines[0] = "\n" | |
newlines[1] = "\r" | |
} | |
if (!quotes[0]) { | |
quotes[0] = "\"" | |
} | |
if (!escapeChars[0]) { | |
escapeChars[0] = "\\" | |
} | |
if (!leftBlockComments[0]) { | |
leftBlockComments[0] = "#|" | |
leftBlockComments[1] = "/*" | |
leftBlockComments[2] = "(*" | |
} | |
if (!rightBlockComments[0]) { | |
rightBlockComments[0] = "|#" | |
rightBlockComments[1] = "*/" | |
rightBlockComments[2] = "*)" | |
} | |
if (!lineComments[0]) { | |
lineComments[0] = ";" | |
lineComments[1] = "//" | |
lineComments[2] = "#" | |
} | |
if (!reservedOperators[0]) { | |
reservedOperators[0] = "(" | |
reservedOperators[1] = ")" | |
reservedOperators[2] = "[" | |
reservedOperators[3] = "]" | |
reservedOperators[4] = "{" | |
reservedOperators[5] = "}" | |
reservedOperators[6] = "," | |
} | |
if (!reservedPatterns[0]) { | |
reservedPatterns[0] = "[+-]?((0|[1-9][0-9]*)|[.][0-9]*|(0|[1-9][0-9]*)[.][0-9]*)([Ee][+-]?[0-9]+)?" | |
reservedPatterns[1] = "[+-]?0[0-7]+([.][0-7]*)?" | |
reservedPatterns[2] = "[+-]?0[Xx][0-9A-Fa-f]+([.][0-9A-Fa-f]*)?" | |
} | |
split(string, s, "") | |
currentToken = "" | |
quoting = escaping = blockCommenting = lineCommenting = 0 | |
p = 0 | |
i = 1 | |
while (i <= length(s)) { | |
c = s[i] | |
r = substr(string, i) | |
if (blockCommenting) { | |
if (tempString = startsWithAny(r, rightBlockComments)) | |
blockCommenting = 0 | |
i++ | |
} else if (lineCommenting) { | |
if (belongsTo(c, newlines)) | |
lineCommenting = 0 | |
i++ | |
} else if (quoting) { | |
currentToken = currentToken c | |
if (escaping) { | |
escaping = 0 | |
} else { | |
if (belongsTo(c, quotes)) { | |
if (currentToken) { | |
returnTokens[p++] = currentToken | |
currentToken = "" | |
} | |
quoting = 0 | |
} else if (belongsTo(c, escapeChars)) { | |
escaping = 1 | |
} else { | |
} | |
} | |
i++ | |
} else { | |
if (belongsTo(c, delimiters) || belongsTo(c, newlines)) { | |
if (currentToken) { | |
returnTokens[p++] = currentToken | |
currentToken = "" | |
} | |
i++ | |
} else if (belongsTo(c, quotes)) { | |
if (currentToken) { | |
returnTokens[p++] = currentToken | |
} | |
currentToken = c | |
quoting = 1 | |
i++ | |
} else if (tempString = startsWithAny(r, leftBlockComments)) { | |
if (currentToken) { | |
returnTokens[p++] = currentToken | |
currentToken = "" | |
} | |
blockCommenting = 1 | |
i += length(tempString) | |
} else if (tempString = startsWithAny(r, lineComments)) { | |
if (currentToken) { | |
returnTokens[p++] = currentToken | |
currentToken = "" | |
} | |
lineCommenting = 1 | |
i += length(tempString) | |
} else if (tempString = startsWithAny(r, reservedOperators)) { | |
if (currentToken) { | |
returnTokens[p++] = currentToken | |
currentToken = "" | |
} | |
returnTokens[p++] = tempString | |
i += length(tempString) | |
} else if (tempPattern = matchesAny(r, reservedPatterns)) { | |
if (currentToken) { | |
returnTokens[p++] = currentToken | |
currentToken = "" | |
} | |
match(r, "^" tempPattern, tempGroup) | |
returnTokens[p++] = tempGroup[0] | |
i += length(tempGroup[0]) | |
} else { | |
currentToken = currentToken c | |
i++ | |
} | |
} | |
} | |
if (currentToken) | |
returnTokens[p++] = currentToken | |
} | |
function parseJsonArray(returnAST, tokens, | |
leftBrackets, | |
rightBrackets, | |
separators, | |
i, j, key, p, stack, token) { | |
if (!leftBrackets[0]) { | |
leftBrackets[0] = "(" | |
leftBrackets[1] = "[" | |
leftBrackets[2] = "{" | |
} | |
if (!rightBrackets[0]) { | |
rightBrackets[0] = ")" | |
rightBrackets[1] = "]" | |
rightBrackets[2] = "}" | |
} | |
if (!separators[0]) { | |
separators[0] = "," | |
} | |
stack[p = 0] = 0 | |
for (i = 0; i < length(tokens); i++) { | |
token = tokens[i] | |
if (belongsTo(token, leftBrackets)) | |
stack[++p] = 0 | |
else if (belongsTo(token, rightBrackets)) | |
--p | |
else if (belongsTo(token, separators)) | |
stack[p]++ | |
else { | |
key = stack[0] | |
for (j = 1; j <= p; j++) | |
key = key SUBSEP stack[j] | |
returnAST[key] = token | |
} | |
} | |
} | |
function parseJson(returnAST, tokens, | |
arrayStartTokens, arrayEndTokens, | |
objectStartTokens, objectEndTokens, | |
commas, colons, | |
flag, i, j, key, name, p, stack, token) { | |
if (!arrayStartTokens[0]) arrayStartTokens[0] = "[" | |
if (!arrayEndTokens[0]) arrayEndTokens[0] = "]" | |
if (!objectStartTokens[0]) objectStartTokens[0] = "{" | |
if (!objectEndTokens[0]) objectEndTokens[0] = "}" | |
if (!commas[0]) commas[0] = "," | |
if (!colons[0]) colons[0] = ":" | |
stack[p = 0] = 0 | |
flag = 0 | |
for (i = 0; i < length(tokens); i++) { | |
token = tokens[i] | |
if (belongsTo(token, arrayStartTokens)) { | |
stack[++p] = 0 | |
} else if (belongsTo(token, objectStartTokens)) { | |
stack[++p] = NULLSTR | |
flag = 0 | |
} else if (belongsTo(token, objectEndTokens) || | |
belongsTo(token, arrayEndTokens)) { | |
--p | |
} else if (belongsTo(token, commas)) { | |
if (isnum(stack[p])) | |
stack[p]++ | |
else | |
flag = 0 | |
} else if (belongsTo(token, colons)) { | |
flag = 1 | |
} else if (isnum(stack[p]) || flag) { | |
key = stack[0] | |
for (j = 1; j <= p; j++) | |
key = key SUBSEP stack[j] | |
returnAST[key] = token | |
flag = 0 | |
} else { | |
stack[p] = unparameterize(token) | |
} | |
} | |
} | |
function parseList(returnAST, tokens, | |
leftBrackets, | |
rightBrackets, | |
separators, | |
i, j, key, p, stack, token) { | |
if (!leftBrackets[0]) { | |
leftBrackets[0] = "(" | |
leftBrackets[1] = "[" | |
leftBrackets[2] = "{" | |
} | |
if (!rightBrackets[0]) { | |
rightBrackets[0] = ")" | |
rightBrackets[1] = "]" | |
rightBrackets[2] = "}" | |
} | |
if (!separators[0]) { | |
separators[0] = "," | |
} | |
stack[p = 0] = 0 | |
for (i = 0; i < length(tokens); i++) { | |
token = tokens[i] | |
if (belongsTo(token, leftBrackets)) { | |
stack[++p] = 0 | |
} else if (belongsTo(token, rightBrackets)) { | |
stack[--p]++ | |
} else if (belongsTo(token, separators)) { | |
} else { | |
key = NULLSTR | |
if (p > 0) { | |
for (j = 0; j < p - 1; j++) | |
key = key SUBSEP stack[j] | |
returnAST[key][stack[p - 1]] = NULLSTR | |
key = key SUBSEP stack[p - 1] | |
} | |
returnAST[key][stack[p]] = token | |
stack[p]++ | |
} | |
} | |
} | |
function prettify(name, string, i, temp) { | |
temp = string | |
if ("sgr-" name in Option) | |
if (isarray(Option["sgr-" name])) | |
for (i in Option["sgr-" name]) | |
temp = ansi(Option["sgr-" name][i], temp) | |
else | |
temp = ansi(Option["sgr-" name], temp) | |
return temp | |
} | |
function randomColor( i) { | |
i = int(5 * rand()) | |
switch (i) { | |
case 0: return "green" | |
case 1: return "yellow" | |
case 2: return "blue" | |
case 3: return "magenta" | |
case 4: return "cyan" | |
default: return "default" | |
} | |
} | |
function setRandomTheme( i, n, temp) { | |
srand(systime()) | |
for (i = 0; i < 3; i++) { | |
do temp = randomColor(); while (belongsTo(temp, n)) | |
n[i] = temp | |
} | |
Option["sgr-prompt-message"] = Option["sgr-languages"] = n[0] | |
Option["sgr-original-dictionary-detailed-word-class"][1] = n[0] | |
Option["sgr-original-dictionary-detailed-word-class"][2] = "bold" | |
Option["sgr-original-dictionary-synonyms"] = n[0] | |
Option["sgr-original-dictionary-synonyms-word-class"][1] = n[0] | |
Option["sgr-original-dictionary-synonyms-word-class"][2] = "bold" | |
Option["sgr-original-dictionary-examples"] = n[0] | |
Option["sgr-original-dictionary-see-also"] = n[0] | |
Option["sgr-dictionary-word-class"][1] = n[0] | |
Option["sgr-dictionary-word-class"][2] = "bold" | |
Option["sgr-original"][1] = Option["sgr-original-phonetics"][1] = n[1] | |
Option["sgr-original"][2] = Option["sgr-original-phonetics"][2] = "bold" | |
Option["sgr-prompt-message-original"][1] = n[1] | |
Option["sgr-prompt-message-original"][2] = "bold" | |
Option["sgr-languages-sl"] = n[1] | |
Option["sgr-original-dictionary-detailed-explanation"][1] = n[1] | |
Option["sgr-original-dictionary-detailed-explanation"][2] = "bold" | |
Option["sgr-original-dictionary-detailed-example"] = n[1] | |
Option["sgr-original-dictionary-detailed-synonyms"] = n[1] | |
Option["sgr-original-dictionary-detailed-synonyms-item"][1] = n[1] | |
Option["sgr-original-dictionary-detailed-synonyms-item"][2] = "bold" | |
Option["sgr-original-dictionary-synonyms-synonyms"] = n[1] | |
Option["sgr-original-dictionary-synonyms-synonyms-item"][1] = n[1] | |
Option["sgr-original-dictionary-synonyms-synonyms-item"][2] = "bold" | |
Option["sgr-original-dictionary-examples-example"] = n[1] | |
Option["sgr-original-dictionary-examples-original"][1] = n[1] | |
Option["sgr-original-dictionary-examples-original"][2] = "bold" | |
Option["sgr-original-dictionary-examples-original"][3] = "underline" | |
Option["sgr-original-dictionary-see-also-phrases"] = n[1] | |
Option["sgr-original-dictionary-see-also-phrases-item"][1] = n[1] | |
Option["sgr-original-dictionary-see-also-phrases-item"][2] = "bold" | |
Option["sgr-dictionary-explanation"] = n[1] | |
Option["sgr-dictionary-explanation-item"][1] = n[1] | |
Option["sgr-dictionary-explanation-item"][2] = "bold" | |
Option["sgr-alternatives-original"][1] = n[1] | |
Option["sgr-alternatives-original"][2] = "bold" | |
Option["sgr-translation"][1] = Option["sgr-translation-phonetics"][1] = n[2] | |
Option["sgr-translation"][2] = Option["sgr-translation-phonetics"][2] = "bold" | |
Option["sgr-languages-tl"] = n[2] | |
Option["sgr-dictionary-word"][1] = n[2] | |
Option["sgr-dictionary-word"][2] = "bold" | |
Option["sgr-alternatives-translations"] = n[2] | |
Option["sgr-alternatives-translations-item"][1] = n[2] | |
Option["sgr-alternatives-translations-item"][2] = "bold" | |
Option["sgr-brief-translation"][1] = Option["sgr-brief-translation-phonetics"][1] = n[2] | |
Option["sgr-brief-translation"][2] = Option["sgr-brief-translation-phonetics"][2] = "bold" | |
Option["fmt-welcome-message"] = Name | |
Option["sgr-welcome-message"][1] = n[0] | |
Option["sgr-welcome-message"][2] = "bold" | |
Option["fmt-welcome-submessage"] = "(:q to quit)" | |
Option["sgr-welcome-submessage"] = n[0] | |
Option["fmt-prompt"] = "%s> " | |
Option["sgr-prompt"][1] = n[1] | |
Option["sgr-prompt"][2] = "bold" | |
} | |
function setDefaultTheme() { | |
Option["sgr-translation"] = Option["sgr-translation-phonetics"] = "bold" | |
Option["sgr-prompt-message-original"] = "underline" | |
Option["sgr-languages-sl"] = "underline" | |
Option["sgr-languages-tl"] = "bold" | |
Option["sgr-original-dictionary-detailed-explanation"] = "bold" | |
Option["sgr-original-dictionary-detailed-synonyms-item"] = "bold" | |
Option["sgr-original-dictionary-synonyms-synonyms-item"] = "bold" | |
Option["sgr-original-dictionary-examples-original"][1] = "bold" | |
Option["sgr-original-dictionary-examples-original"][2] = "underline" | |
Option["sgr-original-dictionary-see-also-phrases-item"] = "bold" | |
Option["sgr-dictionary-word"] = "bold" | |
Option["sgr-alternatives-original"] = "underline" | |
Option["sgr-alternatives-translations-item"] = "bold" | |
Option["fmt-welcome-message"] = Name | |
Option["sgr-welcome-message"] = "bold" | |
Option["fmt-welcome-submessage"] = "(:q to quit)" | |
Option["fmt-prompt"] = "%s> " | |
Option["sgr-prompt"] = "bold" | |
} | |
function setTheme( file, line, script) { | |
if (Option["theme"] && Option["theme"] != "default"\ | |
&& Option["theme"] != "none" && Option["theme"] != "random") { | |
file = Option["theme"] | |
if (!fileExists(file)) { | |
file = ENVIRON["HOME"] "/.translate-shell/" Option["theme"] | |
if (!fileExists(file)) { | |
file = ENVIRON["HOME"] "/.config/translate-shell/" Option["theme"] | |
if (!fileExists(file)) return | |
} | |
} | |
} | |
if (file && fileExists(file)) { | |
script = NULLSTR | |
while (getline line < file) | |
script = script "\n" line | |
loadOptions(script) | |
} else if (Option["theme"] == "none") | |
; | |
else if (Option["theme"] == "random") | |
setRandomTheme() | |
else | |
setDefaultTheme() | |
} | |
function provides(engineName) { | |
Translator[tolower(engineName)] = TRUE | |
} | |
function engineMethod(methodName, engine, translator) { | |
if (!Translator[Option["engine"]]) { | |
engine = tolower(Option["engine"]) | |
if (!Translator[engine]) | |
for (translator in Translator) | |
if (Translator[translator] && | |
translator ~ "^"engine) { | |
engine = translator | |
break | |
} | |
if (!Translator[engine]) { | |
e("[ERROR] Translator not found: " Option["engine"] "\n"\ | |
" Run '-list-engines / -S' to see a list of available engines.") | |
exit 1 | |
} | |
Option["engine"] = engine | |
} | |
return Option["engine"] methodName | |
} | |
function initAudioPlayer() { | |
AudioPlayer = !system("mplayer" SUPOUT SUPERR) ? | |
"mplayer" : | |
(!system("mpv" SUPOUT SUPERR) ? | |
"mpv" : | |
(!system("mpg123 --version" SUPOUT SUPERR) ? | |
"mpg123" : | |
"")) | |
} | |
function initSpeechSynthesizer() { | |
SpeechSynthesizer = !system("say ''" SUPOUT SUPERR) ? | |
"say" : | |
(!system("espeak ''" SUPOUT SUPERR) ? | |
"espeak" : | |
"") | |
} | |
function initPager() { | |
Pager = !system("less -V" SUPOUT SUPERR) ? | |
"less" : | |
(!system("more -V" SUPOUT SUPERR) ? | |
"more" : | |
(!system("most" SUPOUT SUPERR) ? | |
"most" : | |
"")) | |
} | |
function initHttpService() { | |
_Init() | |
if (Option["proxy"]) { | |
match(Option["proxy"], /^(http:\/*)?(([^:]+):([^@]+)@)?([^\/]*):([^\/:]*)/, HttpProxySpec) | |
HttpAuthUser = HttpProxySpec[3] | |
HttpAuthPass = HttpProxySpec[4] | |
HttpAuthCredentials = base64(unquote(HttpAuthUser) ":" HttpAuthPass) | |
HttpService = "/inet/tcp/0/" HttpProxySpec[5] "/" HttpProxySpec[6] | |
HttpPathPrefix = HttpProtocol HttpHost | |
} else { | |
HttpService = "/inet/tcp/0/" HttpHost "/" HttpPort | |
HttpPathPrefix = "" | |
} | |
} | |
function preprocess(text) { | |
return quote(text) | |
} | |
function postprocess(text) { | |
text = gensub(/ ([.,;:?!"])/, "\\1", "g", text) | |
text = gensub(/(["]) /, "\\1", "g", text) | |
return text | |
} | |
function getResponse(text, sl, tl, hl, | |
content, header, isBody, url, group, status, location) { | |
url = _RequestUrl(text, sl, tl, hl) | |
header = "GET " url " HTTP/1.1\n"\ | |
"Host: " HttpHost "\n"\ | |
"Connection: close\n" | |
if (Option["user-agent"]) | |
header = header "User-Agent: " Option["user-agent"] "\n" | |
if (Cookie) | |
header = header "Cookie: " Cookie "\n" | |
if (HttpAuthUser && HttpAuthPass) | |
header = header "Proxy-Authorization: Basic " HttpAuthCredentials "\n" | |
content = NULLSTR; isBody = 0 | |
print header |& HttpService | |
while ((HttpService |& getline) > 0) { | |
if (isBody) | |
content = content ? content "\n" $0 : $0 | |
else if (length($0) <= 1) | |
isBody = 1 | |
else { | |
match($0, /^HTTP[^ ]* ([^ ]*)/, group) | |
if (RSTART) status = group[1] | |
match($0, /^Location: (.*)/, group) | |
if (RSTART) location = squeeze(group[1]) | |
} | |
l(sprintf("%4s bytes > %s", length($0), $0)) | |
} | |
close(HttpService) | |
if (status == "301" && location) | |
content = curl(location) | |
return assert(content, "[ERROR] Null response.") | |
} | |
function p(string) { | |
if (Option["view"]) | |
print string | Option["pager"] | |
else | |
print string > Option["output"] | |
} | |
function play(text, tl, url) { | |
url = _TTSUrl(text, tl) | |
system(Option["player"] " " parameterize(url) SUPOUT SUPERR) | |
} | |
function download_audio(text, tl, url, output) { | |
url = _TTSUrl(text, tl) | |
if (Option["download-audio-as"]) | |
output = Option["download-audio-as"] | |
else | |
output = text " [" Option["engine"] "] (" Option["narrator"] ").ts" | |
if (url ~ /^\//) | |
system("mv -- " parameterize(url) " " parameterize(output)) | |
else | |
curl(url, output) | |
} | |
function getTranslation(text, sl, tl, hl, | |
isVerbose, toSpeech, returnPlaylist, returnIl) { | |
return _Translate(text, sl, tl, hl, | |
isVerbose, toSpeech, returnPlaylist, returnIl) | |
} | |
function fileTranslation(uri, group, temp1, temp2) { | |
temp1 = Option["input"] | |
temp2 = Option["verbose"] | |
match(uri, /^file:\/\/(.*)/, group) | |
Option["input"] = group[1] | |
Option["verbose"] = 0 | |
translateMain() | |
Option["input"] = temp1 | |
Option["verbose"] = temp2 | |
} | |
function webTranslation(uri, sl, tl, hl) { | |
system(Option["browser"] " "\ | |
parameterize(_WebTranslateUrl(uri, sl, tl, hl)) "&") | |
} | |
function translate(text, inline, | |
i, j, playlist, il, saveSortedIn) { | |
if (!getCode(Option["hl"])) { | |
w("[WARNING] Unknown language code: " Option["hl"] ", fallback to English: en") | |
Option["hl"] = "en" | |
} else if (isRTL(Option["hl"])) { | |
if (!FriBidi) | |
w("[WARNING] " getName(Option["hl"]) " is a right-to-left language, but FriBidi is not found.") | |
} | |
if (!getCode(Option["sl"])) { | |
w("[WARNING] Unknown source language code: " Option["sl"]) | |
} else if (isRTL(Option["sl"])) { | |
if (!FriBidi) | |
w("[WARNING] " getName(Option["sl"]) " is a right-to-left language, but FriBidi is not found.") | |
} | |
saveSortedIn = PROCINFO["sorted_in"] | |
PROCINFO["sorted_in"] = "@ind_num_asc" | |
for (i in Option["tl"]) { | |
if (!Option["interactive"]) | |
if (Option["verbose"] && i > 1) | |
p(prettify("target-seperator", replicate(Option["chr-target-seperator"], Option["width"]))) | |
if (inline && | |
startsWithAny(text, UriSchemes) == "file://") { | |
fileTranslation(text) | |
} else if (inline && | |
startsWithAny(text, UriSchemes) == "http://" || | |
startsWithAny(text, UriSchemes) == "https://") { | |
webTranslation(text, Option["sl"], Option["tl"][i], Option["hl"]) | |
} else { | |
if (!Option["no-translate"]) | |
p(getTranslation(text, Option["sl"], Option["tl"][i], Option["hl"], Option["verbose"], Option["play"] || Option["download-audio"], playlist, il)) | |
else | |
il[0] = Option["sl"] == "auto" ? "en" : Option["sl"] | |
if (Option["play"] == 1) { | |
if (Option["player"]) | |
for (j in playlist) | |
play(playlist[j]["text"], playlist[j]["tl"]) | |
else if (SpeechSynthesizer) | |
for (j in playlist) | |
print playlist[j]["text"] | SpeechSynthesizer | |
} else if (Option["play"] == 2) { | |
if (Option["player"]) | |
play(text, il[0]) | |
else if (SpeechSynthesizer) | |
print text | SpeechSynthesizer | |
} | |
if (Option["download-audio"] == 1) { | |
if (Option["play"] != 2 && !Option["no-translate"]) | |
download_audio(playlist[length(playlist) - 1]["text"],\ | |
playlist[length(playlist) - 1]["tl"]) | |
else | |
download_audio(text, il[0]) | |
} | |
} | |
} | |
PROCINFO["sorted_in"] = saveSortedIn | |
} | |
function translateMain( i, line) { | |
if (Option["interactive"]) | |
prompt() | |
if (Option["input"] == STDIN || fileExists(Option["input"])) { | |
i = 0 | |
while (getline line < Option["input"]) | |
if (line) { | |
if (!Option["interactive"]) | |
if (Option["verbose"] && i++ > 0) | |
p(prettify("source-seperator", | |
replicate(Option["chr-source-seperator"], | |
Option["width"]))) | |
if (Option["interactive"]) | |
repl(line) | |
else | |
translate(line) | |
} else { | |
if (!Option["interactive"]) | |
if (!Option["verbose"]) | |
p(line) | |
} | |
} else | |
e("[ERROR] File not found: " Option["input"]) | |
} | |
function _Init( vm) { | |
vm = engineMethod("Init") | |
return @vm() | |
} | |
function _RequestUrl(text, sl, tl, hl, vm) { | |
vm = engineMethod("RequestUrl") | |
return @vm(text, sl, tl, hl) | |
} | |
function _TTSUrl(text, tl, vm) { | |
vm = engineMethod("TTSUrl") | |
return @vm(text, tl) | |
} | |
function _WebTranslateUrl(uri, sl, tl, hl, vm) { | |
vm = engineMethod("WebTranslateUrl") | |
return @vm(uri, sl, tl, hl) | |
} | |
function _Translate(text, sl, tl, hl, | |
isVerbose, toSpeech, returnPlaylist, returnIl, | |
vm) { | |
vm = engineMethod("Translate") | |
return @vm(text, sl, tl, hl, | |
isVerbose, toSpeech, returnPlaylist, returnIl) | |
} | |
BEGIN { provides("google") } | |
function genRL(a, x, | |
b, c, d, i, y) { | |
tokenize(y, x) | |
parseList(b, y) | |
i = SUBSEP 0 | |
for (c = 0; c < length(b[i]) - 2; c += 3) { | |
d = b[i][c + 2] | |
d = d >= 97 ? d - 87 : | |
d - 48 | |
d = b[i][c + 1] == 43 ? rshift(a, d) : lshift(a, d) | |
a = b[i][c] == 43 ? and(a + d, 4294967295) : xor(a, d) | |
} | |
return a | |
} | |
function genTK(text, | |
a, d, dLen, e, tkk, ub, vb) { | |
if (TK[text]) return TK[text] | |
tkk = systime() / 3600 | |
ub = "[43,45,51,94,43,98,43,45,102]" | |
vb = "[43,45,97,94,43,54]" | |
dLen = dump(text, d) | |
a = tkk | |
for (e = 1; e <= dLen; e++) | |
a = genRL(a + d[e], vb) | |
a = genRL(a, ub) | |
0 > a && (a = and(a, 2147483647) + 2147483648) | |
a %= 1e6 | |
TK[text] = a "." xor(a, tkk) | |
l(text, "text") | |
l(tkk, "tkk") | |
l(TK[text], "tk") | |
return TK[text] | |
} | |
function googleInit() { | |
HttpProtocol = "http://" | |
HttpHost = "translate.googleapis.com" | |
HttpPort = 80 | |
} | |
function googleRequestUrl(text, sl, tl, hl, qc) { | |
qc = Option["no-autocorrect"] ? "qc" : "qca"; | |
return HttpPathPrefix "/translate_a/single?client=gtx"\ | |
"&ie=UTF-8&oe=UTF-8"\ | |
"&dt=bd&dt=ex&dt=ld&dt=md&dt=rw&dt=rm&dt=ss&dt=t&dt=at"\ | |
"&dt=" qc "&sl=" sl "&tl=" tl "&hl=" hl\ | |
"&q=" preprocess(text) | |
} | |
function googleTTSUrl(text, tl) { | |
return HttpProtocol HttpHost "/translate_tts?ie=UTF-8&client=gtx"\ | |
"&tl=" tl "&q=" preprocess(text) | |
} | |
function googleWebTranslateUrl(uri, sl, tl, hl) { | |
return "https://translate.google.com/translate?"\ | |
"hl=" hl "&sl=" sl "&tl=" tl "&u=" uri | |
} | |
function googleTranslate(text, sl, tl, hl, | |
isVerbose, toSpeech, returnPlaylist, returnIl, | |
r, | |
content, tokens, ast, | |
_sl, _tl, _hl, il, ils, isPhonetic, | |
article, example, explanation, ref, word, | |
translation, translations, phonetics, | |
wordClasses, words, segments, altTranslations, | |
original, oPhonetics, oWordClasses, oWords, | |
oRefs, oSynonymClasses, oSynonyms, | |
oExamples, oSeeAlso, | |
wShowOriginal, wShowOriginalPhonetics, | |
wShowTranslation, wShowTranslationPhonetics, | |
wShowPromptMessage, wShowLanguages, | |
wShowOriginalDictionary, wShowDictionary, | |
wShowAlternatives, | |
hasWordClasses, hasAltTranslations, | |
i, j, k, group, temp, saveSortedIn) { | |
isPhonetic = match(tl, /^@/) | |
tl = substr(tl, 1 + isPhonetic) | |
if (!getCode(tl)) { | |
w("[WARNING] Unknown target language code: " tl) | |
} else if (isRTL(tl)) { | |
if (!FriBidi) | |
w("[WARNING] " getName(tl) " is a right-to-left language, but FriBidi is not found.") | |
} | |
_sl = getCode(sl); if (!_sl) _sl = sl | |
_tl = getCode(tl); if (!_tl) _tl = tl | |
_hl = getCode(hl); if (!_hl) _hl = hl | |
content = getResponse(text, _sl, _tl, _hl) | |
if (Option["dump"]) | |
return content | |
tokenize(tokens, content) | |
parseJsonArray(ast, tokens) | |
l(content, "content", 1, 1) | |
l(tokens, "tokens", 1, 0, 1) | |
l(ast, "ast") | |
if (!isarray(ast) || !anything(ast)) { | |
e("[ERROR] Oops! Something went wrong and I can't translate it for you :(") | |
ExitCode = 1 | |
return | |
} | |
saveSortedIn = PROCINFO["sorted_in"] | |
PROCINFO["sorted_in"] = "compareByIndexFields" | |
for (i in ast) { | |
if (ast[i] == "null") continue | |
if (i ~ "^0" SUBSEP "0" SUBSEP "[[:digit:]]+" SUBSEP "0$") | |
append(translations, literal(ast[i])) | |
if (i ~ "^0" SUBSEP "0" SUBSEP "[[:digit:]]+" SUBSEP "1$") | |
append(original, literal(ast[i])) | |
if (i ~ "^0" SUBSEP "0" SUBSEP "[[:digit:]]+" SUBSEP "2$") | |
append(phonetics, literal(ast[i])) | |
if (i ~ "^0" SUBSEP "0" SUBSEP "[[:digit:]]+" SUBSEP "3$") | |
append(oPhonetics, literal(ast[i])) | |
if (match(i, "^0" SUBSEP "1" SUBSEP "([[:digit:]]+)" SUBSEP "0$", group)) | |
wordClasses[group[1]] = literal(ast[i]) | |
if (match(i, "^0" SUBSEP "1" SUBSEP "([[:digit:]]+)" SUBSEP "2" SUBSEP "([[:digit:]]+)" SUBSEP "([[:digit:]]+)$", group)) | |
words[group[1]][group[2]][group[3]] = literal(ast[i]) | |
if (match(i, "^0" SUBSEP "1" SUBSEP "([[:digit:]]+)" SUBSEP "2" SUBSEP "([[:digit:]]+)" SUBSEP "1" SUBSEP "([[:digit:]]+)$", group)) | |
words[group[1]][group[2]]["1"][group[3]] = literal(ast[i]) | |
if (match(i, "^0" SUBSEP "5" SUBSEP "([[:digit:]]+)" SUBSEP "0$", group)) { | |
segments[group[1]] = literal(ast[i]) | |
altTranslations[group[1]][0] = "" | |
} | |
if (match(i, "^0" SUBSEP "5" SUBSEP "([[:digit:]]+)" SUBSEP "2" SUBSEP "([[:digit:]]+)" SUBSEP "0$", group)) | |
altTranslations[group[1]][group[2]] = literal(ast[i]) | |
if (i ~ "^0" SUBSEP "7" SUBSEP "5$") { | |
if (ast[i] == "true") | |
w("Showing translation for: (use -no-auto to disable autocorrect)") | |
else | |
w("Did you mean: "\ | |
ansi("bold", unparameterize(ast["0" SUBSEP "7" SUBSEP "1"]))) | |
} | |
if (i ~ "^0" SUBSEP "8" SUBSEP "0" SUBSEP "[[:digit:]]+$" || | |
i ~ "^0" SUBSEP "2$") | |
append(ils, literal(ast[i])) | |
if (match(i, "^0" SUBSEP "11" SUBSEP "([[:digit:]]+)" SUBSEP "0$", group)) | |
oSynonymClasses[group[1]] = literal(ast[i]) | |
if (match(i, "^0" SUBSEP "11" SUBSEP "([[:digit:]]+)" SUBSEP "1" SUBSEP "([[:digit:]]+)" SUBSEP "1$", group)) | |
if (ast[i]) { | |
oRefs[literal(ast[i])][1] = group[1] | |
oRefs[literal(ast[i])][2] = group[2] | |
} | |
if (match(i, "^0" SUBSEP "11" SUBSEP "([[:digit:]]+)" SUBSEP "1" SUBSEP "([[:digit:]]+)" SUBSEP "0" SUBSEP "([[:digit:]]+)$", group)) | |
oSynonyms[group[1]][group[2]][group[3]] = literal(ast[i]) | |
if (match(i, "^0" SUBSEP "12" SUBSEP "([[:digit:]]+)" SUBSEP "0$", group)) | |
oWordClasses[group[1]] = literal(ast[i]) | |
if (match(i, "^0" SUBSEP "12" SUBSEP "([[:digit:]]+)" SUBSEP "1" SUBSEP "([[:digit:]]+)" SUBSEP "0$", group)) | |
oWords[group[1]][group[2]][0] = literal(ast[i]) | |
if (match(i, "^0" SUBSEP "12" SUBSEP "([[:digit:]]+)" SUBSEP "1" SUBSEP "([[:digit:]]+)" SUBSEP "1$", group)) | |
oWords[group[1]][group[2]][1] = literal(ast[i]) | |
if (match(i, "^0" SUBSEP "12" SUBSEP "([[:digit:]]+)" SUBSEP "1" SUBSEP "([[:digit:]]+)" SUBSEP "2$", group)) | |
oWords[group[1]][group[2]][2] = literal(ast[i]) | |
if (match(i, "^0" SUBSEP "13" SUBSEP "0" SUBSEP "([[:digit:]]+)" SUBSEP "0$", group)) | |
oExamples[group[1]] = literal(ast[i]) | |
if (match(i, "^0" SUBSEP "14" SUBSEP "0" SUBSEP "([[:digit:]]+)$", group)) | |
oSeeAlso[group[1]] = literal(ast[i]) | |
} | |
PROCINFO["sorted_in"] = saveSortedIn | |
translation = join(translations) | |
returnIl[0] = il = !anything(ils) || belongsTo(sl, ils) ? sl : ils[0] | |
if (Option["verbose"] < 0) | |
return getList(il) | |
if (!isVerbose) { | |
r = isPhonetic && anything(phonetics) ? | |
prettify("brief-translation-phonetics", join(phonetics, " ")) : | |
prettify("brief-translation", s(translation, tl)) | |
if (toSpeech) { | |
returnPlaylist[0]["text"] = translation | |
returnPlaylist[0]["tl"] = tl | |
} | |
} else { | |
wShowOriginal = Option["show-original"] | |
wShowOriginalPhonetics = Option["show-original-phonetics"] | |
wShowTranslation = Option["show-translation"] | |
wShowTranslationPhonetics = Option["show-translation-phonetics"] | |
wShowPromptMessage = Option["show-prompt-message"] | |
wShowLanguages = Option["show-languages"] | |
wShowOriginalDictionary = Option["show-original-dictionary"] | |
wShowDictionary = Option["show-dictionary"] | |
wShowAlternatives = Option["show-alternatives"] | |
if (!anything(oPhonetics)) wShowOriginalPhonetics = 0 | |
if (!anything(phonetics)) wShowTranslationPhonetics = 0 | |
if (getCode(il) == getCode(tl) &&\ | |
(isarray(oWordClasses) || isarray(oSynonymClasses) ||\ | |
isarray(oExamples) || isarray(oSeeAlso))) { | |
wShowOriginalDictionary = 1 | |
wShowTranslation = 0 | |
} | |
hasWordClasses = exists(wordClasses) | |
hasAltTranslations = exists(altTranslations[0]) | |
if (!hasWordClasses && !hasAltTranslations) | |
wShowPromptMessage = wShowLanguages = 0 | |
if (!hasWordClasses) wShowDictionary = 0 | |
if (!hasAltTranslations) wShowAlternatives = 0 | |
if (wShowOriginal) { | |
if (r) r = r RS RS | |
r = r m("-- display original text & phonetics") | |
r = r prettify("original", s(join(original, " "), il)) | |
if (wShowOriginalPhonetics) | |
r = r RS prettify("original-phonetics", showPhonetics(join(oPhonetics, " "), il)) | |
} | |
if (wShowTranslation) { | |
if (r) r = r RS RS | |
r = r m("-- display major translation & phonetics") | |
r = r prettify("translation", s(translation, tl)) | |
if (wShowTranslationPhonetics) | |
r = r RS prettify("translation-phonetics", showPhonetics(join(phonetics, " "), tl)) | |
} | |
if (wShowPromptMessage || wShowLanguages) | |
if (r) r = r RS | |
if (wShowPromptMessage) { | |
if (hasWordClasses) { | |
if (r) r = r RS | |
r = r m("-- display prompt message (Definitions of ...)") | |
if (isRTL(hl)) | |
r = r prettify("prompt-message", s(showDefinitionsOf(hl, join(original, " ")))) | |
else { | |
split(showDefinitionsOf(hl, "\0%s\0"), group, "\0") | |
for (i = 1; i <= length(group); i++) { | |
if (group[i] == "%s") | |
r = r prettify("prompt-message-original", show(join(original, " "), il)) | |
else | |
r = r prettify("prompt-message", group[i]) | |
} | |
} | |
} else if (hasAltTranslations) { | |
if (r) r = r RS | |
r = r m("-- display prompt message (Translations of ...)") | |
if (isRTL(hl)) | |
r = r prettify("prompt-message", s(showTranslationsOf(hl, join(original, " ")))) | |
else { | |
split(showTranslationsOf(hl, "\0%s\0"), group, "\0") | |
for (i = 1; i <= length(group); i++) { | |
if (group[i] == "%s") | |
r = r prettify("prompt-message-original", show(join(original, " "), il)) | |
else | |
r = r prettify("prompt-message", group[i]) | |
} | |
} | |
} | |
} | |
if (wShowLanguages) { | |
if (r) r = r RS | |
r = r m("-- display source language -> target language") | |
temp = Option["fmt-languages"] | |
if (!temp) temp = "[ %s -> %t ]" | |
split(temp, group, /(%s|%S|%t|%T)/) | |
r = r prettify("languages", group[1]) | |
if (temp ~ /%s/) | |
r = r prettify("languages-sl", getDisplay(il)) | |
if (temp ~ /%S/) | |
r = r prettify("languages-sl", getName(il)) | |
r = r prettify("languages", group[2]) | |
if (temp ~ /%t/) | |
r = r prettify("languages-tl", getDisplay(tl)) | |
if (temp ~ /%T/) | |
r = r prettify("languages-tl", getName(tl)) | |
r = r prettify("languages", group[3]) | |
} | |
if (wShowOriginalDictionary) { | |
if (exists(oWordClasses)) { | |
if (r) r = r RS | |
r = r m("-- display original dictionary (detailed explanations)") | |
for (i = 0; i < length(oWordClasses); i++) { | |
r = (i > 0 ? r RS : r) RS prettify("original-dictionary-detailed-word-class", s(oWordClasses[i], hl)) | |
for (j = 0; j < length(oWords[i]); j++) { | |
explanation = oWords[i][j][0] | |
ref = oWords[i][j][1] | |
example = oWords[i][j][2] | |
r = (j > 0 ? r RS : r) RS prettify("original-dictionary-detailed-explanation", ins(1, explanation, il)) | |
if (example) | |
r = r RS prettify("original-dictionary-detailed-example", ins(2, "- \"" example "\"", il)) | |
if (ref && isarray(oRefs[ref])) { | |
temp = prettify("original-dictionary-detailed-synonyms", ins(1, show(showSynonyms(hl), hl) ": ")) | |
temp = temp prettify("original-dictionary-detailed-synonyms-item", show(oSynonyms[oRefs[ref][1]][oRefs[ref][2]][0], il)) | |
for (k = 1; k < length(oSynonyms[oRefs[ref][1]][oRefs[ref][2]]); k++) | |
temp = temp prettify("original-dictionary-detailed-synonyms", ", ")\ | |
prettify("original-dictionary-detailed-synonyms-item", show(oSynonyms[oRefs[ref][1]][oRefs[ref][2]][k], il)) | |
r = r RS temp | |
} | |
} | |
} | |
} | |
if (exists(oSynonymClasses)) { | |
r = r RS RS | |
r = r m("-- display original dictionary (synonyms)") | |
r = r prettify("original-dictionary-synonyms", s(showSynonyms(hl), hl)) | |
for (i = 0; i < length(oSynonymClasses); i++) { | |
r = (i > 0 ? r RS : r) RS prettify("original-dictionary-synonyms-word-class", ins(1, oSynonymClasses[i], hl)) | |
for (j = 0; j < length(oSynonyms[i]); j++) { | |
temp = prettify("original-dictionary-synonyms-synonyms", ins(2, "- ")) | |
temp = temp prettify("original-dictionary-synonyms-synonyms-item", show(oSynonyms[i][j][0], il)) | |
for (k = 1; k < length(oSynonyms[i][j]); k++) | |
temp = temp prettify("original-dictionary-synonyms-synonyms", ", ")\ | |
prettify("original-dictionary-synonyms-synonyms-item", show(oSynonyms[i][j][k], il)) | |
r = r RS temp | |
} | |
} | |
} | |
if (exists(oExamples)) { | |
r = r RS RS | |
r = r m("-- display original dictionary (examples)") | |
r = r prettify("original-dictionary-examples", s(showExamples(hl), hl)) | |
for (i = 0; i < length(oExamples); i++) { | |
example = oExamples[i] | |
temp = prettify("original-dictionary-examples-example", ins(1, "- ")) | |
split(example, group, /(<b>|<\/b>)/) | |
if (isRTL(il)) | |
temp = temp show(group[1] group[2] group[3], il) | |
else | |
temp = temp prettify("original-dictionary-examples-example", group[1])\ | |
prettify("original-dictionary-examples-original", group[2])\ | |
prettify("original-dictionary-examples-example", group[3]) | |
r = (i > 0 ? r RS : r) RS temp | |
} | |
} | |
if (exists(oSeeAlso)) { | |
r = r RS RS | |
r = r m("-- display original dictionary (see also)") | |
r = r prettify("original-dictionary-see-also", s(showSeeAlso(hl), hl)) | |
temp = ins(1, prettify("original-dictionary-see-also-phrases-item", show(oSeeAlso[0], il))) | |
for (k = 1; k < length(oSeeAlso); k++) | |
temp = temp prettify("original-dictionary-see-also-phrases", ", ")\ | |
prettify("original-dictionary-see-also-phrases-item", show(oSeeAlso[k], il)) | |
r = r RS temp | |
} | |
} | |
if (wShowDictionary) { | |
if (r) r = r RS | |
r = r m("-- display dictionary entries") | |
for (i = 0; i < length(wordClasses); i++) { | |
r = (i > 0 ? r RS : r) RS prettify("dictionary-word-class", s(wordClasses[i], hl)) | |
for (j = 0; j < length(words[i]); j++) { | |
word = words[i][j][0] | |
article = words[i][j][4] | |
if (isRTL(il)) | |
explanation = join(words[i][j][1], ", ") | |
else { | |
explanation = prettify("dictionary-explanation-item", words[i][j][1][0]) | |
for (k = 1; k < length(words[i][j][1]); k++) | |
explanation = explanation prettify("dictionary-explanation", ", ")\ | |
prettify("dictionary-explanation-item", words[i][j][1][k]) | |
} | |
r = r RS prettify("dictionary-word", ins(1, (article ? "(" article ") " : "") word, tl)) | |
if (isRTL(il)) | |
r = r RS prettify("dictionary-explanation-item", ins(2, explanation, il)) | |
else | |
r = r RS ins(2, explanation) | |
} | |
} | |
} | |
if (wShowAlternatives) { | |
if (r) r = r RS RS | |
r = r m("-- display alternative translations") | |
for (i = 0; i < length(altTranslations); i++) { | |
r = (i > 0 ? r RS : r) prettify("alternatives-original", show(segments[i], il)) | |
if (isRTL(tl)) { | |
temp = join(altTranslations[i], ", ") | |
r = r RS prettify("alternatives-translations-item", ins(1, temp, tl)) | |
} else { | |
temp = prettify("alternatives-translations-item", altTranslations[i][0]) | |
for (j = 1; j < length(altTranslations[i]); j++) | |
temp = temp prettify("alternatives-translations", ", ")\ | |
prettify("alternatives-translations-item", altTranslations[i][j]) | |
r = r RS ins(1, temp) | |
} | |
} | |
} | |
if (toSpeech) { | |
if (index(showTranslationsOf(hl, "%s"), "%s") > 2) { | |
returnPlaylist[0]["text"] = showTranslationsOf(hl) | |
returnPlaylist[0]["tl"] = hl | |
returnPlaylist[1]["text"] = join(original) | |
returnPlaylist[1]["tl"] = il | |
} else { | |
returnPlaylist[0]["text"] = join(original) | |
returnPlaylist[0]["tl"] = il | |
returnPlaylist[1]["text"] = showTranslationsOf(hl) | |
returnPlaylist[1]["tl"] = hl | |
} | |
returnPlaylist[2]["text"] = translation | |
returnPlaylist[2]["tl"] = tl | |
} | |
} | |
return r | |
} | |
BEGIN { provides("bing") } | |
function bingInit() { | |
HttpProtocol = "http://" | |
HttpHost = "www.bing.com" | |
HttpPort = 80 | |
} | |
function bingSetCookie( cookie, group, header, url) { | |
url = HttpPathPrefix "/translator" | |
header = "GET " url " HTTP/1.1\n"\ | |
"Host: " HttpHost "\n"\ | |
"Connection: close\n" | |
if (Option["user-agent"]) | |
header = header "User-Agent: " Option["user-agent"] "\n" | |
cookie = NULLSTR | |
print header |& HttpService | |
while ((HttpService |& getline) > 0 && length($0) > 1) { | |
match($0, /Set-Cookie: ([^;]*);/, group) | |
if (group[1]) { | |
cookie = cookie (cookie ? "; " : NULLSTR) group[1] | |
} | |
l(sprintf("%4s bytes > %s", length($0), length($0) < 1024 ? $0 : "...")) | |
} | |
close(HttpService) | |
Cookie = cookie | |
} | |
function bingTTSUrl(text, tl, | |
country, gender, i, group, | |
header, content, isBody) { | |
gender = "female" | |
country = NULLSTR | |
split(Option["narrator"], group, ",") | |
for (i in group) { | |
if (group[i] ~ /^(f(emale)?|w(oman)?)$/) | |
gender = "female" | |
else if (group[i] ~ /^m(ale|an)?$/) | |
gender = "male" | |
else | |
country = group[i] | |
} | |
if (country) tl = tl "-" country | |
else if (tl == "ar") tl = tl "-EG" | |
else if (tl == "da") tl = tl "-DK" | |
else if (tl == "de") tl = tl "-DE" | |
else if (tl == "en") tl = tl "-US" | |
else if (tl == "es") tl = tl "-ES" | |
else if (tl == "fi") tl = tl "-FI" | |
else if (tl == "fr") tl = tl "-FR" | |
else if (tl == "it") tl = tl "-IT" | |
else if (tl == "ja") tl = tl "-JP" | |
else if (tl == "ko") tl = tl "-KR" | |
else if (tl == "nl") tl = tl "-NL" | |
else if (tl == "nb") tl = tl "-NO" | |
else if (tl == "pl") tl = tl "-PL" | |
else if (tl == "pt") tl = tl "-PT" | |
else if (tl == "ru") tl = tl "-RU" | |
else if (tl == "sv") tl = tl "-SE" | |
else if (tl == "yue") ; | |
else if (tl == "zh") tl = tl "-CN" | |
header = "GET " "/translator/api/language/Speak?"\ | |
"locale=" tl "&text=" preprocess(text)\ | |
"&gender=" gender "&media=audio/mp3" " HTTP/1.1\n"\ | |
"Host: " HttpHost "\n"\ | |
"Connection: close\n" | |
if (Option["user-agent"]) | |
header = header "User-Agent: " Option["user-agent"] "\n" | |
if (Cookie) | |
header = header "Cookie: " Cookie "\n" | |
content = NULLSTR; isBody = 0 | |
print header |& HttpService | |
while ((HttpService |& getline) > 0) { | |
if (isBody) | |
content = content ? content "\n" $0 : $0 | |
else if (length($0) <= 1) | |
isBody = 1 | |
} | |
close(HttpService) | |
if (!TempFile) | |
TempFile = getOutput("mktemp") | |
printf("%s", content) > TempFile | |
close(TempFile) | |
return TempFile | |
} | |
function bingWebTranslateUrl(uri, sl, tl, hl) { | |
return "http://www.microsofttranslator.com/bv.aspx?"\ | |
"from=" sl "&to=" tl "&a=" uri | |
} | |
function bingPost(text, sl, tl, hl, | |
content, contentLength, group, | |
header, isBody, reqBody, url) { | |
reqBody = "[{" parameterize("text") ":" parameterize(text, "\"") "}]" | |
if (DumpContentengths[reqBody]) | |
contentLength = DumpContentengths[reqBody] | |
else | |
contentLength = DumpContentengths[reqBody] = dump(reqBody, group) | |
url = HttpPathPrefix "/translator/api/Translate/TranslateArray?"\ | |
"from=" sl "&to=" tl | |
header = "POST " url " HTTP/1.1\n"\ | |
"Host: " HttpHost "\n"\ | |
"Connection: close\n"\ | |
"Content-Length: " contentLength "\n"\ | |
"Content-Type: application/json\n" | |
if (Option["user-agent"]) | |
header = header "User-Agent: " Option["user-agent"] "\n" | |
if (Cookie) | |
header = header "Cookie: " Cookie "\n" | |
content = NULLSTR; isBody = 0 | |
print (header "\n" reqBody) |& HttpService | |
while ((HttpService |& getline) > 0) { | |
if (isBody) | |
content = content ? content "\n" $0 : $0 | |
else if (length($0) <= 1) | |
isBody = 1 | |
l(sprintf("%4s bytes > %s", length($0), $0)) | |
} | |
close(HttpService) | |
return assert(content, "[ERROR] Null response.") | |
} | |
function bingRequestUrl(text, sl, tl, hl) { | |
return HttpPathPrefix "/translator/api/Dictionary/Lookup?"\ | |
"from=" sl "&to=" tl "&text=" preprocess(text) | |
} | |
function bingTranslate(text, sl, tl, hl, | |
isVerbose, toSpeech, returnPlaylist, returnIl, | |
r, | |
content, tokens, ast, | |
_sl, _tl, _hl, il, | |
translation, | |
wShowOriginal, wShowTranslation, wShowLanguages, | |
group, temp) { | |
if (!getCode(tl)) { | |
w("[WARNING] Unknown target language code: " tl) | |
} else if (isRTL(tl)) { | |
if (!FriBidi) | |
w("[WARNING] " getName(tl) " is a right-to-left language, but FriBidi is not found.") | |
} | |
_sl = getCode(sl); if (!_sl) _sl = sl | |
_tl = getCode(tl); if (!_tl) _tl = tl | |
_hl = getCode(hl); if (!_hl) _hl = hl | |
if (_sl == "auto") _sl = "-" | |
if (_sl == "bs") _sl = "bs-Latn" | |
if (_sl == "zh-CN") _sl = "zh-CHS" | |
if (_sl == "zh-TW") _sl = "zh-CHT" | |
if (_tl == "bs") _tl = "bs-Latn" | |
if (_tl == "zh-CN") _tl = "zh-CHS" | |
if (_tl == "zh-TW") _tl = "zh-CHT" | |
bingSetCookie() | |
content = bingPost(text, _sl, _tl, _hl) | |
if (Option["dump"]) | |
return content | |
tokenize(tokens, content) | |
parseJson(ast, tokens) | |
l(content, "content", 1, 1) | |
l(tokens, "tokens", 1, 0, 1) | |
l(ast, "ast") | |
if (!isarray(ast) || !anything(ast)) { | |
e("[ERROR] Oops! Something went wrong and I can't translate it for you :(") | |
ExitCode = 1 | |
return | |
} else if (ast[0 SUBSEP "Message"]) { | |
e("[ERROR] " unparameterize(ast[0 SUBSEP "Message"])) | |
e("[ERROR] " unparameterize(ast[0 SUBSEP "Details" SUBSEP 0])) | |
ExitCode = 1 | |
return | |
} | |
translation = unparameterize(ast[0 SUBSEP "items" SUBSEP 0 SUBSEP "text"]) | |
returnIl[0] = il = unparameterize(ast[0 SUBSEP "from"]) | |
if (Option["verbose"] < 0) | |
return getList(il) | |
if (!isVerbose) { | |
r = translation | |
} else { | |
wShowOriginal = Option["show-original"] | |
wShowTranslation = Option["show-translation"] | |
wShowLanguages = Option["show-languages"] | |
wShowDictionary = Option["show-dictionary"] | |
if (wShowOriginal) { | |
if (r) r = r RS RS | |
r = r m("-- display original text") | |
r = r prettify("original", s(text, il)) | |
} | |
if (wShowTranslation) { | |
if (r) r = r RS RS | |
r = r m("-- display major translation") | |
r = r prettify("translation", s(translation, tl)) | |
} | |
if (wShowLanguages) { | |
if (r) r = r RS RS | |
r = r m("-- display source language -> target language") | |
temp = Option["fmt-languages"] | |
if (!temp) temp = "[ %s -> %t ]" | |
split(temp, group, /(%s|%S|%t|%T)/) | |
r = r prettify("languages", group[1]) | |
if (temp ~ /%s/) | |
r = r prettify("languages-sl", getDisplay(il)) | |
if (temp ~ /%S/) | |
r = r prettify("languages-sl", getName(il)) | |
r = r prettify("languages", group[2]) | |
if (temp ~ /%t/) | |
r = r prettify("languages-tl", getDisplay(tl)) | |
if (temp ~ /%T/) | |
r = r prettify("languages-tl", getName(tl)) | |
r = r prettify("languages", group[3]) | |
} | |
if (wShowDictionary && false) { | |
dicContent = getResponse(text, il, _tl, _hl) | |
tokenize(dicTokens, dicContent) | |
parseJson(dicAst, dicTokens) | |
if (anything(dicAst)) { | |
if (r) r = r RS | |
r = r m("-- display dictionary entries") | |
} | |
} | |
} | |
if (toSpeech) { | |
returnPlaylist[0]["text"] = translation | |
returnPlaylist[0]["tl"] = tl | |
} | |
return r | |
} | |
BEGIN { provides("yandex") } | |
function genSID( content, group, temp) { | |
content = curl("http://translate.yandex.com") | |
match(content, /SID:[[:space:]]*'([^']+)'/, group) | |
if (group[1]) { | |
split(group[1], temp, ".") | |
SID = reverse(temp[1]) "." reverse(temp[2]) "." reverse(temp[3]) | |
} else { | |
e("[ERROR] Oops! Something went wrong and I can't translate it for you :(") | |
exit 1 | |
} | |
} | |
function yandexInit() { | |
genSID() | |
YandexWebTranslate = "z5h64q92x9.net" | |
HttpProtocol = "http://" | |
HttpHost = "translate.yandex.net" | |
HttpPort = 80 | |
} | |
function yandexRequestUrl(text, sl, tl, hl, group) { | |
split(sl, group, "-"); sl = group[1] | |
split(tl, group, "-"); tl = group[1] | |
return HttpPathPrefix "/api/v1/tr.json/translate?"\ | |
"id=" SID "-0-0&srv=tr-text"\ | |
"&text=" preprocess(text) "&lang=" (sl == "auto" ? tl : sl "-" tl) | |
} | |
function yandexGetDictionaryResponse(text, sl, tl, hl, content, header, isBody, url) { | |
split(sl, group, "-"); sl = group[1] | |
split(tl, group, "-"); tl = group[1] | |
url = HttpPathPrefix "/dicservice.json/lookup?"\ | |
"sid=" SID\ | |
"&text=" preprocess(text) "&lang=" (sl == "auto" ? tl : sl "-" tl) | |
header = "GET " url " HTTP/1.1\n"\ | |
"Host: " "dictionary.yandex.net" "\n"\ | |
"Connection: close\n" | |
if (Option["user-agent"]) | |
header = header "User-Agent: " Option["user-agent"] "\n" | |
content = NULLSTR; isBody = 0 | |
print header |& HttpService | |
while ((HttpService |& getline) > 0) { | |
if (isBody) | |
content = content ? content "\n" $0 : $0 | |
else if (length($0) <= 1) | |
isBody = 1 | |
l(sprintf("%4s bytes > %s", length($0), $0)) | |
} | |
close(HttpService) | |
return assert(content, "[ERROR] Null response.") | |
} | |
function yandexTTSUrl(text, tl, | |
speaker, emotion, i, group) { | |
speaker = NULLSTR | |
emotion = NULLSTR | |
split(Option["narrator"], group, ",") | |
for (i in group) { | |
if (group[i] ~ /^(g(ood)?|n(eutral)?|e(vil)?)$/) | |
emotion = group[i] | |
else if (group[i] ~ /^(f(emale)?|w(oman)?)$/) | |
speaker = "alyss" | |
else if (group[i] ~ /^m(ale|an)?$/) | |
speaker = "zahar" | |
else | |
speaker = group[i] | |
} | |
switch (tl) { | |
case "ar": tl = "ar_AE"; break | |
case "cs": tl = "cs_CZ"; break | |
case "da": tl = "da_DK"; break | |
case "de": tl = "de_DE"; break | |
case "el": tl = "el_GR"; break | |
case "en": tl = "en_GB"; break | |
case "es": tl = "es_ES"; break | |
case "fi": tl = "fi_FI"; break | |
case "fr": tl = "fr_FR"; break | |
case "it": tl = "it_IT"; break | |
case "nl": tl = "nl_NL"; break | |
case "no": tl = "no_NO"; break | |
case "pl": tl = "pl_PL"; break | |
case "pt": tl = "pt_PT"; break | |
case "ru": tl = "ru_RU"; break | |
case "sv": tl = "sv_SE"; break | |
case "tr": tl = "tr_TR"; break | |
default: tl = NULLSTR | |
} | |
return HttpProtocol "tts.voicetech.yandex.net" "/tts?"\ | |
"text=" preprocess(text) (tl ? "&lang=" tl : tl)\ | |
(speaker ? "&speaker=" speaker : speaker)\ | |
(emotion ? "&emotion=" emotion : emotion)\ | |
"&format=mp3" "&quality=hi" | |
} | |
function yandexWebTranslateUrl(uri, sl, tl, hl) { | |
gsub(/:\/\//, "/", uri) | |
return HttpProtocol YandexWebTranslate "/proxy_u/"\ | |
(sl == "auto" ? tl : sl "-" tl)"/" uri | |
} | |
function yandexTranslate(text, sl, tl, hl, | |
isVerbose, toSpeech, returnPlaylist, returnIl, | |
r, | |
content, tokens, ast, | |
_sl, _tl, _hl, il, | |
translation, | |
wShowOriginal, wShowTranslation, wShowLanguages, | |
wShowDictionary, dicContent, dicTokens, dicAst, | |
i, syn, mean, | |
group, temp) { | |
if (!getCode(tl)) { | |
w("[WARNING] Unknown target language code: " tl) | |
} else if (isRTL(tl)) { | |
if (!FriBidi) | |
w("[WARNING] " getName(tl) " is a right-to-left language, but FriBidi is not found.") | |
} | |
_sl = getCode(sl); if (!_sl) _sl = sl | |
_tl = getCode(tl); if (!_tl) _tl = tl | |
_hl = getCode(hl); if (!_hl) _hl = hl | |
content = getResponse(text, _sl, _tl, _hl) | |
if (Option["dump"]) | |
return content | |
tokenize(tokens, content) | |
parseJson(ast, tokens) | |
l(content, "content", 1, 1) | |
l(tokens, "tokens", 1, 0, 1) | |
l(ast, "ast") | |
if (!isarray(ast) || !anything(ast)) { | |
e("[ERROR] Oops! Something went wrong and I can't translate it for you :(") | |
ExitCode = 1 | |
return | |
} | |
if (ast[0 SUBSEP "code"] != "200") { | |
e("[ERROR] " unparameterize(ast[0 SUBSEP "message"])) | |
ExitCode = 1 | |
return | |
} | |
translation = unparameterize(ast[0 SUBSEP "text" SUBSEP 0]) | |
split(unparameterize(ast[0 SUBSEP "lang"]), group, "-") | |
returnIl[0] = il = group[1] | |
if (Option["verbose"] < 0) | |
return getList(il) | |
if (!isVerbose) { | |
r = translation | |
} else { | |
wShowOriginal = Option["show-original"] | |
wShowTranslation = Option["show-translation"] | |
wShowLanguages = Option["show-languages"] | |
wShowDictionary = Option["show-dictionary"] | |
if (wShowOriginal) { | |
if (r) r = r RS RS | |
r = r m("-- display original text") | |
r = r prettify("original", s(text, il)) | |
} | |
if (wShowTranslation) { | |
if (r) r = r RS RS | |
r = r m("-- display major translation") | |
r = r prettify("translation", s(translation, tl)) | |
} | |
if (wShowLanguages) { | |
if (r) r = r RS RS | |
r = r m("-- display source language -> target language") | |
temp = Option["fmt-languages"] | |
if (!temp) temp = "[ %s -> %t ]" | |
split(temp, group, /(%s|%S|%t|%T)/) | |
r = r prettify("languages", group[1]) | |
if (temp ~ /%s/) | |
r = r prettify("languages-sl", getDisplay(il)) | |
if (temp ~ /%S/) | |
r = r prettify("languages-sl", getName(il)) | |
r = r prettify("languages", group[2]) | |
if (temp ~ /%t/) | |
r = r prettify("languages-tl", getDisplay(tl)) | |
if (temp ~ /%T/) | |
r = r prettify("languages-tl", getName(tl)) | |
r = r prettify("languages", group[3]) | |
} | |
if (wShowDictionary) { | |
dicContent = yandexGetDictionaryResponse(text, _sl, _tl, _hl) | |
tokenize(dicTokens, dicContent) | |
parseJson(dicAst, dicTokens) | |
if (anything(dicAst)) { | |
if (r) r = r RS | |
r = r m("-- display dictionary entries") | |
saveSortedIn = PROCINFO["sorted_in"] | |
PROCINFO["sorted_in"] = "@ind_num_asc" | |
for (i in dicAst) { | |
if (i ~ "^0" SUBSEP "def" SUBSEP "[[:digit:]]+" SUBSEP\ | |
"pos$") { | |
r = r RS prettify("dictionary-word-class", s((literal(dicAst[i])), hl)) | |
syn = mean = "" | |
} | |
if (i ~ "^0" SUBSEP "def" SUBSEP "[[:digit:]]+" SUBSEP\ | |
"tr" SUBSEP "[[:digit:]]+" SUBSEP\ | |
"mean" SUBSEP "[[:digit:]]+" SUBSEP "text") { | |
if (mean) { | |
mean = mean prettify("dictionary-explanation", ", ")\ | |
prettify("dictionary-explanation-item", s((literal(dicAst[i])), sl)) | |
} else { | |
mean = prettify("dictionary-explanation-item", s((literal(dicAst[i])), sl)) | |
} | |
} | |
if (i ~ "^0" SUBSEP "def" SUBSEP "[[:digit:]]+" SUBSEP\ | |
"tr" SUBSEP "[[:digit:]]+" SUBSEP\ | |
"syn" SUBSEP "[[:digit:]]+" SUBSEP "text") { | |
if (syn) { | |
syn = syn prettify("dictionary-explanation", ", ")\ | |
prettify("dictionary-word", s((literal(dicAst[i])), il)) | |
} else { | |
syn = prettify("dictionary-word", s((literal(dicAst[i])), il)) | |
} | |
} | |
if (i ~ "^0" SUBSEP "def" SUBSEP "[[:digit:]]+" SUBSEP\ | |
"tr" SUBSEP "[[:digit:]]+" SUBSEP "text$") { | |
text = prettify("dictionary-word", s((literal(dicAst[i])), il)) | |
if (syn) { | |
r = r RS ins(1, text prettify("dictionary-explanation", ", ") syn) | |
} else { | |
r = r RS ins(1, text) | |
} | |
r = r RS ins(2, mean) | |
syn = mean = "" | |
} | |
} | |
PROCINFO["sorted_in"] = saveSortedIn | |
} | |
} | |
} | |
if (toSpeech) { | |
returnPlaylist[0]["text"] = translation | |
returnPlaylist[0]["tl"] = tl | |
} | |
return r | |
} | |
BEGIN { provides("apertium") } | |
function apertiumInit() { | |
HttpProtocol = "http://" | |
HttpHost = "www.apertium.org" | |
HttpPort = 80 | |
} | |
function apertiumRequestUrl(text, sl, tl, hl) { | |
return HttpPathPrefix "/apy/translate?"\ | |
"langpair=" preprocess(sl) "|" preprocess(tl)\ | |
"&q=" preprocess(text) | |
} | |
function apertiumTTSUrl(text, tl, narrator) { | |
} | |
function apertiumWebTranslateUrl(uri, sl, tl, hl) { | |
} | |
function apertiumTranslate(text, sl, tl, hl, | |
isVerbose, toSpeech, returnPlaylist, returnIl, | |
r, | |
content, tokens, ast, | |
_sl, _tl, _hl, il, | |
translation, | |
wShowOriginal, wShowTranslation, wShowLanguages, | |
group, temp) { | |
if (!getCode(tl)) { | |
w("[WARNING] Unknown target language code: " tl) | |
} else if (isRTL(tl)) { | |
if (!FriBidi) | |
w("[WARNING] " getName(tl) " is a right-to-left language, but FriBidi is not found.") | |
} | |
_sl = getCode(sl); if (!_sl) _sl = sl | |
_tl = getCode(tl); if (!_tl) _tl = tl | |
_hl = getCode(hl); if (!_hl) _hl = hl | |
_sl = "auto" == _sl ? "en" : _sl | |
content = getResponse(text, _sl, _tl, _hl) | |
if (Option["dump"]) | |
return content | |
tokenize(tokens, content) | |
parseJson(ast, tokens) | |
l(content, "content", 1, 1) | |
l(tokens, "tokens", 1, 0, 1) | |
l(ast, "ast") | |
if (!isarray(ast) || !anything(ast)) { | |
e("[ERROR] Oops! Something went wrong and I can't translate it for you :(") | |
ExitCode = 1 | |
return | |
} | |
translation = uprintf(unquote(unparameterize(ast[0 SUBSEP "responseData" SUBSEP "translatedText"]))) | |
returnIl[0] = il = _sl | |
if (Option["verbose"] < 0) | |
return getList(il) | |
if (!isVerbose) { | |
r = translation | |
} else { | |
wShowOriginal = Option["show-original"] | |
wShowTranslation = Option["show-translation"] | |
wShowLanguages = Option["show-languages"] | |
if (wShowOriginal) { | |
if (r) r = r RS RS | |
r = r m("-- display original text") | |
r = r prettify("original", s(text, il)) | |
} | |
if (wShowTranslation) { | |
if (r) r = r RS RS | |
r = r m("-- display major translation") | |
r = r prettify("translation", s(translation, tl)) | |
} | |
if (wShowLanguages) { | |
if (r) r = r RS RS | |
r = r m("-- display source language -> target language") | |
temp = Option["fmt-languages"] | |
if (!temp) temp = "[ %s -> %t ]" | |
split(temp, group, /(%s|%S|%t|%T)/) | |
r = r prettify("languages", group[1]) | |
if (temp ~ /%s/) | |
r = r prettify("languages-sl", getDisplay(il)) | |
if (temp ~ /%S/) | |
r = r prettify("languages-sl", getName(il)) | |
r = r prettify("languages", group[2]) | |
if (temp ~ /%t/) | |
r = r prettify("languages-tl", getDisplay(tl)) | |
if (temp ~ /%T/) | |
r = r prettify("languages-tl", getName(tl)) | |
r = r prettify("languages", group[3]) | |
} | |
} | |
if (toSpeech) { | |
returnPlaylist[0]["text"] = translation | |
returnPlaylist[0]["tl"] = tl | |
} | |
return r | |
} | |
BEGIN { | |
provides("spell") | |
provides("aspell") | |
provides("hunspell") | |
} | |
function spellInit() { | |
Ispell = detectProgram("aspell", "--version") ? "aspell" : | |
(detectProgram("hunspell", "--version") ? "hunspell" : "") | |
if (!Ispell) { | |
e("[ERROR] Spell checker (aspell or hunspell) not found.") | |
exit 1 | |
} | |
} | |
function aspellInit() { | |
if (!(Ispell = detectProgram("aspell", "--version") ? "aspell" : "")) { | |
e("[ERROR] Spell checker (aspell) not found.") | |
exit 1 | |
} | |
} | |
function hunspellInit() { | |
if (!(Ispell = detectProgram("hunspell", "--version") ? "hunspell" : "")) { | |
e("[ERROR] Spell checker (hunspell) not found.") | |
exit 1 | |
} | |
} | |
function spellTranslate(text, sl, tl, hl, | |
isVerbose, toSpeech, returnPlaylist, returnIl, | |
args, i, j, r, line, group, word, sug) { | |
args = " -a" (sl != "auto" ? " -d " sl : "") | |
if (system("echo" PIPE Ispell args SUPOUT SUPERR)) { | |
e("[ERROR] No dictionary for language: " sl) | |
exit 1 | |
} | |
i = 1 | |
r = "" | |
while ((("echo " parameterize(text) PIPE Ispell args SUPERR) |& getline line) > 0) { | |
match(line, | |
/^& (.*) [[:digit:]]+ [[:digit:]]+: ([^,]+)(, ([^,]+))?(, ([^,]+))?/, | |
group) | |
if (RSTART) { | |
ExitCode = 1 | |
word = group[1] | |
sug = "[" group[2] | |
if (group[4]) sug = sug "|" group[4] | |
if (group[6]) sug = sug "|" group[6] | |
sug = sug "]" | |
j = i + index(substr(text, i), word) - 1 | |
r = r substr(text, i, j - i) | |
r = r ansi("bold", ansi("red", word)) ansi("yellow", sug) | |
i = j + length(word) | |
} | |
} | |
r = r substr(text, i) | |
return r | |
} | |
function aspellTranslate(text, sl, tl, hl, | |
isVerbose, toSpeech, returnPlaylist, returnIl) { | |
return spellTranslate(text, sl, tl, hl) | |
} | |
function hunspellTranslate(text, sl, tl, hl, | |
isVerbose, toSpeech, returnPlaylist, returnIl) { | |
return spellTranslate(text, sl, tl, hl) | |
} | |
BEGIN { provides("deepl") } | |
function deeplInit() { | |
HttpProtocol = "http://" | |
HttpHost = "www.deepl.com" | |
HttpPort = 80 | |
} | |
function deeplRequestUrl(text, sl, tl, hl) { | |
} | |
function deeplTTSUrl(text, tl, narrator) { | |
} | |
function deeplWebTranslateUrl(uri, sl, tl, hl) { | |
} | |
function deeplPost(text, sl, tl, hl, | |
content, data, url) { | |
data = "{\"jsonrpc\":\"2.0\",\"method\":\"LMT_handle_jobs\"," | |
data = data "\"params\":{\"jobs\":[{\"kind\":\"default\"," | |
data = data "\"raw_en_sentence\":" parameterize(text, "\"") "}]," | |
data = data "\"lang\":{\"user_preferred_langs\":[\"" hl "\"]," | |
data = data "\"source_lang_user_selected\":\"" sl "\"," | |
data = data "\"target_lang\":\"" tl "\"}," | |
data = data "\"priority\":1},\"id\":1}" | |
l(data) | |
url = "https://www.deepl.com/jsonrpc" | |
content = curlPost(url, data) | |
return assert(content, "[ERROR] Null response.") | |
} | |
function deeplTranslate(text, sl, tl, hl, | |
isVerbose, toSpeech, returnPlaylist, returnIl, | |
r, | |
content, tokens, ast, | |
_sl, _tl, _hl, il, | |
translation, translations, | |
wShowOriginal, wShowTranslation, | |
wShowLanguages, wShowAlternatives, | |
group, temp) { | |
if (!getCode(tl)) { | |
w("[WARNING] Unknown target language code: " tl) | |
} else if (isRTL(tl)) { | |
if (!FriBidi) | |
w("[WARNING] " getName(tl) " is a right-to-left language, but FriBidi is not found.") | |
} | |
_sl = getCode(sl); if (!_sl) _sl = sl | |
_tl = getCode(tl); if (!_tl) _tl = tl | |
_hl = getCode(hl); if (!_hl) _hl = hl | |
if (_sl != "auto") _sl = toupper(_sl) | |
if (_tl != "auto") _tl = toupper(_tl) | |
if (_hl != "auto") _hl = toupper(_hl) | |
content = deeplPost(text, _sl, _tl, _hl) | |
if (Option["dump"]) | |
return content | |
tokenize(tokens, content) | |
parseJson(ast, tokens) | |
l(content, "content", 1, 1) | |
l(tokens, "tokens", 1, 0, 1) | |
l(ast, "ast") | |
if (!isarray(ast) || !anything(ast)) { | |
e("[ERROR] Oops! Something went wrong and I can't translate it for you :(") | |
ExitCode = 1 | |
return | |
} | |
saveSortedIn = PROCINFO["sorted_in"] | |
PROCINFO["sorted_in"] = "compareByIndexFields" | |
for (i in ast) { | |
if (i ~ "^0" SUBSEP "result" SUBSEP "translations" SUBSEP 0 SUBSEP "beams" SUBSEP "[[:digit:]]+" SUBSEP "postprocessed_sentence$") { | |
append(translations, uprintf(unquote(unparameterize(ast[i])))) | |
} | |
} | |
PROCINFO["sorted_in"] = saveSortedIn | |
translation = translations[0] | |
returnIl[0] = il = tolower(unparameterize(ast[0 SUBSEP "result" SUBSEP "source_lang"])) | |
if (Option["verbose"] < 0) | |
return getList(il) | |
if (!isVerbose) { | |
r = translation | |
} else { | |
wShowOriginal = Option["show-original"] | |
wShowTranslation = Option["show-translation"] | |
wShowLanguages = Option["show-languages"] | |
wShowAlternatives = Option["show-alternatives"] | |
if (length(translations) <= 1) wShowAlternatives = 0 | |
if (wShowOriginal) { | |
if (r) r = r RS RS | |
r = r m("-- display original text") | |
r = r prettify("original", s(text, il)) | |
} | |
if (wShowTranslation) { | |
if (r) r = r RS RS | |
r = r m("-- display major translation") | |
r = r prettify("translation", s(translation, tl)) | |
} | |
if (wShowLanguages) { | |
if (r) r = r RS RS | |
r = r m("-- display source language -> target language") | |
temp = Option["fmt-languages"] | |
if (!temp) temp = "[ %s -> %t ]" | |
split(temp, group, /(%s|%S|%t|%T)/) | |
r = r prettify("languages", group[1]) | |
if (temp ~ /%s/) | |
r = r prettify("languages-sl", getDisplay(il)) | |
if (temp ~ /%S/) | |
r = r prettify("languages-sl", getName(il)) | |
r = r prettify("languages", group[2]) | |
if (temp ~ /%t/) | |
r = r prettify("languages-tl", getDisplay(tl)) | |
if (temp ~ /%T/) | |
r = r prettify("languages-tl", getName(tl)) | |
r = r prettify("languages", group[3]) | |
} | |
if (wShowAlternatives) { | |
if (r) r = r RS | |
r = r m("-- display alternative translations") | |
r = r RS ins(1, prettify("alternatives-translations-item", translations[1])) | |
for (i = 2; i < length(translations); i++) | |
r = r RS ins(1, prettify("alternatives-translations-item", translations[i])) | |
} | |
} | |
if (toSpeech) { | |
returnPlaylist[0]["text"] = translation | |
returnPlaylist[0]["tl"] = tl | |
} | |
return r | |
} | |
function loadOptions(script, i, j, tokens, name, value) { | |
tokenize(tokens, script) | |
for (i in tokens) { | |
if (tokens[i] ~ /^:/) { | |
name = substr(tokens[i], 2) | |
value = tokens[i + 1] | |
if (value ~ /^[+-]?((0|[1-9][0-9]*)|[.][0-9]*|(0|[1-9][0-9]*)[.][0-9]*)([Ee][+-]?[0-9]+)?$/) { | |
delete Option[name] | |
Option[name] = value | |
} else if (value == "false" || value == "true") { | |
delete Option[name] | |
Option[name] = yn(value) | |
} else if (value ~ /^".*"$/) { | |
delete Option[name] | |
Option[name] = literal(value) | |
} else if (value == "[") { | |
delete Option[name] | |
for (j = 1; tokens[i + j + 1] && tokens[i + j + 1] != "]"; j++) { | |
if (tokens[i + j + 1] ~ /^".*"$/) | |
Option[name][j] = literal(tokens[i + j + 1]) | |
else { | |
e("[ERROR] Malformed configuration.") | |
return | |
} | |
} | |
} else { | |
e("[ERROR] Malformed configuration.") | |
return | |
} | |
} | |
} | |
} | |
function upgrade( i, newVersion, registry, tokens) { | |
RegistryIndex = "https://raw.githubusercontent.com/soimort/translate-shell/registry/index.trans" | |
registry = curl(RegistryIndex) | |
if (!registry) { | |
e("[ERROR] Failed to check for upgrade.") | |
ExitCode = 1 | |
return | |
} | |
tokenize(tokens, registry) | |
for (i in tokens) | |
if (tokens[i] == ":translate-shell") | |
newVersion = literal(tokens[i + 1]) | |
if (newerVersion(newVersion, Version)) { | |
w("Current version: \t" Version) | |
w("New version available: \t" newVersion) | |
w("Download from: \t" "https://www.soimort.org/translate-shell/trans") | |
} else { | |
w("Current version: \t" Version) | |
w("Already up-to-date.") | |
} | |
} | |
function welcome() { | |
if (Option["fmt-welcome-message"]) | |
print prettify("welcome-message", Option["fmt-welcome-message"]) > STDERR | |
if (Option["fmt-welcome-submessage"]) | |
print prettify("welcome-submessage", Option["fmt-welcome-submessage"]) > STDERR | |
} | |
function prompt( i, p, temp) { | |
p = Option["fmt-prompt"] | |
if (p ~ /%a/) gsub(/%a/, strftime("%a"), p) | |
if (p ~ /%A/) gsub(/%A/, strftime("%A"), p) | |
if (p ~ /%b/) gsub(/%b/, strftime("%b"), p) | |
if (p ~ /%B/) gsub(/%B/, strftime("%B"), p) | |
if (p ~ /%c/) gsub(/%c/, strftime("%c"), p) | |
if (p ~ /%C/) gsub(/%C/, strftime("%C"), p) | |
if (p ~ /%d/) gsub(/%d/, strftime("%d"), p) | |
if (p ~ /%D/) gsub(/%D/, strftime("%D"), p) | |
if (p ~ /%e/) gsub(/%e/, strftime("%e"), p) | |
if (p ~ /%F/) gsub(/%F/, strftime("%F"), p) | |
if (p ~ /%g/) gsub(/%g/, strftime("%g"), p) | |
if (p ~ /%G/) gsub(/%G/, strftime("%G"), p) | |
if (p ~ /%h/) gsub(/%h/, strftime("%h"), p) | |
if (p ~ /%H/) gsub(/%H/, strftime("%H"), p) | |
if (p ~ /%I/) gsub(/%I/, strftime("%I"), p) | |
if (p ~ /%j/) gsub(/%j/, strftime("%j"), p) | |
if (p ~ /%m/) gsub(/%m/, strftime("%m"), p) | |
if (p ~ /%M/) gsub(/%M/, strftime("%M"), p) | |
if (p ~ /%n/) gsub(/%n/, strftime("%n"), p) | |
if (p ~ /%p/) gsub(/%p/, strftime("%p"), p) | |
if (p ~ /%r/) gsub(/%r/, strftime("%r"), p) | |
if (p ~ /%R/) gsub(/%R/, strftime("%R"), p) | |
if (p ~ /%u/) gsub(/%u/, strftime("%u"), p) | |
if (p ~ /%U/) gsub(/%U/, strftime("%U"), p) | |
if (p ~ /%V/) gsub(/%V/, strftime("%V"), p) | |
if (p ~ /%w/) gsub(/%w/, strftime("%w"), p) | |
if (p ~ /%W/) gsub(/%W/, strftime("%W"), p) | |
if (p ~ /%x/) gsub(/%x/, strftime("%x"), p) | |
if (p ~ /%X/) gsub(/%X/, strftime("%X"), p) | |
if (p ~ /%y/) gsub(/%y/, strftime("%y"), p) | |
if (p ~ /%Y/) gsub(/%Y/, strftime("%Y"), p) | |
if (p ~ /%z/) gsub(/%z/, strftime("%z"), p) | |
if (p ~ /%Z/) gsub(/%Z/, strftime("%Z"), p) | |
if (p ~ /%_/) | |
gsub(/%_/, showTranslationsOf(Option["hl"]), p) | |
if (p ~ /%l/) | |
gsub(/%l/, getDisplay(Option["hl"]), p) | |
if (p ~ /%L/) | |
gsub(/%L/, getName(Option["hl"]), p) | |
if (p ~ /%S/) | |
gsub(/%S/, getName(Option["sl"]), p) | |
if (p ~ /%t/) { | |
temp = getDisplay(Option["tl"][1]) | |
for (i = 2; i <= length(Option["tl"]); i++) | |
temp = temp "+" getDisplay(Option["tl"][i]) | |
gsub(/%t/, temp, p) | |
} | |
if (p ~ /%T/) { | |
temp = getName(Option["tl"][1]) | |
for (i = 2; i <= length(Option["tl"]); i++) | |
temp = temp "+" getName(Option["tl"][i]) | |
gsub(/%T/, temp, p) | |
} | |
if (p ~ /%,/) { | |
temp = getDisplay(Option["tl"][1]) | |
for (i = 2; i <= length(Option["tl"]); i++) | |
temp = temp "," getDisplay(Option["tl"][i]) | |
gsub(/%,/, temp, p) | |
} | |
if (p ~ /%</) { | |
temp = getName(Option["tl"][1]) | |
for (i = 2; i <= length(Option["tl"]); i++) | |
temp = temp "," getName(Option["tl"][i]) | |
gsub(/%</, temp, p) | |
} | |
if (p ~ /%\//) { | |
temp = getDisplay(Option["tl"][1]) | |
for (i = 2; i <= length(Option["tl"]); i++) | |
temp = temp "/" getDisplay(Option["tl"][i]) | |
gsub(/%\//, temp, p) | |
} | |
if (p ~ /%\?/) { | |
temp = getName(Option["tl"][1]) | |
for (i = 2; i <= length(Option["tl"]); i++) | |
temp = temp "/" getName(Option["tl"][i]) | |
gsub(/%\?/, temp, p) | |
} | |
printf(prettify("prompt", p), getDisplay(Option["sl"])) > STDERR | |
} | |
function repl(line, command, group, name, i, value, words) { | |
split(line, words, " ") | |
command = words[1] | |
if (command ~ /^:(q|quit)$/) { | |
exit | |
} else if (command ~ /^:set$/) { | |
name = words[2] | |
value = words[3] | |
Option[name] = value | |
} else if (command ~ /^:show$/) { | |
name = words[2] | |
print prettify("welcome-submessage", toString(Option[name], 1, 0, 1)) | |
} else if (command ~ /^:engine$/) { | |
value = words[2] | |
Option["engine"] = value | |
initHttpService() | |
} else { | |
match(command, /^[{(\[]?([[:alpha:]][[:alpha:]][[:alpha:]]?(-[[:alpha:]][[:alpha:]][[:alpha:]]?[[:alpha:]]?)?)?(:|=)((@?[[:alpha:]][[:alpha:]][[:alpha:]]?(-[[:alpha:]][[:alpha:]][[:alpha:]]?[[:alpha:]]?)?\+)*(@?[[:alpha:]][[:alpha:]][[:alpha:]]?(-[[:alpha:]][[:alpha:]][[:alpha:]]?[[:alpha:]]?)?)?)[})\]]?$/, group) | |
if (RSTART) { | |
if (group[1]) Option["sl"] = group[1] | |
if (group[4]) split(group[4], Option["tl"], "+") | |
line = words[2] | |
for (i = 3; i <= length(words); i++) | |
line = line " " words[i] | |
} | |
if (line) { | |
translate(line) | |
if (Option["verbose"]) printf RS | |
} | |
} | |
prompt() | |
} | |
function init() { | |
initGawk() | |
initBiDi() | |
initLocale() | |
initUserLang() | |
RS = "\n" | |
ExitCode = 0 | |
Option["debug"] = 0 | |
Option["engine"] = "google" | |
Option["verbose"] = 1 | |
Option["show-original"] = 1 | |
Option["show-original-phonetics"] = 1 | |
Option["show-translation"] = 1 | |
Option["show-translation-phonetics"] = 1 | |
Option["show-prompt-message"] = 1 | |
Option["show-languages"] = 1 | |
Option["show-original-dictionary"] = 0 | |
Option["show-dictionary"] = 1 | |
Option["show-alternatives"] = 1 | |
Option["width"] = ENVIRON["COLUMNS"] ? ENVIRON["COLUMNS"] - 2 : 0 | |
Option["indent"] = 4 | |
Option["no-ansi"] = 0 | |
Option["no-autocorrect"] = 0 | |
Option["no-bidi"] = 0 | |
Option["no-warn"] = 0 | |
Option["theme"] = "default" | |
Option["dump"] = 0 | |
Option["play"] = 0 | |
Option["narrator"] = "female" | |
Option["player"] = ENVIRON["PLAYER"] | |
Option["no-translate"] = 0 | |
Option["download-audio"] = 0 | |
Option["download-audio-as"] = NULLSTR | |
Option["view"] = 0 | |
Option["pager"] = ENVIRON["PAGER"] | |
Option["browser"] = ENVIRON["BROWSER"] | |
Option["proxy"] = ENVIRON["HTTP_PROXY"] ? ENVIRON["HTTP_PROXY"] : ENVIRON["http_proxy"] | |
Option["user-agent"] = ENVIRON["USER_AGENT"] ? ENVIRON["USER_AGENT"] : | |
"Mozilla/5.0 (X11; Linux x86_64) "\ | |
"AppleWebKit/602.1 (KHTML, like Gecko) Version/8.0 "\ | |
"Safari/602.1 Epiphany/3.18.2" | |
Option["no-rlwrap"] = 0 | |
Option["interactive"] = 0 | |
Option["emacs"] = 0 | |
Option["input"] = NULLSTR | |
Option["output"] = STDOUT | |
Option["hl"] = ENVIRON["HOME_LANG"] ? ENVIRON["HOME_LANG"] : UserLang | |
Option["sl"] = ENVIRON["SOURCE_LANG"] ? ENVIRON["SOURCE_LANG"] : "auto" | |
Option["tl"][1] = ENVIRON["TARGET_LANG"] ? ENVIRON["TARGET_LANG"] : UserLang | |
} | |
function initScript( file, line, script, temp) { | |
file = ".trans" | |
if (!fileExists(file)) { | |
file = ENVIRON["HOME"] "/.translate-shell/init.trans" | |
if (!fileExists(file)) { | |
file = ENVIRON["XDG_CONFIG_HOME"] "/translate-shell/init.trans" | |
if (!fileExists(file)) { | |
file = ENVIRON["HOME"] "/.config/translate-shell/init.trans" | |
if (!fileExists(file)) { | |
file = "/etc/translate-shell" | |
if (!fileExists(file)) return | |
} | |
} | |
} | |
} | |
InitScript = file | |
script = NULLSTR | |
while (getline line < InitScript) | |
script = script "\n" line | |
loadOptions(script) | |
if (!isarray(Option["tl"])) { | |
temp = Option["tl"] | |
delete Option["tl"] | |
Option["tl"][1] = temp | |
} | |
} | |
function initMisc( group, temp) { | |
initHttpService() | |
if (!Option["width"] && detectProgram("tput", "-V")) { | |
"tput cols" SUPERR | getline temp | |
Option["width"] = temp ? temp - 2 : 64 | |
} | |
if (Option["no-ansi"]) | |
delete AnsiCode | |
if (Option["no-bidi"]) | |
BiDi = BiDiNoPad = NULLSTR | |
if (Option["no-warn"]) | |
STDERR = "/dev/null" | |
if (Option["play"]) { | |
if (!Option["player"]) { | |
initAudioPlayer() | |
Option["player"] = AudioPlayer ? AudioPlayer : Option["player"] | |
if (!Option["player"]) | |
initSpeechSynthesizer() | |
} | |
if (!Option["player"] && !SpeechSynthesizer) { | |
w("[WARNING] No available audio player or speech synthesizer.") | |
Option["play"] = 0 | |
} | |
} | |
if (Option["view"]) { | |
if (!Option["pager"]) { | |
initPager() | |
Option["pager"] = Pager | |
} | |
if (!Option["pager"]) { | |
w("[WARNING] No available terminal pager.") | |
Option["view"] = 0 | |
} | |
} | |
if (!Option["browser"]) { | |
"xdg-mime query default text/html" SUPERR | getline Option["browser"] | |
match(Option["browser"], "(.*).desktop$", group) | |
Option["browser"] = group[1] | |
} | |
} | |
BEGIN { | |
init() | |
if (!(belongsTo("-no-init", ARGV) || belongsTo("--no-init", ARGV))) | |
initScript() | |
pos = 0 | |
noargc = 0 | |
while (ARGV[++pos]) { | |
match(ARGV[pos], /^--?(V|vers(i(on?)?)?)$/) | |
if (RSTART) { | |
InfoOnly = "version" | |
continue | |
} | |
match(ARGV[pos], /^--?(H|h(e(lp?)?)?)$/) | |
if (RSTART) { | |
InfoOnly = "help" | |
continue | |
} | |
match(ARGV[pos], /^--?(M|m(a(n(u(al?)?)?)?)?)$/) | |
if (RSTART) { | |
InfoOnly = "manual" | |
continue | |
} | |
match(ARGV[pos], /^--?(T|ref(e(r(e(n(ce?)?)?)?)?)?)$/) | |
if (RSTART) { | |
InfoOnly = "reference" | |
continue | |
} | |
match(ARGV[pos], /^--?r$/) | |
if (RSTART) { | |
w("[WARNING] Option '-r' has been deprecated since version 0.9.\n"\ | |
" Use option '-T' or '-reference' instead.") | |
exit 1 | |
} | |
match(ARGV[pos], /^--?(R|reference-e(n(g(l(i(sh?)?)?)?)?)?)$/) | |
if (RSTART) { | |
InfoOnly = "reference-english" | |
continue | |
} | |
match(ARGV[pos], /^--?(L|list)(=(.*)?)?$/, group) | |
if (RSTART) { | |
InfoOnly = "list" | |
if (group[2]) { | |
if (group[3]) split(group[3], Option["tl"], "+") | |
} else | |
split(ARGV[++pos], Option["tl"], "+") | |
continue | |
} | |
match(ARGV[pos], /^--?(S|list-e(n(g(i(n(es?)?)?)?)?)?)$/) | |
if (RSTART) { | |
InfoOnly = "list-engines" | |
continue | |
} | |
match(ARGV[pos], /^--?(U|upgrade)$/) | |
if (RSTART) { | |
InfoOnly = "upgrade" | |
continue | |
} | |
match(ARGV[pos], /^--?(N|nothing)$/) | |
if (RSTART) { | |
InfoOnly = "nothing" | |
continue | |
} | |
match(ARGV[pos], /^--?(e|engine)(=(.*)?)?$/, group) | |
if (RSTART) { | |
Option["engine"] = group[2] ? | |
(group[3] ? group[3] : Option["engine"]) : | |
ARGV[++pos] | |
continue | |
} | |
match(ARGV[pos], /^\/(.*)$/, group) | |
if (RSTART) { | |
Option["engine"] = group[1] | |
continue | |
} | |
match(ARGV[pos], /^--?verbose$/) | |
if (RSTART) { | |
Option["verbose"] = 1 | |
continue | |
} | |
match(ARGV[pos], /^--?b(r(i(ef?)?)?)?$/) | |
if (RSTART) { | |
Option["verbose"] = 0 | |
continue | |
} | |
match(ARGV[pos], /^--?d(i(c(t(i(o(n(a(ry?)?)?)?)?)?)?)?)?$/) | |
if (RSTART) { | |
Option["show-original-dictionary"] = 1 | |
Option["show-dictionary"] = 0 | |
Option["show-alternatives"] = 0 | |
continue | |
} | |
match(ARGV[pos], /^--?id(e(n(t(i(fy?)?)?)?)?)?$/) | |
if (RSTART) { | |
Option["verbose"] = -1 | |
continue | |
} | |
match(ARGV[pos], /^--?show-original(=(.*)?)?$/, group) | |
if (RSTART) { | |
Option["show-original"] = yn(group[1] ? group[2] : ARGV[++pos]) | |
continue | |
} | |
match(ARGV[pos], /^--?show-original-phonetics(=(.*)?)?$/, group) | |
if (RSTART) { | |
Option["show-original-phonetics"] = yn(group[1] ? group[2] : ARGV[++pos]) | |
continue | |
} | |
match(ARGV[pos], /^--?show-translation(=(.*)?)?$/, group) | |
if (RSTART) { | |
Option["show-translation"] = yn(group[1] ? group[2] : ARGV[++pos]) | |
continue | |
} | |
match(ARGV[pos], /^--?show-translation-phonetics(=(.*)?)?$/, group) | |
if (RSTART) { | |
Option["show-translation-phonetics"] = yn(group[1] ? group[2] : ARGV[++pos]) | |
continue | |
} | |
match(ARGV[pos], /^--?show-prompt-message(=(.*)?)?$/, group) | |
if (RSTART) { | |
Option["show-prompt-message"] = yn(group[1] ? group[2] : ARGV[++pos]) | |
continue | |
} | |
match(ARGV[pos], /^--?show-languages(=(.*)?)?$/, group) | |
if (RSTART) { | |
Option["show-languages"] = yn(group[1] ? group[2] : ARGV[++pos]) | |
continue | |
} | |
match(ARGV[pos], /^--?show-original-dictionary(=(.*)?)?$/, group) | |
if (RSTART) { | |
Option["show-original-dictionary"] = yn(group[1] ? group[2] : ARGV[++pos]) | |
continue | |
} | |
match(ARGV[pos], /^--?show-dictionary(=(.*)?)?$/, group) | |
if (RSTART) { | |
Option["show-dictionary"] = yn(group[1] ? group[2] : ARGV[++pos]) | |
continue | |
} | |
match(ARGV[pos], /^--?show-alternatives(=(.*)?)?$/, group) | |
if (RSTART) { | |
Option["show-alternatives"] = yn(group[1] ? group[2] : ARGV[++pos]) | |
continue | |
} | |
match(ARGV[pos], /^--?w(i(d(th?)?)?)?(=(.*)?)?$/, group) | |
if (RSTART) { | |
Option["width"] = group[4] ? | |
(group[5] ? group[5] : Option["width"]) : | |
ARGV[++pos] | |
continue | |
} | |
match(ARGV[pos], /^--?indent(=(.*)?)?$/, group) | |
if (RSTART) { | |
Option["indent"] = group[1] ? | |
(group[2] ? group[2] : Option["indent"]) : | |
ARGV[++pos] | |
continue | |
} | |
match(ARGV[pos], /^--?theme(=(.*)?)?$/, group) | |
if (RSTART) { | |
Option["theme"] = group[1] ? | |
(group[2] ? group[2] : Option["theme"]) : | |
ARGV[++pos] | |
continue | |
} | |
match(ARGV[pos], /^--?no-theme$/) | |
if (RSTART) { | |
Option["theme"] = NULLSTR | |
continue | |
} | |
match(ARGV[pos], /^--?no-ansi$/) | |
if (RSTART) { | |
Option["no-ansi"] = 1 | |
continue | |
} | |
match(ARGV[pos], /^--?no-auto(correct)?$/) | |
if (RSTART) { | |
Option["no-autocorrect"] = 1 | |
continue | |
} | |
match(ARGV[pos], /^--?no-bidi/) | |
if (RSTART) { | |
Option["no-bidi"] = 1 | |
continue | |
} | |
match(ARGV[pos], /^--?no-warn/) | |
if (RSTART) { | |
Option["no-warn"] = 1 | |
continue | |
} | |
match(ARGV[pos], /^--?dump/) | |
if (RSTART) { | |
Option["dump"] = 1 | |
continue | |
} | |
match(ARGV[pos], /^--?p(l(ay?)?)?$/) | |
if (RSTART) { | |
Option["play"] = 1 | |
continue | |
} | |
match(ARGV[pos], /^--?sp(e(ak?)?)?$/) | |
if (RSTART) { | |
Option["play"] = 2 | |
continue | |
} | |
match(ARGV[pos], /^--?(n|narrator)(=(.*)?)?$/, group) | |
if (RSTART) { | |
if (!Option["play"]) Option["play"] = 1 | |
Option["narrator"] = group[2] ? | |
(group[3] ? group[3] : Option["narrator"]) : | |
ARGV[++pos] | |
continue | |
} | |
match(ARGV[pos], /^--?player(=(.*)?)?$/, group) | |
if (RSTART) { | |
if (!Option["play"]) Option["play"] = 1 | |
Option["player"] = group[1] ? | |
(group[2] ? group[2] : Option["player"]) : | |
ARGV[++pos] | |
continue | |
} | |
match(ARGV[pos], /^--?no-play$/) | |
if (RSTART) { | |
Option["play"] = 0 | |
continue | |
} | |
match(ARGV[pos], /^--?no-tran(s(l(a(te?)?)?)?)?$/) | |
if (RSTART) { | |
Option["no-translate"] = 1 | |
continue | |
} | |
match(ARGV[pos], /^--?download-a(u(d(io?)?)?)?$/) | |
if (RSTART) { | |
Option["download-audio"] = 1 | |
continue | |
} | |
match(ARGV[pos], /^--?download-audio-as(=(.*)?)?$/, group) | |
if (RSTART) { | |
if (!Option["download-audio"]) Option["download-audio"] = 1 | |
Option["download-audio-as"] = group[1] ? | |
(group[2] ? group[2] : Option["download-audio-as"]) : | |
ARGV[++pos] | |
continue | |
} | |
match(ARGV[pos], /^--?v(i(ew?)?)?$/) | |
if (RSTART) { | |
Option["view"] = 1 | |
continue | |
} | |
match(ARGV[pos], /^--?pager(=(.*)?)?$/, group) | |
if (RSTART) { | |
Option["view"] = 1 | |
Option["pager"] = group[1] ? | |
(group[2] ? group[2] : Option["pager"]) : | |
ARGV[++pos] | |
continue | |
} | |
match(ARGV[pos], /^--?no-view$/) | |
if (RSTART) { | |
Option["view"] = 0 | |
continue | |
} | |
match(ARGV[pos], /^--?browser(=(.*)?)?$/, group) | |
if (RSTART) { | |
Option["browser"] = group[1] ? | |
(group[2] ? group[2] : Option["browser"]) : | |
ARGV[++pos] | |
continue | |
} | |
match(ARGV[pos], /^--?(x|proxy)(=(.*)?)?$/, group) | |
if (RSTART) { | |
Option["proxy"] = group[2] ? | |
(group[3] ? group[3] : Option["proxy"]) : | |
ARGV[++pos] | |
continue | |
} | |
match(ARGV[pos], /^--?(u|user-agent)(=(.*)?)?$/, group) | |
if (RSTART) { | |
Option["user-agent"] = group[2] ? | |
(group[3] ? group[3] : Option["user-agent"]) : | |
ARGV[++pos] | |
continue | |
} | |
match(ARGV[pos], /^--?(I|int(e(r(a(c(t(i(ve?)?)?)?)?)?)?)?|shell)$/) | |
if (RSTART) { | |
Option["interactive"] = 1 | |
continue | |
} | |
match(ARGV[pos], /^--?(E|emacs)$/) | |
if (RSTART) { | |
Option["emacs"] = 1 | |
continue | |
} | |
match(ARGV[pos], /^--?no-rlwrap$/) | |
if (RSTART) { | |
Option["no-rlwrap"] = 1 | |
continue | |
} | |
match(ARGV[pos], /^--?prompt(=(.*)?)?$/, group) | |
if (RSTART) { | |
w("[ERROR] Option '-prompt' has been deprecated since version 0.9.\n"\ | |
" Use configuration variable 'fmt-prompt' instead.") | |
exit 1 | |
} | |
match(ARGV[pos], /^--?prompt-color(=(.*)?)?$/, group) | |
if (RSTART) { | |
w("[ERROR] Option '-prompt-color' has been deprecated since version 0.9.\n"\ | |
" Use configuration variable 'sgr-prompt' instead.") | |
exit 1 | |
} | |
match(ARGV[pos], /^--?i(n(p(ut?)?)?)?(=(.*)?)?$/, group) | |
if (RSTART) { | |
Option["input"] = group[4] ? | |
(group[5] ? group[5] : Option["input"]) : | |
ARGV[++pos] | |
continue | |
} | |
match(ARGV[pos], /^--?o(u(t(p(ut?)?)?)?)?(=(.*)?)?$/, group) | |
if (RSTART) { | |
Option["output"] = group[5] ? | |
(group[6] ? group[6] : Option["output"]) : | |
ARGV[++pos] | |
continue | |
} | |
match(ARGV[pos], /^--?(l(a(ng?)?)?|hl)(=(.*)?)?$/, group) | |
if (RSTART) { | |
Option["hl"] = group[4] ? | |
(group[5] ? group[5] : Option["hl"]) : | |
ARGV[++pos] | |
continue | |
} | |
match(ARGV[pos], /^--?(s(o(u(r(ce?)?)?)?|l)?|f|from)(=(.*)?)?$/, group) | |
if (RSTART) { | |
Option["sl"] = group[6] ? | |
(group[7] ? group[7] : Option["sl"]) : | |
ARGV[++pos] | |
continue | |
} | |
match(ARGV[pos], /^--?t(a(r(g(et?)?)?)?|l|o)?(=(.*)?)?$/, group) | |
if (RSTART) { | |
if (group[5]) { | |
if (group[6]) split(group[6], Option["tl"], "+") | |
} else | |
split(ARGV[++pos], Option["tl"], "+") | |
continue | |
} | |
match(ARGV[pos], /^[{(\[]?([[:alpha:]][[:alpha:]][[:alpha:]]?(-[[:alpha:]][[:alpha:]][[:alpha:]]?[[:alpha:]]?)?)?(:|=)((@?[[:alpha:]][[:alpha:]][[:alpha:]]?(-[[:alpha:]][[:alpha:]][[:alpha:]]?[[:alpha:]]?)?\+)*(@?[[:alpha:]][[:alpha:]][[:alpha:]]?(-[[:alpha:]][[:alpha:]][[:alpha:]]?[[:alpha:]]?)?)?)[})\]]?$/, group) | |
if (RSTART) { | |
if (group[1]) Option["sl"] = group[1] | |
if (group[4]) split(group[4], Option["tl"], "+") | |
continue | |
} | |
match(ARGV[pos], /^--?(D|debug)$/) | |
if (RSTART) { | |
Option["debug"] = 1 | |
continue | |
} | |
match(ARGV[pos], /^--?no-init/) | |
if (RSTART) continue | |
match(ARGV[pos], /^-(-?no-op)?$/) | |
if (RSTART) continue | |
match(ARGV[pos], /^--$/) | |
if (RSTART) { | |
++pos | |
break | |
} | |
noargv[noargc++] = ARGV[pos] | |
} | |
if (Option["interactive"] && !Option["no-rlwrap"]) | |
rlwrapMe() | |
else if (Option["emacs"] && !Option["interactive"] && !Option["no-rlwrap"]) | |
if (emacsMe()) | |
Option["interactive"] = 1 | |
initMisc() | |
switch (InfoOnly) { | |
case "version": | |
print getVersion() | |
exit ExitCode | |
case "help": | |
print getHelp() | |
exit ExitCode | |
case "manual": | |
showMan() | |
exit ExitCode | |
case "reference": | |
print getReference("endonym") | |
exit ExitCode | |
case "reference-english": | |
print getReference("name") | |
exit ExitCode | |
case "list": | |
print getList(Option["tl"]) | |
exit ExitCode | |
case "list-engines": | |
for (translator in Translator) | |
print (Option["engine"] == translator ? "* " : " ") translator | |
exit ExitCode | |
case "upgrade": | |
upgrade() | |
exit ExitCode | |
case "nothing": | |
exit ExitCode | |
} | |
setTheme() | |
if (Option["interactive"]) | |
welcome() | |
if (pos < ARGC) | |
for (i = pos; i < ARGC; i++) | |
noargv[noargc++] = ARGV[i] | |
if (noargc) { | |
for (i = 0; i < noargc; i++) { | |
if (Option["verbose"] && i > pos) | |
p(prettify("source-seperator", replicate(Option["chr-source-seperator"], Option["width"]))) | |
translate(noargv[i], 1) | |
} | |
} else { | |
if (!Option["input"]) Option["input"] = STDIN | |
} | |
if (Option["input"]) | |
translateMain() | |
exit ExitCode | |
} | |
EOF | |
read -r -d '' TRANS_MANPAGE << 'EOF' | |
.\" Automatically generated by Pandoc 2.0 | |
.\" | |
.TH "TRANS" "1" "2017\-12\-17" "0.9.6.6" "" | |
.hy | |
.SH NAME | |
.PP | |
trans \- Command\-line translator using Google Translate, Bing | |
Translator, Yandex.Translate, DeepL Translator, etc. | |
.SH SYNOPSIS | |
.PP | |
\f[B]trans\f[] [\f[I]OPTIONS\f[]] [\f[I]SOURCE\f[]]:[\f[I]TARGETS\f[]] | |
[\f[I]TEXT\f[]]... | |
.SH DESCRIPTION | |
.PP | |
This tool translates text into any language from the command\-line, | |
using a translation engine such as Google Translate, Bing Translator and | |
Yandex.Translate. | |
.PP | |
Each argument which is not a valid option is treated as \f[I]TEXT\f[] to | |
be translated. | |
.PP | |
If neither \f[I]TEXT\f[] nor the input file is specified by | |
command\-line arguments, the program will read and translate from | |
standard input. | |
.SH OPTIONS | |
.SS Information options | |
.TP | |
.B \f[B]\-V\f[], \f[B]\-version\f[] | |
Print version and exit. | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-H\f[], \f[B]\-help\f[] | |
Print help message and exit. | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-M\f[], \f[B]\-man\f[] | |
Show man page and exit. | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-T\f[], \f[B]\-reference\f[] | |
Print reference table of all supported languages and codes, and exit. | |
Names of languages are displayed in their endonyms (language name in the | |
language itself). | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-R\f[], \f[B]\-reference\-english\f[] | |
Print reference table of all supported languages and codes, and exit. | |
Names of languages are displayed in English. | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-L\f[] \f[I]CODES\f[], \f[B]\-list\f[] \f[I]CODES\f[] | |
Print details of languages and exit. | |
When specifying two or more language codes, concatenate them by plus | |
sign "+". | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-S\f[], \f[B]\-list\-engines\f[] | |
List available translation engines and exit. | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-U\f[], \f[B]\-upgrade\f[] | |
Check for upgrade of this program. | |
.RS | |
.RE | |
.SS Translator options | |
.TP | |
.B \f[B]\-e\f[] \f[I]ENGINE\f[], \f[B]\-engine\f[] \f[I]ENGINE\f[] | |
Specify the translation engine to use. | |
(default: google) | |
.RS | |
.RE | |
.SS Display options | |
.TP | |
.B \f[B]\-verbose\f[] | |
Verbose mode. | |
.RS | |
.PP | |
Show the original text and its most relevant translation, then its | |
phonetic notation (if any), then its alternative translations (if any) | |
or its definition in the dictionary (if it is a word). | |
.PP | |
This option is unnecessary in most cases since verbose mode is enabled | |
by default. | |
.RE | |
.TP | |
.B \f[B]\-b\f[], \f[B]\-brief\f[] | |
Brief mode. | |
.RS | |
.PP | |
Show the most relevant translation or its phonetic notation only. | |
.RE | |
.TP | |
.B \f[B]\-d\f[], \f[B]\-dictionary\f[] | |
Dictionary mode. | |
.RS | |
.PP | |
Show the definition of the original word in the dictionary. | |
.RE | |
.TP | |
.B \f[B]\-identify\f[] | |
Language identification. | |
.RS | |
.PP | |
Show the identified language of the original text. | |
.RE | |
.TP | |
.B \f[B]\-show\-original\f[] \f[I]Y/n\f[] | |
Show original text or not. | |
(default: yes) | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-show\-original\-phonetics\f[] \f[I]Y/n\f[] | |
Show phonetic notation of original text or not. | |
(default: yes) | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-show\-translation\f[] \f[I]Y/n\f[] | |
Show translation or not. | |
(default: yes) | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-show\-translation\-phonetics\f[] \f[I]Y/n\f[] | |
Show phonetic notation of translation or not. | |
(default: yes) | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-show\-prompt\-message\f[] \f[I]Y/n\f[] | |
Show prompt message or not. | |
(default: yes) | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-show\-languages\f[] \f[I]Y/n\f[] | |
Show source and target languages or not. | |
(default: yes) | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-show\-original\-dictionary\f[] \f[I]y/N\f[] | |
Show dictionary entry of original text or not. | |
(default: no) | |
.RS | |
.PP | |
This option is enabled in dictionary mode. | |
.RE | |
.TP | |
.B \f[B]\-show\-dictionary\f[] \f[I]Y/n\f[] | |
Show dictionary entry of translation or not. | |
(default: yes) | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-show\-alternatives\f[] \f[I]Y/n\f[] | |
Show alternative translations or not. | |
(default: yes) | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-w\f[] \f[I]NUM\f[], \f[B]\-width\f[] \f[I]NUM\f[] | |
Specify the screen width for padding. | |
.RS | |
.PP | |
This option overrides the setting of environment variable | |
$\f[B]COLUMNS\f[]. | |
.RE | |
.TP | |
.B \f[B]\-indent\f[] \f[I]NUM\f[] | |
Specify the size of indent (number of spaces). | |
(default: 4) | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-theme\f[] \f[I]FILENAME\f[] | |
Specify the theme to use. | |
(default: default) | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-no\-theme\f[] | |
Do not use any other theme than default. | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-no\-ansi\f[] | |
Do not use ANSI escape codes. | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-no\-autocorrect\f[] | |
Do not autocorrect. | |
(if defaulted by the translation engine) | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-no\-bidi\f[] | |
Do not convert bidirectional texts. | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-no\-warn\f[] | |
Do not write warning messages to stderr. | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-dump\f[] | |
Print raw API response instead. | |
.RS | |
.RE | |
.SS Audio options | |
.TP | |
.B \f[B]\-p\f[], \f[B]\-play\f[] | |
Listen to the translation. | |
.RS | |
.PP | |
You must have at least one of the supported audio players | |
(\f[B]mplayer\f[], \f[B]mpv\f[] or \f[B]mpg123\f[]) installed to stream | |
from Google Text\-to\-Speech engine. | |
Otherwise, a local speech synthesizer may be used instead (\f[B]say\f[] | |
on macOS, \f[B]espeak\f[] on Linux or other platforms). | |
.RE | |
.TP | |
.B \f[B]\-speak\f[] | |
Listen to the original text. | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-n\f[] \f[I]VOICE\f[], \f[B]\-narrator\f[] \f[I]VOICE\f[] | |
Specify the narrator, and listen to the translation. | |
.RS | |
.PP | |
Common values for this option are \f[B]male\f[] and \f[B]female\f[]. | |
.RE | |
.TP | |
.B \f[B]\-player\f[] \f[I]PROGRAM\f[] | |
Specify the audio player to use, and listen to the translation. | |
.RS | |
.PP | |
Option \f[B]\-play\f[] will try to use \f[B]mplayer\f[], \f[B]mpv\f[] or | |
\f[B]mpg123\f[] by default, since these players are known to work for | |
streaming URLs. | |
Not all command\-line audio players can work this way. | |
Use this option only when you have your own preference. | |
.PP | |
This option overrides the setting of environment variable | |
$\f[B]PLAYER\f[]. | |
.RE | |
.TP | |
.B \f[B]\-no\-play\f[] | |
Do not listen to the translation. | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-no\-translate\f[] | |
Do not translate anything when using \-speak. | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-download\-audio\f[] | |
Download the audio to the current directory. | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-download\-audio\-as\f[] \f[I]FILENAME\f[] | |
Download the audio to the specified file. | |
.RS | |
.RE | |
.SS Terminal paging and browsing options | |
.TP | |
.B \f[B]\-v\f[], \f[B]\-view\f[] | |
View the translation in a terminal pager (\f[B]less\f[], \f[B]more\f[] | |
or \f[B]most\f[]). | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-pager\f[] \f[I]PROGRAM\f[] | |
Specify the terminal pager to use, and view the translation. | |
.RS | |
.PP | |
This option overrides the setting of environment variable | |
$\f[B]PAGER\f[]. | |
.RE | |
.TP | |
.B \f[B]\-no\-view\f[] | |
Do not view the translation in a terminal pager. | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-browser\f[] \f[I]PROGRAM\f[] | |
Specify the web browser to use. | |
.RS | |
.PP | |
This option overrides the setting of environment variable | |
$\f[B]BROWSER\f[]. | |
.RE | |
.SS Networking options | |
.TP | |
.B \f[B]\-x\f[] \f[I]HOST:PORT\f[], \f[B]\-proxy\f[] \f[I]HOST:PORT\f[] | |
Use HTTP proxy on given port. | |
.RS | |
.PP | |
This option overrides the setting of environment variables | |
$\f[B]HTTP_PROXY\f[] and $\f[B]http_proxy\f[]. | |
.RE | |
.TP | |
.B \f[B]\-u\f[] \f[I]STRING\f[], \f[B]\-user\-agent\f[] \f[I]STRING\f[] | |
Specify the User\-Agent to identify as. | |
.RS | |
.PP | |
This option overrides the setting of environment variables | |
$\f[B]USER_AGENT\f[]. | |
.RE | |
.SS Interactive shell options | |
.TP | |
.B \f[B]\-I\f[], \f[B]\-interactive\f[], \f[B]\-shell\f[] | |
Start an interactive shell, invoking \f[B]rlwrap\f[] whenever possible | |
(unless \f[B]\-no\-rlwrap\f[] is specified). | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-E\f[], \f[B]\-emacs\f[] | |
Start the GNU Emacs front\-end for an interactive shell. | |
.RS | |
.PP | |
This option does not need to, and cannot be used along with \f[B]\-I\f[] | |
or \f[B]\-no\-rlwrap\f[]. | |
.RE | |
.TP | |
.B \f[B]\-no\-rlwrap\f[] | |
Do not invoke \f[B]rlwrap\f[] when starting an interactive shell. | |
.RS | |
.PP | |
This option is useful when your terminal type is not supported by | |
\f[B]rlwrap\f[] (e.g. | |
\f[B]emacs\f[]). | |
.RE | |
.SS I/O options | |
.TP | |
.B \f[B]\-i\f[] \f[I]FILENAME\f[], \f[B]\-input\f[] \f[I]FILENAME\f[] | |
Specify the input file. | |
.RS | |
.PP | |
Source text to be translated will be read from the input file, instead | |
of standard input. | |
.RE | |
.TP | |
.B \f[B]\-o\f[] \f[I]FILENAME\f[], \f[B]\-output\f[] \f[I]FILENAME\f[] | |
Specify the output file. | |
.RS | |
.PP | |
Translations will be written to the output file, instead of standard | |
output. | |
.RE | |
.SS Language preference options | |
.TP | |
.B \f[B]\-l\f[] \f[I]CODE\f[], \f[B]\-hl\f[] \f[I]CODE\f[], \f[B]\-lang\f[] \f[I]CODE\f[] | |
Specify your home language (the language you would like to see for | |
displaying prompt messages in the translation). | |
.RS | |
.PP | |
This option affects only the display in verbose mode (anything other | |
than source language and target language will be displayed in your home | |
language). | |
This option has no effect in brief mode. | |
.PP | |
This option is optional. | |
When its setting is omitted, English will be used. | |
.PP | |
This option overrides the setting of environment variables | |
$\f[B]LANGUAGE\f[], $\f[B]LC_ALL\f[], $\f[B]LANG\f[] and | |
$\f[B]HOME_LANG\f[]. | |
.RE | |
.TP | |
.B \f[B]\-s\f[] \f[I]CODE\f[], \f[B]\-sl\f[] \f[I]CODE\f[], \f[B]\-source\f[] \f[I]CODE\f[], \f[B]\-from\f[] \f[I]CODE\f[] | |
Specify the source language (the language of original text). | |
.RS | |
.PP | |
This option is optional. | |
When its setting is omitted, the language of original text will be | |
identified automatically (with a possibility of misidentification). | |
.PP | |
This option overrides the setting of environment variable | |
$\f[B]SOURCE_LANG\f[]. | |
.RE | |
.TP | |
.B \f[B]\-t\f[] \f[I]CODES\f[], \f[B]\-tl\f[] \f[I]CODE\f[], \f[B]\-target\f[] \f[I]CODES\f[], \f[B]\-to\f[] \f[I]CODES\f[] | |
Specify the target language(s) (the language(s) of translated text). | |
When specifying two or more language codes, concatenate them by plus | |
sign "+". | |
.RS | |
.PP | |
This option is optional. | |
When its setting is omitted, everything will be translated into English. | |
.PP | |
This option overrides the setting of environment variables | |
$\f[B]LANGUAGE\f[], $\f[B]LC_ALL\f[], $\f[B]LANG\f[] and | |
$\f[B]TARGET_LANG\f[]. | |
.RE | |
.TP | |
.B [\f[I]SOURCE\f[]]:[\f[I]TARGETS\f[]] | |
A simpler, alternative way to specify the source language and target | |
language(s) is to use a shortcut formatted string: | |
.RS | |
.IP \[bu] 2 | |
\f[I]SOURCE\-CODE\f[]:\f[I]TARGET\-CODE\f[] | |
.IP \[bu] 2 | |
\f[I]SOURCE\-CODE\f[]:\f[I]TARGET\-CODE1\f[]+\f[I]TARGET\-CODE2\f[]+... | |
.IP \[bu] 2 | |
\f[I]SOURCE\-CODE\f[]=\f[I]TARGET\-CODE\f[] | |
.IP \[bu] 2 | |
\f[I]SOURCE\-CODE\f[]=\f[I]TARGET\-CODE1\f[]+\f[I]TARGET\-CODE2\f[]+... | |
.PP | |
Delimiter ":" and "=" can be used interchangeably. | |
.PP | |
Either \f[I]SOURCE\f[] or \f[I]TARGETS\f[] may be omitted, but the | |
delimiter character must be kept. | |
.RE | |
.SS Other options | |
.TP | |
.B \f[B]\-no\-init\f[] | |
Do not load any initialization script. | |
.RS | |
.RE | |
.TP | |
.B \f[B]\-\-\f[] | |
End\-of\-options. | |
.RS | |
.PP | |
All arguments after this option are treated as \f[I]TEXT\f[] to be | |
translated. | |
.RE | |
.SH EXIT STATUS | |
.TP | |
.B \f[B]0\f[] | |
Successful translation. | |
.RS | |
.RE | |
.TP | |
.B \f[B]1\f[] | |
Error. | |
.RS | |
.RE | |
.SH ENVIRONMENT | |
.TP | |
.B \f[B]PAGER\f[] | |
Equivalent to option setting \f[B]\-pager\f[]. | |
.RS | |
.RE | |
.TP | |
.B \f[B]BROWSER\f[] | |
Equivalent to option setting \f[B]\-browser\f[]. | |
.RS | |
.RE | |
.TP | |
.B \f[B]PLAYER\f[] | |
Equivalent to option setting \f[B]\-player\f[]. | |
.RS | |
.RE | |
.TP | |
.B \f[B]HTTP_PROXY\f[] | |
Equivalent to option setting \f[B]\-proxy\f[]. | |
.RS | |
.RE | |
.TP | |
.B \f[B]USER_AGENT\f[] | |
Equivalent to option setting \f[B]\-user\-agent\f[]. | |
.RS | |
.RE | |
.TP | |
.B \f[B]HOME_LANG\f[] | |
Equivalent to option setting \f[B]\-lang\f[]. | |
.RS | |
.RE | |
.TP | |
.B \f[B]SOURCE_LANG\f[] | |
Equivalent to option setting \f[B]\-source\f[]. | |
.RS | |
.RE | |
.TP | |
.B \f[B]TARGET_LANG\f[] | |
Equivalent to option setting \f[B]\-target\f[]. | |
.RS | |
.RE | |
.SH FILES | |
.TP | |
.B \f[I]/etc/translate\-shell\f[] | |
Initialization script. | |
(system\-wide) | |
.RS | |
.RE | |
.TP | |
.B \f[I]$HOME/.translate\-shell/init.trans\f[] | |
Initialization script. | |
(user\-specific) | |
.RS | |
.RE | |
.TP | |
.B \f[I]$XDG_CONFIG_HOME/translate\-shell/init.trans\f[] | |
Initialization script. | |
(user\-specific) | |
.RS | |
.RE | |
.TP | |
.B \f[I]./.trans\f[] | |
Initialization script. | |
(current directory) | |
.RS | |
.RE | |
.SH REPORTING BUGS | |
.PP | |
<https://github.com/soimort/translate-shell/issues> | |
.SH AUTHORS | |
Mort Yao <[email protected]>. | |
EOF | |
export TRANS_MANPAGE | |
export TRANS_BUILD=release | |
gawk -f <(echo -E "$TRANS_PROGRAM") - "$@" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment