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 Resources
corrente:
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_US
per 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.
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>
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 quale quantity
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
- few
- 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.
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 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
, TextDirection
e TextAlignment
per semplificare la compilazione di schermate che si adattano ai lettori RTL.
Lo screenshot seguente mostra l'esempio localizzato tasky in arabo:
Lo screenshot seguente mostra l'esempio localizzato tasky in ebraico:
Il testo RTL viene localizzato usando Strings.xml file nello stesso modo del testo LTR.
Test
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.