translate command
This commit is contained in:
parent
9630f02275
commit
663b97ae39
2 changed files with 206 additions and 3 deletions
204
src/modules/misc/translate.js
Normal file
204
src/modules/misc/translate.js
Normal file
|
|
@ -0,0 +1,204 @@
|
||||||
|
const Command = require("#lib/command.js");
|
||||||
|
const InteractionCommand = require("#lib/interactionCommand.js");
|
||||||
|
|
||||||
|
const {ApplicationCommandOptionTypes} = require("#util/dconstants.js");
|
||||||
|
const {Icons} = require("#util/constants.js");
|
||||||
|
|
||||||
|
const languageCodeToName = {
|
||||||
|
en: "English",
|
||||||
|
sq: "Albanian",
|
||||||
|
ar: "Arabic",
|
||||||
|
az: "Azerbaijani",
|
||||||
|
eu: "Basque",
|
||||||
|
bn: "Bengali",
|
||||||
|
bg: "Bulgarian",
|
||||||
|
ca: "Catalan",
|
||||||
|
"zh-Hans": "Chinese",
|
||||||
|
"zh-Hant": "Chinese (traditional)",
|
||||||
|
cs: "Czech",
|
||||||
|
da: "Danish",
|
||||||
|
nl: "Dutch",
|
||||||
|
eo: "Esperanto",
|
||||||
|
et: "Estonian",
|
||||||
|
fi: "Finnish",
|
||||||
|
fr: "French",
|
||||||
|
gl: "Galician",
|
||||||
|
de: "German",
|
||||||
|
el: "Greek",
|
||||||
|
he: "Hebrew",
|
||||||
|
hi: "Hindi",
|
||||||
|
hu: "Hungarian",
|
||||||
|
id: "Indonesian",
|
||||||
|
ga: "Irish",
|
||||||
|
it: "Italian",
|
||||||
|
ja: "Japanese",
|
||||||
|
ko: "Korean",
|
||||||
|
ky: "Kyrgyz",
|
||||||
|
lv: "Latvian",
|
||||||
|
lt: "Lithuanian",
|
||||||
|
ms: "Malay",
|
||||||
|
nb: "Norwegian",
|
||||||
|
fa: "Persian",
|
||||||
|
pl: "Polish",
|
||||||
|
pt: "Portuguese",
|
||||||
|
"pt-BR": "Portuguese (Brazil)",
|
||||||
|
ro: "Romanian",
|
||||||
|
ru: "Russian",
|
||||||
|
sk: "Slovak",
|
||||||
|
sl: "Slovenian",
|
||||||
|
es: "Spanish",
|
||||||
|
sv: "Swedish",
|
||||||
|
tl: "Tagalog",
|
||||||
|
th: "Thai",
|
||||||
|
tr: "Turkish",
|
||||||
|
uk: "Ukrainian",
|
||||||
|
ur: "Urdu",
|
||||||
|
auto: "Auto Detect",
|
||||||
|
};
|
||||||
|
const languageCodeToFlag = {
|
||||||
|
en: "\ud83c\uddfa\ud83c\uddf8",
|
||||||
|
sq: "\ud83c\udde6\ud83c\uddf1",
|
||||||
|
ar: "\ud83c\uddea\ud83c\uddec",
|
||||||
|
az: "\ud83c\udde6\ud83c\uddff",
|
||||||
|
eu: "\ud83d\udfe5",
|
||||||
|
bn: "\ud83c\udde7\ud83c\udde9",
|
||||||
|
bg: "\ud83c\udde7\ud83c\uddec",
|
||||||
|
ca: "\ud83c\udde6\ud83c\udde9",
|
||||||
|
"zh-Hans": "\ud83c\udde8\ud83c\uddf3",
|
||||||
|
"zh-Hant": "\ud83c\udde8\ud83c\uddf3",
|
||||||
|
cs: "\ud83c\udde8\ud83c\uddff",
|
||||||
|
da: "\ud83c\udde9\ud83c\uddf0",
|
||||||
|
nl: "\ud83c\uddf3\ud83c\uddf1",
|
||||||
|
eo: "\ud83d\udfe9",
|
||||||
|
et: "\ud83c\uddea\ud83c\uddea",
|
||||||
|
fi: "\ud83c\uddeb\ud83c\uddee",
|
||||||
|
fr: "\ud83c\uddeb\ud83c\uddf7",
|
||||||
|
gl: "\ud83d\udfe6",
|
||||||
|
de: "\ud83c\udde9\ud83c\uddea",
|
||||||
|
el: "\ud83c\uddec\ud83c\uddf7",
|
||||||
|
he: "\ud83c\uddee\ud83c\uddf1",
|
||||||
|
hi: "\ud83c\uddee\ud83c\uddf3",
|
||||||
|
hu: "\ud83c\udded\ud83c\uddfa",
|
||||||
|
id: "\ud83c\uddee\ud83c\udde9",
|
||||||
|
ga: "\ud83c\uddee\ud83c\uddea",
|
||||||
|
it: "\ud83c\uddee\ud83c\uddf9",
|
||||||
|
ja: "\ud83c\uddef\ud83c\uddf5",
|
||||||
|
ko: "\ud83c\uddf0\ud83c\uddf7",
|
||||||
|
ky: "\ud83c\uddf0\ud83c\uddec",
|
||||||
|
lv: "\ud83c\uddf1\ud83c\uddfb",
|
||||||
|
lt: "\ud83c\uddf1\ud83c\uddf9",
|
||||||
|
ms: "\ud83c\uddf2\ud83c\uddfe",
|
||||||
|
nb: "\ud83c\uddf3\ud83c\uddf4",
|
||||||
|
fa: "\ud83c\uddee\ud83c\uddf7",
|
||||||
|
pl: "\ud83c\uddf5\ud83c\uddf1",
|
||||||
|
pt: "\ud83c\uddf5\ud83c\uddf9",
|
||||||
|
"pt-BR": "\ud83c\udde7\ud83c\uddf7",
|
||||||
|
ro: "\ud83c\uddf7\ud83c\uddf4",
|
||||||
|
ru: "\ud83c\uddf7\ud83c\uddfa",
|
||||||
|
sk: "\ud83c\uddf8\ud83c\uddf0",
|
||||||
|
sl: "\ud83c\uddf8\ud83c\uddee",
|
||||||
|
es: "\ud83c\uddea\ud83c\uddf8",
|
||||||
|
sv: "\ud83c\uddf8\ud83c\uddfb",
|
||||||
|
tl: "\ud83c\uddf5\ud83c\udded",
|
||||||
|
th: "\ud83c\uddf9\ud83c\udded",
|
||||||
|
tr: "\ud83c\uddf9\ud83c\uddf7",
|
||||||
|
uk: "\ud83c\uddfa\ud83c\udde6",
|
||||||
|
ur: "\ud83c\uddf5\ud83c\uddf0",
|
||||||
|
};
|
||||||
|
|
||||||
|
const translate = new Command("translate");
|
||||||
|
translate.category = "misc";
|
||||||
|
translate.helpText = "Translate";
|
||||||
|
translate.usage = "<--from=lang> <--to=lang> [string]";
|
||||||
|
translate.addAlias("tr");
|
||||||
|
translate.callback = async function (msg, line, args, {from, to, languages}) {
|
||||||
|
if (!hf.config.libretranslate) return "No translation provider is set on this instance.";
|
||||||
|
|
||||||
|
if (languages) {
|
||||||
|
return Object.keys(languageCodeToName)
|
||||||
|
.map((code) => `${languageCodeToFlag} ${languageCodeToName[code]} - \`${code}\``)
|
||||||
|
.join("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
let text = args?.join(" ") ?? "";
|
||||||
|
if (text == null || text == "") {
|
||||||
|
if (msg.messageReference?.messageID) {
|
||||||
|
const reply = await msg.channel.getMessage(msg.messageReference.messageID);
|
||||||
|
text = reply.content;
|
||||||
|
} else {
|
||||||
|
return "Arguments or reply required.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (text == null || text == "") return "No text provided.";
|
||||||
|
|
||||||
|
if (from == null) from = "auto";
|
||||||
|
if (to == null) to = "en";
|
||||||
|
if (languageCodeToName[from] == null) {
|
||||||
|
from = "auto";
|
||||||
|
}
|
||||||
|
if (languageCodeToName[to] == null) {
|
||||||
|
to = "en";
|
||||||
|
}
|
||||||
|
|
||||||
|
const res = await fetch(`${hf.config.libretranslate}/translate`, {
|
||||||
|
method: "POST",
|
||||||
|
headers: {"Content-Type": "application/json"},
|
||||||
|
body: JSON.stringify({
|
||||||
|
q: text,
|
||||||
|
source: from,
|
||||||
|
target: to,
|
||||||
|
alternatives: 0,
|
||||||
|
api_key: "",
|
||||||
|
}),
|
||||||
|
}).then((res) => res.json());
|
||||||
|
|
||||||
|
const fromLanguage = res.detectedLanguage?.language ?? from;
|
||||||
|
const confidence = res.detectedLanguage ? ` (${res.detectedLanguage.confidence}%)` : "";
|
||||||
|
|
||||||
|
return `-# Translated from ${languageCodeToFlag[fromLanguage] ?? Icons.blank} **${
|
||||||
|
languageCodeToName[fromLanguage] ?? `<unknown: \`${fromLanguage}\`>`
|
||||||
|
}**${confidence} to ${languageCodeToFlag[to] ?? Icons.blank} **${
|
||||||
|
languageCodeToName[to] ?? `<unknown: \`${to}\`>`
|
||||||
|
}**\n${res.translatedText
|
||||||
|
.replaceAll("`", "\\`")
|
||||||
|
.replaceAll("*", "\\*")
|
||||||
|
.replaceAll("_", "\\_")
|
||||||
|
.replaceAll("||", "|\u200b|")
|
||||||
|
.replaceAll("~~", "~\u200b~")}`;
|
||||||
|
};
|
||||||
|
hf.registerCommand(translate);
|
||||||
|
|
||||||
|
const translateInteraction = new InteractionCommand("translate");
|
||||||
|
translateInteraction.helpText = "Translate";
|
||||||
|
translateInteraction.options.content = {
|
||||||
|
name: "text",
|
||||||
|
type: ApplicationCommandOptionTypes.STRING,
|
||||||
|
description: "Text to translate",
|
||||||
|
required: true,
|
||||||
|
default: "",
|
||||||
|
};
|
||||||
|
translateInteraction.options.from = {
|
||||||
|
name: "from",
|
||||||
|
type: ApplicationCommandOptionTypes.STRING,
|
||||||
|
description: "Language to translate from (default: Auto Detect)",
|
||||||
|
default: "auto",
|
||||||
|
choices: Object.entries(languageCodeToName).map(([code, name]) => ({name, value: code})),
|
||||||
|
};
|
||||||
|
translateInteraction.options.to = {
|
||||||
|
name: "to",
|
||||||
|
type: ApplicationCommandOptionTypes.STRING,
|
||||||
|
description: "Language to translate to (default: English)",
|
||||||
|
default: "en",
|
||||||
|
choices: Object.entries(languageCodeToName)
|
||||||
|
.filter(([code]) => code !== "auto")
|
||||||
|
.map(([code, name]) => ({name, value: code})),
|
||||||
|
};
|
||||||
|
translateInteraction.callback = async function (interaction) {
|
||||||
|
const text = this.getOption(interaction, "text");
|
||||||
|
const from = this.getOption(interaction, "from");
|
||||||
|
const to = this.getOption(interaction, "to");
|
||||||
|
|
||||||
|
return translate.callback(interaction, text, text.split(" "), {from, to});
|
||||||
|
};
|
||||||
|
hf.registerCommand(translateInteraction);
|
||||||
|
|
@ -35,8 +35,8 @@ charinfo.callback = async function (msg, line) {
|
||||||
.replace("_", "\\_")
|
.replace("_", "\\_")
|
||||||
.replace("`", "\\`")
|
.replace("`", "\\`")
|
||||||
.replace("*", "\\*")
|
.replace("*", "\\*")
|
||||||
.replace("<", "\\<")
|
.replace("<", "\\<")
|
||||||
.replace(">", "\\>")}`
|
.replace(">", "\\>")}`
|
||||||
)
|
)
|
||||||
.join("\n");
|
.join("\n");
|
||||||
|
|
||||||
|
|
@ -71,4 +71,3 @@ charinfoInteraction.callback = async function (interaction) {
|
||||||
return charinfo.callback(interaction, content);
|
return charinfo.callback(interaction, content);
|
||||||
};
|
};
|
||||||
hf.registerCommand(charinfoInteraction);
|
hf.registerCommand(charinfoInteraction);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue