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:
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>
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 propriedadeFlowDirection
. - 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 propriedadeFlowDirection
. - 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 propriedadeFlowDirection
. - O alinhamento do texto de
EntryCell
é controlado pela localidade do dispositivo, em vez de pela propriedadeFlowDirection
. - Os gestos e o alinhamento de
ContextActions
não são revertidos.
Android
- A orientação de
SearchBar
é controlada pela localidade do dispositivo, em vez de pela propriedadeFlowDirection
. - O posicionamento de
ContextActions
é controlado pela localidade do dispositivo, em vez de pela propriedadeFlowDirection
.
UWP
- O alinhamento do texto de
Editor
é controlado pela localidade do dispositivo, em vez de pela propriedadeFlowDirection
. - A propriedade de
FlowDirection
não é herdada pelos filhos deFlyoutPage
. - O alinhamento do texto de
ContextActions
é controlado pela localidade do dispositivo, em vez de pela propriedadeFlowDirection
.
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:
Declare a
IntPtr_objc_msgSend
função como a primeira linha da suaAppDelegate
classe:[System.Runtime.InteropServices.DllImport(ObjCRuntime.Constants.ObjectiveCLibrary, EntryPoint = "objc_msgSend")] internal extern static IntPtr IntPtr_objc_msgSend(IntPtr receiver, IntPtr selector, UISemanticContentAttribute arg1);
Chame a
IntPtr_objc_msgSend
função doFinishedLaunching
método, antes de retornar doFinshedLaunching
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