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 localización de tu aplicación con estas buenas prácticas.

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

Internacionalización (i18n) parece sencilla, hasta que descubres que tus usuarios alemanes ven botones recortados, tus usuarios japoneses obtienen fragmentos de oraciones distorsionados y tus usuarios de habla árabe enfrentan diseños completamente rotos. Estos no son casos aislados. Son las consecuencias previsibles 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 analizamos los 10 errores más comunes de i18n, explicamos exactamente por qué ocurren y te mostramos, paso a paso, cómo corregir 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: Strings codificados en duro

Hardcodear cadenas es el error i18n más fundamental. Sucede porque los desarrolladores se centran primero en hacer que las funciones funcionen y planean 'limpiar después'. Pero ese momento nunca llega, y de pronto tienes miles de cadenas distribuidas 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 función 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 lleva 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 cientos o miles. Extraerlas más tarde requiere tocar cada archivo, volver a probar cada componente y arriesgar regresiones en todos lados.

Las cadenas hardcodeadas 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 propio código.

Los usuarios en locales que no son inglés ven elementos de la interfaz de usuario sin traducir mezclados con contenido traducido, lo que da 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

Agrega 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: Traducir 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 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 una sobretraducción requiere revisar cada cadena en cada idioma, lo que puede llevar 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 los contenidos no traducibles y proporciona notas de contexto para los traductores.

1

Crea un glosario de 'no traducir' que enumere 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 de manera drástica 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 la concatenación por una sola clave de mensaje con marcadores: 'cart.summary': 'Tienes {count} artículos en tu carrito '{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 '{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 lenguas como el francés tratan la cantidad cero de forma diferente al inglés.

['Siempre usa ICU MessageFormat o una biblioteca equivalente para contenidos con plural', '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']

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 ? ' archivo' : ' archivos') — maneja el alemán correctamente.

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.

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 elementos de UI

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 soportar 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 números pueden parecer universales, pero 01/02/2025 significa el 2 de enero en EE. UU. y el 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

Guarda todos los datos en ISO 8601 y las monedas en la unidad 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 locale real del usuario. Incluso usar la locale correcta pero con el calendario equivocado (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í lo solucionas.

Utiliza la API Intl integrada o una biblioteca de formateo que respete 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 con 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 RTL

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.

Usa 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

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

3

Verifica todos los iconos por su significado direccional. Reemplaza los iconos con dirección fija por versiones espejo o usa CSS transform: scaleX(-1) para contextos RTL.

Error #7: 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é esto es un problema

Una página de marketing típica tiene entre 5 y 10 imágenes con texto. Con 15 idiomas, eso equivale a 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 en 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 aplicación 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 siempre quedan incompletas durante el desarrollo. Las nuevas funciones añaden cadenas más rápido de lo que pueden traducirse. Sin una gestión adecuada de fallback, las traducciones faltantes causan fallos, elementos de la interfaz vacíos o claves de traducción sin procesar mostradas 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 fallback, 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 generar errores, hacer que la página se bloquee 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

Agrega 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 detectar.

['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 una 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 la clasificación 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 tu pila. Una intercalación de base de datos mal configurada puede dañar millones de registros, y la reparación requiere costosas migraciones de datos

Codificación inconsistente a través de la pila: UTF-8 en los archivos fuente, Latin-1 en la base de datos y Windows-1252 en las respuestas de la API: rompe los caracteres multibyte. Una única capa mal configurada transforma '日本語' en '????' o '日本èª'.

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

Cómo solucionarlo

Imponer la codificación UTF-8 de forma consistente en cada capa de la pila de tu aplicación.

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 pilas 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 detallados como 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)

Pseudolocalizació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 comprobación estándar en cada revisión de sprint: solo toma 10 segundos cambiar y detecta problemas que, de otro modo, tomarían semanas para corregirse en producción.

La lista de verificación i18n

['Todos los textos visibles para el usuario se han externalizado en archivos de recursos', 'No uses concatenación de cadenas para formar oraciones', 'Reglas de pluralización implementadas con ICU MessageFormat o equivalente', 'El formateo de fechas, horas y números usa APIs sensibles a la localidad', 'RTL layout probado con contenidos en árabe o hebreo', 'Interfaz de usuario flexible sin anchos fijos para elementos con texto', 'Idioma de reserva configurado y probado para claves faltantes', '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 app de iOS, Android o Web a más de 29 idiomas con traducción impulsada por IA.

Comienza gratis

Contenido relacionado

Guía

Elegir idiomas objetivo para tu app

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

7 min
target languagesmarket researchlocalization strategy