From 3cea3331daa1a74c7594c75bccc2ce61d17e878b Mon Sep 17 00:00:00 2001 From: derpystuff <3515180-derpystuff@users.noreply.gitlab.com> Date: Sat, 4 Nov 2023 01:04:38 +0100 Subject: [PATCH] language support for translate --- commands/message/utils/dictionary.js | 31 ++++++++++++++++----- labscore/api/index.js | 5 ++-- labscore/constants.js | 40 ++++++++++++++++++++++++++++ labscore/utils/translate.js | 11 +++++++- 4 files changed, 77 insertions(+), 10 deletions(-) diff --git a/commands/message/utils/dictionary.js b/commands/message/utils/dictionary.js index f6d176c..74cb441 100644 --- a/commands/message/utils/dictionary.js +++ b/commands/message/utils/dictionary.js @@ -1,17 +1,19 @@ const { createEmbed, formatPaginationEmbeds } = require('../../../labscore/utils/embed') -const { link, iconPill, smallPill, citation, icon } = require('../../../labscore/utils/markdown') +const { link, iconPill, smallPill, icon, iconLinkPill, pill } = require('../../../labscore/utils/markdown') const { editOrReply } = require('../../../labscore/utils/message') const { paginator } = require('../../../labscore/client'); const { dictionary } = require('../../../labscore/api'); const { Permissions } = require("detritus-client/lib/constants"); +const { dictionaryGetCodeFromAny } = require('../../../labscore/utils/translate'); +const { TRANSLATE_LANGUAGE_MAPPINGS, DICTIONARY_LANGUAGES } = require('../../../labscore/constants'); const LABELS = { "offensive": `${iconPill("warning", "Offensive")}` } -function createDictionaryPage(context, result, index){ +function createDictionaryPage(context, result, index, language){ let phon = '' if(result.phonetic) phon = `\n*${result.phonetic}*` @@ -21,13 +23,15 @@ function createDictionaryPage(context, result, index){ }) if(result.phonetic) e.description += smallPill(result.phonetic) + + if(language !== "en") e.description += `\n${TRANSLATE_LANGUAGE_MAPPINGS[language]} ${pill(DICTIONARY_LANGUAGES[language])}` let word = result.entries[index] let defItms = [] let i = 1; - for(const def of word.definitions){ + for(const def of word.definitions.splice(0, 6)){ let entry = `${i}. ${def.definition}` if(def.example) entry += `\n - *${def.example}*` if(def.synonyms) entry += `\n${icon("empty")}${def.synonyms.splice(0, 4).map((s)=>smallPill(s)).join(' ')}` @@ -35,6 +39,8 @@ function createDictionaryPage(context, result, index){ i++ } + if(word.definitions.length >= 6 ) defItms.push(iconLinkPill("link", `https://www.google.com/search?q=define+${encodeURIComponent(result.word)}`, 'More results', 'View More Results')) + let type = word.type if(word.labels) type += " " + word.labels.map((label)=>{if(LABELS[label]) return LABELS[label]; else return ""}).join(' ') @@ -51,15 +57,26 @@ module.exports = { metadata: { description: 'Returns dictionary definitions for words.', description_short: 'Dictionary word definitions.', - examples: ['dictionary Walking'], + examples: ['dictionary Gehen -lang de'], category: 'utils', - usage: 'define ' + usage: 'define [-lang ]' }, + args: [ + {name: 'lang', default: 'en', type: 'language', help: "Language to define in"}, + ], permissionsClient: [Permissions.EMBED_LINKS, Permissions.SEND_MESSAGES, Permissions.USE_EXTERNAL_EMOJIS, Permissions.READ_MESSAGE_HISTORY], run: async (context, args) => { context.triggerTyping(); + + let language = dictionaryGetCodeFromAny(args.lang); + + console.log(language) + + if(!language) return editOrReply(context, createEmbed("warning", context, "Invalid Language")) + + try{ - let search = await dictionary(context, args.query) + let search = await dictionary(context, args.query, language) search = search.response if(search.body.status == 1) return editOrReply(context, createEmbed("warning", context, search.body.message)) @@ -68,7 +85,7 @@ module.exports = { let i = 0; for(const d of search.body.results[0].entries){ - pages.push(createDictionaryPage(context, search.body.results[0], i)) + pages.push(createDictionaryPage(context, search.body.results[0], i, language)) i++; } diff --git a/labscore/api/index.js b/labscore/api/index.js index f970d58..e3c4628 100644 --- a/labscore/api/index.js +++ b/labscore/api/index.js @@ -291,9 +291,10 @@ module.exports.tiktok = async function(context, text, voice){ }) } -module.exports.dictionary = async function(context, query){ +module.exports.dictionary = async function(context, query, language){ return await request(Api.UTILS_DICTIONARY, "GET", {}, { - q: query + q: query, + l: language }) } diff --git a/labscore/constants.js b/labscore/constants.js index 57a1b1e..2644ade 100644 --- a/labscore/constants.js +++ b/labscore/constants.js @@ -435,6 +435,46 @@ module.exports.MICROSOFT_VOICE_CONFIG = { "Male Whisper": { pitch: 113, speed: 170 } } +module.exports.DICTIONARY_LANGUAGES = Object.freeze({ + ar: "Arabic", + ca: "Catalan", + cs: "Czech", + da: "Danish", + de: "German", + el: "Greek", + "en-uk": "English (UK)", + en: "English (US)", + es: "Spanish", + fi: "Finnish", + fr: "French", + hi: "Hindi", + hr: "Croatian", + id: "Indonesian", + it: "Italian", + iw: "Hebrew", + ja: "Japanese", + ko: "Korean", + nl: "Dutch", + no: "Norwegian", + pl: "Polish", + "pt-br": "Portuguese", + "pt-pt": "Portuguese", + pt: "Portuguese", + ro: "Romanian", + ru: "Russian", + sr: "Serbian", + sk: "Slovak", + sv: "Swedish", + th: "Thai", + tl: "Tagalog", + tr: "Turkish", + uk: "Ukrainian", + vi: "Vietnamese", + "zh-cn": "Chinese", + "zh-tw": "Chinese", + zh: "Chinese" +}) + // hey if you're looking at this and annoyed that a language doesnt // work lmk on discord @bignutty and i'll add it (if reasonable) // same goes for emoji below diff --git a/labscore/utils/translate.js b/labscore/utils/translate.js index e6cbb23..b6453bc 100644 --- a/labscore/utils/translate.js +++ b/labscore/utils/translate.js @@ -1,4 +1,4 @@ -const { TRANSLATE_LANGUAGES, TRANSLATE_LANGUAGE_MAPPINGS, TRANSLATE_LANGUAGE_ALIASES } = require("../constants"); +const { TRANSLATE_LANGUAGES, TRANSLATE_LANGUAGE_MAPPINGS, TRANSLATE_LANGUAGE_ALIASES, DICTIONARY_LANGUAGES } = require("../constants"); function getCode(desiredLang) { if (!desiredLang) { @@ -38,6 +38,15 @@ module.exports.getCodeFromAny = function (prompt) { return languages[0]; }; + +module.exports.dictionaryGetCodeFromAny = function (prompt) { + if(DICTIONARY_LANGUAGES[prompt.toLowerCase()]) return prompt.toLowerCase() + let languages = []; + for(const i of Object.keys(DICTIONARY_LANGUAGES)) if(!languages.includes(i) && DICTIONARY_LANGUAGES[i].toLowerCase() == prompt.toLowerCase()) languages.push(i) + return languages[0]; +}; + + module.exports.isSupported = function (desiredLang) { return Boolean(getCode(desiredLang)); } \ No newline at end of file