From d188c9726736c41ff9380c6b55eb2dfcd6f8a79f Mon Sep 17 00:00:00 2001 From: Valerie Date: Sat, 24 May 2025 01:22:38 -0400 Subject: [PATCH] Enhance Translator Cog with new configuration options and slash command support. Update description to reflect feature-rich capabilities, including embed display preferences and improved error handling for translations. Refactor translation response handling to support both embeds and plain text based on user settings. --- translator/info.json | 4 +- translator/translator.py | 90 ++++++++++++++++++++++++++++++---------- 2 files changed, 69 insertions(+), 25 deletions(-) diff --git a/translator/info.json b/translator/info.json index 3311190..b208321 100644 --- a/translator/info.json +++ b/translator/info.json @@ -1,8 +1,8 @@ { "name": "Translator", "short": "Translate messages in different languages", - "description": "A cog that allows you to translate messages by replying to them. Supports multiple languages using Google Translate.", - "end_user_data_statement": "This cog does not store any user data.", + "description": "A feature-rich translation cog that allows you to translate messages by replying to them or using slash commands. Supports multiple languages using Google Translate, with configurable embed/text display, user mentions, and ephemeral responses.", + "end_user_data_statement": "This cog stores guild-specific settings for embed display preferences. No personal user data is stored.", "author": [ "Valerie" ], diff --git a/translator/translator.py b/translator/translator.py index e4c15b5..195d06d 100644 --- a/translator/translator.py +++ b/translator/translator.py @@ -1,6 +1,7 @@ -from redbot.core import commands +from redbot.core import commands, Config from googletrans import Translator, LANGUAGES import discord +from discord import app_commands import asyncio class TranslatorCog(commands.Cog): @@ -10,6 +11,57 @@ class TranslatorCog(commands.Cog): self.bot = bot self.translator = Translator() self.languages = LANGUAGES + self.config = Config.get_conf(self, identifier=95932766180) + default_guild = { + "use_embeds": True + } + self.config.register_guild(**default_guild) + + @commands.group(name="transset") + @commands.admin_or_permissions(manage_guild=True) + async def _transset(self, ctx): + """Configure translator settings""" + pass + + @_transset.command(name="embed") + async def _transset_embed(self, ctx, toggle: bool): + """Toggle whether to use embeds for translations or plain text""" + await self.config.guild(ctx.guild).use_embeds.set(toggle) + await ctx.send(f"Embed display has been {'enabled' if toggle else 'disabled'}.") + + async def translate_and_respond(self, ctx, text_to_translate, dest_lang="en", source_lang="auto", original_author=None, ephemeral=False): + try: + # Validate destination language + if dest_lang.lower() not in self.languages and dest_lang.lower() not in {v.lower(): k for k, v in self.languages.items()}: + return await ctx.send(f"Invalid destination language code. Use `{ctx.prefix}langlist` to see available languages.", ephemeral=True) + + # Convert language name to code if full name was provided + if dest_lang.lower() in {v.lower(): k for k, v in self.languages.items()}: + dest_lang = next(k for k, v in self.languages.items() if v.lower() == dest_lang.lower()) + + # Translate the text + translation = self.translator.translate(text_to_translate, dest=dest_lang, src=source_lang) + + use_embeds = await self.config.guild(ctx.guild).use_embeds() + + if use_embeds: + embed = discord.Embed(title="Translation", color=discord.Color.blue()) + if original_author: + embed.set_author(name=f"Original message by {original_author.display_name}", icon_url=original_author.display_avatar.url) + embed.add_field(name=f"Original ({translation.src}):", value=text_to_translate[:1024], inline=False) + embed.add_field(name=f"Translation ({translation.dest}):", value=translation.text[:1024], inline=False) + await ctx.send(content=ctx.author.mention, embed=embed, ephemeral=ephemeral) + else: + author_text = f"\nOriginal message by: {original_author.display_name}" if original_author else "" + response = ( + f"{ctx.author.mention}\n" + f"**Original** ({translation.src}):{author_text}\n{text_to_translate}\n\n" + f"**Translation** ({translation.dest}):\n{translation.text}" + ) + await ctx.send(response, ephemeral=ephemeral) + + except Exception as e: + await ctx.send(f"An error occurred while translating: {str(e)}", ephemeral=True) @commands.command(name="translate") async def translate_text(self, ctx, *, message=None): @@ -25,6 +77,7 @@ class TranslatorCog(commands.Cog): if ctx.message.reference: referenced_msg = await ctx.fetch_message(ctx.message.reference.message_id) text_to_translate = referenced_msg.content + original_author = referenced_msg.author # Check if language was specified in the command if message: @@ -39,6 +92,7 @@ class TranslatorCog(commands.Cog): dest_lang = "en" source_lang = "auto" else: + original_author = ctx.author # Direct message translation if "->" in message: try: @@ -55,28 +109,7 @@ class TranslatorCog(commands.Cog): dest_lang = "en" source_lang = "auto" - try: - # Validate destination language - if dest_lang.lower() not in self.languages and dest_lang.lower() not in {v.lower(): k for k, v in self.languages.items()}: - await ctx.send(f"Invalid destination language code. Available languages: {', '.join(self.languages.keys())}") - return - - # Convert language name to code if full name was provided - if dest_lang.lower() in {v.lower(): k for k, v in self.languages.items()}: - dest_lang = next(k for k, v in self.languages.items() if v.lower() == dest_lang.lower()) - - # Translate the text - translation = self.translator.translate(text_to_translate, dest=dest_lang, src=source_lang) - - # Create embed - embed = discord.Embed(title="Translation", color=discord.Color.blue()) - embed.add_field(name=f"Original ({translation.src}):", value=text_to_translate[:1024], inline=False) - embed.add_field(name=f"Translation ({translation.dest}):", value=translation.text[:1024], inline=False) - - await ctx.send(embed=embed) - - except Exception as e: - await ctx.send(f"An error occurred while translating: {str(e)}") + await self.translate_and_respond(ctx, text_to_translate, dest_lang, source_lang, original_author) @commands.command(name="langlist") async def language_list(self, ctx): @@ -97,5 +130,16 @@ class TranslatorCog(commands.Cog): embed = discord.Embed(description="\n".join(chunk), color=discord.Color.blue()) await ctx.send(embed=embed) + @app_commands.command(name="translate") + @app_commands.describe( + text="The text to translate", + to_language="The language to translate to (e.g., 'en' for English)", + from_language="The language to translate from (optional)" + ) + async def slash_translate(self, interaction: discord.Interaction, text: str, to_language: str, from_language: str = "auto"): + """Translate text from one language to another""" + await interaction.response.defer(ephemeral=True) + await self.translate_and_respond(interaction, text, to_language, from_language, interaction.user, ephemeral=True) + async def setup(bot): await bot.add_cog(TranslatorCog(bot)) \ No newline at end of file