Back to Guides
Guía

10 errores comunes de i18n y cómo evitarlos.

Aprende los errores de internacionalización más comunes que cometen los desarrolladores y cómo solucionarlos. Mejora la calidad de la localización de tu aplicación con estas mejores prácticas.

5 Tiempo de lectura mínimo
Por shipglobal.dev
#i18n#developer#user experience#best practices#internationalization#common mistakes

La internacionalización (i18n) parece simple, hasta que descubres que tus usuarios en alemán ven botones recortados, tus usuarios en japonés obtienen fragmentos de oraciones distorsionados y tus usuarios de habla árabe enfrentan diseños completamente rotos. Estos no son casos aislados. Son las consecuencias predecibles de errores comunes que la mayoría de los equipos de desarrollo cometen al abordar la localización por primera vez. En esta guía examinamos los 10 errores más comunes de i18n, explicamos exactamente por qué ocurren y te mostramos, paso a paso, cómo solucionar cada uno. Ya sea que estés construyendo una nueva app o actualizando una existente, evitar estas trampas te ahorra semanas de depuración.

Error #1: Cadenas codificadas

Codificar cadenas de forma fija es el error i18n más fundamental. Sucede porque los desarrolladores se concentran primero en hacer que las características funcionen y planean 'limpiarlo después'. Pero ese momento nunca llega, y de pronto tienes miles de cadenas repartidas en cientos de archivos.

['Configura tu marco i18n antes de escribir la primera línea de código de la interfaz', 'Utiliza un plugin de lint para detectar cadenas hardcodeadas en plantillas y componentes', 'Mantén las claves de traducción descriptivas y organizadas por funcionalidad o página']

Configura tu marco i18n antes de escribir la primera línea de código de la interfaz de usuario

Utiliza un plugin de linter para detectar cadenas codificadas en plantillas y componentes

Mantén las claves de traducción descriptivas y organizadas por función o página

Un escenario típico

1

Un desarrollador escribe una etiqueta de botón directamente en JSX: <button>Submit Order</button>.

2

La aplicación se lanza en inglés y funciona correctamente. Seis meses después la empresa se expande a Alemania.

3

El equipo de localización descubre más de 2.000 cadenas codificadas en duro. La incorporación retroactiva toma 3 semanas y genera 47 errores.

Por qué esto es un problema

En una base de código madura, las cadenas codificadas en duro pueden llegar a miles. Extraerlas más tarde requiere tocar cada archivo, volver a probar cada componente y arriesgar regresiones en todas partes.

Las cadenas codificadas en duro están incrustadas directamente en el código fuente, plantillas o componentes. No se pueden extraer, traducir o intercambiar en tiempo de ejecución sin modificar el código.

Los usuarios en locales que no son inglés ven elementos de UI sin traducir mezclados con contenido traducido, lo que provoca una impresión caótica y poco profesional.

Cómo solucionarlo

Externaliza todos los textos visibles para el usuario desde el inicio en archivos de recursos.

1

Configura un marco de traducción (p. ej., next-intl, react-i18next, vue-i18n) antes de escribir tu primer componente.

2

Crea una estructura de archivos de recursos (p. ej., messages/de.json) y referencia todas las cadenas mediante claves de traducción como t('checkout.submitButton').

3

Añade una regla de linting o un hook de pre-commit que marque literales de cadena sin procesar en componentes de la interfaz de usuario.

Error #10: Traducirlo todo literalmente.

No todo el contenido debe ser traducido. Los nombres de marca, nombres de entidades legales, términos técnicos y ciertos nombres de productos deben permanecer en su idioma original. La sobretraducción puede causar problemas legales, incoherencias de marca y confusión del usuario.

["Mantén un glosario de 'no traducir' y compártelo con todos los traductores", 'Usa segmentos bloqueados o espacios de nombres separados para términos de marca y legales', 'Siempre proporciona notas de contexto para cadenas ambiguas para evitar malas traducciones']

Mantén un glosario de 'no traducir' y compártelo con todos los traductores

Utiliza segmentos bloqueados o espacios de nombres separados para términos de marca y términos legales

Siempre proporciona notas de contexto para cadenas ambiguas para evitar malas traducciones

Un escenario típico

1

Un archivo de traducción contiene el nombre de la empresa 'CloudForge Inc.' y el término técnico 'OAuth 2.0 Token' como cadenas traducibles regulares.

2

El traductor español traduce 'CloudForge' como 'ForjaNube' y 'OAuth 2.0 Token' como 'token OAuth 2.0'.

3

Resultado: los usuarios no pueden encontrar la empresa con su nombre real, y los desarrolladores que leen la documentación en español se confunden por términos técnicos traducidos que no les resultan familiares.

Por qué esto es un problema

Un solo nombre de marca mal traducido en un documento legal puede invalidar contratos. Corregir la sobretraducción requiere revisar cada cadena en cada idioma, lo que puede tomar varias semanas.

Si todos los strings se envían a traducción sin contexto, los traductores pueden traducir nombres de marca ('Apple' → 'Apfel'), términos legales ('GmbH' → 'LLC') o identificadores técnicos que deben permanecer en inglés.

Los usuarios pueden no encontrar productos bajo su nombre de marca familiar, los documentos legales pueden hacer referencia a la empresa incorrecta y la documentación técnica se vuelve poco clara si términos como 'API Endpoint' se traducen.

Cómo solucionarlo

Marca claramente el contenido no traducible y proporciona notas de contexto para los traductores.

1

Crea un glosario de 'no traducir' que liste todos los nombres de marca, nombres de producto, entidades legales y términos técnicos que deben permanecer sin cambios.

2

Usa un espacio de nombres separado o claves dedicadas para contenido no traducible. Muchas herramientas de i18n soportan segmentos 'bloqueados' que los traductores no pueden editar.

3

Agrega comentarios/descripciones para los traductores en tus archivos de traducción que expliquen el contexto: 'Este es un nombre de marca — no traducir' o 'Término — dejar en inglés'.

Error #2: Concatenación de cadenas.

Unir oraciones a partir de fragmentos puede parecer lógico en inglés, pero no funciona en otros idiomas. El orden de las palabras, la gramática y la estructura de las oraciones varían drásticamente entre idiomas, lo que hace que las cadenas concatenadas sean intraducibles.

['Nunca construyas frases concatenando fragmentos traducidos', 'Usa marcadores de posición nombrados ('{name}') en lugar de posicionales ({0}) para mayor claridad', 'Proporciona comentarios de contexto para los traductores explicando qué contiene cada marcador']

Nunca formes oraciones concatenando fragmentos traducidos

Usa marcadores de posición nombrados ('{name}') en lugar de posicionales ({0}) para mayor claridad

Proporciona comentarios de contexto para los traductores que expliquen qué contiene cada marcador de posición.

Un escenario típico

1

El desarrollador escribe: 'You have ' + count + ' items in your ' + cartType + ' cart' — funciona perfectamente en inglés.

2

El traductor alemán recibe tres fragmentos separados y no puede formar una oración gramaticalmente correcta porque el orden de las palabras debe cambiar.

3

Resultado: los usuarios alemanes ven 'Sie haben 5 Artikel in Ihrem Warenkorb Standard' — torpe y poco profesional.

Por qué esto es un problema

Cada cadena concatenada es una bomba de tiempo. Con 20 idiomas y 50 cadenas concatenadas tienes 1.000 posibles errores de gramática que deben corregirse manualmente.

La concatenación de cadenas como 'Bienvenido ' + userName + ', tienes ' + count + ' mensajes nuevos' requiere un orden de palabras fijo. Los traductores reciben fragmentos inconexos que no pueden reordenar.

Los usuarios ven oraciones gramaticalmente incorrectas. En alemán, el verbo suele ir al final. En árabe, toda la estructura está invertida. El resultado se lee como un disparate.

Cómo solucionarlo

Usa mensajes parametrizados con marcadores de posición nombrados para que los traductores puedan reordenar toda la oración.

1

Reemplaza concatenaciones con una sola clave de mensaje con marcadores: 'cart.summary': 'Tienes {count} artículos en tu carrito de '{cartType}''.

2

Pasa las variables como parámetros a tu función de traducción: t('cart.summary', { count: 5, cartType: 'Premium' }).

3

Los traductores ahora pueden reorganizar libremente: 'En tu carrito de '{cartType}' hay {count} artículos' — en alemán gramaticalmente correcto.

Error #3: Ignorar la pluralización.

El inglés tiene dos formas de plural: singular y plural. Los desarrolladores a menudo suponen que todos los idiomas funcionan igual. No es así. El polaco tiene 4 formas, el árabe tiene 6, e incluso lenguajes como el francés tratan la cantidad cero de forma diferente al inglés.

['Utiliza siempre ICU MessageFormat o una biblioteca equivalente para contenido con pluralización', 'Nunca escribas tu propia lógica de plurales; confía en las reglas de CLDR', 'Prueba las formas plurales con valores como 0, 1, 2, 5, 21 y 100 para cubrir todas las categorías']

Siempre usa ICU MessageFormat o una biblioteca equivalente para contenido pluralizable

Nunca escribas tu propia lógica de plural — confía en las reglas CLDR

Prueba los plurales con valores como 0, 1, 2, 5, 21 y 100 para cubrir todas las categorías

Un escenario típico

1

El desarrollador escribe: count + (count === 1 ? ' Datei' : ' Dateien') — maneja correctamente el alemán.

2

El traductor polaco necesita 4 formas: 1 plik, 2-4 pliki, 5-21 plików, 22-24 pliki. El operador ternario simple no puede expresar eso.

3

Resultado: los usuarios polacos ven '5 pliki' (forma incorrecta) en lugar de '5 plików' (forma correcta), y la aplicación parece rota.

Por qué es un problema

Cada sustantivo contable en tu aplicación necesita manejo de plurales. Con 50 cadenas de este tipo y 20 idiomas, hay 1.000 reglas de plural que es imposible administrar manualmente.

Las comprobaciones simples con if/else (count === 1 ? 'Datei' : 'Dateien') solo manejan alemán/inglés. CLDR define hasta 6 categorías de plural: zero, one, two, few, many y other. Cada idioma utiliza un subconjunto diferente.

Los usuarios ven textos gramaticalmente incorrectos como '1 Nachrichten' o formas de plural completamente incorrectas. En contextos formales, eso daña la credibilidad.

Cómo solucionarlo

Utiliza ICU MessageFormat, que admite todas las reglas de plural de CLDR de forma integrada.

1

Define mensajes con sintaxis ICU: 'fileCount': '{count, plural, one {# archivo} other {# archivos}}'.

2

Los traductores proporcionan todas las formas de plural necesarias para su idioma. Polaco: '{count, plural, one {# plik} few {# pliki} many {# plików} other {# pliku}}'.

3

La biblioteca i18n de tu proyecto selecciona automáticamente la forma correcta en tiempo de ejecución, basada en las reglas CLDR del locale activo.

Error #4: Anchuras fijas de los elementos de la interfaz de usuario.

Los diseñadores crean diseños píxel-perfectos en inglés, y los desarrolladores los implementan con anchos fijos. Pero el texto traducido puede ser drásticamente más largo o más corto. El texto en alemán es aproximadamente un 30% más largo que el inglés, mientras que el chino puede ser un 50% más corto.

['Nunca uses anchos de píxeles fijos en elementos con texto traducible', 'Planifica un aumento del 40% en el texto como línea base — algunos idiomas se expanden aún más', 'Utiliza CSS Flexbox o Grid para diseños que se adapten a longitudes de contenido variables']

Nunca uses anchos de píxel fijos en elementos con texto traducible

Planifica una expansión de texto del 40% como base; algunas lenguas se expanden aún más

Utiliza CSS Flexbox o Grid para diseños que se adapten a longitudes de contenido variables

Un escenario típico

1

El diseñador crea una barra de navegación con 5 botones, cada uno exactamente de 100px de ancho — se ve genial en inglés.

2

Traducción al alemán: 'Settings' se convierte en 'Einstellungen' (13 frente a 8 caracteres), 'Submit' se convierte en 'Absenden' (8 frente a 6). La barra de navegación se desborda.

3

Resultado: En dispositivos móviles, los botones se apilan uno encima del otro o el texto se corta, lo que hace que la navegación sea inutilizable para los usuarios alemanes.

Por qué esto es un problema

Cada elemento con ancho fijo es un posible punto de quiebre. Una aplicación típica tiene cientos de botones, etiquetas y tarjetas que deben tolerar la expansión de texto.

Contenedores con ancho fijo (width: 120px) y botones de tamaño fijo se recortan o desbordan cuando el texto se expande. overflow: hidden oculta el contenido silenciosamente, mientras que overflow: visible rompe el diseño.

Los usuarios ven etiquetas recortadas como 'Einstellu...' en lugar de 'Einstellungen', o botones que se superponen a los elementos vecinos. Las acciones críticas se vuelven ilegibles o no clicables.

Cómo solucionarlo

Diseña e implementa diseños flexibles que se adapten a la longitud de contenido de todos los locales.

1

Reemplaza anchos fijos por min-width, max-width y diseños flexibles. Usa CSS Grid o Flexbox para distribuir el espacio dinámicamente.

2

Configura los contenedores de texto para romper líneas: usa overflow-wrap: break-word y evita white-space: nowrap para contenido traducible.

3

Prueba tu UI con pseudo-localización que expanda todas las cadenas en un 40% para simular el peor caso — antes de enviar las cadenas a los traductores.

Error #5: Formato de fechas y números.

Las fechas y los números pueden parecer universales, pero 01/02/2025 significa 2 de enero en Estados Unidos y 1 de febrero en Europa. Las comas y puntos cambian de significado en los números: 1,000.50 (EE. UU.) vs 1.000,50 (Alemania). Hacerlo mal provoca confusión, errores de datos y pérdida de confianza.

['Usa solo propiedades CSS lógicas (inline-start/end, block-start/end) desde el primer día', 'Prueba tu aplicación con dir='rtl' en el elemento HTML en cada revisión de sprint', 'Crea una lista de verificación de pruebas RTL para navegación, iconos, formularios y indicadores de progreso']

Nunca formatees datos o números manualmente con plantillas de cadenas; utiliza siempre las API Intl

Almacena todos los datos en ISO 8601 y las divisas en la subunidad más pequeña (cent) internamente

Prueba con locales que utilicen diferentes separadores decimales, formatos de fecha y órdenes, y sistemas de calendario

Un escenario típico

1

Los desarrolladores formatean una fecha como MM/DD/YYYY y un precio como $1,234.50 — correcto para usuarios de EE.UU.

2

Un usuario alemán ve la fecha 03/04/2025 y la interpreta como 3 de abril (convención DD/MM/YYYY). El precio $1,234.50 parece ser 1.234,50.

3

Resultado: El usuario reserva un vuelo para la fecha incorrecta y cuestiona el formato de precios. Los tickets de soporte aumentan en el mercado alemán un 15%.

Por qué esto es un problema

El formato de fechas y números afecta cada visualización de datos en tu aplicación: tablas, gráficos, formularios, facturas, informes. Una solución global abarca cientos de instancias.

Cadenas de formato codificadas como toLocaleDateString('en-US') o formateo manual con literales de plantilla ignoran la localidad real del usuario. Incluso usar una locale correcta pero con el calendario incorrecto (gregoriano vs. hijri) provoca problemas.

Los usuarios leen datos de forma incorrecta e introducen datos en el formato equivocado. Un usuario europeo que ve 03/04/2025 podría interpretarlo como 3 de abril en lugar de 4 de marzo — citas perdidas o reservas incorrectas.

Así es como lo arreglas.

Utiliza la API Intl integrada o una biblioteca de formateo compatible con la locale para todas las fechas, horas, números y monedas.

1

Reemplaza el formateo manual con Intl.DateTimeFormat(locale) para fechas y Intl.NumberFormat(locale, { style: 'currency', currency }) para precios.

2

Almacena los datos internamente en formato ISO 8601 (YYYY-MM-DD) y formatea solo para la visualización usando la configuración regional del usuario.

3

Prueba las visualizaciones críticas de fechas y números con al menos 5 locales diferentes: en-US, de-DE, ja-JP, ar-SA y zh-CN, para cubrir las variantes de formato principales.

Error #6: Olvidar los idiomas de derecha a izquierda.

Las lenguas de derecha a izquierda (RTL), como árabe, hebreo y persa, son usadas por más de 500 millones de personas. Sin embargo, la mayoría de las apps se diseñan para diseños de izquierda a derecha (LTR). El soporte RTL no es solo invertir el texto: toda la interfaz debe reflejarse.

['Usa solo propiedades CSS lógicas (inline-start/end, block-start/end) desde el primer día', 'Prueba tu aplicación con dir='rtl' en el elemento HTML en cada revisión de sprint', 'Crea una lista de verificación de pruebas RTL para navegación, iconos, formularios y indicadores de progreso']

Desde el primer día, utiliza únicamente propiedades CSS lógicas (inline-start/end, block-start/end)

Prueba tu aplicación con dir='rtl' en el elemento HTML en cada revisión de sprint

Crea una lista de verificación de pruebas RTL para navegación, iconos, formularios y indicadores de progreso

Un escenario típico

1

Los desarrolladores usan margin-left: 16px y text-align: left en toda la aplicación — la práctica LTR estándar.

2

La app se inicia en Arabia Saudita. Las flechas de retroceso señalan hacia adelante, las barras laterales aparecen en el lado equivocado y los datos numéricos están desalineados.

3

Resultado: Los usuarios árabes abandonan la app después de 30 segundos. El equipo necesita 4 semanas de refactorización de CSS de emergencia para solucionar el problema.

Por qué esto es un problema

El soporte RTL afecta a cada componente de tu app. Implementarlo después de haberlo lanzado normalmente requiere reescribir entre el 30% y el 50% de todas las reglas CSS y revisar cada icono y diseño.

Propiedades CSS como margin-left, padding-right, text-align: left y float: left codifican la dirección de forma fija.

Los usuarios árabes ven la navegación en la esquina incorrecta, las barras de progreso avanzan en la dirección contraria y el texto choca con los elementos de la interfaz. La app se siente extraña e inaccesible.

Así es como lo arreglas.

Utiliza propiedades CSS lógicas y prueba con diseño RTL desde el inicio.

1

Reemplaza todas las propiedades CSS físicas por equivalentes lógicos: margin-left → margin-inline-start, padding-right → padding-inline-end, text-align: left → text-align: start.

2

Establece el atributo dir en el elemento raíz de HTML según la configuración regional activa. Usa la pseudo-clase CSS :dir(rtl) para overrides específicos de RTL.

3

Verifica todos los iconos por su significado direccional. Reemplaza iconos direccionalmente ligados por versiones espejadas o usa CSS transform: scaleX(-1) para contextos RTL.

Imágenes con texto.

Incrustar texto en imágenes — ya sea en banners de héroe, botones, infografías o capturas de pantalla — es una pesadilla de localización. Cada imagen con texto debe crearse de nuevo para cada idioma, lo que multiplica los costos de diseño y retrasa los lanzamientos.

['Por favor, no pongas texto traducible directamente en imágenes raster (PNG, JPG)', 'Utiliza superposiciones de texto CSS sobre imágenes de fondo para banners principales y CTAs', 'Automatiza la generación de capturas de pantalla para listados de App Store y páginas de marketing']

Nunca incrustes texto traducible directamente en imágenes rasterizadas (PNG, JPG)

Utiliza superposiciones de texto CSS sobre imágenes de fondo para banners de héroe y CTAs

Automatiza la generación de capturas de pantalla para listados de App Store y páginas de marketing

Un escenario típico

1

Un diseñador crea un banner promocional con el texto 'Start Your Free Trial' incrustado directamente en la imagen.

2

El equipo de localización traduce todos los textos de la interfaz, pero en la página alemana el banner sigue mostrando texto en inglés.

3

Resultado: La página de aterrizaje alemana tiene un banner en inglés que resulta irritante. Crear banners localizados para 15 idiomas toma 3 días de trabajo de diseño y retrasa el lanzamiento.

Por qué eso es un problema

Una página de marketing típica tiene 5-10 imágenes con texto. Para 15 idiomas, son 75-150 variantes de imágenes que deben crearse, mantenerse y actualizarse con cada cambio de diseño.

El texto incrustado en imágenes (PNG, JPG, SVG con texto incrustado) no puede ser extraído por herramientas de traducción. Cada versión localizada requiere que un diseñador edite manualmente el archivo fuente, lo exporte y lo cargue.

Los usuarios ven imágenes con texto en un idioma extranjero, o peor, una mezcla de UI traducida e imágenes sin traducir. Esto resulta inconsistente y socava la confianza de la marca.

Así es como lo solucionas

Separa el texto de las imágenes utilizando superposiciones CSS, SVGs con elementos de texto traducibles o generación dinámica de imágenes.

1

Utiliza CSS para colocar el texto traducible sobre las imágenes de fondo: posiciona la capa de texto con posicionamiento absoluto sobre el contenedor de la imagen.

2

Para infografías o diagramas, usa SVGs con elementos <text> que hagan referencia a claves de traducción, en lugar de incrustar cadenas sin procesar.

3

Para capturas de pantalla de la app en material de marketing, automatiza la generación de capturas con herramientas como Fastlane (Móvil) o Playwright (Web), tomando capturas en cada locale.

Error #8: Traducciones faltantes no gestionadas

Las traducciones están incompletas durante el desarrollo. Las nuevas características añaden cadenas más rápido de lo que pueden traducirse los traductores. Sin una adecuada gestión de fallback, las traducciones faltantes provocan fallos, elementos de la interfaz vacíos o claves de traducción sin procesar que se muestran a los usuarios.

['Configura siempre al menos un idioma de respaldo en tu configuración de i18n', 'Registra las claves de traducción que falten en tu sistema de monitoreo para su seguimiento', 'Establece un umbral mínimo de cobertura de traducción antes de que una locale pueda estar en vivo']

Configura al menos un idioma de respaldo en tu configuración i18n

Registra las claves de traducción faltantes en tu sistema de monitoreo para su seguimiento

Establece un porcentaje mínimo de cobertura de traducción antes de que una localización pueda publicarse

Un escenario típico

1

Los desarrolladores añaden una nueva sección 'Premium Features' con 15 nuevas claves de traducción. La versión en inglés se entrega de inmediato.

2

Las traducciones al francés aún no están terminadas. La página en francés muestra claves sin procesar: 'premium.feature1.title', 'premium.feature1.description'.

3

Resultado: Los usuarios franceses ven una página rota llena de nombres de claves de desarrollador. El equipo de soporte recibe docenas de informes de errores.

Por qué esto es un problema

Cuanto más crece tu aplicación, mayor es la brecha entre las cadenas en inglés y las traducciones en otros idiomas. Una aplicación con 100 idiomas y 2,000 cadenas podría tener en cualquier momento más de 10,000 traducciones faltantes.

Sin lógica de respaldo, una clave de traducción faltante devuelve undefined, null o la cadena de clave sin procesar (p. ej., 'checkout.confirmButton'). Los motores de plantillas pueden lanzar errores, bloquear la página o no renderizar nada.

Los usuarios ven una interfaz rota: botones vacíos, etiquetas faltantes o cadenas crípticas como 'nav.settings.title' en lugar de texto real. Esto resulta confuso y poco profesional.

Así es como lo solucionas

Configura una cadena de respaldo robusta y supervisa la cobertura de traducciones en todos los locales.

1

Richte una cadena de idiomas de respaldo en tu configuración i18n: las claves en francés (fr) faltantes caen automáticamente al inglés (en).

2

Añade un manejador de claves faltantes que registre las claves no traducidas en tu sistema de monitoreo (p. ej. Sentry, Datadog) sin interrumpir la experiencia del usuario.

3

Crea un panel de cobertura de traducciones que rastree el porcentaje de finalización por locale y bloquee los lanzamientos si la cobertura cae por debajo de un umbral (p. ej., 95%).

Error #9: Problemas de codificación de caracteres

Los problemas de codificación de caracteres son el asesino silencioso de la localización. Todo se ve bien en inglés y en los idiomas europeos, pero cuando añades chino, japonés, coreano, árabe o emojis, aparecen caracteres distorsionados (Mojibake). Estos errores son notoriamente difíciles de rastrear.

['Usa codificación UTF-8 en todas partes — archivos fuente, base de datos, respuestas API y etiquetas meta HTML', 'Utiliza utf8mb4 en MySQL (no utf8), para soportar toda la gama Unicode, incluidos Emoji', 'Prueba con contenido real en CJK, árabe y Emoji para detectar problemas de codificación temprano']

Utiliza la codificación UTF-8 en todas partes: archivos fuente, base de datos, respuestas de API y etiquetas meta HTML

Utiliza utf8mb4 en MySQL (no utf8) para soportar todo el rango Unicode, incluido emoji

Prueba con contenido real en CJK, árabe y emoji para detectar problemas de codificación temprano

Un escenario típico

1

Los desarrolladores configuran una base de datos MySQL con intercalación latin1 (el antiguo valor por defecto). El código fuente de la aplicación usa UTF-8.

2

Los usuarios japoneses se registran con su nombre real. La base de datos almacena '田中太郎' como bytes corruptos.

3

Resultado: el perfil del usuario muestra texto distorsionado. Peor aún: la búsqueda y el ordenamiento se rompen para todos los nombres CJK, afectando a miles de usuarios.

Por qué esto es un problema

Los problemas de codificación se propagan por toda la pila. Una colación de base de datos mal configurada puede corromper millones de registros; repararlos requiere migraciones de datos costosas.

Codificación inconsistente a lo largo de la pila — UTF-8 en los archivos fuente, Latin-1 en la base de datos y Windows-1252 en la respuesta de la API — destruye caracteres multibyte. Una sola capa mal configurada transforma '日本語' en '????' o '日本èª'.

Los usuarios ven texto distorsionado, signos de interrogación o cuadros vacíos donde debería aparecer su idioma. En el peor de los casos, las entradas de formularios quedan permanentemente dañadas en la base de datos.

Cómo solucionarlo

Haz cumplir la codificación UTF-8 de forma consistente en cada capa de tu pila de aplicaciones.

1

Configura todos los archivos fuente a UTF-8 (configura tu editor y .editorconfig). Agrega <meta charset='UTF-8'> en tu HTML y 'Content-Type: application/json; charset=utf-8' en las respuestas de API.

2

Configura tu base de datos a utf8mb4 (no solo utf8, que en MySQL es un subconjunto de 3 bytes). Configura la colación de conexión a utf8mb4_unicode_ci.

3

Elige tipografías que cubran tus sistemas de escritura objetivo: latino, cirílico, CJK, árabe, devanagari. Usa conjuntos de fuentes del sistema o Google Fonts con subconjuntos de idioma para una carga óptima.

Prueba tu implementación de i18n.

Prueba de extensión de longitud

Amplía todas las cadenas traducidas entre un 30-40% para simular la expansión de texto que ocurre en idiomas verbosos como el alemán, finés o griego. Esto cubre contenedores de ancho fijo, etiquetas truncadas y botones desbordados incluso antes de empezar a traducir. Muchas herramientas de pseudo-localización ofrecen esto como una función integrada.

"Enviar" → "Ṡééééñðéñ_éxpáñðéð" (40% más largo)

Pseudo-localización

La pseudo-localización reemplaza cada carácter por un equivalente acentuado (p. ej., 'a' → 'á') y envuelve las cadenas con marcadores como [!! y !!]. Esto permite ver de inmediato qué cadenas están codificadas de forma fija y cuáles provienen del sistema de traducción. Ejecuta la pseudo-localización como parte de tu pipeline de CI para detectar regresiones automáticamente.

Todo el texto en la pantalla que NO esté rodeado por las marcas [!! !!] está codificado de forma fija y debe externalizarse. Esta prueba detecta el 95% de las cadenas pasadas por alto en menos de un minuto.

"Enviar mensaje" → "[!! Ñáçḥŕíçḥṫ ṡéñðéñ !!]"

Prueba de diseño RTL

Sin necesidad de traducciones al árabe o hebreo, también puedes probar el diseño RTL añadiendo dir='rtl' al elemento raíz de tu HTML. Esto detecta de inmediato fallos de CSS direccionales: iconos mal alineados, márgenes en el lado incorrecto, navegación rota y elementos flex desordenados. Haz de esto una verificación estándar en cada revisión de sprint: solo toma 10 segundos cambiar y detecta problemas que, de otra manera, tomarían semanas para arreglarse en producción.

La lista de verificación de i18n.

['Todos los textos visibles para el usuario deben externalizarse en archivos de recursos', 'No usar concatenación de cadenas para formar oraciones', 'Reglas de pluralización implementadas con ICU MessageFormat o su equivalente', 'El formateo de fechas, horas y números debe usar APIs sensibles a la localidad', 'Prueba el diseño RTL con contenidos en árabe o hebreo', 'Interfaz de usuario flexible sin anchos fijos para elementos con texto', 'Idioma de respaldo configurado y probado para claves ausentes', 'Codificación UTF-8 consistente en todos los archivos y bases de datos', 'Metadatos de App Store y Play Store localizados para cada mercado', 'Capturas y recursos de marketing actualizados para cada idioma']

Compartir artículo

¿Listo para traducir tu aplicación?

Traduce tu aplicación iOS, Android o web a más de 29 idiomas con traducción impulsada por IA.

Comienza gratis

Contenido relacionado

Guía

Selecciona los idiomas objetivo para tu app

Guía basada en datos para elegir los idiomas adecuados para la localización de la app. Descubre qué idiomas ofrecen el mejor ROI — según tamaño de mercado, ARPU y competencia.

7 min
target languagesmarket researchlocalization strategy