Localizzazione da destra a sinistra
La localizzazione da destra a sinistra aggiunge il supporto per la direzione del flusso da destra a sinistra alle Xamarin.Forms applicazioni.
Nota
La localizzazione da destra a sinistra richiede l'uso di iOS 9 o versione successiva e l'API 17 o versione successiva in Android.
La direzione del flusso è la direzione in cui gli elementi dell'interfaccia utente della pagina vengono analizzati dall'occhio del lettore. Alcuni lingue, come l'arabo e l'ebraico, richiedono che gli elementi dell'interfaccia utente vengano disposti da destra a sinistra. A questo scopo, è possibile impostare la proprietà VisualElement.FlowDirection
. Questa proprietà ottiene o imposta la direzione nella quale disporre gli elementi dell'interfaccia utente all'interno di qualsiasi elemento padre che ne controlla il layout e deve essere impostata su uno dei valori di enumerazione FlowDirection
:
L'impostazione della proprietà FlowDirection
per un elemento su RightToLeft
determina, da un punto di vista generale, l'allineamento a destra, l'ordine di lettura da destra a sinistra e il layout del controllo da destra a sinistra:
Suggerimento
Si consiglia di impostare la proprietà FlowDirection
solo nel layout iniziale. La modifica di questo valore in fase di esecuzione genera un laborioso processo di elaborazione del layout che influirà sulle prestazioni.
Il valore predefinito della proprietà FlowDirection
di un elemento senza elemento padre è LeftToRight
, mentre il valore predefinito FlowDirection
di un elemento con un elemento padre è MatchParent
. Pertanto, un elemento eredita il valore della proprietà FlowDirection
dal relativo elemento padre nella struttura ad albero visuale e qualsiasi elemento può sostituire il valore ereditato dal relativo elemento padre.
Suggerimento
Durante la localizzazione di un'app per le lingue con flusso da destra a sinistra, impostare la proprietà FlowDirection
in un layout di pagina o radice. In questo modo, tutti gli elementi contenuti all'interno del layout di pagina o radice risponderanno in modo appropriato alla direzione del flusso.
Rispetto della direzione del flusso di un dispositivo
Il rispetto della direzione del flusso del dispositivo in funzione della lingua e dell'area geografica selezionata è una scelta esplicita che deve operare lo sviluppatore e, pertanto, non avviene automaticamente. Può essere ottenuto impostando la FlowDirection
proprietà in una pagina, o layout radice, sul static
Device.FlowDirection
valore :
<ContentPage ... FlowDirection="{x:Static Device.FlowDirection}"> />
this.FlowDirection = Device.FlowDirection;
Tutti gli elementi figlio del layout di pagina o radice erediteranno quindi, per impostazione predefinita, il valore Device.FlowDirection
.
Impostazione della piattaforma
Per abilitare le impostazioni locali da destra a sinistra, è necessario prevedere un'impostazione specifica della piattaforma.
iOS
Le impostazioni locali necessarie per la direzione da destra a sinistra devono essere aggiunte come lingua supportata agli elementi matrice della chiave CFBundleLocalizations
in Info.plist. L'esempio seguente mostra l'arabo aggiunto alla matrice della chiave CFBundleLocalizations
:
<key>CFBundleLocalizations</key>
<array>
<string>en</string>
<string>ar</string>
</array>
Per altre informazioni, vedere Nozioni fondamentali di localizzazione in iOS.
La localizzazione da destra a sinistra può essere testata cambiando la lingua e l'area geografica nel dispositivo o simulatore e scegliendo le impostazioni locali per la direzione da destra a sinistra specificate in Info.plist.
Avviso
Si noti che quando si cambia la lingua e l'area geografica scegliendo delle impostazioni locali per la direzione da destra a sinistra su iOS, qualsiasi visualizzazione DatePicker
genererà un'eccezione se le risorse necessarie per le impostazioni locali non sono state incluse. Ad esempio, durante il test di un'app in arabo con un DatePicker
, verificare che mideast sia selezionato nella sezione Internazionalizzazione del riquadro Compilazione iOS.
Android
Il file AndroidManifest.xml dell'app deve essere aggiornato in modo che il nodo <uses-sdk>
imposti l'attributo android:minSdkVersion
su 17 e il nodo <application>
imposti l'attributo android:supportsRtl
su true
:
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<uses-sdk android:minSdkVersion="17" ... />
<application ... android:supportsRtl="true">
</application>
</manifest>
La localizzazione da destra a sinistra può quindi essere testata modificando il dispositivo/emulatore per usare la lingua da destra a sinistra o abilitando Forza direzione layout RTL in Impostazioni > Opzioni sviluppatore.
Piattaforma UWP (Universal Windows Platform)
Le risorse della lingua necessarie devono essere specificate nel nodo <Resources>
del file Package.appxmanifest. L'esempio seguente mostra l'arabo aggiunto al nodo <Resources>
:
<Resources>
<Resource Language="x-generate"/>
<Resource Language="en" />
<Resource Language="ar" />
</Resources>
Inoltre, la piattaforma UWP richiede che le impostazioni cultura predefinite dell'app siano definite esplicitamente nella libreria .NET Standard. Questa operazione può essere eseguita impostando l'attributo NeutralResourcesLanguage
nella classe AssemblyInfo.cs
, o in un'altra classe, sulle impostazioni cultura predefinite:
using System.Resources;
[assembly: NeutralResourcesLanguage("en")]
La localizzazione da destra a sinistra può essere testata cambiando la lingua e l'area geografica nel dispositivo e scegliendo le impostazioni locali per la direzione da destra a sinistra appropriate.
Limiti
Xamarin.Forms La localizzazione da destra a sinistra presenta attualmente una serie di limitazioni:
- La posizione del pulsante
NavigationPage
, la posizione degli elementi della barra degli strumenti e l'animazione della transizione sono controllate dalle impostazioni locali del dispositivo anziché dalla proprietàFlowDirection
. - La direzione di scorrimento rapido di
CarouselPage
non si inverte. - Il contenuto visivo di
Image
non si capovolge. - Il contenuto di
WebView
non rispetta la proprietàFlowDirection
. - È necessario aggiungere una proprietà
TextDirection
per controllare l'allineamento del testo.
iOS
- L'orientamento di
Stepper
è controllato dalle impostazioni locali del dispositivo, anziché dalla proprietàFlowDirection
. - L'allineamento del testo di
EntryCell
è controllato dalle impostazioni locali del dispositivo, anziché dalla proprietàFlowDirection
. - I movimenti e l'allineamento di
ContextActions
non vengono invertiti.
Android
- L'orientamento di
SearchBar
è controllato dalle impostazioni locali del dispositivo, anziché dalla proprietàFlowDirection
. - Il posizionamento di
ContextActions
è controllato dalle impostazioni locali del dispositivo, anziché dalla proprietàFlowDirection
.
UWP
- L'allineamento del testo di
Editor
è controllato dalle impostazioni locali del dispositivo, anziché dalla proprietàFlowDirection
. - La proprietà
FlowDirection
non viene ereditata dagli elementi figlio diFlyoutPage
. - L'allineamento del testo di
ContextActions
è controllato dalle impostazioni locali del dispositivo, anziché dalla proprietàFlowDirection
.
Forzare il layout da destra a sinistra
Le applicazioni Xamarin.iOS e Xamarin.Android possono essere costrette a usare sempre un layout da destra a sinistra, indipendentemente dalle impostazioni del dispositivo, modificando i rispettivi progetti di piattaforma.
iOS
Le applicazioni Xamarin.iOS possono essere forzate a usare sempre un layout da destra a sinistra modificando la classe AppDelegate come indicato di seguito:
Dichiarare la
IntPtr_objc_msgSend
funzione come prima riga dellaAppDelegate
classe:[System.Runtime.InteropServices.DllImport(ObjCRuntime.Constants.ObjectiveCLibrary, EntryPoint = "objc_msgSend")] internal extern static IntPtr IntPtr_objc_msgSend(IntPtr receiver, IntPtr selector, UISemanticContentAttribute arg1);
Chiamare la
IntPtr_objc_msgSend
funzione dalFinishedLaunching
metodo , prima di restituire dalFinshedLaunching
metodo :bool result = base.FinishedLaunching(app, options); ObjCRuntime.Selector selector = new ObjCRuntime.Selector("setSemanticContentAttribute:"); IntPtr_objc_msgSend(UIView.Appearance.Handle, selector.Handle, UISemanticContentAttribute.ForceRightToLeft); return result;
Questo approccio è utile per le applicazioni che richiedono sempre un layout da destra a sinistra e rimuove il requisito di impostare la FlowDirection
proprietà.
Per altre informazioni sul IntrPtr_objc_msgSend
metodo, vedere Selettori Objective-C in Xamarin.iOS.
Android
Le applicazioni Xamarin.Android possono essere forzate a usare sempre un layout da destra a sinistra modificando la classe MainActivity per includere la riga seguente:
Window.DecorView.LayoutDirection = LayoutDirection.Rtl;
Nota
Questo approccio richiede che l'applicazione sia configurata per supportare il layout da destra a sinistra. Per altre informazioni, vedere Configurazione della piattaforma Android.
Questo approccio è utile per le applicazioni che richiedono sempre un layout da destra a sinistra e rimuove il requisito di impostare la proprietà per la FlowDirection
maggior parte dei controlli. Tuttavia, alcuni controlli, ad esempio CollectionView
, non rispettano la LayoutDirection
proprietà e richiedono comunque che la FlowDirection
proprietà sia impostata.
Supporto delle lingue da destra a sinistra con Xamarin.University
Xamarin.Forms Video di supporto da destra a sinistra 3.0