Usa sottodirectory come example.com/de/ quando un unico prodotto condivide sito e processo di rilascio. Solo un ccTLD indica un paese, i sottodomini consentono un hosting separato, Google sconsiglia i parametri ?lang= e tratta i domini di fantasia come .io e .ai come generici.
Lascia che sia l'URL a stabilire la lingua di ogni pagina che vuoi far indicizzare, perché Googlebot non invia alcuna intestazione Accept-Language ed esegue la scansione soprattutto da indirizzi statunitensi. Usa la scelta salvata in un cookie e, in subordine, Accept-Language solo per decidere verso quale pagina reindirizzare una radice neutra come /, con un reindirizzamento temporaneo 302 o 307.
Spesso sì, per le lingue più diffuse, ma solo dopo aver superato una valutazione sulle tue lingue, sulle tue stringhe di UI e sui contenuti più a rischio. Al WMT25, Gemini 2.5 Pro ha eguagliato o superato le traduzioni umane di riferimento in 10 coppie linguistiche su 16, ma un benchmark sui documenti non dice se brevi stringhe di interfaccia siano pronte per il rilascio.
L'internazionalizzazione (i18n) è il lavoro di sviluppo e progettazione che permette a un unico prodotto di supportare molte impostazioni regionali, ad esempio formattando le date con Intl e gestendo il testo right-to-left. La localizzazione (l10n) adatta il prodotto a una specifica impostazione regionale e comprende la traduzione, ma anche valute, formati di data, unità di misura, tono e aspetti legali.
Traduci il testo descrittivo, il testo alt delle immagini, i titoli e le descrizioni nel frontmatter e le props dei componenti che mostrano testo. Lascia invariati blocchi di codice, codice inline, import, nomi dei componenti JSX, chiavi del frontmatter e URL dei link, a meno che una mappatura dei locale non li riscriva. Racchiudi tra virgolette i valori YAML tradotti, quindi esegui la build del sito.
Esegui in CI un linter che segnali i letterali stringa visibili all'utente, come la regola no-literal-string di eslint-plugin-i18next per JSX, il controllo HardcodedText di Android Lint o il linter HardCodedString di erb_lint per Rails. Poi naviga nell'app con una pseudo-impostazione regionale per individuare il testo che i controlli statici non riescono a tracciare.