01 Proyectos 02 Conceptos 03 Apps 04 Utilidades 05 GameBob 06 Charlas
Volver al muro de la vergüenza
Fallo
ID: caos-traducciones

El Caos de las Traducciones

#i18n #testing #productividad #indie-dev
Imagen del error: El Caos de las Traducciones

Lo que hice mal (El Drama)

Para un proyecto pequeño, gestionar las traducciones en diferentes idiomas puede ser muy caótico. Archivos desincronizados, claves perdidas y la incertidumbre de si el idioma secundario está al día con el principal convierten la localización en una pesadilla de mantenimiento.

Lo que aprendí (La Redención)

La solución simple y funcional: separar las traducciones en ficheros por categorías y testear cada una de ellas, siempre usando el idioma base como fuente de verdad. Implementé una comparativa automática fichero a fichero de todas las keys (key por key, no solo el número total). Un test fácil de programar que garantiza una consistencia del 100%. Para pequeñas aplicaciones o desarrolladores indie, este pequeño esfuerzo inicial es ideal.

La Solución (El Algoritmo)

1 Preparación del Entorno

const REFERENCE_LANG = 'es'; const TARGET_LANGS = ['en', 'de', 'fr', 'it', 'pt']; const TRANSLATION_FILES = ['ui', 'fortunes', 'bestiary'];

2 El Algoritmo de Paridad

it('should have 100% key parity across all files', () => { TARGET_LANGS.forEach(lang => { TRANSLATION_FILES.forEach(file => { const baseKeys = Object.keys(load(REFERENCE_LANG, file)); const targetData = load(lang, file); baseKeys.forEach(key => { if (!Object.hasOwn(targetData, key)) { throw new Error(`Missing key [${key}] in file [${file}] for language [${lang}]`); } }); }); }); });

3 Extra: Detectar Valores Vacíos

it('should not have empty translations', () => { TARGET_LANGS.forEach(lang => { TRANSLATION_FILES.forEach(file => { const targetData = load(lang, file); Object.entries(targetData).forEach(([key, value]) => { if (typeof value === 'string' && value.trim() === '') { throw new Error(`Empty value for [${key}] in [${file}] for [${lang}]`); } }); }); }); });

Nota: Esta es una forma simplificada de mostrar la idea. Para una implementación final, prefiero tests más unitarios y verbosos que permitan un control total sobre cada caso de fallo.