Panoramica della risoluzione delle lingue e delle impostazioni internazionali

A partire da Android 7.0 (livello API 24), Android fornisce un supporto avanzato per gli utenti multilingue, consentendo loro di selezionare più impostazioni internazionali nelle impostazioni. Android offre questa funzionalità espandendo notevolmente il numero di impostazioni internazionali supportate e cambiando il modo in cui il sistema risolve le risorse.

Questo documento inizia spiegando la strategia di risoluzione delle risorse nelle versioni di Android precedenti alla 7.0 (livello API 24). Successivamente descrive la strategia migliorata di risoluzione delle risorse in Android 7.0. Infine, spiega come sfruttare il numero esteso di impostazioni internazionali per supportare un numero maggiore di utenti multilingue.

Sfide nella risoluzione delle risorse linguistiche

Prima di Android 7.0, Android non poteva sempre trovare corrispondenze con le impostazioni internazionali dell'app e del sistema.

Ad esempio, supponiamo che tu abbia la seguente situazione:

  • La lingua predefinita dell'app è en_US (inglese americano) e ha anche stringhe spagnole localizzate in es_ES file di risorse.
  • Un dispositivo è impostato su es_MX

Quando il codice Java fa riferimento alle stringhe, il sistema carica le stringhe dal file di risorse predefinito (en_US), anche se l'app ha risorse in spagnolo localizzate in es_ES. Questo perché, quando il sistema non riesce a trovare una corrispondenza esatta, continua a cercare risorse rimuovendo il codice paese dalle impostazioni internazionali. Infine, se non viene trovata alcuna corrispondenza, il sistema torna al valore predefinito, ovvero en_US.

Il sistema applicava anche la lingua en_US per impostazione predefinita se l'utente sceglieva una lingua non supportata dall'app, ad esempio il francese. Ecco alcuni esempi:

Tabella 1. Risoluzione delle risorse senza una corrispondenza esatta delle impostazioni internazionali.

impostazioni utente Risorse per le app Risoluzione delle risorse
fr_CH predefinito (en)
de_DE
es_ES
fr_FR
it_IT
Prova fr_CH => Fail
Prova fr => Fail
Usa impostazione predefinita (en)

In questo esempio, il sistema mostra le stringhe in inglese senza sapere se l'utente capisce l'inglese. Questo comportamento è piuttosto comune oggi.

Miglioramenti alla strategia di risoluzione delle risorse

Android 7.0 (livello API 24) offre una risoluzione delle risorse più solida e trova automaticamente i fallback migliori. Tuttavia, per velocizzare la risoluzione e migliorare la gestibilità, devi archiviare le risorse nel dialetto padre più comune. Ad esempio, se in precedenza archiviavi risorse in spagnolo nella directory values-es-rUS, spostale nella directory values-b+es+419, che contiene lo spagnolo latinoamericano. Allo stesso modo, se in una directory denominata values-en-rGB sono presenti stringhe di risorse, rinomina la directory in values-b+en+001 (inglese internazionale), perché l'elemento padre più comune per le stringhe en-GB è en-001. I seguenti esempi spiegano perché queste pratiche migliorano le prestazioni e l'affidabilità della risoluzione delle risorse.

Esempi di risoluzione delle risorse

Con versioni di Android successive alla 7.0, il caso descritto nella Tabella 1 viene risolto in modo diverso:

Tabella 2. Una migliore strategia di risoluzione per i casi in cui non esiste una corrispondenza esatta delle impostazioni internazionali.

impostazioni utente Risorse per le app Risoluzione delle risorse
  1. fr_CH
predefinito (en)
de_DE
es_ES
fr_FR
it_IT
Prova fr_CH => Fail
Prova fr => Fail
Prova i figli di fr => fr_FR
Usa fr_FR

Ora l'utente riceve risorse in francese anziché in inglese. Questo esempio mostra anche perché dovresti memorizzare le stringhe in francese in fr anziché in fr_FR per Android 7.0 o versioni successive. In questo caso, la soluzione è quella di utilizzare il dialetto padre più simile, rendendo la risoluzione più rapida e prevedibile.

Oltre a questa migliore logica di risoluzione, Android ora offre agli utenti più lingue tra cui scegliere. Proviamo di nuovo a utilizzare l'esempio precedente, specificando l'italiano come lingua utente aggiuntiva, ma senza il supporto dell'app per il francese.

Tabella 3. La risoluzione delle risorse quando l'app corrisponde solo alla seconda impostazione internazionale preferita dell'utente.

impostazioni utente Risorse per le app Risoluzione delle risorse
  1. fr_CH
  2. it_CH
predefinito (it)
de_DE
es_ES
it_IT
Prova fr_CH => Fail
Prova fr => Fail
Prova figli di fr => Fail
Prova it_CH => Fail
Prova => Fail
Prova dai figli => it_IT
Usalo_IT

L'utente riceve comunque una lingua che comprende, anche se l'app non supporta il francese.

Progettazione dell'app per supportare ulteriori impostazioni internazionali

Android offre strumenti che semplificano la localizzazione dei contenuti delle app e il coinvolgimento degli utenti nelle lingue che preferiscono. Ti consigliamo di utilizzare le seguenti tecniche per configurare la tua app in modo che possa supportare lingue e convenzioni di formattazione diverse in modo scalabile.

Specificare le lingue supportate dalla tua app

Per assicurarti che le lingue siano risolte correttamente, specifica le lingue supportate dalla tua app utilizzando la proprietà resConfigs nel file build.gradle a livello di modulo.

Il seguente esempio di codice mostra come utilizzare resConfigs per indicare le lingue supportate. In questo esempio, l'app supporta sia l'inglese sia lo spagnolo.

Trendy

android {
    defaultConfig {
        ...
        resConfigs "en", "es"
    }
}

Kotlin

android {
    defaultConfig {
        ...
        resConfigs("en", "es")
    }
}
A causa del modo in cui il sistema di build unisce le risorse della tua app e le sue dipendenze, devi specificare le lingue supportate in questo modo per assicurarti che le impostazioni della lingua dell'utente vengano ricevute correttamente.

API LocaleList

A partire da Android 7.0 (livello API 24), Android espone l'API LocaleList.getDefault(), che consente alle app di eseguire query direttamente sull'elenco delle lingue specificate da un utente. Questa API ti consente di creare un comportamento delle app più sofisticato e una visualizzazione migliore dei contenuti. Ad esempio, la Ricerca può mostrare risultati in più lingue a seconda delle impostazioni dell'utente. Le app browser possono evitare di proporre la traduzione di pagine in una lingua che l'utente già conosce e le app per tastiera possono attivare automaticamente tutti i layout appropriati.

Formattatori

Fino ad Android 6.0 (livello API 23), Android supportava solo una o due impostazioni internazionali per molte lingue comuni (en, es, ar, fr, ru). Poiché esistevano solo poche varianti di ogni lingua, le app potevano evitare l'archiviazione di alcuni numeri e date come stringhe hardcoded nei file di risorse. Tuttavia, con l'ampio insieme di impostazioni internazionali supportate da Android, possono esserci differenze significative nei formati di date, orari, valute e informazioni simili anche all'interno di un'unica impostazione internazionale. L'hardcoded dei formati può creare un'esperienza confusa per gli utenti finali. Pertanto, quando sviluppi per Android 7.0 o versioni successive, assicurati di utilizzare formattatori anziché numeri hardcoded e stringhe di date.

Ad esempio, Android 7.0 e versioni successive include il supporto per 27 lingue arabe. Queste impostazioni internazionali possono condividere la maggior parte delle risorse, ma alcune preferiscono le cifre ASCII, mentre altre preferiscono le cifre native. Ad esempio, se vuoi creare una frase con una variabile di cifre, come "Scegli un PIN di 4 cifre", utilizza i formattatitori come mostrato di seguito:

 format(locale, "Choose a %d-digit PIN", 4)