Por qué tu chat envía media frase en japonés
Si tu chat envía el mensaje cuando alguien pulsa Enter, enviará frases en japonés a medio escribir. Quien escribe en japonés, chino o coreano usa un método de entrada (IME) y pulsa Enter para confirmar la conversión de una palabra, no para enviar. La solución es ignorar Enter mientras hay una composición activa: comprueba event.isComposing y también keyCode === 229 para Safari.
Vivo en Tokio y escribo en cuatro idiomas casi todos los días. Este es el fallo que más me encuentro en productos de IA hechos fuera de Asia, incluidos algunos con mucha financiación. Escribes unas palabras en hiragana, pulsas Enter para convertirlas en kanji y el mensaje se va, con los caracteres equivocados, mientras el modelo ya responde a una pregunta que no habías terminado.
Qué hace un IME con la tecla Enter
Escribir japonés en un portátil tiene dos pasos. Tecleas sonidos en un teclado latino, el método de entrada los muestra en hiragana subrayado, pulsas Espacio para recorrer los candidatos en kanji y pulsas Enter para confirmar el que quieres. Solo después de esa confirmación el texto está de verdad en el campo.
Esa etapa subrayada se llama composición. El navegador la marca con un evento compositionstart cuando empieza y compositionend cuando el texto se confirma. Durante la composición, Enter le pertenece al método de entrada. Una frase de longitud normal puede llevar cinco o seis de esas pulsaciones antes de que la persona quiera enviar nada.
Las interfaces de chat lo empeoraron. Hace diez años la mayoría de formularios necesitaban un clic en un botón de enviar. Los productos de IA copiaron el patrón de las apps de mensajería, donde Enter envía y Mayúsculas más Enter añade una línea, y muchos de esos manejadores se escribieron y probaron solo en inglés.
La solución en código
MDN documenta el patrón directamente en la página del evento keydown. Comprueba isComposing y comprueba si keyCode vale 229, el valor que los navegadores ponen en los eventos de teclado que ha procesado el método de entrada:
textarea.addEventListener("keydown", (event) => {
if (event.isComposing || event.keyCode === 229) return
if (event.key === "Enter" && !event.shiftKey) {
event.preventDefault()
send()
}
})
La segunda comprobación hace falta. MDN advierte que compositionend puede dispararse antes del keydown de la tecla que cierra el método de entrada, así que isComposing es falso justo en la pulsación de Enter que te importa. keyCode está obsoleto, pero en ese caso sigue valiendo 229.
Por qué Safari necesita la comprobación extra
Los datos de compatibilidad que usa MDN marcan el soporte de isComposing en Safari como parcial. La nota dice que, en la pulsación que completa una composición, los eventos keydown e input se envían después de compositionend en lugar de antes, así que isComposing es falso cuando esperarías verdadero. Chrome y Firefox se comportan como se espera.
Eso importa en el Mac, y en iPhone y iPad, donde Safari y la mayoría de los demás navegadores siguen funcionando sobre WebKit. Un equipo que prueba en Chrome en un portátil con Windows y un método de entrada japonés verá que la primera comprobación funciona y lo publicará. Un usuario japonés en un MacBook con Safari se encontrará el fallo igualmente.
Si usas un framework, revisa qué hace por ti. Algunas librerías de interfaz lo gestionan dentro de sus componentes de texto y otras te lo dejan a ti. React pasa el evento nativo como event.nativeEvent, así que las mismas dos comprobaciones funcionan ahí.
Pruébalo como lo usaría alguien en Japón
No necesitas leer japonés para probarlo. Añade el método de entrada japonés en tu Mac o PC, cámbiate a él, escribe konnichiha en tu chat, pulsa Espacio para convertir y luego pulsa Enter una vez. No debería enviarse nada. Pulsa Enter otra vez y el mensaje debería salir.
Haz lo mismo en Safari, en Chrome y en un iPhone con el teclado japonés. En el teléfono prueba también el teclado chino pinyin; la entrada en chino tiene el mismo paso de composición y el mismo fallo.
Hay dos casos más que merecen un minuto. Pega una frase en japonés y pulsa Enter, que sí debería enviar porque no hay composición activa. Y prueba el botón de enviar con una composición todavía subrayada, y decide a propósito si eso confirma el texto o espera.
La lección más amplia para productos de IA
Los modelos de lenguaje ya escriben bien en japonés. Eso hace fácil suponer que un producto funciona en Japón porque las respuestas llegan en un japonés fluido. Donde se rompe es en la caja de texto, y se rompe antes de que el modelo intervenga.
Esto conecta con algo sobre lo que escribo a menudo: en Japón la gente juzga un producto por el cuidado con el que trata los detalles pequeños, y una tecla Enter rota se lee como un producto que no se hizo para ellos. Hablé del patrón general en qué hace diferente al UX japonés, y de por qué la interfaz escrita pesa tanto en el artículo sobre la escritura en inglés en Japón. La comprobación del IME son cuatro líneas de código, y para un usuario japonés suele ser la primera señal de que alguien probó el producto en su idioma.