# General Translation Knowledge Base: Cosa sono i codici locale, come en-US ed en-GB?
URL: https://generaltranslation.com/it/kb/locale-codes.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: Un codice locale identifica una lingua e, quando serve, il suo sistema di scrittura e la sua regione, come en-US per l'inglese degli Stati Uniti o zh-Hant-TW per il cinese tradizionale di Taiwan. La maggior parte dei software usa tag BCP 47 basati su codici ISO. General Translation usa codici BCP 47 per le impostazioni regionali sorgente e di destinazione in gt.config.json.
Category: Formattazione per impostazione regionale
Last updated: 2026-10-28
Authors: General Translation Team
Published: 2026-10-28

Un codice locale indica una lingua e, quando serve, il sistema di scrittura in cui è scritta e la regione in cui è parlata. `en-US` è l&#39;inglese degli Stati Uniti, `en-GB` è l&#39;inglese del Regno Unito e `zh-Hant-TW` è il cinese in caratteri tradizionali usato a Taiwan. Browser, HTTP, HTML e le API `Intl` di JavaScript adottano tutti lo stesso standard per questi codici, BCP 47: il codice che scegli determina quindi la traduzione, il formato delle date e le regole del plurale che l&#39;utente riceverà.

## Come è composto un tag BCP 47

[BCP 47](https://www.rfc-editor.org/info/bcp47) è lo standard dell&#39;IETF per i tag di lingua. Combina [RFC 5646](https://www.rfc-editor.org/rfc/rfc5646.html), che ne definisce la sintassi, con [RFC 4647](https://www.rfc-editor.org/rfc/rfc4647.html), che stabilisce come confrontare i tag. Un tag è una sequenza di subtag separati da trattini, sempre in quest&#39;ordine:

| Subtag                | Formato                                                     | Origine                                  | Esempi                                      |
| --------------------- | ----------------------------------------------------------- | ---------------------------------------- | ------------------------------------------- |
| Lingua (obbligatorio) | 2 o 3 lettere                                               | ISO 639, il codice più breve disponibile | `en`, `zh`, `gsw`                           |
| Sistema di scrittura  | 4 lettere                                                   | ISO 15924                                | `Hant`, `Hans`, `Latn`, `Cyrl`              |
| Regione               | 2 lettere o 3 cifre                                         | ISO 3166-1 alpha-2, oppure UN M.49       | `GB`, `BR`, `419`                           |
| Variante              | Da 5 a 8 caratteri, oppure una cifra seguita da 3 caratteri | Registrata presso IANA                   | `de-1901` (ortografia tedesca tradizionale) |
| Estensione            | Una singola lettera, seguita dai relativi subtag            | `u` è definita da Unicode                | `ar-EG-u-nu-latn`                           |
| Uso privato           | `x`, seguita da subtag a tua scelta                         | Tu                                       | `en-CA-x-ca`                                |

Ogni subtag valido è elencato nell&#39;[IANA Language Subtag Registry](https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry), l&#39;unico riferimento da consultare per verificare un codice. L&#39;edizione di settembre 2026 elenca 8.276 subtag di lingua e 305 subtag di regione, e per ogni codice ritirato indica quello che lo sostituisce.

Combinando questi elementi si può esprimere con precisione ciò che si intende. `sr-Latn-RS` indica il serbo in alfabeto latino come usato in Serbia. `es-419` indica lo spagnolo dell&#39;America Latina e dei Caraibi, dove `419` è un codice UN M.49 che designa una regione comprendente più paesi. RFC 5646 propone un esempio più sottile: `de-CH` è il tedesco usato in Svizzera (tedesco standard svizzero), mentre lo svizzero tedesco (Schweizerdeutsch) è una lingua a sé, con un proprio codice: `gsw-CH`.

### Le estensioni modificano la formattazione, non la lingua

L&#39;estensione `-u-`, definita nella [RFC 6067](https://www.rfc-editor.org/rfc/rfc6067.html) con le relative chiavi elencate nella [specifica LDML di Unicode](https://unicode.org/reports/tr35/), veicola preferenze di formattazione. `-u-nu-` seleziona il sistema di numerazione, `-u-hc-` il ciclo orario, `-u-ca-` il calendario e `-u-co-` l&#39;ordinamento. `en-US-u-hc-h23` resta inglese statunitense, ma mostra `14:05` anziché `2:05 PM`. L&#39;esempio più avanti illustra entrambi i casi.

## Maiuscole, trattini e trattini bassi

I tag non fanno distinzione tra maiuscole e minuscole, quindi `EN-gb` e `en-GB` sono equivalenti. L&#39;RFC 5646 [raccomanda comunque una convenzione](https://www.rfc-editor.org/rfc/rfc5646.html#section-2.1.1): lingua in minuscolo, sistema di scrittura con l&#39;iniziale maiuscola e regione in maiuscolo, come in `zh-Hant-TW`. Normalizza il codice in questa forma prima di usarlo in un nome di file o in un URL, in modo che `/en-gb/` e `/en-GB/` non diventino due percorsi distinti.

BCP 47 separa i subtag con i trattini. Diverse piattaforme usano formati propri, quindi esegui la conversione nel punto di passaggio tra un sistema e l&#39;altro:

| Sistema                                                                                            | Formato                                                                                   | Esempio                            |
| -------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | ---------------------------------- |
| Web (HTML `lang`, `hreflang`, `Accept-Language`, `Intl`)                                           | BCP 47 con trattini                                                                       | `en-US`, `zh-Hant-TW`              |
| [POSIX](https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap08.html) (`LANG`, `LC_*`) | `language[_territory][.codeset][@modifier]`                                               | `en_US.UTF-8`                      |
| ID di impostazione regionale di [Unicode CLDR](https://unicode.org/reports/tr35/) e ICU            | Trattini bassi; sono accettati anche i trattini                                           | `en_US`                            |
| [Java](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Locale.html)         | `toString()` restituisce la forma con trattini bassi, `toLanguageTag()` quella BCP 47     | `en_US`, `en-US`                   |
| [Risorse Android](https://developer.android.com/guide/topics/resources/providing-resources)        | `r` prima della regione, oppure `b+` per i tag BCP 47 (Android 7.0 e versioni successive) | `values-en-rUS`, `values-b+es+419` |

JavaScript non accetta la forma con il trattino basso: `Intl.getCanonicalLocales('en_US')` solleva un&#39;eccezione `RangeError`.

## Errori comuni

* **`en-UK` invece di `en-GB`.** Il codice di regione ISO per il Regno Unito è `GB`, mentre `UK` non figura nel registro IANA. Unicode CLDR tratta `UK` come alias, quindi JavaScript converte silenziosamente `en-UK` in `en-GB`, ma [Google ignora](https://developers.google.com/search/docs/specialty/international/localized-versions) `UK` negli attributi hreflang. Usa `en-GB`.
* **Un codice paese al posto del codice lingua.** `jp`, `cn`, `gr`, `dk` e `cz` non sono codici di lingua: il giapponese è `ja`, il cinese `zh`, il greco `el`, il danese `da` e il ceco `cs`. Alcuni codici paese corrispondono addirittura ad altre lingue: `se` è il sami settentrionale (lo svedese è `sv`), `kr` è il kanuri (il coreano è `ko`), `uk` è l&#39;ucraino e `be` è il bielorusso. I controlli sintattici accettano `jp` perché è composto da due lettere, quindi verifica i codici anziché limitarti a controllare che vengano analizzati senza errori.
* **`zh-CN` quando intendi il cinese semplificato.** Nel cinese è il sistema di scrittura a cambiare il testo scritto, mentre la regione si limita a implicarne uno: `zh-TW` si espande in `zh-Hant-TW` e `zh-SG` in `zh-Hans-SG`. Se un&#39;unica traduzione in cinese semplificato è destinata sia alla Cina continentale sia a Singapore, assegnale il tag `zh-Hans`; usa `zh-Hant` per il tradizionale e aggiungi una regione, ad esempio `zh-Hant-HK`, quando la terminologia cambia.
* **Codici ritirati.** `iw` (ebraico), `in` (indonesiano) e `ji` (yiddish) sono stati deprecati nel 1989 a favore di `he`, `id` e `yi`. Le versioni di Java precedenti alla 17 generavano ancora le vecchie forme, che quindi ricorrono nei dati meno recenti. La canonicalizzazione le sostituisce.
* **Tag troppo specifici.** `en-Latn-US` aggiunge un sistema di scrittura che per l&#39;inglese è quasi sempre scontato. RFC 5646 [consiglia](https://www.rfc-editor.org/rfc/rfc5646.html#section-4.1) di omettere i subtag che non aggiungono informazioni distintive e fa notare che, con il filtro di base, una richiesta per `en-US` non corrisponde ai contenuti con tag `en-Latn-US`.
* **Codici validi ma non supportati da chi li utilizza.** `es-419` è un codice BCP 47 valido, ma l&#39;hreflang di Google accetta solo regioni ISO 3166-1, quindi annota quelle pagine come `es` o con paesi specifici. (Vedi [Che cos&#39;è hreflang?](/kb/what-is-hreflang).)

## Codice generico o regionale: quale usare?

Il W3C, a proposito della [scelta dei tag di lingua](https://www.w3.org/International/questions/qa-choosing-language-tags), consiglia di mantenere i tag il più brevi possibile e di aggiungere una regione solo quando fornisce un&#39;informazione di cui hai bisogno. Tradotto in una regola per ciascuna impostazione regionale:

* **Usa la sola lingua** (`fr`, `de`, `ja`) quando un&#39;unica traduzione va bene per tutte le regioni in cui viene parlata.
* **Aggiungi una regione** quando ortografia, lessico o testi legali differiscono e intendi mantenere traduzioni separate: `en-US` e `en-GB`, `pt-BR` e `pt-PT`, `es-MX` e `es-ES`, `fr-CA`.
* **Per il cinese, il serbo e le altre lingue con più sistemi di scrittura, scegli prima il sistema di scrittura**: `zh-Hans` e `zh-Hant`, `sr-Cyrl` e `sr-Latn`.
* **Usa un codice regionale per la formattazione anche quando la traduzione è condivisa.** Un testo tradotto una sola volta come `en` può comunque formattare le date secondo l&#39;impostazione `en-GB` del visitatore, che scrive 28/10/2026 mentre `en-US` scrive 10/28/2026.

Per il software, un codice generico non è privo di regione. I dati likely-subtags di CLDR integrano il sistema di scrittura e la regione più probabili, per cui `pt` diventa `pt-Latn-BR` e `zh` diventa `zh-Hans-CN`. Se la tua traduzione `pt` è in portoghese europeo, etichettala come `pt-PT`.

Quando l&#39;impostazione regionale di un utente non è tra quelle supportate, il software ricorre a un fallback. La [ricerca](https://www.rfc-editor.org/rfc/rfc4647.html#section-3.4) definita dalla RFC 4647 rimuove i subtag a partire dalla fine finché non trova una corrispondenza (`zh-Hant-HK`, poi `zh-Hant`, poi `zh`), mentre altri algoritmi di corrispondenza provano anche le regioni affini. Per sapere come leggere le preferenze del browser e scegliere tra questi algoritmi, consulta [come rilevare la lingua del browser di un utente](/kb/detect-user-language).

## Normalizzare i codici in JavaScript

[`Intl.getCanonicalLocales`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/getCanonicalLocales) corregge l&#39;uso di maiuscole e minuscole e sostituisce i subtag deprecati o con alias, mentre [`Intl.Locale`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale) può aggiungere il sistema di scrittura e la regione più probabili:

```js title="locale-codes.mjs"
const names = new Intl.DisplayNames(['en'], { type: 'language' });

for (const tag of ['EN-gb', 'zh-tw', 'iw-IL', 'en-UK', 'jp', 'es-419', 'en_US']) {
  try {
    // Canonicalizzazione: corregge maiuscole e minuscole e sostituisce i subtag deprecati o alias
    const [canonical] = Intl.getCanonicalLocales(tag);
    // Aggiunge il sistema di scrittura e la regione probabili
    const maximized = new Intl.Locale(canonical).maximize().toString();
    console.log(`${tag} -> ${canonical} (${maximized}): ${names.of(canonical)}`);
  } catch (error) {
    console.log(`${tag} -> ${error.name}: ${error.message}`);
  }
}

// Un'estensione -u- modifica la formattazione, non la lingua
const time = new Date(Date.UTC(2026, 9, 28, 14, 5));
for (const tag of ['en-US', 'en-US-u-hc-h23', 'ar-EG', 'ar-EG-u-nu-latn']) {
  const formatted = new Intl.DateTimeFormat(tag, {
    hour: 'numeric',
    minute: '2-digit',
    timeZone: 'UTC',
  }).format(time);
  console.log(`${tag}: ${formatted}`);
}
```

Output di `node locale-codes.mjs` con Node.js 24.19.0:

```text title="Output"
EN-gb -> en-GB (en-Latn-GB): British English
zh-tw -> zh-TW (zh-Hant-TW): Chinese (Taiwan)
iw-IL -> he-IL (he-Hebr-IL): Hebrew (Israel)
en-UK -> en-GB (en-Latn-GB): British English
jp -> jp (jp): jp
es-419 -> es-419 (es-Latn-419): Latin American Spanish
en_US -> RangeError: Incorrect locale information provided
en-US: 2:05 PM
en-US-u-hc-h23: 14:05
ar-EG: ٢:٠٥ م
ar-EG-u-nu-latn: 2:05 م
```

Due righe meritano un&#39;occhiata più attenta. `jp` supera la canonicalizzazione e viene restituito senza nome visualizzato, perché il controllo verifica la sintassi, non l&#39;effettiva esistenza della lingua. Invece `ar-EG-u-nu-latn` mantiene il testo in arabo ma passa alle cifre occidentali.

## Come General Translation utilizza i codici locale

General Translation utilizza i codici BCP 47 in modo uniforme. In `gt.config.json`, [`defaultLocale`](/docs/cli/reference/config#default-locale) indica l&#39;impostazione regionale in cui è scritto il tuo contenuto di origine (`en` per impostazione predefinita), mentre [`locales`](/docs/cli/reference/config#locales) elenca le impostazioni regionali di destinazione:

```json title="gt.config.json"
{
  "defaultLocale": "en-US",
  "locales": ["en-GB", "fr-CA", "pt-BR", "zh-Hant"]
}
```

La CLI verifica questi codici prima di tradurre qualsiasi cosa. Si interrompe se trova un codice non valido e anche quando `defaultLocale` è più generico di un target: la traduzione da `en` a `en-GB` non riesce, quindi un progetto che aggiunge l&#39;inglese britannico imposta la sorgente su `en-US`, come mostrato sopra.

La piattaforma traduce nelle impostazioni regionali incluse nell&#39;elenco delle [impostazioni regionali supportate](/docs/platform/dashboard/reference/supported-locales). In genere General Translation tratta i codici equivalenti come un&#39;unica impostazione regionale: `fr`, `fr-FR` e `fr-Latn-FR` riceverebbero la stessa traduzione, e `ja` e `ja-JP` aggiornano la stessa traduzione memorizzata. (Vedi [Comprendere i codici locale](/docs/platform/core/guides/locale-codes).)

Per usare un codice che non corrisponde a una lingua registrata, come `cn` nei tuoi URL, il [`customMapping`](/docs/cli/reference/config#custom-mapping) di General Translation lo associa come alias a un codice standard (`cn` a `zh`) e può sovrascriverne il nome visualizzato. Per hreflang, la [guida SEO sugli alias delle impostazioni regionali](/docs/react/nextjs/locale-alias-seo) rimappa l&#39;alias su `zh`.

La libreria Core `generaltranslation` esporta gli helper per le impostazioni regionali come funzioni autonome che non richiedono alcuna chiave API. I valori restituiti riportati di seguito si riferiscono a `generaltranslation` 9.5.8:

```js title="check-locales.mjs"
import {
  standardizeLocale,
  isValidLocale,
  getLocaleName,
  determineLocale,
} from 'generaltranslation';

standardizeLocale('EN-gb'); // 'en-GB'
isValidLocale('en_US'); // false
isValidLocale('jp'); // false
getLocaleName('pt-BR', 'en'); // 'Brazilian Portuguese'
determineLocale(['fr-CA', 'en-US'], ['en', 'fr', 'zh-Hant']); // 'fr'
```

[`standardizeLocale`](/docs/platform/core/reference/utility-functions/locales/standardize-locale) corregge l&#39;uso di maiuscole e minuscole, [`isValidLocale`](/docs/platform/core/reference/utility-functions/locales/is-valid-locale) rifiuta le forme con trattino basso e codici come `jp` che `Intl` invece accetta, [`getLocaleName`](/docs/platform/core/reference/utility-functions/locales/get-locale-name) restituisce un nome visualizzato da usare in un selettore della lingua e [`determineLocale`](/docs/platform/core/reference/utility-functions/locales/determine-locale) sceglie, tra quelle supportate, la corrispondenza più adatta alle preferenze dell&#39;utente: in questo esempio, a un utente franco-canadese viene servita la tua traduzione `fr`.

## Domande frequenti

### Qual è la differenza tra un codice lingua e un codice locale?

Un codice lingua è composto da un solo subtag, come `en` o `pt`. Un codice locale può aggiungere anche un sistema di scrittura e una regione, come in `pt-BR`, e determina quindi anche la formattazione di date, numeri e valute.

### Si scrive en-GB o en-UK?

`en-GB`. `GB` è il codice ISO 3166-1 del Regno Unito; `UK` non è un subtag di regione registrato e Google lo ignora negli attributi hreflang.

### Devo usare zh-CN o zh-Hans?

Usa `zh-Hans` per i testi in cinese semplificato destinati a più di una regione e `zh-CN` solo quando il contenuto è specifico per la Cina continentale. Entrambi si risolvono nel sistema di scrittura semplificato.

### I codici locale fanno distinzione tra maiuscole e minuscole?

No. `en-us` e `en-US` sono lo stesso tag, ma usa la forma `en-US` per mantenere coerenti nomi di file, URL e chiavi.

## Punti chiave

* Un codice locale BCP 47 è composto da un subtag di lingua seguito da subtag facoltativi di sistema di scrittura, regione, variante ed estensione, in quest&#39;ordine e separati da trattini: `zh-Hant-TW`, `es-419`, `en-US-u-hc-h23`.
* Cerca i codici nel registro IANA: `en-GB`, non `en-UK`; `ja`, non `jp`; `he`, non `iw`.
* Usa tag brevi, aggiungi una regione solo per i contenuti che cambiano da una regione all&#39;altra e, per il cinese, scegli prima il sistema di scrittura.
* Converti i codici ai confini del sistema: POSIX, ICU e il metodo `toString()` di Java usano il trattino basso, mentre Android usa `values-b+es+419`.
* General Translation legge i codici BCP 47 da `defaultLocale` e `locales` in `gt.config.json`, rifiuta un locale di origine più generico di un locale di destinazione e supporta gli alias tramite `customMapping`.

## Related questions

- [Come si rileva la lingua del browser di un utente?](https://generaltranslation.com/it/kb/detect-user-language.mdx): Leggi l'elenco ordinato delle lingue del browser (navigator.languages in JavaScript o l'intestazione Accept-Language sul server), ordinato per q-value, e confrontalo con le impostazioni regionali supportate, prevedendo un fallback. Safari e Chrome in incognito restituiscono una sola lingua, mentre la geolocalizzazione tramite IP rivela la posizione, non la lingua.
- [Che cos'è hreflang e come si configura?](https://generaltranslation.com/it/kb/what-is-hreflang.mdx): Hreflang indica a Google quali URL sono versioni linguistiche o regionali della stessa pagina, così che possa mostrare quella giusta nei risultati di ricerca. Puoi aggiungerlo con tag link HTML, intestazioni HTTP Link o una mappa del sito: assicurati che ogni collegamento sia reciproco e usa codici validi come en-GB, non en-UK.
- [Internazionalizzazione vs. localizzazione (i18n vs. l10n)](https://generaltranslation.com/it/kb/internationalization-vs-localization.mdx): 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.
- [Come si formattano numeri, date e valute per ogni impostazione regionale?](https://generaltranslation.com/it/kb/format-numbers-dates-currencies.mdx): Formatta ogni valore al momento del rendering della pagina, usando l'impostazione regionale del lettore e l'API Intl di JavaScript, e tienilo fuori dalla frase tradotta. I componenti `<Num>`, `<Currency>`, `<DateTime>` e `<RelativeTime>` di General Translation fanno entrambe le cose all'interno di un `<T>`, così una sola traduzione funziona con qualsiasi valore.
- [Sottodirectory, sottodominio o ccTLD per la SEO multilingue](https://generaltranslation.com/it/kb/multilingual-url-structure.mdx): 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.

## Previous and next questions

- Previous question: [Come si traducono le animazioni Lottie?](https://generaltranslation.com/it/kb/translate-lottie-animations.mdx)
- Next question: [General Translation vs. Lingo.dev: quale scegliere?](https://generaltranslation.com/it/kb/general-translation-vs-lingo-dev.mdx)

## Sitemap

See the [Knowledge Base sitemap](https://generaltranslation.com/it/kb/sitemap.md) for every article.
