Enhance Translator Cog by adding support for message references in translation responses. Update error handling and command logic to improve user experience when translating messages. Refactor command descriptions for clarity and usability.

This commit is contained in:
Valerie 2025-05-24 02:12:55 -04:00
parent 07686d47c2
commit b8911e1b93

View file

@ -29,11 +29,15 @@ class TranslatorCog(commands.Cog):
await self.config.guild(ctx.guild).use_embeds.set(toggle) await self.config.guild(ctx.guild).use_embeds.set(toggle)
await ctx.send(f"Embed display has been {'enabled' if toggle else 'disabled'}.") 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): async def translate_and_respond(self, ctx, text_to_translate, dest_lang="en", source_lang="auto", original_author=None, ephemeral=False, reference_message=None):
try: try:
# Validate destination language # 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()}: 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) return await ctx.send(
f"Invalid language code. Use `{ctx.prefix}langlist` to see available languages.",
ephemeral=True,
reference=reference_message
)
# Convert language name to code if full name was provided # 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()}: if dest_lang.lower() in {v.lower(): k for k, v in self.languages.items()}:
@ -50,7 +54,12 @@ class TranslatorCog(commands.Cog):
embed.set_author(name=f"Original message by {original_author.display_name}", icon_url=original_author.display_avatar.url) 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"Original ({translation.src}):", value=text_to_translate[:1024], inline=False)
embed.add_field(name=f"Translation ({translation.dest}):", value=translation.text[: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) await ctx.send(
content=ctx.author.mention,
embed=embed,
ephemeral=ephemeral,
reference=reference_message
)
else: else:
author_text = f"\nOriginal message by: {original_author.display_name}" if original_author else "" author_text = f"\nOriginal message by: {original_author.display_name}" if original_author else ""
response = ( response = (
@ -58,58 +67,83 @@ class TranslatorCog(commands.Cog):
f"**Original** ({translation.src}):{author_text}\n{text_to_translate}\n\n" f"**Original** ({translation.src}):{author_text}\n{text_to_translate}\n\n"
f"**Translation** ({translation.dest}):\n{translation.text}" f"**Translation** ({translation.dest}):\n{translation.text}"
) )
await ctx.send(response, ephemeral=ephemeral) await ctx.send(
response,
ephemeral=ephemeral,
reference=reference_message
)
except Exception as e: except Exception as e:
await ctx.send(f"An error occurred while translating: {str(e)}", ephemeral=True) await ctx.send(
f"An error occurred while translating: {str(e)}",
ephemeral=True,
reference=reference_message
)
@commands.command(name="translate") @commands.command(name="translate")
async def translate_text(self, ctx, *, message=None): async def translate_text(self, ctx, lang_code: str = "en", *, message=None):
"""Translate a message to English by replying to it """Translate a message
You can also specify a language code after your message to translate to that language Reply to a message with just the language code to translate to that language
Example: [p]translate bonjour fr -> en Or provide text after the language code to translate that text
Examples:
- Reply to a message: [p]translate jp
- Translate text: [p]translate fr Hello, how are you?
- Auto-detect and translate to English: [p]translate This will detect the language
""" """
if not message and not ctx.message.reference: # Initialize variables
await ctx.send("Please either provide text to translate or reply to a message to translate it.") text_to_translate = None
return original_author = None
reference_message = None
# If replying to a message # If replying to a message
if ctx.message.reference: if ctx.message.reference:
referenced_msg = await ctx.fetch_message(ctx.message.reference.message_id) referenced_msg = await ctx.fetch_message(ctx.message.reference.message_id)
text_to_translate = referenced_msg.content text_to_translate = referenced_msg.content
original_author = referenced_msg.author original_author = referenced_msg.author
reference_message = referenced_msg
# Check if language was specified in the command
if message: # If no language code is provided in a reply, default to English
try: if not lang_code or lang_code.lower() not in self.languages:
source_lang, dest_lang = message.split("->") if message: # If there's additional text, it means the first argument was text, not a lang code
source_lang = source_lang.strip() text_to_translate = f"{lang_code} {message}"
dest_lang = dest_lang.strip() lang_code = "en"
except ValueError:
dest_lang = "en"
source_lang = "auto"
else: else:
dest_lang = "en" # Valid language code provided
source_lang = "auto" if message: # If there's a message after the lang code, use that instead of the replied message
else:
original_author = ctx.author
# Direct message translation
if "->" in message:
try:
text, langs = message.rsplit("->", 1)
text_to_translate = text.strip()
dest_lang = langs.strip()
source_lang = "auto"
except ValueError:
text_to_translate = message text_to_translate = message
dest_lang = "en" original_author = ctx.author
source_lang = "auto" reference_message = ctx.message
else:
# Not replying to a message
original_author = ctx.author
reference_message = ctx.message
if not message: # Only language code provided without text
await ctx.send("Please provide text to translate or reply to a message.", reference=ctx.message)
return
# Check if the "lang_code" is actually the start of the message
if lang_code.lower() not in self.languages:
text_to_translate = f"{lang_code} {message}" if message else lang_code
lang_code = "en" # Default to English for direct translation
else: else:
text_to_translate = message text_to_translate = message
dest_lang = "en"
source_lang = "auto"
await self.translate_and_respond(ctx, text_to_translate, dest_lang, source_lang, original_author) # If we still don't have text to translate
if not text_to_translate:
await ctx.send("Please provide text to translate or reply to a message.", reference=ctx.message)
return
await self.translate_and_respond(
ctx,
text_to_translate,
dest_lang=lang_code,
source_lang="auto",
original_author=original_author,
reference_message=reference_message
)
@commands.command(name="langlist") @commands.command(name="langlist")
async def language_list(self, ctx): async def language_list(self, ctx):
@ -128,7 +162,7 @@ class TranslatorCog(commands.Cog):
color=discord.Color.blue()) color=discord.Color.blue())
else: else:
embed = discord.Embed(description="\n".join(chunk), color=discord.Color.blue()) embed = discord.Embed(description="\n".join(chunk), color=discord.Color.blue())
await ctx.send(embed=embed) await ctx.send(embed=embed, reference=ctx.message if i == 0 else None)
@app_commands.command(name="translate") @app_commands.command(name="translate")
@app_commands.describe( @app_commands.describe(