Fix: Mejorar manejo de menciones en traducciones usando placeholders más robustos

- Cambiar formato de placeholder de <m0 /> a 【M0】 (corchetes chinos)
- El traductor ya no altera estos placeholders
- Agregar verificación de placeholders antes de usar caché
- Regenerar traducciones automáticamente si placeholders no coinciden
- Compatible con formatos antiguos de placeholders
This commit is contained in:
2026-03-23 21:19:13 -06:00
parent 77024d443f
commit 48f7a80dc4
2 changed files with 37 additions and 9 deletions

View File

@@ -94,6 +94,15 @@ async def on_member_join(member):
) )
text_escaped = html.escape(formatted_message) text_escaped = html.escape(formatted_message)
mention_pattern = re.compile(r'&lt;@!?(\d+)&gt;|&lt;@&(\d+)&gt;|&lt;#(\d+)&gt;')
welcome_mentions_map = {}
def replace_mention(match):
placeholder = f"【M{len(welcome_mentions_map)}"
welcome_mentions_map[placeholder] = html.unescape(match.group(0))
return placeholder
text_to_translate = mention_pattern.sub(replace_mention, text_escaped)
welcome_msg = await channel.send(formatted_message) welcome_msg = await channel.send(formatted_message)
print(f"[WELCOME] Mensaje enviado: {welcome_msg.id}") print(f"[WELCOME] Mensaje enviado: {welcome_msg.id}")
@@ -102,8 +111,8 @@ async def on_member_join(member):
welcome_msg.id, welcome_msg.id,
member.guild.id, member.guild.id,
member.id, member.id,
text_escaped, text_to_translate,
{}, welcome_mentions_map,
'discord' 'discord'
) )
@@ -153,13 +162,12 @@ async def on_message(message):
active_codes = get_active_langs_for_guild(message.guild.id) active_codes = get_active_langs_for_guild(message.guild.id)
if not active_codes: return if not active_codes: return
# Escapar y procesar menciones
text_escaped = html.escape(message.content) text_escaped = html.escape(message.content)
mention_pattern = re.compile(r'&lt;@!?(\d+)&gt;|&lt;@&(\d+)&gt;|&lt;#(\d+)&gt;') mention_pattern = re.compile(r'&lt;@!?(\d+)&gt;|&lt;@&(\d+)&gt;|&lt;#(\d+)&gt;')
mentions_map = {} mentions_map = {}
def replace_mention(match): def replace_mention(match):
placeholder = f"<m{len(mentions_map)} />" placeholder = f"【M{len(mentions_map)}"
mentions_map[placeholder] = html.unescape(match.group(0)) mentions_map[placeholder] = html.unescape(match.group(0))
return placeholder return placeholder

View File

@@ -52,11 +52,22 @@ class TranslationButton(discord.ui.Button):
return return
text = db_msg['content'] text = db_msg['content']
mentions_map = db_msg['mentions_map'] mentions_map = db_msg['mentions_map'] or {}
cached = get_cached_translation(original_msg_id, self.lang_code) cached = get_cached_translation(original_msg_id, self.lang_code)
needs_retranslate = False
if cached: if cached:
translated = cached for placeholder in mentions_map.keys():
if placeholder not in cached:
needs_retranslate = True
break
if needs_retranslate:
translated = await translate_text(text, self.lang_code)
save_translation(original_msg_id, self.lang_code, translated)
else:
translated = cached
else: else:
translated = await translate_text(text, self.lang_code) translated = await translate_text(text, self.lang_code)
save_translation(original_msg_id, self.lang_code, translated) save_translation(original_msg_id, self.lang_code, translated)
@@ -65,7 +76,6 @@ class TranslationButton(discord.ui.Button):
if mentions_map: if mentions_map:
for placeholder, mention in mentions_map.items(): for placeholder, mention in mentions_map.items():
translated = translated.replace(placeholder, mention) translated = translated.replace(placeholder, mention)
translated = translated.replace(placeholder.replace(" ", ""), mention)
guild_id = interaction.guild_id guild_id = interaction.guild_id
active_codes = get_active_languages(guild_id) active_codes = get_active_languages(guild_id)
@@ -145,8 +155,19 @@ class WelcomeTranslationButton(discord.ui.Button):
mentions_map = db_msg['mentions_map'] or {} mentions_map = db_msg['mentions_map'] or {}
cached = get_cached_translation(original_msg_id, self.lang_code) cached = get_cached_translation(original_msg_id, self.lang_code)
needs_retranslate = False
if cached: if cached:
translated = cached for placeholder in mentions_map.keys():
if placeholder not in cached:
needs_retranslate = True
break
if needs_retranslate:
translated = await translate_text(text, self.lang_code)
save_translation(original_msg_id, self.lang_code, translated)
else:
translated = cached
else: else:
translated = await translate_text(text, self.lang_code) translated = await translate_text(text, self.lang_code)
save_translation(original_msg_id, self.lang_code, translated) save_translation(original_msg_id, self.lang_code, translated)
@@ -155,7 +176,6 @@ class WelcomeTranslationButton(discord.ui.Button):
if mentions_map: if mentions_map:
for placeholder, mention in mentions_map.items(): for placeholder, mention in mentions_map.items():
translated = translated.replace(placeholder, mention) translated = translated.replace(placeholder, mention)
translated = translated.replace(placeholder.replace(" ", ""), mention)
guild_id = interaction.guild_id guild_id = interaction.guild_id
active_codes = get_active_languages(guild_id) active_codes = get_active_languages(guild_id)