import { ContextMenuCommandBuilder, ApplicationCommandType } from 'discord.js'; import { t } from '@nexumi/shared'; import type { ContextMenuCommand } from '../../types.js'; import { getGuildLocale } from '../../i18n.js'; async function translateText(text: string, targetLang: string): Promise { const url = new URL('https://api.mymemory.translated.net/get'); url.searchParams.set('q', text.slice(0, 500)); url.searchParams.set('langpair', `auto|${targetLang}`); const response = await fetch(url.toString()); if (!response.ok) { return null; } const data = (await response.json()) as { responseData?: { translatedText?: string }; }; return data.responseData?.translatedText ?? null; } const translateContextMenu: ContextMenuCommand = { data: new ContextMenuCommandBuilder() .setName('Translate') .setType(ApplicationCommandType.Message), async execute(interaction, context) { const locale = await getGuildLocale(context.prisma, interaction.guildId); const content = interaction.targetMessage.content; if (!content?.trim()) { await interaction.reply({ content: t(locale, 'utility.translate.noContent'), ephemeral: true }); return; } await interaction.deferReply({ ephemeral: true }); const targetLang = locale === 'de' ? 'de' : 'en'; const translated = await translateText(content, targetLang); if (!translated) { await interaction.editReply({ content: t(locale, 'utility.translate.failed') }); return; } await interaction.editReply({ content: t(locale, 'utility.translate.result').replace('{text}', translated) }); } }; export const utilityContextMenus: ContextMenuCommand[] = [translateContextMenu];