Localizzazione da destra a sinistra

Download Sample Scaricare l'esempio

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:

TodoItemPage in Arabic with a right-to-left flow direction

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 proprietà FlowDirection in un layout di pagina o radice sul valore staticDevice.FlowDirection:

<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>

Info.plist supported languages

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 in modo da usare la lingua da destra a sinistra oppure abilitando Forza direzione del 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 di FlyoutPage.
  • 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:

  1. Dichiarare la IntPtr_objc_msgSend funzione come prima riga della AppDelegate classe:

    [System.Runtime.InteropServices.DllImport(ObjCRuntime.Constants.ObjectiveCLibrary, EntryPoint = "objc_msgSend")]
    internal extern static IntPtr IntPtr_objc_msgSend(IntPtr receiver, IntPtr selector, UISemanticContentAttribute arg1);
    
  2. Chiamare la IntPtr_objc_msgSend funzione dal FinishedLaunching metodo , prima di restituire dal FinshedLaunching 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