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 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:
# 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)
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
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.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)
await ctx.send(
content=ctx.author.mention,
embed=embed,
ephemeral=ephemeral,
reference=reference_message
)
else:
author_text = f"\nOriginal message by: {original_author.display_name}" if original_author else ""
response = (
@ -58,58 +67,83 @@ class TranslatorCog(commands.Cog):
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)
await ctx.send(
response,
ephemeral=ephemeral,
reference=reference_message
)
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")
async def translate_text(self, ctx, *, message=None):
"""Translate a message to English by replying to it
You can also specify a language code after your message to translate to that language
Example: [p]translate bonjour fr -> en
async def translate_text(self, ctx, lang_code: str = "en", *, message=None):
"""Translate a message
Reply to a message with just the language code to translate to that language
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:
await ctx.send("Please either provide text to translate or reply to a message to translate it.")
return
# Initialize variables
text_to_translate = None
original_author = None
reference_message = None
# If replying to a message
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:
try:
source_lang, dest_lang = message.split("->")
source_lang = source_lang.strip()
dest_lang = dest_lang.strip()
except ValueError:
dest_lang = "en"
source_lang = "auto"
reference_message = referenced_msg
# If no language code is provided in a reply, default to English
if not lang_code or lang_code.lower() not in self.languages:
if message: # If there's additional text, it means the first argument was text, not a lang code
text_to_translate = f"{lang_code} {message}"
lang_code = "en"
else:
dest_lang = "en"
source_lang = "auto"
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:
# Valid language code provided
if message: # If there's a message after the lang code, use that instead of the replied message
text_to_translate = message
dest_lang = "en"
source_lang = "auto"
original_author = ctx.author
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:
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")
async def language_list(self, ctx):
@ -128,7 +162,7 @@ class TranslatorCog(commands.Cog):
color=discord.Color.blue())
else:
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.describe(