From c09a24ce9da1423e43cd6cc914a61d81be12e8ed Mon Sep 17 00:00:00 2001 From: derpystuff <3515180-derpystuff@users.noreply.gitlab.com> Date: Sun, 10 Jul 2022 23:06:45 +0200 Subject: [PATCH] translate v1 --- commands/message/utils/translate.js | 56 ++++++++++++++ labscore/constants.js | 110 +++++++++++++++++++++++++++- labscore/utils/translate.js | 26 +++++++ 3 files changed, 191 insertions(+), 1 deletion(-) create mode 100644 commands/message/utils/translate.js create mode 100644 labscore/utils/translate.js diff --git a/commands/message/utils/translate.js b/commands/message/utils/translate.js new file mode 100644 index 0000000..8e7effc --- /dev/null +++ b/commands/message/utils/translate.js @@ -0,0 +1,56 @@ +const { createEmbed } = require('../../../labscore/utils/embed') +const { editOrReply } = require('../../../labscore/utils/message') + +const { getRecentImage } = require("../../../labscore/utils/attachment"); +const { codeblock, highlight, icon } = require('../../../labscore/utils/markdown'); + +const superagent = require('superagent'); + +const { isSupported } = require('../../../labscore/utils/translate'); +const { googleTranslate } = require('../../../labscore/api'); +const { STATICS } = require('../../../labscore/utils/statics'); + +module.exports = { + name: 'translate', + label: 'text', + aliases: ['tr'], + metadata: { + description: 'translate text', + examples: ['tr groß nussig -from de -to en'], + category: 'utils', + usage: `tr [-to ] [-from ]` + }, + args: [ + {name: 'to', default: 'en'}, + {name: 'from', default: 'auto'} + ], + run: async (context, args) => { + await context.triggerTyping(); + + let content = args.text; + if(context.message.messageReference) { + let msg = await context.message.channel.fetchMessage(context.message.messageReference.messageId); + if(msg.content && msg.content.length) content = msg.content + } + + if(!content.length) return editOrReply(context, createEmbed("warning", context, "No text supplied.")) + + if(!isSupported(args.to)) return editOrReply(context, createEmbed("warning", context, "Invalid language (to).")) + if(!isSupported(args.from)) return editOrReply(context, createEmbed("warning", context, "Invalid language (from).")) + + try{ + let translate = await googleTranslate(context, content, args.to, args.from) + return editOrReply(context, createEmbed("default", context, { + description: `${icon("locale")} ${highlight(`${translate.response.body.language.from} -> ${translate.response.body.language.to}`)}\n${codeblock("ansi", [translate.response.body.translation])}`, + footer: { + iconUrl: STATICS.google, + text: `Google Translator • ${context.application.name} • Took ${translate.timings}s` + } + })) + }catch(e){ + console.log(e) + if(e.response?.body?.status && e.response.body.status == 2) return editOrReply(context, {embeds:[createEmbed("error", context, `Unable to translate text.`)]}) + return editOrReply(context, {embeds:[createEmbed("error", context, `Something went wrong.`)]}) + } + } +}; \ No newline at end of file diff --git a/labscore/constants.js b/labscore/constants.js index b9a1bf5..f99cc83 100644 --- a/labscore/constants.js +++ b/labscore/constants.js @@ -450,4 +450,112 @@ module.exports.IMTRANSLATOR_VOICES = [ "name": "Korean (Female)", "value": "ko" } -] \ No newline at end of file +] + +module.exports.TRANSLATE_LANGUAGES = Object.freeze({ + 'auto': 'Automatic', + 'af': 'Afrikaans', + 'sq': 'Albanian', + 'am': 'Amharic', + 'ar': 'Arabic', + 'hy': 'Armenian', + 'az': 'Azerbaijani', + 'eu': 'Basque', + 'be': 'Belarusian', + 'bn': 'Bengali', + 'bs': 'Bosnian', + 'bg': 'Bulgarian', + 'ca': 'Catalan', + 'ceb': 'Cebuano', + 'ny': 'Chichewa', + 'zh-cn': 'Chinese Simplified', + 'zh-tw': 'Chinese Traditional', + 'co': 'Corsican', + 'hr': 'Croatian', + 'cs': 'Czech', + 'da': 'Danish', + 'nl': 'Dutch', + 'en': 'English', + 'eo': 'Esperanto', + 'et': 'Estonian', + 'tl': 'Filipino', + 'fi': 'Finnish', + 'fr': 'French', + 'fy': 'Frisian', + 'gl': 'Galician', + 'ka': 'Georgian', + 'de': 'German', + 'el': 'Greek', + 'gu': 'Gujarati', + 'ht': 'Haitian Creole', + 'ha': 'Hausa', + 'haw': 'Hawaiian', + 'iw': 'Hebrew', + 'hi': 'Hindi', + 'hmn': 'Hmong', + 'hu': 'Hungarian', + 'is': 'Icelandic', + 'ig': 'Igbo', + 'id': 'Indonesian', + 'ga': 'Irish', + 'it': 'Italian', + 'ja': 'Japanese', + 'jw': 'Javanese', + 'kn': 'Kannada', + 'kk': 'Kazakh', + 'km': 'Khmer', + 'ko': 'Korean', + 'ku': 'Kurdish (Kurmanji)', + 'ky': 'Kyrgyz', + 'lo': 'Lao', + 'la': 'Latin', + 'lv': 'Latvian', + 'lt': 'Lithuanian', + 'lb': 'Luxembourgish', + 'mk': 'Macedonian', + 'mg': 'Malagasy', + 'ms': 'Malay', + 'ml': 'Malayalam', + 'mt': 'Maltese', + 'mi': 'Maori', + 'mr': 'Marathi', + 'mn': 'Mongolian', + 'my': 'Myanmar (Burmese)', + 'ne': 'Nepali', + 'no': 'Norwegian', + 'ps': 'Pashto', + 'fa': 'Persian', + 'pl': 'Polish', + 'pt': 'Portuguese', + 'ma': 'Punjabi', + 'ro': 'Romanian', + 'ru': 'Russian', + 'sm': 'Samoan', + 'gd': 'Scots Gaelic', + 'sr': 'Serbian', + 'st': 'Sesotho', + 'sn': 'Shona', + 'sd': 'Sindhi', + 'si': 'Sinhala', + 'sk': 'Slovak', + 'sl': 'Slovenian', + 'so': 'Somali', + 'es': 'Spanish', + 'su': 'Sundanese', + 'sw': 'Swahili', + 'sv': 'Swedish', + 'tg': 'Tajik', + 'ta': 'Tamil', + 'te': 'Telugu', + 'th': 'Thai', + 'tr': 'Turkish', + 'uk': 'Ukrainian', + 'ur': 'Urdu', + 'uz': 'Uzbek', + 'vi': 'Vietnamese', + 'cy': 'Welsh', + 'xh': 'Xhosa', + 'yi': 'Yiddish', + 'yo': 'Yoruba', + 'zu': 'Zulu' +}) \ No newline at end of file diff --git a/labscore/utils/translate.js b/labscore/utils/translate.js new file mode 100644 index 0000000..b73fc8a --- /dev/null +++ b/labscore/utils/translate.js @@ -0,0 +1,26 @@ +const { TRANSLATE_LANGUAGES } = require("../constants"); + +function getCode(desiredLang) { + if (!desiredLang) { + return false; + } + desiredLang = desiredLang.toLowerCase(); + + if (TRANSLATE_LANGUAGES[desiredLang]) { + return desiredLang; + } + + var keys = Object.keys(TRANSLATE_LANGUAGES).filter(function (key) { + if (typeof TRANSLATE_LANGUAGES[key] !== 'string') { + return false; + } + + return TRANSLATE_LANGUAGES[key].toLowerCase() === desiredLang; + }); + + return keys[0] || false; +} + +module.exports.isSupported = function (desiredLang) { + return Boolean(getCode(desiredLang)); +} \ No newline at end of file