Compartilhar via


Localização

Procurar amostra. Procurar no exemplo

A localização é o processo de adaptação de um aplicativo para atender aos requisitos específicos de idioma ou cultura de um mercado-alvo. Para localizar um aplicativo, seu texto e imagens podem precisar ser traduzidos para vários idiomas. Um aplicativo localizado exibe automaticamente o texto traduzido com base nas configurações de cultura do dispositivo.

O .NET inclui um mecanismo para localizar aplicativos usando arquivos de recurso. Um arquivo de recurso armazena texto e outros conteúdos como pares de nome/valor que permitem que o aplicativo recupere conteúdo para uma chave fornecida. Os arquivos de recurso permitem que o conteúdo localizado seja separado do código do aplicativo. Além de armazenar texto, os arquivos de recursos também podem armazenar imagens e dados binários. No entanto, os dispositivos têm uma variedade de tamanhos e densidades de tela e cada plataforma tem funcionalidade para exibir imagens dependentes da densidade. Portanto, a funcionalidade da plataforma deve ser usada para localizar imagens em vez de armazená-las em arquivos de recursos.

Para localizar um aplicativo .NET MAUI (interface do usuário do aplicativo .NET multiplataforma), você deve:

  1. Crie arquivos de recurso para armazenar cadeias de caracteres. Para obter mais informações, consulte Criar arquivos de recurso para armazenar cadeias de caracteres.
  2. Especifique o idioma neutro do aplicativo. Para obter mais informações, confira Especificar o idioma neutro do aplicativo.
  3. Execute a configuração da plataforma. Para obter mais informações, consulte Executar a configuração da plataforma.
  4. Localize o texto. Para obter mais informações, consulte Localizar texto.
  5. Localize imagens. Para obter mais informações, confira Localizar imagens.
  6. Localize o nome do aplicativo. Para obter mais informações, confira Localizar o nome do aplicativo.
  7. Localização de teste. Para obter mais informações, consulte Localização de teste.

Além disso, a direção do layout de um aplicativo pode ser especificada. Para obter mais informações, consulte Localização da direita para a esquerda.

Criar arquivos de recurso para armazenar cadeias de caracteres

Os arquivos de recurso .NET são arquivos XML com uma extensão .resx que são compilados em arquivos de recurso binário (.resources) durante o processo de build. Um aplicativo localizado normalmente contém um arquivo de recurso padrão com todas as cadeias de caracteres usadas no aplicativo e arquivos de recurso para cada idioma compatível.

Os arquivos de recurso contêm as seguintes informações para cada item:

  • Nome especifica a chave usada para acessar o texto no código.
  • Valor especifica o texto traduzido.
  • Comentário é um campo opcional que contém informações adicionais.

Um arquivo de recurso pode ser adicionado com a caixa de diálogo Adicionar Novo Item no Visual Studio:

Captura de tela da adição de um arquivo de recurso no Visual Studio.

Depois que o arquivo é adicionado, as linhas podem ser adicionadas para cada recurso de texto:

Captura de tela das cadeias de caracteres padrão do aplicativo.

A lista suspensa Modificador de Acesso determina como o Visual Studio gera a classe usada para acessar recursos. Definir o Modificador de Acesso como Público ou Interno resulta em uma classe gerada com o nível de acessibilidade especificado. Definir o Modificador de Acesso como Sem geração de código não gera um arquivo de classe. O arquivo de recurso padrão deve ser configurado para gerar um arquivo de classe, o que resulta em um arquivo com o . Designer.cs extensão sendo adicionada ao projeto.

Depois que o arquivo de recurso padrão é criado, arquivos adicionais podem ser criados para cada localidade compatível com o aplicativo. Cada arquivo de recurso adicional deve ter o mesmo nome de arquivo raiz que o arquivo de recurso padrão, mas também deve incluir o idioma e a cultura opcional no nome do arquivo. Por exemplo, se você adicionar um arquivo de recurso chamado AppResources.resx, também poderá criar arquivos de recurso chamados AppResources.en-US.resx e AppResources.fr-FR.resx para manter recursos localizados para as culturas inglesa (Estados Unidos) e francesa (França), respectivamente. Além disso, você deve definir o Modificador de Acesso para cada arquivo de recurso adicional como Sem geração de código.

No tempo de execução, seu aplicativo tenta resolver uma solicitação de recurso em ordem de especificidade. Por exemplo, se a cultura do dispositivo for en-US , o aplicativo procurará arquivos de recurso nesta ordem:

  1. AppResources.pt-BR.resx
  2. AppResources.en.resx
  3. AppResources.resx (padrão)

A captura de tela a seguir mostra um arquivo de tradução em espanhol chamado AppResources.es.resx:

Captura de tela das strings em espanhol para o aplicativo.

O arquivo de recurso localizado usa os mesmos valores de Nome especificados no arquivo padrão, mas contém cadeias de caracteres de idioma espanhol na coluna Valor . Além disso, o Modificador de Acesso é definido como Sem geração de código.

Especificar o idioma neutro do aplicativo

Para que os arquivos de recurso do .NET funcionem corretamente, o aplicativo deve ter um idioma neutro especificado. Esse é o idioma cujos recursos são usados se os recursos de uma localidade não puderem ser encontrados. Para especificar o idioma neutro:

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto de aplicativo .NET MAUI e selecione Propriedades.

  2. Selecione a página de propriedades Geral do Pacote > e selecione o idioma e a cultura apropriados na lista suspensa Idioma neutro do assembly:

    Captura de tela da configuração do idioma neutro para o assembly.

  3. Salve suas alterações.

Como alternativa, adicione o elemento ao primeiro <PropertyGroup> no arquivo de projeto e especifique a <NeutralLanguage> localidade escolhida como seu valor:

<NeutralLanguage>en-US</NeutralLanguage>

Aviso

Se você não especificar um idioma neutro, a ResourceManager classe retornará null valores para todos os idiomas sem um arquivo de recurso. Quando um idioma neutro é especificado, a ResourceManager classe retorna resultados do arquivo de recurso de idioma neutro para idiomas sem suporte. Portanto, é recomendável que você sempre especifique um idioma neutro para que o texto seja exibido para idiomas sem suporte.

Executar a configuração da plataforma

A configuração adicional é necessária no iOS, Mac Catalyst e Windows, para que todos os controles .NET MAUI sejam localizados.

Catalisador para iOS e Mac

No iOS e no Mac Catalyst, você deve declarar todos os idiomas suportados no arquivo Info.plist da plataforma em seu projeto de aplicativo .NET MAUI. Para fazer isso, abra o arquivo Info.plist para a plataforma escolhida em um editor XML e crie uma matriz para a CFBundleLocalizations chave. Em seguida, forneça valores de matriz que correspondam aos arquivos de recurso. Além disso, certifique-se de definir um idioma esperado por meio da CFBundleDevelopmentRegion chave:

<key>CFBundleLocalizations</key>
<array>
    <string>de</string>
    <string>es</string>
    <string>fr</string>
    <string>ja</string>
    <string>pt</string> <!-- Brazil -->
    <string>pt-PT</string> <!-- Portugal -->
    <string>ru</string>
    <string>zh-Hans</string>
    <string>zh-Hant</string>
</array>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>

Como alternativa, no Gerenciador de Soluções no Visual Studio, abra o arquivo Info.plist para a plataforma escolhida no Editor de PList Genérico. Em seguida, crie uma matriz para a CFBundleLocalizations chave e forneça valores de matriz que correspondam aos arquivos de recurso. Além disso, certifique-se de definir um idioma esperado por meio da CFBundleDevelopmentRegion chave:

Captura de tela das localidades com suporte para o aplicativo no editor genérico Info.plist.

Para obter mais informações sobre o arquivo Info.plist , consulte Lista de propriedades de informações.

Windows

Para dar suporte a vários idiomas em um aplicativo .NET MAUI no Windows, você deve declarar cada idioma com suporte no arquivo Platforms\Windows\Package.appxmanifest do seu projeto de aplicativo .NET MAUI:

  1. Abra o arquivo Package.appxmanifest em um editor de texto e localize a seguinte seção:

    <Resources>
        <Resource Language="x-generate"/>
    </Resources>
    
  2. Substitua <Resource Language="x-generate"> por <Resource /> elementos para cada um dos idiomas suportados:

    <Resources>
        <Resource Language="en-US"/>
        <Resource Language="de-DE"/>
        <Resource Language="es-ES"/>
        <Resource Language="fr-FR"/>
        <Resource Language="ja-JP"/>
        <Resource Language="pt-BR"/>
        <Resource Language="pt-PT"/>
        <Resource Language="ru-RU"/>
        <Resource Language="zh-CN"/>
        <Resource Language="zh-TW"/>
    </Resources>
    
  3. Salve suas alterações.

Localizar texto

O texto é localizado usando uma classe gerada a partir do arquivo de recursos padrão. A classe é nomeada com base no nome do arquivo de recurso padrão. Dado um nome de arquivo de recurso padrão de AppResources.resx, o Visual Studio gera uma classe correspondente chamada AppResources contendo propriedades estáticas para cada entrada no arquivo de recurso.

Em XAML, o texto localizado pode ser recuperado usando a extensão de x:Static marcação para acessar as propriedades estáticas geradas:

<ContentPage ...
             xmlns:strings="clr-namespace:LocalizationDemo.Resources.Strings">
    <VerticalStackLayout>
        <Label Text="{x:Static strings:AppResources.NotesLabel}" />
        <Entry Placeholder="{x:Static strings:AppResources.NotesPlaceholder}" />
        <Button Text="{x:Static strings:AppResources.AddButton}" />
    </VerticalStackLayout>
</ContentPage>

Para obter mais informações sobre a extensão de x:Static marcação, consulte x:Static markup extension.

O texto localizado também pode ser recuperado no código:

Label notesLabel = new Label();
notesLabel.Text = AppResources.NotesLabel,

Entry notesEntry = new Entry();
notesEntry.Placeholder = AppResources.NotesPlaceholder,

Button addButton = new Button();
addButton.Text = AppResources.AddButton,

As propriedades na AppResources classe usam o valor da CurrentUICulture propriedade para determinar de qual arquivo de recurso recuperar valores.

Localizar imagens

Além de armazenar texto, os arquivos de recursos também podem armazenar imagens e dados binários. No entanto, os dispositivos têm uma variedade de tamanhos e densidades de tela e cada plataforma tem funcionalidade para exibir imagens dependentes da densidade. Portanto, a funcionalidade da plataforma deve ser usada para localizar imagens em vez de armazená-las em arquivos de recursos.

Android

No Android, as imagens localizadas, conhecidas como drawables, são armazenadas usando uma convenção de nomenclatura baseada em pasta na pasta Platforms\Android\Resources . As pastas devem ser nomeadas como desenháveis com um sufixo para o idioma e a cultura. Por exemplo, a pasta em espanhol é chamada drawable-es. O drawable do nome da pasta deve conter as imagens para seu idioma e cultura padrão. A ação de build de cada imagem deve ser definida como AndroidResource.

Observação

Em vez de definir arquivos individuais para a ação de build AndroidResource , o conteúdo de uma pasta específica pode ser definido para essa ação de build adicionando o seguinte XML ao arquivo de projeto (.csproj) do aplicativo:

<ItemGroup Condition="$(TargetFramework.Contains('-android'))">
  <AndroidResource Include="Platforms\Android\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

Este exemplo define qualquer conteúdo na pasta Platforms\Android\Resources , incluindo conteúdo em subpastas, para a ação de build AndroidResource . Ele também define o caminho de saída para cada arquivo com essa ação de compilação.

Apenas dois caracteres são necessários no nome da pasta ao especificar um idioma de nível superior, como es. No entanto, ao especificar uma localidade completa, o formato do nome da pasta requer um traço e r minúsculo para separar o idioma da cultura. Por exemplo, a pasta de localidade do México (es-MX) deve ser chamada de drawable-es-rMX. Os nomes dos arquivos de imagem em cada pasta de localidade devem ser idênticos:

Captura de tela da estrutura de pastas localizada no Visual Studio para imagens no Android.

iOS

No iOS, as imagens localizadas são armazenadas usando uma convenção de nomenclatura baseada em pasta na pasta Plataformas\iOS\Recursos . As pastas devem ser nomeadas com o idioma e a cultura opcional, seguidos por .lproj. Por exemplo, a pasta em espanhol é chamada es.lproj. A ação de build de cada imagem deve ser definida como BundleResource.

Observação

Em vez de definir arquivos individuais para a ação de build BundleResource , o conteúdo de uma pasta específica pode ser definido para essa ação de build adicionando o seguinte XML ao arquivo de projeto (.csproj) do aplicativo:

<ItemGroup Condition="$(TargetFramework.Contains('-ios'))">
  <BundleResource Include="Platforms\iOS\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

Este exemplo define qualquer conteúdo na pasta Platforms\iOS\Resources , incluindo conteúdo em subpastas, para a ação de build BundleResource . Ele também define o caminho de saída para cada arquivo com essa ação de compilação.

Apenas dois caracteres são necessários no nome da pasta ao especificar um idioma de nível superior, como es. No entanto, ao especificar uma localidade completa, o formato do nome da pasta requer um traço para separar o idioma da cultura. Por exemplo, a pasta de localidade do México (es-MX) deve ser nomeada es-MX.lproj. Os nomes dos arquivos de imagem em cada pasta de localidade devem ser idênticos:

Captura de tela da estrutura de pastas localizada no Visual Studio para imagens no iOS.

Se uma imagem não estiver presente para um idioma específico, o iOS retornará à pasta de idioma nativo padrão e carregará a imagem de lá.

Catalisador Mac

No Mac Catalyst, as imagens localizadas são armazenadas usando uma convenção de nomenclatura baseada em pasta na pasta Platforms\MacCatalyst\Resources . As pastas devem ser nomeadas com o idioma e a cultura opcional, seguidos por .lproj. Por exemplo, a pasta em espanhol é chamada es.lproj. A ação de build de cada imagem deve ser definida como BundleResource.

Observação

Em vez de definir arquivos individuais para a ação de build BundleResource , o conteúdo de uma pasta específica pode ser definido para essa ação de build adicionando o seguinte XML ao arquivo de projeto (.csproj) do aplicativo:

<ItemGroup Condition="$(TargetFramework.Contains('-maccatalyst'))">
  <BundleResource Include="Platforms\MacCatalyst\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

Este exemplo define qualquer conteúdo na pasta Platforms\MacCatalyst\Resources , incluindo conteúdo em subpastas, para a ação de build BundleResource . Ele também define o caminho de saída para cada arquivo com essa ação de compilação.

Apenas dois caracteres são necessários no nome da pasta ao especificar um idioma de nível superior, como es. No entanto, ao especificar uma localidade completa, o formato do nome da pasta requer um traço para separar o idioma da cultura. Por exemplo, a pasta de localidade do México (es-MX) deve ser nomeada es-MX.lproj. Os nomes dos arquivos de imagem em cada pasta de localidade devem ser idênticos:

Captura de tela da estrutura de pastas localizada no Visual Studio para imagens no MacCatalyst.

Se uma imagem não estiver presente para um idioma específico, o Mac Catalyst retornará à pasta de idioma nativo padrão e carregará a imagem de lá.

Windows

No Windows, as imagens localizadas são armazenadas usando uma convenção de nomenclatura baseada em pasta na pasta Platforms\Windows\Assets\Images . As pastas devem ser nomeadas com o idioma e a cultura opcional. Por exemplo, a pasta em espanhol é chamada es e a pasta de localidade do México deve ser chamada es-MX. A ação de build de cada imagem deve ser definida como Content.

Observação

Em vez de definir arquivos individuais para a ação de build de conteúdo , o conteúdo de uma pasta específica pode ser definido para essa ação de build adicionando o seguinte XML ao arquivo de projeto (.csproj) do aplicativo:

<ItemGroup Condition="$(TargetFramework.Contains('-windows'))">
  <Content Include="Platforms\Windows\Assets\Images\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

Este exemplo define qualquer conteúdo na pasta Platforms\Windows\Assets\Images , incluindo conteúdo em subpastas, para a ação de build de conteúdo . Ele também define o caminho de saída para cada arquivo com essa ação de compilação.

Apenas dois caracteres são necessários no nome da pasta ao especificar um idioma de nível superior, como es. No entanto, ao especificar uma localidade completa, o formato do nome da pasta requer um traço para separar o idioma da cultura. Por exemplo, a pasta de localidade do México (es-MX) deve ser nomeada es-MX. Os nomes dos arquivos de imagem em cada pasta de localidade devem ser idênticos:

Captura de tela da estrutura de pastas localizada no Visual Studio para imagens no Windows.

Consumir imagens localizadas

No Android, iOS, Mac Catalyst e Windows, as imagens localizadas podem ser consumidas definindo a Source propriedade de an Image para o nome do arquivo de imagem:

<Image Source="flag.png" />

No entanto, para que isso funcione no Windows, é necessário modificar o arquivo de projeto do aplicativo se você tiver adicionado um <Content /> item do MSBuild para cada imagem localizada. Isso pode ser feito modificando o arquivo .csproj para remover o <Content /> item MSBuild de cada imagem. Em seguida, adicione o seguinte item do MSBuild:

<ItemGroup Condition="$(TargetFramework.Contains('-windows'))">
  <Content Include="Platforms\Windows\Assets\Images\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

Isso garante que todas as imagens nas subpastas da pasta Platforms\Windows\Assets\Images sejam copiadas para a raiz do pacote do aplicativo.

Localize o nome do aplicativo

A funcionalidade da plataforma é necessária para localizar o nome do aplicativo.

Android

No Android, o nome do aplicativo localizado pode ser armazenado usando uma convenção de nomenclatura baseada em pasta na pasta Platforms\Android\Resources. As pastas devem ser nomeadas como valores com um sufixo para o idioma e a cultura. Por exemplo, a pasta em espanhol é chamada values-es. Adicione um arquivo Strings.xml com uma ação de build de AndroidResource a cada pasta que define uma cadeia de caracteres para o nome do aplicativo localizado.

Observação

Em vez de definir arquivos individuais para a ação de build AndroidResource , o conteúdo de uma pasta específica pode ser definido para essa ação de build adicionando o seguinte XML ao arquivo de projeto (.csproj) do aplicativo:

<ItemGroup Condition="$(TargetFramework.Contains('-android'))">
  <AndroidResource Include="Platforms\Android\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

Este exemplo define qualquer conteúdo na pasta Platforms\Android\Resources , incluindo conteúdo em subpastas, para a ação de build AndroidResource . Ele também define o caminho de saída para cada arquivo com essa ação de compilação.

Apenas dois caracteres são necessários no nome da pasta ao especificar um idioma de nível superior, como es. No entanto, ao especificar uma localidade completa, o formato do nome da pasta requer um traço e r minúsculo para separar o idioma da cultura. Por exemplo, a pasta de localidade do México (es-MX) deve ser nomeada values-es-rMX.

Cada cadeia de caracteres traduzível é um elemento XML com a ID do recurso especificada como o name atributo e a cadeia de caracteres traduzida como o valor. Você precisa escapar sua string de acordo com as regras XML normais e deve ser um ID de recurso válido do name Android (sem espaços ou traços).

Portanto, para localizar o nome do aplicativo, crie um arquivo Strings.xml e adicione um <string> elemento como filho de um <resources> elemento. Em seguida, defina seu name atributo como um ID adequado com a string traduzida como o valor:

<resources>
    <!-- French -->
    <string name="app_name">Maison</string>
</resources>

Em seguida, para usar o nome do aplicativo localizado em seu aplicativo, adicione a Label propriedade ao Activity na classe do MainActivity aplicativo e defina seu valor como @string/id:

[Activity(Label = "@string/app_name", Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
public class MainActivity : MauiAppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
    }
}

iOS

No iOS, o nome do aplicativo localizado é armazenado usando uma convenção de nomenclatura baseada em pasta na pasta Platforms\iOS\Resources. As pastas devem ser nomeadas com o idioma e a cultura opcional, seguidos por .lproj. Por exemplo, a pasta em espanhol é chamada es.lproj. Adicione um arquivo InfoPlist.strings com uma ação de build de BundleResource a cada pasta que define a chave e o CFBundleDisplayName valor.

Observação

Em vez de definir arquivos individuais para a ação de build BundleResource , o conteúdo de uma pasta específica pode ser definido para essa ação de build adicionando o seguinte XML ao arquivo de projeto (.csproj) do aplicativo:

<ItemGroup Condition="$(TargetFramework.Contains('-ios'))">
  <BundleResource Include="Platforms\iOS\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

Este exemplo define qualquer conteúdo na pasta Platforms\iOS\Resources , incluindo conteúdo em subpastas, para a ação de build BundleResource . Ele também define o caminho de saída para cada arquivo com essa ação de compilação.

A sintaxe para valores de cadeia de caracteres localizados é:

/* comment */
"key"="localized-value";

Você deve escapar os seguintes caracteres em strings:

  • Cota de \"
  • \\ barra invertida
  • \n Newline

Portanto, para localizar o nome do aplicativo, crie um arquivo InfoPlist.strings e adicione um valor para a CFBundleDisplayName chave ao arquivo:

/* French */
CFBundleDisplayName="Maisons";

Outras chaves que você pode usar para localizar cadeias de caracteres específicas do aplicativo são:

  • CFBundleName - Especifica o nome abreviado do pacote de aplicativos, que pode ser exibido aos usuários em situações como a ausência de um valor para CFBundleDisplayName.
  • CFBundleShortVersionString - Especifica o número da versão de lançamento do pacote de apps.
  • NSHumanReadableCopyright - o aviso de direitos autorais do pacote de apps.

Catalisador Mac

No Mac Catalyst, o nome do aplicativo localizado é armazenado usando uma convenção de nomenclatura baseada em pasta na pasta Platforms\MacCatalyst\Resources . As pastas devem ser nomeadas com o idioma e a cultura opcional, seguidos por .lproj. Por exemplo, a pasta em espanhol é chamada es.lproj. Adicione um arquivo InfoPlist.strings com uma ação de build de BundleResource a cada pasta que define a chave e o CFBundleDisplayName valor.

Observação

Em vez de definir arquivos individuais para a ação de build BundleResource , o conteúdo de uma pasta específica pode ser definido para essa ação de build adicionando o seguinte XML ao arquivo de projeto (.csproj) do aplicativo:

<ItemGroup Condition="$(TargetFramework.Contains('-maccatalyst'))">
  <BundleResource Include="Platforms\MacCatalyst\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

Este exemplo define qualquer conteúdo na pasta Platforms\MacCatalyst\Resources , incluindo conteúdo em subpastas, para a ação de build BundleResource . Ele também define o caminho de saída para cada arquivo com essa ação de compilação.

A sintaxe para valores de cadeia de caracteres localizados é:

/* comment */
"key"="localized-value";

Você deve escapar os seguintes caracteres em strings:

  • Cota de \"
  • \\ barra invertida
  • \n Newline

Portanto, para localizar o nome do aplicativo, crie um arquivo InfoPlist.strings e adicione um valor para a CFBundleDisplayName chave ao arquivo:

/* French */
CFBundleDisplayName="Maisons";

Outras chaves que você pode usar para localizar cadeias de caracteres específicas do aplicativo são:

  • CFBundleName - especifica o nome abreviado do pacote de aplicativos, que pode ser exibido aos usuários em situações como a ausência de um valor para CFBundleDisplayName.
  • CFBundleShortVersionString - Especifica o número da versão de lançamento do pacote de apps.
  • NSHumanReadableCopyright - o aviso de direitos autorais do pacote de apps.

Windows

No Windows, o nome do aplicativo é definido no manifesto do pacote do aplicativo. A localização do nome do aplicativo exige que você primeiro especifique o idioma padrão do aplicativo e, em seguida, crie um arquivo de recurso de cadeia de caracteres para cada localidade que você pretende dar suporte. O recurso de cadeia de caracteres que representa o nome do aplicativo localizado pode ser consumido no manifesto do pacote do aplicativo usando o ms-resource esquema de URI.

Para obter mais informações sobre como localizar cadeias de caracteres no manifesto do pacote do aplicativo, consulte Localizar cadeias de caracteres na interface do usuário e no manifesto do pacote do aplicativo.

Especifique o idioma padrão

Para localizar um nome de aplicativo, seu aplicativo do Windows deve primeiro ter um idioma padrão especificado. Esse é o idioma cujos recursos são usados se nenhum recurso localizado para um idioma específico puder ser encontrado. Para especificar o idioma padrão:

  1. No Gerenciador de Soluções, abra o arquivo Packageappxmanifest no editor de manifesto do pacote.

  2. No editor de manifesto do pacote, na guia Aplicativo, defina o campo Idioma padrão como o idioma padrão escolhido:

    Captura de tela da configuração do idioma padrão de um aplicativo do Windows no manifesto do pacote.

  3. Salve suas alterações.

No mínimo, você precisa fornecer um recurso de cadeia de caracteres para o nome do aplicativo para o idioma padrão. Esse é o recurso que é carregado se nenhuma correspondência melhor puder ser encontrada para o idioma preferencial do usuário ou configurações de idioma de exibição.

Criar arquivos de recurso do Windows

No Windows, o nome do aplicativo localizado deve ser armazenado em um arquivo de recurso do Windows para cada localidade. Um arquivo de recurso do Windows é um arquivo XML com uma extensão .resw compilado em um formato binário e armazenado em um arquivo .pri . O arquivo .resw para cada localidade deve ser nomeado Resources.resw e armazenado usando uma convenção de nomenclatura baseada em pasta na pasta Platforms\Windows\Strings . As pastas devem ser nomeadas com o idioma e a cultura opcional. Por exemplo, a pasta em espanhol é chamada es e a pasta de localidade do México deve ser chamada es-MX.

Atualmente, não há nenhum modelo de item do Visual Studio para criar um arquivo de recurso do Windows em um aplicativo .NET MAUI. Portanto, para criar um arquivo de recurso do Windows para cada localidade:

  1. Na pasta Plataformas\Windows do projeto de aplicativo .NET MAUI, crie uma pasta Cadeias de Caracteres.

  2. Na pasta Strings, crie uma pasta para cada localidade.

  3. Na pasta de cada localidade, crie um arquivo chamado Resources.resw que contenha o seguinte XML:

    <?xml version="1.0" encoding="utf-8"?>
    <root>
      <!--
        Microsoft ResX Schema
    
        Version 2.0
    
        The primary goals of this format is to allow a simple XML format
        that is mostly human readable. The generation and parsing of the
        various data types are done through the TypeConverter classes
        associated with the data types.
    
        Example:
    
        ... ado.net/XML headers & schema ...
        <resheader name="resmimetype">text/microsoft-resx</resheader>
        <resheader name="version">2.0</resheader>
        <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
        <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
        <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
        <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
        <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
            <value>[base64 mime encoded serialized .NET Framework object]</value>
        </data>
        <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
            <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
            <comment>This is a comment</comment>
        </data>
    
        There are any number of "resheader" rows that contain simple
        name/value pairs.
    
        Each data row contains a name, and value. The row also contains a
        type or mimetype. Type corresponds to a .NET class that support
        text/value conversion through the TypeConverter architecture.
        Classes that don't support this are serialized and stored with the
        mimetype set.
    
        The mimetype is used for serialized objects, and tells the
        ResXResourceReader how to depersist the object. This is currently not
        extensible. For a given mimetype the value must be set accordingly:
    
        Note - application/x-microsoft.net.object.binary.base64 is the format
        that the ResXResourceWriter will generate, however the reader can
        read any of the formats listed below.
    
        mimetype: application/x-microsoft.net.object.binary.base64
        value   : The object must be serialized with
                : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
                : and then encoded with base64 encoding.
    
        mimetype: application/x-microsoft.net.object.soap.base64
        value   : The object must be serialized with
                : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
                : and then encoded with base64 encoding.
    
        mimetype: application/x-microsoft.net.object.bytearray.base64
        value   : The object must be serialized into a byte array
                : using a System.ComponentModel.TypeConverter
                : and then encoded with base64 encoding.
        -->
      <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
        <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
        <xsd:element name="root" msdata:IsDataSet="true">
          <xsd:complexType>
            <xsd:choice maxOccurs="unbounded">
              <xsd:element name="metadata">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="value" type="xsd:string" minOccurs="0" />
                  </xsd:sequence>
                  <xsd:attribute name="name" use="required" type="xsd:string" />
                  <xsd:attribute name="type" type="xsd:string" />
                  <xsd:attribute name="mimetype" type="xsd:string" />
                  <xsd:attribute ref="xml:space" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="assembly">
                <xsd:complexType>
                  <xsd:attribute name="alias" type="xsd:string" />
                  <xsd:attribute name="name" type="xsd:string" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="data">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                    <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
                  </xsd:sequence>
                  <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
                  <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
                  <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
                  <xsd:attribute ref="xml:space" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="resheader">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                  </xsd:sequence>
                  <xsd:attribute name="name" type="xsd:string" use="required" />
                </xsd:complexType>
              </xsd:element>
            </xsd:choice>
          </xsd:complexType>
        </xsd:element>
      </xsd:schema>
      <resheader name="resmimetype">
        <value>text/microsoft-resx</value>
      </resheader>
      <resheader name="version">
        <value>2.0</value>
      </resheader>
      <resheader name="reader">
        <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
      </resheader>
      <resheader name="writer">
        <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
      </resheader>
    </root>
    

    Observação

    Os arquivos de recursos do Windows usam uma ação de compilação de PRIResource. Essa ação de build não precisa ser definida em cada arquivo .resw em um aplicativo .NET MAUI, pois ela é aplicada implicitamente.

  4. Abra cada arquivo Resources.resw e adicione um recurso de cadeia de caracteres que represente o nome do aplicativo:

    Captura de tela do editor de arquivos resw no Visual Studio no Windows.

    Observação

    Os identificadores de recursos não diferenciam maiúsculas de minúsculas e devem ser exclusivos por arquivo de recurso.

  5. Salve cada arquivo de recurso do Windows.

Um exemplo da estrutura de pastas e arquivos necessária é mostrado na captura de tela a seguir:

Captura de tela da estrutura de pastas localizada no Visual Studio para cadeias de caracteres no Windows.

Consumir o nome do aplicativo localizado

O recurso de cadeia de caracteres que representa o nome do aplicativo localizado pode ser consumido usando o ms-resource esquema de URI:

  1. No Gerenciador de Soluções, abra o arquivo Packageappxmanifest no editor de manifesto do pacote.

  2. No editor de manifesto do pacote, na guia Aplicativo, defina o campo Nome de exibição como ms-resource: seguido pelo nome do recurso de cadeia de caracteres que identifica o nome do aplicativo:

    Captura de tela da configuração do nome do aplicativo localizado no manifesto do pacote no Windows.

  3. Salve suas alterações.

Importante

Se os arquivos .resw forem armazenados em um assembly diferente do projeto de aplicativo .NET MAUI, você precisará especificar um caminho totalmente qualificado para o nome do recurso. Isso usa o formato ms-resource:Assembly/ResourceFilename/Resource.

Localização da direita para a esquerda

A direção do fluxo, ou direção do layout, é a direção na qual os elementos da interface do usuário na página são verificados a olho nu. 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. Os aplicativos .NET MAUI respeitam automaticamente a direção do fluxo do dispositivo com base no idioma e na região selecionados. Para obter informações sobre como recuperar a direção do fluxo do dispositivo, com base em sua localidade, consulte Obter a direção do layout.

Para substituir a direção do fluxo de um aplicativo, defina a Window.FlowDirection propriedade. Como alternativa, defina a VisualElement.FlowDirection propriedade por elemento. Essas propriedades obtêm ou definem a direção na qual os elementos da interface do usuário fluem dentro de qualquer elemento pai que controla seu layout e devem ser definidas como um dos FlowDirection valores de enumeração:

  • LeftToRight
  • RightToLeft
  • MatchParent

Definir a FlowDirection propriedade como RightToLeft em um elemento define o alinhamento à direita, a ordem de leitura da direita para a esquerda e o layout do controle para fluir da direita para a esquerda.

Aviso

Alterar a propriedade em tempo de execução causa um processo de layout caro que afetará o FlowDirection desempenho.

O valor da propriedade padrão FlowDirection para um elemento é 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

Se você precisar alterar a direção do fluxo, defina a FlowDirection propriedade em uma janela, página ou layout raiz. Isso faz com que todos os elementos contidos no aplicativo, página ou layout raiz respondam adequadamente à direção do fluxo.

Instalação da plataforma

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

Android

Os aplicativos criados usando o modelo de projeto de aplicativo .NET MAUI incluem automaticamente suporte para localidades da direita para a esquerda. Esse suporte é habilitado pelo android:supportsRtl atributo que está sendo definido como true no <application> nó no arquivo AndroidManifest.xml do aplicativo:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application ... android:supportsRtl="true" />
    ...
</manifest>

A localização da direita para a esquerda pode ser testada alterando o dispositivo ou emulador para usar o idioma da direita para a esquerda. Como alternativa, se você ativou as opções do desenvolvedor no aplicativo Configurações, pode ativar Forçar direção do layout RTL em Configurações > Opções do desenvolvedor. Para obter informações sobre como configurar as opções do desenvolvedor, consulte Configurar opções do desenvolvedor no dispositivo no developer.android.com.

Catalisador para iOS e Mac

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>

A localização da direita para a esquerda pode ser testada alterando o idioma e a região no dispositivo ou simulador para uma localidade da direita para a esquerda especificada em Info.plist.

Windows

Os recursos de idioma necessários devem ser especificados no nó <Resources> do arquivo Package.appxmanifest. Substitua <Resource Language="x-generate"> por <Resource /> elementos para cada um dos idiomas suportados. Por exemplo, a marcação a seguir especifica que os recursos localizados "en" e "ar" estão disponíveis:

<Resources>
    <Resource Language="en" />
    <Resource Language="ar" />
</Resources>

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.

Localização de teste

Em tempo de execução, seu aplicativo carrega os recursos localizados apropriados por thread, com base na cultura especificada pela CurrentUICulture propriedade.

A melhor maneira de testar a localização é alterando o idioma do dispositivo no aplicativo Configurações em cada dispositivo.

Aviso

Embora seja possível definir o valor de CurrentUICulture no código, o comportamento resultante é inconsistente entre plataformas, portanto, isso não é recomendado para teste.