+ narrow input lang
+ print errors
+ reset id on > max
master
io42630 3 years ago
parent 37b2fdea80
commit 3ec7c6915f

@ -1,6 +1,6 @@
{ {
"name": "translate-reboot", "name": "translate-reboot",
"version": "0.4", "version": "0.5",
"description": "", "description": "",
"scripts": { "scripts": {
"build": "tsc", "build": "tsc",

@ -32,6 +32,30 @@ function makeLines(text: string): string[] {
return lines; return lines;
} }
async function translate(text: string, dstLang: string): Promise<string> {
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<InlineQueryResultArticle> {
const results: Array<InlineQueryResultArticle> = [];
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) => { bot.on('inline_query', async (query: InlineQuery) => {
const queryText = query.query; const queryText = query.query;
const length = queryText.length; const length = queryText.length;
@ -47,32 +71,18 @@ bot.on('inline_query', async (query: InlineQuery) => {
queryText.endsWith(eol + 'it') || queryText.endsWith(eol + 'it') ||
queryText.endsWith(eol + 'ru') queryText.endsWith(eol + 'ru')
); );
let lang: string; let dstLang: string;
let text: string; let text: string;
if (basicQuery) { if (basicQuery) {
lang = 'de'; dstLang = 'de';
text = queryText.slice(0, length - 2); text = queryText.slice(0, length - 2);
} else if (customQuery) { } else if (customQuery) {
lang = queryText.slice(length - 2, length); dstLang = queryText.slice(length - 2, length);
lang = lang === 'ua' || lang === 'ru' ? 'uk' : lang;
text = queryText.slice(0, length - 4); text = queryText.slice(0, length - 4);
} else { } else {
return; return;
} }
let translated: string; const translated = await translate(text, dstLang);
const srcLang: string = await detectGoogle(text); const results = makeResults(translated);
if (srcLang === 'uk' || lang === 'uk') {
translated = await translateGoogle(text, lang);
} else {
translated = await translateDeepL(text, srcLang, lang);
}
const results: Array<InlineQueryResultArticle> = [];
if (translated.length < max) {
results.push(makeResult(translated, translated));
} else {
makeLines(translated).forEach((line: string) => {
results.push(makeResult(line, translated));
});
}
await bot.answerInlineQuery(query.id, results, {cache_time: 0, is_personal: true}); await bot.answerInlineQuery(query.id, results, {cache_time: 0, is_personal: true});
}); });

@ -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); const translator = new Translator(require('../keys.json').DEEPL);
export async function translate(text: string, srcLang:any, targetLang: any): Promise<string> { export async function translate(text: string, srcLang:any, dstLang: any): Promise<string> {
targetLang = targetLang === 'en' ? 'en-US' : targetLang; dstLang = dstLang === 'en' ? 'en-US' : dstLang;
return translator.translateText(text, srcLang, targetLang) if (!(srcLang in DeeplInLang)) { srcLang = 'en'; }
.then((textResult => textResult.text)); if (!(dstLang in DeeplOutLang)) { dstLang = 'en'; }
return translator.translateText(text, srcLang, dstLang)
.then(
(textResult: TextResult) => {return textResult.text;},
() => ''
);
} }

@ -1,15 +1,23 @@
import { GoogleLang } from './model';
const {Translate} = require('@google-cloud/translate').v2; const {Translate} = require('@google-cloud/translate').v2;
const projectId = 'translate-reebot'; const projectId = 'translate-reebot';
const translator = new Translate({projectId}); const translator = new Translate({projectId});
translator.key = require('../keys.json').GOOGLE; translator.key = require('../keys.json').GOOGLE;
export async function translate(text: string, targetLang: string): Promise<string> { export async function translate(text: string, dstLang: string): Promise<string> {
return translator.translate(text, targetLang) return translator.translate(text, dstLang)
.then(([result] : any) => result); .then(
([result] : any) => result,
(error: any) => console.log(error)
);
} }
export async function detect(text: string): Promise<string> { export async function detect(text: string): Promise<string> {
return translator.detect(text) 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)
);
} }

@ -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
}

@ -2,11 +2,12 @@ import { InlineQueryResultArticle } from 'node-telegram-bot-api';
let id = 0; 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 { return {
type: 'article', type: 'article',
id: '' + ++id, id: '' + ++id,
title: title, title: title,
input_message_content: { message_text: message} input_message_content: {message_text: message}
}; };
} }

Loading…
Cancel
Save