2019-02-22 16:13:11 +00:00
|
|
|
import log from "loglevel";
|
2019-02-21 16:43:45 +00:00
|
|
|
let translationHistory = [];
|
2018-06-02 12:42:29 +00:00
|
|
|
|
2019-02-22 16:13:11 +00:00
|
|
|
const logDir = "common/translate";
|
|
|
|
|
2019-02-21 16:43:45 +00:00
|
|
|
const getHistory = (sourceWord, sourceLang, targetLang) => {
|
|
|
|
const history = translationHistory.find(
|
|
|
|
history =>
|
|
|
|
history.sourceWord == sourceWord &&
|
|
|
|
history.sourceLang == sourceLang &&
|
|
|
|
history.targetLang == targetLang &&
|
|
|
|
history.result.statusText == "OK"
|
|
|
|
);
|
|
|
|
return history;
|
|
|
|
};
|
2018-11-15 12:28:22 +00:00
|
|
|
|
2019-02-21 16:43:45 +00:00
|
|
|
const setHistory = (sourceWord, sourceLang, targetLang, formattedResult) => {
|
|
|
|
translationHistory.push({
|
|
|
|
sourceWord: sourceWord,
|
|
|
|
sourceLang: sourceLang,
|
|
|
|
targetLang: targetLang,
|
|
|
|
result: formattedResult
|
|
|
|
});
|
|
|
|
};
|
2018-11-15 12:24:18 +00:00
|
|
|
|
2019-02-21 16:43:45 +00:00
|
|
|
const sendRequest = (word, sourceLang, targetLang) => {
|
2019-02-22 16:13:11 +00:00
|
|
|
log.log(logDir, "sendRequest()");
|
2019-02-21 16:43:45 +00:00
|
|
|
const url = `https://translate.googleapis.com/translate_a/single?client=gtx&sl=${sourceLang}&tl=${targetLang}&dt=t&dt=bd&dj=1&q=${encodeURIComponent(
|
|
|
|
word
|
|
|
|
)}`;
|
|
|
|
const xhr = new XMLHttpRequest();
|
|
|
|
xhr.responseType = "json";
|
|
|
|
xhr.open("GET", url);
|
|
|
|
xhr.send();
|
2018-11-15 12:28:22 +00:00
|
|
|
|
2019-02-21 16:43:45 +00:00
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
xhr.onload = () => {
|
|
|
|
resolve(xhr);
|
|
|
|
};
|
|
|
|
xhr.onerror = () => {
|
|
|
|
resolve(xhr);
|
|
|
|
};
|
|
|
|
});
|
|
|
|
};
|
2018-11-15 12:28:22 +00:00
|
|
|
|
2019-02-21 16:43:45 +00:00
|
|
|
const formatResult = result => {
|
|
|
|
const resultData = {
|
|
|
|
resultText: "",
|
|
|
|
candidateText: "",
|
|
|
|
sourceLanguage: "",
|
|
|
|
percentage: 0,
|
|
|
|
statusText: ""
|
|
|
|
};
|
2018-06-02 12:29:38 +00:00
|
|
|
|
2019-02-22 17:22:13 +00:00
|
|
|
if (result.status === 0) resultData.statusText = "Network Error";
|
|
|
|
else if (result.status === 200) resultData.statusText = "OK";
|
|
|
|
else if (result.status === 503) resultData.statusText = "Service Unavailable";
|
|
|
|
else resultData.statusText = result.statusText || result.status;
|
|
|
|
|
2019-02-22 16:13:11 +00:00
|
|
|
if (resultData.statusText !== "OK") {
|
|
|
|
log.error(logDir, "formatResult()", resultData);
|
|
|
|
return resultData;
|
|
|
|
}
|
2018-06-02 12:29:38 +00:00
|
|
|
|
2019-02-21 16:43:45 +00:00
|
|
|
resultData.sourceLanguage = result.response.src;
|
|
|
|
resultData.percentage = result.response.confidence;
|
|
|
|
resultData.resultText = result.response.sentences.map(sentence => sentence.trans).join("");
|
|
|
|
if (result.response.dict) {
|
|
|
|
resultData.candidateText = result.response.dict
|
|
|
|
.map(dict => `${dict.pos}${dict.pos != "" ? ": " : ""}${dict.terms.join(", ")}\n`)
|
|
|
|
.join("");
|
2018-07-31 11:35:03 +00:00
|
|
|
}
|
2018-06-02 12:29:38 +00:00
|
|
|
|
2019-02-22 16:13:11 +00:00
|
|
|
log.log(logDir, "formatResult()", resultData);
|
2019-02-21 16:43:45 +00:00
|
|
|
return resultData;
|
|
|
|
};
|
2018-06-02 12:29:38 +00:00
|
|
|
|
2019-02-21 16:43:45 +00:00
|
|
|
export default async (sourceWord, sourceLang = "auto", targetLang) => {
|
2019-02-22 16:13:11 +00:00
|
|
|
log.log(logDir, "tranlate()", sourceWord, targetLang);
|
2019-02-21 16:43:45 +00:00
|
|
|
sourceWord = sourceWord.trim();
|
2019-02-22 15:21:55 +00:00
|
|
|
if (sourceWord === "")
|
|
|
|
return {
|
|
|
|
resultText: "",
|
|
|
|
candidateText: "",
|
|
|
|
sourceLanguage: "en",
|
|
|
|
percentage: 0,
|
|
|
|
statusText: "OK"
|
|
|
|
};
|
|
|
|
|
2019-02-21 16:43:45 +00:00
|
|
|
const history = getHistory(sourceWord, sourceLang, targetLang);
|
|
|
|
if (history) return history.result;
|
2018-07-31 15:50:10 +00:00
|
|
|
|
2019-02-21 16:43:45 +00:00
|
|
|
const result = await sendRequest(sourceWord, sourceLang, targetLang);
|
|
|
|
const formattedResult = formatResult(result);
|
|
|
|
setHistory(sourceWord, sourceLang, targetLang, formattedResult);
|
|
|
|
return formattedResult;
|
|
|
|
};
|