Localizzazione in Android

Questo documento presenta le funzionalità di localizzazione di Android SDK e come accedervi con Xamarin.

Funzionalità della piattaforma Android

Questa sezione descrive le principali funzionalità di localizzazione di Android. Passare alla sezione successiva per visualizzare codice ed esempi specifici.

Impostazioni locali

Gli utenti scelgono la lingua in Impostazioni Lingua e input. > Questa selezione controlla sia la lingua visualizzata che le impostazioni internazionali usate ,ad esempio per la formattazione di data e numero.

Le impostazioni locali correnti possono essere sottoposte a query tramite il contesto Resourcescorrente:

var lang = Resources.Configuration.Locale; // eg. "es_ES"

Questo valore sarà un identificatore delle impostazioni locali che contiene sia un codice di lingua che un codice delle impostazioni locali, separati da un carattere di sottolineatura. Per riferimento, ecco un elenco delle impostazioni locali Java e delle impostazioni locali supportate da Android tramite StackOverflow.

Esempi comuni prevedono:

  • en_USper inglese (Stati Uniti)
  • es_ES per spagnolo (Spagna)
  • ja_JP per giapponese (Giappone)
  • zh_CN per cinese (Cina)
  • zh_TW per cinese (Taiwan)
  • pt_PT per portoghese (Portogallo)
  • pt_BR per portoghese (Brasile)

LOCALE_CHANGED

Android genera android.intent.action.LOCALE_CHANGED quando l'utente modifica la selezione della lingua.

Le attività possono scegliere di gestirlo impostando l'attributo sull'attività android:configChanges , come illustrato di seguito:

[Activity (Label = "@string/app_name", MainLauncher = true, Icon="@drawable/launcher",
    ConfigurationChanges = ConfigChanges.Locale | ConfigChanges.ScreenSize | ConfigChanges.Orientation)]

Nozioni di base sulla internazionalizzazione in Android

La strategia di localizzazione di Android include le parti chiave seguenti:

  • Cartelle di risorse che contengono stringhe localizzate, immagini e altre risorse.

  • GetText metodo, usato per recuperare le stringhe localizzate nel codice

  • @string/id nei file AXML per inserire automaticamente stringhe localizzate nei layout.

Cartelle risorse

Le applicazioni Android gestiscono la maggior parte del contenuto nelle cartelle delle risorse, ad esempio:

  • layout : contiene file di layout AXML.
  • drawable : contiene immagini e altre risorse disegnabili.
  • values : contiene stringhe.
  • raw : contiene file di dati.

La maggior parte degli sviluppatori ha già familiarità con l'uso di suffissi dpi nella directory drawable per fornire più versioni di un'immagine, consentendo ad Android di scegliere la versione corretta per ogni dispositivo. Lo stesso meccanismo viene usato per fornire più traduzioni linguistiche tramite il suffisso delle directory delle risorse con identificatori di lingua e impostazioni cultura.

Screenshot of Resources/drawable and Resources/values folders for multiple cultural identifiers

Nota

Quando si specifica una lingua di primo livello come es sono necessari solo due caratteri. Tuttavia, quando si specificano impostazioni locali complete, il formato del nome della directory richiede un trattino e un r minuscolo per separare le due parti, ad esempio pt-rBR o zh-rCN. Confrontare questo valore con il valore restituito nel codice, con un carattere di sottolineatura ( ad esempio pt_BR). Entrambi sono diversi dal valore usato dalla classe .NET CultureInfo , che ha solo un trattino (ad esempio pt-BR). Tenere presenti queste differenze quando si lavora tra le piattaforme Xamarin.

Strings.xml formato di file

Directory dei valori localizzati, ad esempio values-es o values-pt-rBR) deve contenere un file denominato Strings.xml che conterrà il testo tradotto per le impostazioni locali.

Ogni stringa traducibile è un elemento XML con l'ID risorsa specificato come name attributo e la stringa tradotta come valore:

<string name="app_name">TaskyL10n</string>

È necessario eseguire l'escape in base alle normali regole XML e deve name essere un ID risorsa Android valido (senza spazi o trattini). Di seguito è riportato un esempio del file di stringhe (inglese) predefinito per l'esempio:

valori/Strings.xml

<resources>
    <string name="app_name">TaskyL10n</string>
    <string name="taskadd">Add Task</string>
    <string name="taskname">Name</string>
    <string name="tasknotes">Notes</string>
    <string name="taskdone">Done</string>
    <string name="taskcancel">Cancel</string>
</resources>

I valori della directory spagnola es contengono un file con lo stesso nome (Strings.xml) che contiene le traduzioni:

values-es/Strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">TaskyLeon</string>
    <string name="taskadd">agregar tarea</string>
    <string name="taskname">Nombre</string>
    <string name="tasknotes">Notas</string>
    <string name="taskdone">Completo</string>
    <string name="taskcancel">Cancelar</string>
</resources>

Screenshot of multiple values folders, each containing a Strings.xml file

Con la configurazione dei file di stringhe, è possibile fare riferimento ai valori tradotti sia nei layout che nel codice.

File di layout AXML

Per fare riferimento a stringhe localizzate nei file di layout, usare la @string/id sintassi . Questo frammento XML dell'esempio mostra text le proprietà impostate con ID risorsa localizzati (alcuni altri attributi sono stati omessi):

<TextView
    android:id="@+id/NameLabel"
    android:text="@string/taskname"
    ... />
<CheckBox
    android:id="@+id/chkDone"
    android:text="@string/taskdone"
    ... />

Metodo GetText

Per recuperare le stringhe tradotte nel codice, usare il GetText metodo e passare l'ID risorsa:

var cancelText = Resources.GetText (Resource.String.taskcancel);

Stringhe di quantità

Le risorse stringa Android consentono anche di creare stringhe di quantità che consentono ai traduttori di fornire traduzioni diverse per quantità diverse, ad esempio:

  • "C'è 1 attività lasciata."
  • "Ci sono 2 attività ancora da fare."

(anziché un generico "Ci sono n attività a sinistra").

Nel Strings.xml

<plurals name="numberOfTasks">
   <!--
      As a developer, you should always supply "one" and "other"
      strings. Your translators will know which strings are actually
      needed for their language.
    -->
   <item quantity="one">There is %d task left.</item>
   <item quantity="other">There are %d tasks still to do.</item>
 </plurals>

Per eseguire il rendering della stringa completa, usare il GetQuantityString metodo , passando l'ID risorsa e il valore da visualizzare (che viene passato due volte). Il secondo parametro viene usato da Android per determinare qualequantity stringa usare, il terzo parametro è il valore effettivamente sostituito nella stringa (entrambi sono obbligatori).

var translated = Resources.GetQuantityString (
                    Resource.Plurals.numberOfTasks, taskcount, taskcount);`

Le opzioni valide quantity sono:

  • zero
  • Uno
  • due
  • Alcuni
  • many
  • altro

Sono descritti in modo più dettagliato nella documentazione di Android. Se una determinata lingua non richiede la gestione "speciale", tali quantity stringhe verranno ignorate (ad esempio, solo l'inglese usa one e other, specificando una zero stringa non avrà alcun effetto, non verrà usato).

Immagini

Le immagini localizzate seguono le stesse regole dei file di stringhe: tutte le immagini a cui si fa riferimento nell'applicazione devono essere inserite in directory disegnabili in modo che sia presente un fallback.

Le immagini specifiche delle impostazioni locali devono quindi essere inserite in cartelle disegnabili qualificate, ad esempio drawable-es o drawable-ja (è anche possibile aggiungere identificatori dpi).

In questo screenshot, quattro immagini vengono salvate nella directory drawable , ma solo una, flag.png, ha copie localizzate in altre directory.

Screenshot of multiple drawable folders, each containing one or more localized .png files

Altri tipi di risorse

È anche possibile fornire altri tipi di risorse alternative specifiche del linguaggio, tra cui layout, animazioni e file non elaborati. Ciò significa che è possibile fornire un layout dello schermo specifico per una o più lingue di destinazione, ad esempio è possibile creare un layout specifico per il tedesco che consente etichette di testo molto lunghe.

Android 4.2 ha introdotto il supporto per le lingue da destra a sinistra (RTL) se si imposta l'impostazione android:supportsRtl="true"dell'applicazione . Il qualificatore "ldrtl" di risorsa può essere incluso in un nome di directory per contenere layout personalizzati progettati per la visualizzazione RTL.

Per altre informazioni sulla denominazione e il fallback della directory delle risorse, vedere la documentazione di Android per fornire risorse alternative.

Nome dell'app

Il nome dell'applicazione è facile da localizzare usando un in @string/id per l'attività MainLauncher :

[Activity (Label = "@string/app_name", MainLauncher = true, Icon="@drawable/launcher",
    ConfigurationChanges =  ConfigChanges.Orientation | ConfigChanges.Locale)]

Lingue da destra a sinistra (RTL)

Android 4.2 e versioni successive offre il supporto completo per i layout RTL, descritti in dettaglio nel blog del supporto RTL nativo.

Quando si usa Android 4.2 (livello API 17) e versioni successive, è possibile specificare i valori di allineamento con start e end anziché e right (ad esempioandroid:paddingStart).left Sono disponibili anche nuove API come LayoutDirection, TextDirectione TextAlignment per semplificare la compilazione di schermate che si adattano ai lettori RTL.

Lo screenshot seguente mostra l'esempio localizzato tasky in arabo:

Screenshot of Tasky app in Arabic

Lo screenshot seguente mostra l'esempio localizzato tasky in ebraico:

Screenshot of Tasky app in Hebrew

Il testo RTL viene localizzato usando Strings.xml file nello stesso modo del testo LTR.

Test in corso

Assicurarsi di testare accuratamente le impostazioni locali predefinite. L'applicazione si arresta in modo anomalo se le risorse predefinite non possono essere caricate per qualche motivo (ad esempio, sono mancanti).

Test dell'emulatore

Fare riferimento alla sezione Test di Google in un emulatore Android per istruzioni su come impostare un emulatore su impostazioni locali specifiche usando la shell ADB.

adb shell setprop persist.sys.locale fr-CA;stop;sleep 5;start

Test dei dispositivi

Per eseguire il test in un dispositivo, modificare la lingua nell'app Impostazioni.

Suggerimento

Prendere nota delle icone e della posizione delle voci di menu in modo che sia possibile ripristinare l'impostazione originale della lingua.

Riepilogo

Questo articolo illustra le nozioni di base sulla localizzazione delle applicazioni Android usando la gestione delle risorse predefinita. Altre informazioni sulle app i18n e L10n per iOS, Android e multipiattaforma (incluse le app Xamarin.Forms) sono disponibili in questa guida multipiattaforma.