Localização da direita para a esquerda

A localização da direita para a esquerda adiciona suporte para direção de fluxo da direita para a esquerda aos Xamarin.Forms aplicativos.

Observação

A localização da direita para a esquerda exige o uso do iOS 9 ou superior e da API 17 ou superior no Android.

A direção do fluxo é a direção na qual os elementos de interface do usuário na página são detectados pelos olhos. Alguns idiomas, como árabe e hebraico, exigem que os elementos de interface do usuário sejam dispostos em uma direção de fluxo da direita para a esquerda. Isso pode ser feito com a definição da propriedade VisualElement.FlowDirection. Essa propriedade obtém ou define a direção na qual os elementos de interface do usuário fluem nos elementos pai que controlam seu layout e deve ser definida com um dos valores de enumeração FlowDirection:

Em geral, a definição da propriedade FlowDirection como RightToLeft em um elemento define o alinhamento para a direita, o sentido de leitura como direita para esquerda e o layout do controle para fluir da direita para a esquerda:

TodoItemPage em árabe com uma direção de fluxo da direita para a esquerda

Dica

Você só deve definir a propriedade FlowDirection no layout inicial. A alteração desse valor em runtime causa um processo caro de layout que afetará o desempenho.

O valor padrão da propriedade FlowDirection de um elemento sem um pai é LeftToRight, enquanto o FlowDirection padrão de um elemento com um pai é MatchParent. Portanto, um elemento herda o valor da propriedade FlowDirection de seu pai na árvore visual e qualquer elemento pode substituir o valor obtido de seu pai.

Dica

Ao localizar um aplicativo para idiomas da direita para a esquerda, defina a propriedade FlowDirection em uma página ou um layout raiz. Isso faz com que todos os elementos contidos na página ou layout raiz respondam de forma apropriada à direção do fluxo.

Respeitando a direção do fluxo do dispositivo

O respeito à direção do fluxo do dispositivo com base na região e no idioma selecionados é uma opção explícita do desenvolvedor e não ocorre automaticamente. Isso pode ser feito definindo a FlowDirection propriedade em uma página, ou layout raiz, com o static Device.FlowDirection valor:

<ContentPage ... FlowDirection="{x:Static Device.FlowDirection}"> />
this.FlowDirection = Device.FlowDirection;

Em seguida, todos os elementos filho da página ou o layout raiz, por padrão, herdarão o valor Device.FlowDirection.

Instalação da plataforma

A instalação da plataforma específica é necessária para habilitar localidades com leitura da direita para a esquerda.

iOS

A localidade com leitura da direita para a esquerda necessária deve ser adicionada como um idioma compatível aos itens de matriz da chave CFBundleLocalizations em Info.plist. O seguinte exemplo mostra o árabe adicionado à matriz da chave CFBundleLocalizations:

<key>CFBundleLocalizations</key>
<array>
    <string>en</string>
    <string>ar</string>
</array>

Info.plist idiomas suportados

Para obter mais informações, confira Noções básicas de localização no iOS.

A localização da direita para a esquerda pode então ser testada, alterando o idioma e a região no dispositivo/simulador para uma localidade com leitura da direita para a esquerda que foi especificada em Info.plist.

Aviso

Observe que ao alterar o idioma e a região para uma localidade com leitura da direita para a esquerda no iOS, as exibições DatePicker gerarão uma exceção se você não incluir os recursos necessários para a localidade. Por exemplo, ao testar um aplicativo em árabe que tenha um DatePicker, verifique se a opção oriente médio está selecionada na seção Internacionalização no painel Build do iOS.

Android

O arquivo AndroidManifest.xml do aplicativo deve ser atualizado para que o nó <uses-sdk> defina o atributo android:minSdkVersion como 17 e o nó <application> defina o atributo android:supportsRtl como true:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <uses-sdk android:minSdkVersion="17" ... />
    <application ... android:supportsRtl="true">
    </application>
</manifest>

A localização da direita para a esquerda pode ser testada alterando o dispositivo/emulador para usar o idioma da direita para a esquerda ou habilitando Forçar direção de layout RTL em Configurações > Opções do desenvolvedor.

Plataforma Universal do Windows (UWP)

Os recursos de idioma necessários devem ser especificados no nó <Resources> do arquivo Package.appxmanifest. O seguinte exemplo mostra o árabe adicionado ao nó <Resources>:

<Resources>
    <Resource Language="x-generate"/>
    <Resource Language="en" />
    <Resource Language="ar" />
</Resources>

Além disso, o UWP exige que a cultura padrão do aplicativo seja explicitamente definida na biblioteca do .NET Standard. Isso pode ser feito com a definição do atributo NeutralResourcesLanguage em AssemblyInfo.cs, ou em outra classe, como a cultura padrão:

using System.Resources;

[assembly: NeutralResourcesLanguage("en")]

A localização da direita para a esquerda pode então ser testada, alterando o idioma e a região no dispositivo para a localidade da direita para a esquerda apropriada.

Limitações

Xamarin.Forms A localização da direita para a esquerda atualmente tem várias limitações:

  • A localização do botão NavigationPage, a localização do item da barra de ferramentas e a animação de transição são controlados pela localidade do dispositivo, em vez de pela propriedade FlowDirection.
  • A direção de passar o dedo de CarouselPage não é invertida.
  • O conteúdo visual de Image não é invertido.
  • O conteúdo de WebView não respeita a propriedade FlowDirection.
  • Uma propriedade TextDirection precisa ser adicionada, para controlar o alinhamento do texto.

iOS

  • A orientação de Stepper é controlada pela localidade do dispositivo, em vez de pela propriedade FlowDirection.
  • O alinhamento do texto de EntryCell é controlado pela localidade do dispositivo, em vez de pela propriedade FlowDirection.
  • Os gestos e o alinhamento de ContextActions não são revertidos.

Android

UWP

Forçar layout da direita para a esquerda

Os aplicativos Xamarin.iOS e Xamarin.Android podem ser forçados a sempre usar um layout da direita para a esquerda, independentemente das configurações do dispositivo, modificando os respectivos projetos de plataforma.

iOS

Os aplicativos Xamarin.iOS podem ser forçados a sempre usar um layout da direita para a esquerda modificando a classe AppDelegate da seguinte maneira:

  1. Declare a IntPtr_objc_msgSend função como a primeira linha da sua 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. Chame a IntPtr_objc_msgSend função do FinishedLaunching método, antes de retornar do FinshedLaunching método:

    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;
    

Essa abordagem é útil para aplicativos que sempre exigem um layout da direita para a esquerda e remove a necessidade de definir a FlowDirection propriedade.

Para obter mais informações sobre o IntrPtr_objc_msgSend método, consulte Seletores Objective-C no Xamarin.iOS.

Android

Os aplicativos Xamarin.Android podem ser forçados a sempre usar um layout da direita para a esquerda modificando a classe MainActivity para incluir a seguinte linha:

Window.DecorView.LayoutDirection = LayoutDirection.Rtl;

Observação

Essa abordagem requer que o aplicativo seja configurado para dar suporte ao layout da direita para a esquerda. Para obter mais informações, consulte Configuração da plataforma Android.

Essa abordagem é útil para aplicativos que sempre exigem um layout da direita para a esquerda e remove a necessidade de definir a propriedade para a maioria dos FlowDirection controles. No entanto, alguns controles, como CollectionView, não respeitam a LayoutDirection propriedade e ainda exigem que a FlowDirection propriedade seja definida.

Suporte a idiomas da direita para a esquerda com o Xamarin.University

Xamarin.Forms 3.0 Vídeo de suporte da direita para a esquerda