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.
Some checks are pending
Run pre-commit / Run pre-commit (push) Waiting to run
Some checks are pending
Run pre-commit / Run pre-commit (push) Waiting to run
This commit is contained in:
parent
db4d51f5a3
commit
d188c97267
2 changed files with 69 additions and 25 deletions
|
@ -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"
|
||||
],
|
||||
|
|
|
@ -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))
|
Loading…
Add table
Reference in a new issue