Vendiamo infrastruttura per la traduzione. Il nostro sito marketing è disponibile in cinque lingue. Quando abbiamo verificato il JSON che serviamo davvero, il primo problema non riguardava il tono. Era un singolo carattere sbagliato dentro un composto tedesco che a colpo d'occhio sembrava quasi corretto: una lettera cirillica dove doveva esserci una lettera latina. La parola sembrava quella di un glossario, finché non abbiamo controllato il code point. Se le nostre traduzioni sono rotte, perché qualcuno dovrebbe fidarsi del prodotto?


Cinque errori che non avrebbero mai dovuto arrivare in produzione

Cirillico nella copy UI tedesca. Una riga del glossario conteneva una scrittura mista: il suffisso sembrava «ar» in caratteri latini, ma una lettera non lo era. Chi legge in tedesco se ne accorge subito. Lo spell checker 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.

Inversione del registro tra tedesco e francese. Il sito è uno strumento per sviluppatori. La voce dovrebbe riflettere il modo in cui gli ingegneri scrivono davvero nella UI del prodotto. Avevamo usato la forma di cortesia ovunque in de e fr. Non è una sottigliezza. Significa che il percorso di traduzione predefinito aveva scelto il registro sbagliato per l'intera superficie del prodotto, non per una manciata di stringhe marginali.

**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.

Valuta inventata. L'inglese parlava di dollari. Il tedesco mostrava euro con un'etichetta mensile. Non applichiamo prezzi diversi in base al paese. Il JSON lasciava intendere il contrario.

**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.

Falsi amici per «coding». In tre lingue, «coding environment» era stato tradotto usando la parola che indica la codifica. La FAQ diceva che si poteva restare nel proprio «ambiente di codifica». È sbagliato qualunque sia il modo in cui si interpreta il prodotto.

**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» interpretato come spedizione postale. Le stringhe tedesche e italiane usavano verbi associati ai pacchi, non al rilascio del software. Stessa sorgente inglese, campo lessicale sbagliato. Il problema nasceva da suggerimenti automatici non corretti, non da una scelta stilistica deliberata.

**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.

Perché le traduzioni generate automaticamente vanno fuori sync

Non è una tirata contro i traduttori. Gran parte del sito non ha mai ricevuto una revisione umana stringa per stringa. I modelli generalisti tendono a usare un registro formale perché è quello che prevale nei grandi volumi di testo bilingue sul web aperto. Inoltre confondono caratteri quasi omografi tra scritture diverse quando l'obiettivo è produrre «caratteri plausibili», non una «scrittura corretta». Senza un glossario, la scelta delle parole varia tra chiavi adiacenti. Senza una regola sulla valuta, il modello inventa simboli locali plausibili. Senza controlli di dominio, codifica e coding si confondono. È il tipo di errore che esistiamo per comprimere. Il nostro stesso sito lo ha rilasciato finché non abbiamo fatto un audit come avrebbe fatto un cliente.


Cosa abbiamo costruito dopo la pulizia

Le correzioni una tantum della copy non sono un sistema. La parte duratura è un piccolo file di policy che tutto il team — e qualsiasi futuro batch di traduzione automatica — può trattare come legge, più uno script di verifica da eseguire prima del merge.

Policy. i18n/LOCALIZATION_POLICY.md registra il registro per ogni lingua, i prezzi in USD esclusivamente nel JSON, le decisioni sui prestiti linguistici (per esempio mantenere vibe coders in inglese), le regole sui falsi amici per coding e encoding e la tipografia dei literal inline. È breve di proposito. Se una regola non è scritta, un modello non la applicerà in modo coerente.

## Currency
- USD only in all locales. Use {monthlyPrice} and {overageRate} placeholders…
## False friends
- Coding environment is not encoding: Spanish desarrollo / Italian sviluppo / German Entwicklung…

Verifica. scripts/verify-translations.sh cerca caratteri cirillici nei file di traduzione latini, simboli dell'euro, le vecchie sottostringhe dei falsi amici e la parità dei placeholder dei prezzi rispetto a messages/en.json. I controlli opzionali usano ripgrep quando è installato. Lo script è il livello minimo, non il limite massimo. Serve a evitare che «l'abbiamo corretto una volta» si deteriori in silenzio alla modifica massiva successiva.

Codice, non altre ipotesi nel JSON. Abbiamo centralizzato gli importi in USD mostrati all'utente in lib/pricing.ts e collegato formatUsdPerMonth e formatUsdOveragePer1k alla homepage e alla FAQ, così i file di traduzione smettono di inventare cifre. Il bug non erano solo le stringhe sbagliate. Il bug era non avere policy e formatter pronti prima di scalare.


Cosa dovresti prendere per la tua i18n assistita dall'IA

Se generi traduzioni con un modello, il registro è la variabile con la maggiore varianza. Fissalo per ogni lingua prima di aggiungerne altre. Fissa la valuta nel codice, non nella prosa. Fissa i token del brand e il gergo degli sviluppatori. Esegui controlli automatici che facciano fallire il batch, invece di dirti «lo controlleremo a occhio più tardi». Più tardi non succede mai con lo stesso livello qualitativo della prima passata.

Per la storia architetturale alla base di questo audit, leggi Come localizzare un'app generata dall'IA e il confronto degli strumenti in globalize.now contro Lokalise e Crowdin. Se stai configurando l'i18n nel tuo repository e vuoi gli stessi guardrail, connetti il repository a globalize.now: la conversione viene eseguita una volta, nell'app; npx skills add globalize-now/globalize-skills è il punto di ingresso che documentiamo per le skill installate accanto al codice. La conclusione onesta: abbiamo usato il prodotto su noi stessi, trovato bug imbarazzanti, scritto la policy e aggiunto un gate. È questo il livello che vogliamo per ogni lancio multilingue.

globalize.now trasforma il testo hardcoded dell'app in file di localizzazione pronti e li mantiene aggiornati mentre rilasci.

Prova globalize.now gratis