Vendemos infraestructura de traducción. Nuestra propia web de marketing se publica en cinco idiomas. Cuando auditamos el JSON que realmente servimos, el primer hallazgo no fue una cuestión de tono. Fue un solo carácter equivocado dentro de una palabra compuesta alemana que a simple vista parecía casi correcta: una letra cirílica donde debía ir una latina. La palabra parecía sacada de un glosario hasta que mirabas el code point. Si nuestras propias traducciones están rotas, ¿por qué iba nadie a confiar en el producto?
Cinco fallos que nunca deberían haber llegado a producción
Cirílico dentro de copy alemana de UI. Una línea del glosario contenía en su día una mezcla de alfabetos: el sufijo parecía latino, «ar», pero una letra no lo era. Los hablantes nativos lo notan al instante. El corrector ortográfico no.
**The string:** …"Übersetzungsglossар"… (Cyrillic "р" in the compound)
**What it should be:** "Übersetzungsglossar"
**Why it matters:** It reads as corrupted text. It signals automated output nobody proofread in the target language.
Inversión de registro entre alemán y francés. El sitio es una herramienta para desarrolladores. La voz debería coincidir con cómo escriben realmente los ingenieros en la UI de un producto. Habíamos publicado tratamiento formal en todas partes en de y fr. No es un detalle menor. Significa que la ruta de traducción por defecto eligió el registro equivocado para toda la superficie, no solo para un puñado de cadenas sueltas.
**The string:** "… wie Sie …" / "vous pouvez …"
**What it should be:** informal "du" / "tu" voice for product and FAQ
**Why it matters:** Every screen sounded like enterprise procurement, not like the product we sell to vibe coders.
Moneda inventada. El inglés decía dólares. El alemán mostraba euros con una etiqueta mensual. No facturamos un precio distinto por país. El JSON daba a entender que sí.
**The string:** "20 €/Monat" (and similar) next to "$20/mo" elsewhere
**What it should be:** one USD amount, formatted per locale via code (e.g. Intl), not hand-invented symbols in JSON
**Why it matters:** Pricing trust. Mixed symbols read as either a bug or a hidden price change.
Falsos amigos con «coding». En tres idiomas, «coding environment» se tradujo con la palabra para «codificación» en el sentido de cifrado. Las FAQ decían a la gente que podía quedarse en su «entorno de codificación». Eso es incorrecto en cualquier lectura del producto.
**The string:** Spanish "codificación", Italian "codifica", German "Codierung" in the wrong sense
**What it should be:** development environment wording (e.g. entorno de desarrollo / ambiente di sviluppo / Entwicklungsumgebung)
**Why it matters:** It is a semantic bug. It reads like we do not understand our own domain.
«Ship» entendido como envío postal. Las cadenas en alemán e italiano usaban verbos que la gente asocia con paquetería, no con publicar software. Misma fuente en inglés, campo léxico equivocado. Eso venía de sugerencias automáticas sin corregir, no de una decisión de estilo deliberada.
**The string:** parcel-shipping verbs applied to "ship your app"
**What it should be:** release / deploy / deliver software wording
**Why it matters:** Developer trust. One wrong verb tells the reader the copy was never read by a developer in that language.
Por qué se desfasan las traducciones autogeneradas
Esto no es una crítica contra los traductores. Buena parte del sitio nunca pasó por una revisión humana cadena a cadena. Los modelos de propósito general tienden por defecto al registro formal porque así es como se ve el texto bilingüe masivo en la web abierta. También mezclan caracteres casi idénticos entre alfabetos distintos cuando el objetivo es «caracteres plausibles», no «alfabeto correcto». Sin un glosario, la elección de palabras se desvía entre claves vecinas. Sin una regla de moneda, el modelo inventa símbolos locales plausibles. Sin comprobaciones de dominio, «coding» y «encoding» chocan. Ese es el modo de fallo que existimos para eliminar. Nuestro propio sitio lo dejó pasar hasta que lo auditamos como lo haría un cliente.
Qué construimos después de la limpieza
Las correcciones puntuales de copy no son un sistema. Lo duradero es un pequeño archivo de política que todo el equipo (y cualquier futuro lote de auto-traducción) pueda tratar como ley, más un script de verificación que podemos ejecutar antes de cada merge.
Política. i18n/LOCALIZATION_POLICY.md registra el registro por idioma, el precio solo en USD dentro del JSON, decisiones de préstamos léxicos (por ejemplo, mantener vibe coders en inglés), reglas de falsos amigos para coding frente a encoding, y tipografía para literales inline. Es breve a propósito. Si una regla no está escrita, un modelo no la va a inferir de forma consistente.
## Currency
- USD only in all locales. Use {monthlyPrice} and {overageRate} placeholders…
## False friends
- Coding environment is not encoding: Spanish desarrollo / Italian sviluppo / German Entwicklung…
Verificación. scripts/verify-translations.sh busca con grep caracteres cirílicos en los archivos de idiomas latinos, símbolos de euro, las viejas cadenas de falsos amigos, y paridad en los placeholders de precios frente a messages/en.json. Las comprobaciones opcionales usan ripgrep si está instalado. El script es un mínimo, no un máximo. Existe para que «ya lo arreglamos una vez» no se vaya degradando en silencio con la siguiente edición masiva.
Código, no más suposiciones en JSON. Centralizamos los importes en USD que se muestran en lib/pricing.ts y conectamos formatUsdPerMonth y formatUsdOveragePer1k a la home y a las FAQ para que los archivos de traducción dejen de inventarse cifras. El bug no era solo las cadenas equivocadas. El bug era no tener la política y el formateador listos antes de escalar.
Qué deberías robar para tu propio i18n asistido por IA
Si generas traducciones con un modelo, el registro es el parámetro con más varianza. Fíjalo por idioma antes de añadir más idiomas. Fija la moneda en código, no en prosa. Fija los tokens de marca y la jerga de desarrollo. Ejecuta comprobaciones automáticas que hagan fallar el lote entero en lugar de «ya lo revisaremos a ojo más adelante». Ese «más adelante» nunca llega con el mismo nivel de calidad que el primer pase.
Para la historia de arquitectura detrás de esta auditoría, lee Cómo localizar una app generada por IA y la comparativa de herramientas en globalize.now frente a Lokalise frente a Crowdin. Si estás configurando i18n en tu propio repo y quieres las mismas salvaguardas, conecta el repositorio en globalize.now y la conversión se ejecuta una sola vez, dentro de la app; npx skills add globalize-now/globalize-skills es el punto de entrada que documentamos para los skills que se instalan junto a tu código. El cierre honesto: nos comimos nuestro propio dog food, encontramos bugs feos, escribimos la política y añadimos una barrera. Ese es el nivel que queremos que alcance cada lanzamiento multilingüe.
globalize.now convierte el texto codificado de tu app en archivos de traducción listos para localizar y los mantiene actualizados en cada despliegue.
Prueba globalize.now gratis