Introducción
Después de ayudar a miles de equipos a internacionalizar sus aplicaciones, hemos identificado las prácticas que separan las implementaciones i18n fluidas y escalables de las dolorosas y con errores.
Estas son 15 reglas a seguir para una internacionalización exitosa.
Arquitectura del código
1. 1. Extraer todas las cadenas orientadas al usuario desde el primer día
No espere hasta que "necesitemos traducir" Para entonces, tendrás miles de cadenas hardcoded.
JavaScript1// Bad - hardcoded string 2<button>Submit</button> 3 4// Good - extracted from start 5<button>{t('form.submit')}</button>
Consejo: Utilice la CLI de IntlPull para comprobar el estado de la traducción:
Terminalnpx @intlpullhq/cli status
2. Nunca concatenar cadenas
Los idiomas tienen diferentes órdenes de palabras. La concatenación rompe las traducciones.
JavaScript1// Bad - breaks in German, Japanese, Arabic... 2const message = "Hello " + name + ", you have " + count + " messages"; 3 4// Good - uses interpolation 5const message = t('greeting', { name, count }); 6// en: "Hello {name}, you have {count} messages" 7// de: "Hallo {name}, Sie haben {count} Nachrichten" 8// ja: "{name}さん、{count}件のメッセージがあります"
3. Utilice el formato de mensaje ICU para cadenas complejas
ICU maneja los plurales, el género y la selección con elegancia:
{count, plural,
=0 {No messages}
one {# message}
other {# messages}
}
{gender, select,
male {He liked your post}
female {She liked your post}
other {They liked your post}
}
4. 4. Claves de traducción semánticas
Las claves deben describir el contenido, no la ubicación:
JavaScript1// Bad - tied to UI location 2"homepage_header_title" 3"sidebar_menu_item_3" 4 5// Good - describes content 6"welcome.title" 7"navigation.settings" 8"error.network_unavailable"
5. 5. Organice las claves por funciones, no por archivos
Estructure las traducciones por dominio de característica:
/locales/en.json
{
"auth": {
"login": { ... },
"signup": { ... }
},
"dashboard": {
"overview": { ... },
"settings": { ... }
},
"checkout": {
"cart": { ... },
"payment": { ... }
}
}
Formato
6. Utilizar las API de formato nativas
No codifique nunca formatos numéricos, de fecha o de moneda:
JavaScript1// Bad - US-only format 2const date = `${month}/${day}/${year}`; 3const price = `$${amount}`; 4 5// Good - locale-aware 6const date = new Intl.DateTimeFormat(locale).format(dateObj); 7const price = new Intl.NumberFormat(locale, { 8 style: 'currency', 9 currency: userCurrency 10}).format(amount);
Diferencias de localización: | US | Alemania | Japón | |---|---|---|---| | Fecha 31.12.2026 31.12.2026 2026/12/31 | Número | 1.234.56 | 1.234.56 | 1.234.56 | 1.234.56 | 1.234.56 | Divisa 99,99 dólares 99,99 euros 100 yenes
7. Manejar correctamente la pluralización
Cada idioma tiene sus propias reglas de plural:
| Idioma | Formas plurales |
|---|---|
| Inglés 2 (uno, otro) | |
| Francés 2+ (uno, otro, muchos) | |
| Ruso 3 (uno, pocos, muchos) | |
| Árabe 6 (cero, uno, dos, pocos, muchos, otros) |
JavaScript// Use ICU plural format t('items', { count: 5 }) // Config handles the rules per language
8. Idiomas RTL compatibles
El árabe, el hebreo, el persa y el urdu se leen de derecha a izquierda:
CSS1/* Use logical properties */ 2.card { 3 margin-inline-start: 1rem; /* Not margin-left */ 4 padding-inline-end: 1rem; /* Not padding-right */ 5} 6 7/* Let dir attribute handle layout */ 8[dir="rtl"] .icon { 9 transform: scaleX(-1); 10}
JSX<html dir={isRTL ? 'rtl' : 'ltr'}>
Calidad de la traducción
9. Proporcionar contexto a los traductores
Los traductores necesitan saber dónde y cómo se utilizan las cadenas:
JSON1{ 2 "save": { 3 "value": "Save", 4 "context": "Button to save user profile changes, appears at bottom of form", 5 "maxLength": 10, 6 "screenshot": "save-button.png" 7 } 8}
10. Utilizar un glosario
Mantenga una terminología coherente en todas las traducciones:
| Inglés | Español | Alemán | Contexto |
|---|---|---|---|
| Panel de control | Dashboard | Interfaz de usuario principal | Settings |
| Settings | Configuración | Einstellungen | Preferencias del usuario |
| Submit | Enviar | Absenden | Botón de envío del formulario |
11. Aprovechar la memoria de traducción
No traduzca dos veces la misma frase. La TM atrapa:
- Coincidencias exactas: "Guardar cambios" = "Guardar cambios"
- Coincidencias difusas: "Save changes" ≈ "Guardar todos los cambios"
ROI: reducción del 30-60% de los costes de traducción a lo largo del tiempo.
Proceso
12. Automatizar la sincronización de traducciones
La sincronización manual hace perder tiempo y genera traducciones obsoletas:
Terminal1# Sync translations in CI 2npx @intlpullhq/cli upload 3npx @intlpullhq/cli download 4 5# Or use watch mode for local development 6npx @intlpullhq/cli sync --watch
13. 13. Utilizar la localización continua
No haga traducciones por lotes. Localice continuamente:
YAML1# GitHub Action example 2on: 3 push: 4 branches: [main] 5 paths: 6 - 'src/**' 7 - 'locales/en.json' 8 9jobs: 10 sync: 11 runs-on: ubuntu-latest 12 steps: 13 - uses: actions/checkout@v3 14 - run: npx @intlpullhq/cli upload 15 - run: npx @intlpullhq/cli download 16 - uses: stefanzweifel/git-auto-commit-action@v4
14. Prueba con Pseudo-Localización
Antes de traducciones reales, prueba con pseudo-traducciones:
"Welcome" → "[Ẃéĺćőḿé !!!!!!]"
La pseudotraducción revela:
- Cadenas codificadas (no transformadas)
- Problemas de maquetación (expansión del texto)
- Problemas de truncamiento
- Problemas de codificación de caracteres
15. Implementar actualizaciones OTA para móviles
No espere a los lanzamientos de la tienda de aplicaciones para corregir las traducciones:
Swift// With OTA, translation updates are instant let message = IntlPull.t("welcome.message") // Change in dashboard → users see it immediately
Sin OTA: 1-2 semanas de retraso para cualquier cambio de traducción Con OTA: Actualizaciones instantáneas, sin necesidad de lanzar la aplicación
Antipatrones a evitar
No Usar concatenación de cadenas
JavaScript// Never do this "Welcome, " + name
Don't: Formato de código duro
JavaScript// Never do this date.toLocaleDateString('en-US')
No: Frases divididas
JavaScript1// Never do this 2<span>{t('click')}</span> 3<Link>{t('here')}</Link> 4<span>{t('to_continue')}</span>
Don't: Asumir Idioma = País
JavaScript// Never do this if (country === 'US') language = 'en'; // Spanish speakers in US, Portuguese in US, etc.
Don't: Olvidar la expansión del texto
CSS1/* Never do this */ 2.button { 3 width: 100px; /* Breaks in German */ 4}
Lista de comprobación
Antes de lanzarse en un nuevo idioma:
- Todas las cadenas extraídas y traducidas
- Pluralización comprobada
- Formato de fecha/número/moneda correcto
- La maquetación RTL funciona (si procede)
- Imágenes e iconos localizados
- Metadatos SEO traducidos
- Mensajes de error traducidos
- Plantillas de correo electrónico traducidas
- Páginas legales traducidas
- Probado por hablantes nativos
Herramientas que ayudan
| Necesita una herramienta |------|------| | Gestión de traducción IntlPull | Extracción de cadenas IntlPull CLI | Transformación de código IntlPull CLI | Traducción IA IntlPull (GPT-4, Claude) | Actualizaciones OTA SDK de IntlPull | Pseudolocalización IntlPull
Conclusión
Un buen i18n consiste en:
- Arquitectura limpia: Extraer cadenas pronto, usar interpolación
- Formateo adecuado: Dejar que las APIs gestionen las diferencias de localización
- Traducciones de calidad: Contexto, glosarios, TM
- Proceso inteligente: Automatización, flujo continuo, pruebas
Siga estas 15 prácticas y creará aplicaciones que escalarán globalmente sin los típicos problemas de i18n.
¿Listo para mejorar su i18n? Pruebe IntlPull gratis e implemente estas mejores prácticas con las herramientas adecuadas.
