diff --git a/package.json b/package.json index 171b0f2..c570318 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "translate-reboot", - "version": "0.4", + "version": "0.5", "description": "", "scripts": { "build": "tsc", diff --git a/src/bot-hooks.ts b/src/bot-hooks.ts index 1bf34d1..97460e4 100644 --- a/src/bot-hooks.ts +++ b/src/bot-hooks.ts @@ -32,6 +32,30 @@ function makeLines(text: string): string[] { return lines; } +async function translate(text: string, dstLang: string): Promise { + const srcLang: string = await detectGoogle(text); + dstLang = dstLang === 'ua' || dstLang === 'ru' ? 'uk' : dstLang; + if (srcLang === 'uk' || dstLang === 'uk') { + return translateGoogle(text, dstLang); + } else { + return await translateDeepL(text, srcLang, dstLang); + } +} + +function makeResults(translated: string): Array { + const results: Array = []; + if (translated.length === 0) { + return; + } else if (translated.length < max) { + results.push(makeResult(translated, translated)); + } else { + makeLines(translated).forEach((line: string) => { + results.push(makeResult(line, translated)); + }); + } + return results; +} + bot.on('inline_query', async (query: InlineQuery) => { const queryText = query.query; const length = queryText.length; @@ -47,32 +71,18 @@ bot.on('inline_query', async (query: InlineQuery) => { queryText.endsWith(eol + 'it') || queryText.endsWith(eol + 'ru') ); - let lang: string; + let dstLang: string; let text: string; if (basicQuery) { - lang = 'de'; + dstLang = 'de'; text = queryText.slice(0, length - 2); } else if (customQuery) { - lang = queryText.slice(length - 2, length); - lang = lang === 'ua' || lang === 'ru' ? 'uk' : lang; + dstLang = queryText.slice(length - 2, length); text = queryText.slice(0, length - 4); } else { return; } - let translated: string; - const srcLang: string = await detectGoogle(text); - if (srcLang === 'uk' || lang === 'uk') { - translated = await translateGoogle(text, lang); - } else { - translated = await translateDeepL(text, srcLang, lang); - } - const results: Array = []; - if (translated.length < max) { - results.push(makeResult(translated, translated)); - } else { - makeLines(translated).forEach((line: string) => { - results.push(makeResult(line, translated)); - }); - } + const translated = await translate(text, dstLang); + const results = makeResults(translated); await bot.answerInlineQuery(query.id, results, {cache_time: 0, is_personal: true}); }); diff --git a/src/deepl-translate-adapter.ts b/src/deepl-translate-adapter.ts index aaaa555..ff21d91 100644 --- a/src/deepl-translate-adapter.ts +++ b/src/deepl-translate-adapter.ts @@ -1,9 +1,16 @@ -import { Translator} from 'deepl-node'; +import { Translator, TextResult } from 'deepl-node'; +import { DeeplInLang, DeeplOutLang } from './model'; + const translator = new Translator(require('../keys.json').DEEPL); -export async function translate(text: string, srcLang:any, targetLang: any): Promise { - targetLang = targetLang === 'en' ? 'en-US' : targetLang; - return translator.translateText(text, srcLang, targetLang) - .then((textResult => textResult.text)); +export async function translate(text: string, srcLang:any, dstLang: any): Promise { + dstLang = dstLang === 'en' ? 'en-US' : dstLang; + if (!(srcLang in DeeplInLang)) { srcLang = 'en'; } + if (!(dstLang in DeeplOutLang)) { dstLang = 'en'; } + return translator.translateText(text, srcLang, dstLang) + .then( + (textResult: TextResult) => {return textResult.text;}, + () => '' + ); } diff --git a/src/google-translate-adapter.ts b/src/google-translate-adapter.ts index e4a7503..9f9e0f7 100644 --- a/src/google-translate-adapter.ts +++ b/src/google-translate-adapter.ts @@ -1,15 +1,23 @@ +import { GoogleLang } from './model'; + const {Translate} = require('@google-cloud/translate').v2; const projectId = 'translate-reebot'; const translator = new Translate({projectId}); translator.key = require('../keys.json').GOOGLE; -export async function translate(text: string, targetLang: string): Promise { - return translator.translate(text, targetLang) - .then(([result] : any) => result); +export async function translate(text: string, dstLang: string): Promise { + return translator.translate(text, dstLang) + .then( + ([result] : any) => result, + (error: any) => console.log(error) + ); } export async function detect(text: string): Promise { return translator.detect(text) - .then(([result] : any) => result.language === 'und' ? 'en' : result.language); + .then( + ([result] : any) => !(result.language in GoogleLang) ? 'en' : result.language, + (error: any) => console.log(error) + ); } diff --git a/src/model.ts b/src/model.ts new file mode 100644 index 0000000..044e873 --- /dev/null +++ b/src/model.ts @@ -0,0 +1,14 @@ +// subset of https://cloud.google.com/translate/docs/languages +export enum GoogleLang { + de, en, uk, es, fr, it, ru +} + +// subset of https://www.deepl.com/docs-api/translating-text/ +export enum DeeplInLang { + de, en, es, fr, it, ru +} + +// subset of https://www.deepl.com/docs-api/translating-text/ +export enum DeeplOutLang { + de, 'en-US', es, fr, it, ru +} diff --git a/src/results.ts b/src/results.ts index 0a46310..23413de 100644 --- a/src/results.ts +++ b/src/results.ts @@ -2,11 +2,12 @@ import { InlineQueryResultArticle } from 'node-telegram-bot-api'; let id = 0; -export function makeResult(title: string, message: string) : InlineQueryResultArticle { +export function makeResult(title: string, message: string): InlineQueryResultArticle { + if (id + 1 == Number.MAX_SAFE_INTEGER) { id = 0; } return { type: 'article', id: '' + ++id, title: title, - input_message_content: { message_text: message} + input_message_content: {message_text: message} }; }