La versión en inglés de un analizador de Cache-Control recién lanzado mostraba texto en japonés: su estado decía “新鮮” en lugar de “Fresh”. El error se remontaba a una lógica compartida que devolvía cadenas de texto en japonés codificadas directamente, mientras que la página solo proporcionaba etiquetas en inglés.

El desarrollador crea una serie de herramientas ligeras para el navegador, cada una con una página en inglés y otra en japonés que reutilizan las mismas funciones de análisis y la lógica central. Solo debería variar la redacción visible. Cuando se lanzó el analizador de Cache-Control, la interfaz en inglés mostraba las etiquetas correctas, pero los valores que renderizaba provenían de la capa de lógica, que aún contenía literales en japonés. No aparecieron errores en la consola; la página parecía normal, pero la información presentada a los usuarios de habla inglesa era incorrecta.

Por qué la lógica compartida puede traicionar la traducción

El error surgió de una decisión de diseño: la función principal que decide qué mostrar devolvía cadenas literales en japonés. La capa de la página, responsable del texto en inglés que la rodea, nunca tuvo la oportunidad de reemplazar esos valores. Debido a que la lógica y la interfaz de usuario (UI) estaban claramente separadas, el problema permaneció invisible durante las pruebas: técnicamente todo "funcionaba", aunque el idioma orientado al usuario fuera incorrecto.

El inconveniente es que el idioma utilizado dentro del módulo compartido se convierte en el predeterminado para cada front-end que lo consume. Si se requiere un idioma diferente, ese valor predeterminado se convierte en un error oculto.

La solución: claves, paquetes y una red de seguridad

El autor reescribió la arquitectura para separar las responsabilidades:

  • Los paquetes de mensajes (message packs) ahora contienen todas las cadenas legibles por humanos para cada idioma.
  • La lógica compartida devuelve únicamente claves simbólicas, nunca texto sin procesar.
  • Las páginas buscan la palabra apropiada en el paquete correspondiente basándose en la clave.

Cuando un mensaje debe incluir un número, el nuevo código utiliza una pequeña función en lugar de una cadena de plantilla (template string). Esto permite que cada idioma decida dónde debe ir el número, adaptándose a las diferencias en el orden de las palabras.

También se añadió un paso sencillo de análisis estático: el proceso de compilación (build process) escanea los archivos compartidos en busca de caracteres japoneses. Si aparece alguno, se alerta al desarrollador de inmediato, evitando que se vuelva a introducir texto extranjero codificado directamente.

Lo que la experiencia le enseñó al autor

  1. La traducción actúa como una fase de revisión. Mientras escribía los mensajes en inglés, el autor notó que algunos equivalentes en japonés eran vagos. Traducir obligó a utilizar una redacción más clara en ambos idiomas.
  2. Las funciones compartidas que devuelven cadenas de texto fijan un idioma para todos. Si una función decide el idioma, cualquier consumidor que espere uno diferente heredará el error. El fallo no es un error visual de la interfaz; es un fallo de lógica.

Recomendaciones para quienes mantengan herramientas multilingües

  • Devuelva claves, no cadenas, desde las funciones principales. Deje que la capa de la interfaz de usuario se encargue de la localización.
  • O pase las cadenas deseadas a la función como parámetros. Esto mantiene la lógica agnóstica al idioma.
  • Audite los módulos compartidos en busca de texto en el idioma nativo codificado directamente. Una búsqueda rápida de caracteres que no sean ASCII puede sacar a la luz problemas ocultos.
  • Añada una comprobación en tiempo de compilación para caracteres extranjeros en el código compartido. La detección temprana es mejor que la confusión tras el lanzamiento.

Qué tener en cuenta a continuación

Conclusión: Si su proyecto comparte código entre versiones de distintos idiomas, asegúrese de que la parte compartida nunca decida la redacción. Permita que cada página proporcione sus propias palabras y así evitará la vergüenza de que una página en inglés hable accidentalmente en japonés.