Guía 23

Internacionalizar bots: detección de idioma, catálogos de mensajes, plurales, formatos y texto de derecha a izquierda

Traducir cadenas es lo fácil. Una buena localización cubre también plurales, formatos, menús de comandos y la longitud del resultado.

Guía2 min de lecturaActualizado

Decide el idioma del usuario

Las plataformas dan pistas:

  • Telegram: from.language_code (una etiqueta IETF como es o pt-br), cuando el cliente la comparte.
  • Discord: locale en las interacciones (idioma del cliente) y guild_locale en servidores de comunidad.
  • Slack: el locale del usuario está disponible con users.info y include_locale=true.
  • WhatsApp y Messenger: no hay un campo fiable; deduce con cuidado por el prefijo telefónico o pregunta.

Usa la pista como valor por defecto, ofrece un comando /language y guarda la elección. Una pista no es una promesa: el idioma de la interfaz puede no ser el idioma en el que la persona quiere chatear.

Catálogos de mensajes

Mantén las cadenas fuera del código, con un ID por clave:

# es.ftl (sintaxis de Project Fluent)
items-in-cart = { $count ->
    [one] Tienes un artículo en el carrito.
   *[other] Tienes { $count } artículos en el carrito.
}
  • Usa un formato con reglas de plural, como ICU MessageFormat o Project Fluent. Cada idioma tiene categorías distintas (por ejemplo, el árabe tiene seis y el japonés una); Intl.PluralRules las expone.
  • Usa marcadores con nombre, no concatenación, porque el orden de las palabras cambia entre idiomas.
  • Da contexto a quien traduce: dónde aparece el texto y su límite de longitud.
  • Usa un idioma por defecto si falta una clave y detecta las claves ausentes en los tests.

Localiza la superficie del bot

  • Telegram: llama a setMyCommands con language_code para cada idioma; cada persona ve el menú en el idioma de su app. El constructor de comandos genera el JSON. El nombre, la descripción y la descripción corta del bot también se pueden definir por idioma.
  • Discord: los comandos admiten name_localizations y description_localizations. Consulta el constructor de comandos de Discord.
  • Botones y teclados también se traducen, y el texto debe seguir cabiendo.

Formatos

  • Fechas, números y monedas: usa Intl.DateTimeFormat, Intl.NumberFormat e Intl.RelativeTimeFormat (o Babel en Python) con el locale del usuario.
  • Hora: guarda en UTC y muestra en la zona del usuario. Planifica horarios con el planificador de zonas horarias.
  • Discord muestra las marcas <t:UNIX:F> en la hora local de cada lector; úsalas en canales compartidos. El conversor de timestamps las crea.

Longitud y dirección

  • Las traducciones suelen ser más largas que el inglés; comprueba los límites de botones, embeds y mensajes con el divisor de mensajes.
  • El árabe, el hebreo y el persa se escriben de derecha a izquierda. El texto mixto con números o nombres latinos puede mostrarse desordenado; los aislantes Unicode (U+2068 y U+2069) alrededor de los valores insertados ayudan.

Bots con LLM

Indica al modelo en qué idioma responder según la preferencia guardada, no solo según el último mensaje, y evalúa la calidad por idioma: los modelos no rinden igual en todos.

Comprueba lo aprendido

1. ¿Por qué usar un formato de mensajes con reglas de plural?
2. ¿Cómo se localiza el menú de comandos de Telegram?