diff --git a/translator/translator.py b/translator/translator.py index 195d06d..99e32a4 100644 --- a/translator/translator.py +++ b/translator/translator.py @@ -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(