Visão geral de globalização e localização do WPF

Quando você limita a disponibilidade do seu produto para apenas um idioma, você limita sua potencial base de clientes a uma fração da população de 6.5 bilhões de nosso mundo. Se você quiser que seus aplicativos atinjam um público global, localização do seu produto a baixo custo é uma das melhores e mais econômicas maneiras de alcançar mais clientes.

Esta visão geral apresenta globalização e localização na Windows Presentation Foundation (WPF). Globalização é o design e desenvolvimento de aplicativos que executam em vários locais. Por exemplo, globalização suporta as interfaces de usuário localizada e dados regionais para usuários em diferentes culturas. WPF fornece recursos de design globalizado, inclusive layout automático, assemblies satélites e atributos localizados e comentários.

A localização é a conversão de recursos do aplicativo em versões localizadas para culturas específicas que o aplicativo suporta. Quando você localizar em WPF, usar as APIs na System.Windows.Markup.Localizer espaço para nome. Essas alimentação de APIs a Exemplo de ferramenta LocBaml ferramenta de linha de comando. Para obter informações sobre como criar e usar LocBaml, consulte Como: Localizar um Aplicativo.

Este tópico contém as seguintes seções.

  • Práticas recomendadas para globalização e localização no WPF
  • Localizar um aplicativo WPF
  • Exemplos de localização WPF

Práticas recomendadas para globalização e localização no WPF

Você pode aproveitar ao máximo a funcionalidade de globalização e localização que está embutida no WPF seguindo a interface do usuário de design e dicas relacionadas a localização que esta seção fornece.

Práticas recomendadas para o design de interface do usuário no WPF

Quando você cria uma UI baseada em WPF , considere a implementação dessas práticas recomendadas:

  • Grave seu UI no XAML; evite criar UI no código. Quando você cria sua UI usando XAML, você a expõe através de APIs de localização built-in.

  • Evite usar posições absolutas e tamanhos fixos para dispor conteúdo; em vez disso, use dimensionamento relativo ou automático.

    • Use SizeToContent; e mantenha as larguras e alturas definidas como Auto.

    • Evite utilizar Canvas para definir o layout UI s.

    • Use Grid e seu recurso de compartilhamento de tamanho (size-sharing).

  • Forneça espaço extra nas margens porque texto localizado geralmente requer mais espaço. Espaço extra permite possíveis caracteres estendidos.

  • Ative TextWrapping em TextBlock para evitar recorte.

  • Defina o atributo xml:lang. Esse atributo descreve a cultura de um elemento específico e de seus elementos filhos. O valor dessa propriedade altera o comportamento de vários recursos no WPF. Por exemplo, ele altera o comportamento de hifenização, a verificação ortográfica, número substituição, a modelagem de script complexo e fallback de fontes. Veja Globalização para o Windows Presentation Foundation para mais informações sobre a configuração de Manipulando xml:lang em XAML.

  • Crie uma fonte composta personalizada para obter um melhor controle sobre fontes que são usadas para idiomas diferentes. Por padrão, WPF usa a fonte GlobalUserInterface.composite na pasta Windows\Fonts.

  • Quando você cria aplicativos de navegação que podem ser localizados em uma cultura que apresenta texto em um formato da direita para esquerda, defina explicitamente FlowDirection de cada página para certificar-se que a página não herda FlowDirection de NavigationWindow.

  • Ao criar aplicativos autônomos de navegação que são hospedados fora de um navegador, defina a StartupUri para seu aplicativo inicial para um NavigationWindow em vez de de uma página (por exemplo, <Application StartupUri="NavigationWindow.xaml">). Este design permite que você altere a FlowDirection da Window e da barra de navegação. Para mais informações e um exemplo, consulte Exemplo de home page de globalização.

Práticas recomendadas para localização WPF

Quando você localiza aplicativos de WPF, considere a implementação dessas práticas recomendadas:

  • Use comentários de localização para fornecer contexto extra para localizadores.

  • Use atributos de localização para controlar a localização em vez de seletivamente omitir propriedades Uid nos elementos. Consulte Localization Attributes and Comments para obter mais informações.

  • Use msbuild /t:updateuid e /t:checkuid para adicionar e checar as propriedades Uid na sua XAML. Use propriedades Uid para controlar alterações entre o desenvolvimento e a localização. As propriedades Uid ajudam você a localizar novas alterações de desenvolvimento. Se você adicionar manualmente as propriedades Uid a um UI, a tarefa é normalmente tediosa e menos precisa.

    • Não edite ou altere as propriedades Uid depois de iniciar a localização.

    • Não use as propriedades Uid duplicadas (lembre-se desta dica ao usar o comando copiar e colar).

    • Defina o local de UltimateResourceFallback em AssemblyInfo.* para especificar o idioma apropriado para retorno (por exemplo, [assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]).

      Se você decidir incluir o idioma de origem no conjunto de módulos (assembly) principal omitindo a tag <UICulture> no seu arquivo de projeto, defina o local de UltimateResourceFallback como o conjunto de módulos (assembly) principal em vez do satellite assembly (por exemplo, [assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.MainAssembly)]) .

Localizar um aplicativo WPF

Quando você localiza um aplicativo WPF, você tem várias opções. Por exemplo, você pode vincular os recursos localizáveis em seu aplicativo para um arquivo XML, armazenar texto localizável em tabelas resx ou fazer com que seu localizador use arquivos Extensible Application Markup Language (XAML). Esta seção descreve um de fluxo de trabalho de localização que usa XAML binário (BAML), que fornece vários benefícios:

  • Você pode fazer localização depois de compilar.

  • Você pode atualizar para uma versão mais recente do BAML com localizações de uma versão mais antiga do BAML para que você possa localizar ao mesmo tempo que desenvolver.

  • Você pode validar elementos fonte original e semântica em tempo de compilação porque BAML é a forma compilada de XAML.

Processo de Compilação de Localização

Ao desenvolver um aplicativo WPF, o processo de compilação para a localização é o seguinte:

  • O desenvolvedor cria e globaliza o aplicativo WPF. No arquivo de projeto, o desenvolvedor define <UICulture>en-US</UICulture> para que quando o aplicativo é compilado, um assembly principal linguagem neutra é gerado. Este assembly tem um satélite. resources.dll arquivo que contém todos os recursos localizáveis. Opcionalmente, você pode manter o idioma de fonte no assembly principal porque nossa localização APIs suporte a extração do assembly principal.

  • Quando o arquivo é compilado, o XAML é convertido em BAML. O MyDialog.exe culturalmente neutro e os arquivos dependentes culturalmente (em inglês) MyDialog.resources.dll são liberados para o cliente de língua inglesa.

Fluxo de trabalho de localização

O processo de localização começa depois que o arquivo não localizado MyDialog.resources.dll é criado. Os elementos de propriedades de UI no seu XAML original são extraídos da BAML em pares chave-valor usando a APIs sob System.Windows.Markup.Localizer. Localizadores usam os pares chave-valor para localizar o aplicativo. Você pode gerar um novo .resource.dll a partir dos novos valores depois que a localização é concluída.

As chaves de pares chave-valor são x:UIDs que são colocadas pelo desenvolvedor no XAML original. Esses x:UIDs permitem que a API controle e mescle as alterações que ocorrem entre o desenvolvedor e o localizador durante a localização. Por exemplo, se o desenvolvedor altera a UI após o localizador ter começado a localização, você pode mesclar a alteração de desenvolvimento com o trabalho já concluído de localização para que o mínimo de trabalho de tradução seja perdido.

O gráfico a seguir mostra um fluxo de trabalho típico de localização que baseia-se no BAML. Este diagrama supõe que o desenvolvedor escreve o aplicativo em inglês. O desenvolvedor cria e globaliza o aplicativo . O desenvolvedor define <UICulture>en-US</UICulture> de modo que na compilação um conjunto de módulos (assembly) principal neutro a idioma seja gerado com um .resources.DLL satellite contendo todos os recursos localizáveis. Como alternativa, você pode manter o idioma de origem no conjunto de módulos (assembly) principal porque as APIs WPF de localização oferecem suporte a extração do conjunto de módulos (assembly) principal. Após o processo de build, a XAML é compilada para o BAML. O MyDialog.exe.resources.dll culturalmente neutro é enviado ao cliente de fala em inglês.

Fluxo de trabalho de localizaçãoFluxo de trabalho não localizado

O processo de localização começa depois que o MyDialog.resources.dll UN-localizado foi criado. Os elementos e as propriedades de interface do usuário no XAML original podem ser extraídos do BAML para pares chave-valor usando APIs no namespace System.Windows.Markup.Localizer. Localizadores trabalham com os pares chave-valor para localizar o aplicativo. Um novo .resource.dll pode ser gerado a partir de novos valores depois que a localização for concluída.

As chaves de pares chave-valor são x:UIDs que são colocadas pelo desenvolvedor no XAML original. Esses x:UIDs permitem que a API controle e mescle as alterações que ocorrem entre o desenvolvedor e o localizador durante a localização. Por exemplo, se o desenvolvedor fizer uma alteração para o interface do usuário depois que o localizador já começou a localização, a alteração de desenvolvimento pode ser mesclada com o trabalho já concluído de localização para que o mínimo de traduções seja perdido.

Exemplos de localização WPF

Esta seção contém exemplos de aplicativos localizados para ajudá-lo a compreender como construir e localizar aplicativos WPF.

Exemplo da caixa de diálogo Run

Os gráficos a seguir mostram a saída da caixa de diálogo Run de exemplo.

Inglês:

Caixa de diálogo Executar

Alemão:

Caixa de diálogo Executar em alemão

Criar uma caixa de diálogo Run global

Este exemplo produz uma caixa de diálogo Run usando WPF e XAML. Esta caixa de diálogo é equivalente à caixa de diálogo Run que está disponível a partir do menu Iniciar do Microsoft Windows.

For the complete sample, see Exemplo de caixa de Executar Caixa de Diálogo de globalização.

Alguns destaques para criar caixas de diálogo globais são:

Automatic Layout

Em Window1.xaml:

<Window SizeToContent="WidthAndHeight">

A propriedade Window anterior redimensiona automaticamente a janela de acordo com o tamanho do conteúdo. Essa propriedade impede que a janela corte conteúdo que aumenta em tamanho após a localização; ela também remove espaço desnecessário quando o conteúdo diminui de tamanho após a localização.

<Grid x:Uid="Grid_1">

As propriedades Uid são necessárias para que a localização APIs do WPF funcione corretamente.

São usados por WPF localização APIs para controlar as alterações entre o desenvolvimento e a localização das interface do usuário (UI). Uid propriedades permitem que você mesclagem uma versão mais recente das UI com uma localização mais antiga das UI. Você adiciona uma propriedade Uid ao executar msbuild /t:updateuid RunDialog.csproj no shell de comando do SDK do Windows. Esse é o método recomendado de adicionar as propriedades Uid porque adicioná-las manualmente é normalmente demorado e menos preciso. Você pode verificar se as propriedades Uid estão definidas corretamente executando msbuild /t:checkuid RunDialog.csproj.

O UI é estruturado usando o controle Grid, que é um controle útil para tirar vantagem do layout automático no WPF. Observe que o caixa de diálogo é dividida em três linhas e cinco colunas. Nenhuma das linhas ou colunas tem um tamanho fixo; portanto, os elementos de UI que são posicionados em cada célula podem adaptar-se a aumentos e diminuições durante localização.

As duas primeiras colunas onde o em aberto: rótulo e ComboBox são colocados 10 por cento de usar o UIda largura total.

Observe que o exemplo usa o recurso de dimensionamento compartilhado de Grid. As três últimas colunas aproveitam-se disso posicionando-se no mesmo SharedSizeGroup. Como se esperaria do nome da propriedade, isso permite que as colunas compartilhem o mesmo tamanho. Assim quando o “ Browse… ” é localizado para a string mais “ Durchsuchen… ”, todos os botões aumentam em largura, em vez de ter um pequeno botão “ OK ” e um botão desproporcionalmente grande “ Durchsuchen… ”.

Xml:lang

Xml:lang="en-US"

Observe o Manipulando xml:lang em XAML colocado no elemento raiz de UI. Essa propriedade descreve a cultura de um determinado elemento e de seus filhos. Esse valor é usado por vários recursos no WPF e deve ser alterado apropriadamente durante a localização. Esse valor altera qual o dicionário do idioma é usado para hifenizar e checar a ortografia de palavras. Ele também afeta a exibição de dígitos e como o sistema de fontes alternativas seleciona qual fonte a ser usada. Finalmente, a propriedade afeta que a maneira como números são exibidos e o modo como textos gravados em scripts complexos são moldados. O valor padrão é “ en-US”.

Building a Satellite Resource Assembly

Em .csproj:

<UICulture>en-US</UICulture>

Observe a adição de uma propriedade UICulture. Quando isso é definido como um valor CultureInfo válido tal como EN-US, compilar o projeto irá gerar um satellite assembly com todos os recursos localizáveis nele.

<Resource Include="RunIcon.JPG">

<Localizable>False</Localizable>

</Resource>

O RunIcon.JPG não precisa ser localizado porque ele deve aparecer do mesmo modo para todas as culturas. Localizable é definido como False para que ele permaneça no conjunto de módulos (assembly) principal neutro a idiomas en vez do satellite assembly. O valor padrão de todos os recursos não compiláveis é Localizable definido como True.

Localizando a caixa de diálogo Run

Parse

Após compilar o aplicativo, a primeira etapa da sua localização é analisar os recursos localizáveis a partir do satellite assembly. Para fins deste tópico, use a ferramenta LocBaml de exemplo que pode ser encontrada em Exemplo de ferramenta LocBaml. Observe que LocBaml é apenas uma ferramenta de exemplo para ajudá-lo a começar a criar uma ferramenta de localização que se ajuste ao seu processo de localização. Usando LocBaml, execute o seguinte para analisar: LocBaml /parse RunDialog.resources.dll /out: para gerar um arquivo de “ RunDialog.Recursos.dll.CSV ”.

Localize

Use seu editor CSV favorito que ofereça suporte a Unicode para editar este arquivo. Filtre todas as entradas com uma categoria de localização “Nenhum”. Você verá as seguintes entradas:

Resource Key

Localization Category

Valor

Button_1:System.Windows.Controls.Button.$Content

Button

OK

Button_2:System.Windows.Controls.Button.$Content

Button

Cancel

Button_3:System.Windows.Controls.Button.$Content

Button

Browse...

ComboBox_1:System.Windows.Controls.ComboBox.$Content

ComboBox

TextBlock_1:System.Windows.Controls.TextBlock.$Content

Texto

Digite o nome de um programa, pasta, documento ou recurso da Internet, e o Windows abrirá para você.

TextBlock_2:System.Windows.Controls.TextBlock.$Content

Texto

Open:

Window_1:System.Windows.Window.Title

Title

Executar

Localizando o aplicativo para alemão exigiria as traduções a seguir:

Resource Key

Localization Category

Valor

Button_1:System.Windows.Controls.Button.$Content

Button

OK

Button_2:System.Windows.Controls.Button.$Content

Button

Abbrechen

Button_3:System.Windows.Controls.Button.$Content

Button

Durchsuchen…

ComboBox_1:System.Windows.Controls.ComboBox.$Content

ComboBox

TextBlock_1:System.Windows.Controls.TextBlock.$Content

Texto

Geben Sie den Namen eines Programms, Ordners, Dokuments oder einer Internetresource an.

TextBlock_2:System.Windows.Controls.TextBlock.$Content

Texto

Öffnen:

Window_1:System.Windows.Window.Title

Title

Executar

Generate

A última etapa da localização envolve a criação da satellite assembly recém-localizada. Isso pode ser feito com o seguinte comando LocBaml:

LocBaml.exe /generate RunDialog.resources.dll /trans:RunDialog.resources.dll.CSV /out: . /cul:de-DE

Em Windows em alemão, se este resources.dll é colocado em uma pasta de-DE seguint ao conjunto de módulos (assembly) principal, este recurso será carregado automaticamente em vez do localizado na pasta en-US. Se você não tiver um versão em alemão Windows Para testar isso, defina a cultura para qualquer cultura de Windows Você está usando (ou seja en-US) e substitua Recursos.dll original.

Satellite Resource Loading

MyDialog.exe

en-US\MyDialog.resources.dll

de-DE\MyDialog.resources.dll

Código

BAML original em inglês

BAML localizado

Recursos culturalmente neutros

Outros recursos em inglês

Outros recursos localizados para alemão

O framework .NET automaticamente escolhe qual assembly de recursos satellite a ser carregado, dependendo do Thread.CurrentThread.CurrentUICulture do aplicativo. Isso torna padrão a cultura do OS Windows. Portanto, se você estiver usando alemão Windows, o de-DE\MyDialog.resources.dll é carregado, se você estiver usando Windows em inglês, o en-US\MyDialog.resources.dll é carregado. Você pode definir o recurso alternativo final para o seu aplicativo especificando a NeutralResourcesLanguage em AssemblyInfo.* do seu projeto. Por exemplo se você especificar:

[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]

então o en-US\MyDialog.resources.dll será usado com o Windows alemão se um de-DE\MyDialog.resources.dll ou de\MyDialog.resources.dll estiverem ambos indisponíveis.

Home page da Microsoft da Arábia Saudita

Os gráficos a seguir mostram uma Homepage em inglês e árabe. Para o exemplo completo que produz esses elementos gráficos, consulte Exemplo de home page de globalização.

Inglês:

Página em inglês

Árabe:

Página árabe

Criando uma Homepage Microsoft Global

Este exemplo da Microsoft da Arábia Saudita ilustra os recursos de globalização fornecidos para idiomas RightToLeft. Idiomas como árabe e hebraico têm uma ordem da direita para a esquerda de forma que o layout do UI deve geralmente ser disposto de modo bem diferente de como seria disposto em idiomas da esquerda para a direita, como o inglês. Localização de um linguagem da esquerda para a direita para um linguagem escrito da direita para a esquerda ou vice-versa pode ser bastante desafiador. WPF foi projetado para facilitar a tais suas localizações.

FlowDirection

Homepage.xaml:

Observe a propriedade FlowDirection em Page, alterar essa propriedade para “ RightToLeft ” irá alterar a FlowDirection de Page e seus elementos filhos para que o layout dessa UI seja invertido para tornar-se da direita para esquerda como um usuário árabe esperaria. Você pode substituir o comportamento de herança especificando um FlowDirection explícito em qualquer elemento. A propriedade FlowDirection está disponível em qualquer FrameworkElement ou elemento relacionado a documentos e tem um valor implícito de LeftToRight.

Observe que mesmo os planos de fundo de pincéis de gradiente são invertidos corretamente quando a página raiz do FlowDirection é alterada:

FlowDirection = "LeftToRight"

Fluxo da esquerda para a direita

FlowDirection = "RightToLeft"

Fluxo da direita para a esquerda

Evite usar dimensões fixas para painéis e controles

Dê uma olhada em Homepage.xaml, observe que além da largura e altura fixas especificadas para toda a UI na parte superior do DockPanel, não há outras dimensões fixas. Evite usar dimensões fixas para impedir que o texto localizado que pode ser maior do que o texto de fonte de recorte. WPF painéis e os controles serão automaticamente redimensionar com base no conteúdo que eles contêm. A maioria dos controles também têm dimensões mínimas e máxima que você pode conjunto para ter mais controle (ou seja MinWidth = “ 20 ”). Com Grid, você também pode conjunto relativas larguras e alturas usando ‘ * ’ (ou seja, Largura = “ 0.25* ”) ou usar seu compartilhamento de dimensionar de célula de recurso conforme mostrado no exemplo RunDialog, consulte Exemplo de caixa de Executar Caixa de Diálogo de globalização.

Localization Comments

Há vários casos onde o conteúdo pode ser ambíguo e difíceis de serem traduzidos. O desenvolvedor ou designer tem a capacidade de fornecer contexto extra e comentários para localizadores através de comentários de localização. Por exemplo o Localization.Comments abaixo esclarece o uso do caractere ‘|’.

Esse comentário fica associado ao conteúdo do TextBlock_1 e no caso da ferramenta LocBaml, (consulte Como: Localizar um Aplicativo), ele pode ser visto na sexta coluna da linha TextBlock_1 no arquivo de saída .csv:

Resource Key

Category (Categoria)

Readable

Modifiable

Comment

Valor

TextBlock_1:System.Windows.Controls.TextBlock.$Content

Texto

TRUE

TRUE

Esse caractere é usado como uma regra decorativa.

|

Comentários podem ser colocados no conteúdo ou propriedade de qualquer elemento usando a seguinte sintaxe:

Atributos de localização

Geralmente o desenvolvedor ou gerente de localização precisa do controle de o que os localizadores podem ler e modificar. Por exemplo, talvez não seja conveniente o localizador para converter o nome da sua empresa ou texto legal. WPF Fornece atributos que permitem que você conjunto a legibilidade, modifiability e categoria de conteúdo ou propriedade que pode usar a ferramenta de localização para bloquear, ocultar ou classificar os elementos de um elemento. Para obter mais informações, consulte AttributesProperty. Para fins deste exemplo, a ferramenta LocBaml saídas apenas os valores desses atributos. WPF todos os controles têm valores padrão desses atributos, mas você a pode substituí-los. Por exemplo, o exemplo a seguir substitui os atributos padrão de localização para TextBlock_1 e define o conteúdo como legíveis mas não modificáveis pelos localizadores.

<TextBlock
x:Uid="TextBlock_1"
Localization.Attributes=
"$Content(Readable Unmodifiable)">
  Microsoft Corporation
</TextBlock>

Juntamente com os atributos de legibilidade e modifiability, WPF Fornece uma enumeração das comum UI categorias que podem ser usadas para dar mais contexto localizadores: Texto, título, Label, Button, CheckBox, ComboBox, ListBox, Menu, RadioButton, ToolTip, HyperlinkDocumento, XmlData e fonte. As categorias padrão do WPF para controles de plataforma podem ser substituídas no XAML também:

<TextBlock x:Uid="TextBlock_2">
<TextBlock.ToolTip>
<TextBlock
x:Uid="TextBlock_3"
Localization.Attributes=
"$Content(ToolTip Readable Unmodifiable)">
Microsoft Corporation
</TextBlock>
</TextBlock.ToolTip>
Windows Vista
</TextBlock>

Os atributos padrão de localização que o WPF fornece também pode ser substituído pelo código, para que você possa definir corretamente os valores padrão certos para controles personalizados. Por exemplo:

[Localizability(Readability = Readability.Readable, Modifiability=Modifiability.Unmodifiable, LocalizationCategory.None)]

public class CorporateLogo: TextBlock

{

..

.

}

Os atributos de instância definidos no XAML terão precedência sobre os valores definidos no código em controles personalizados. Para obter mais informações sobre atributos e comentários, consulte Localization Attributes and Comments.

Fontes alternativas e fontes compostas

Se você especificar uma fonte que não oferece suporte a um intervalo de um determinado codepoint, WPF automaticamente alternará para uma que suporta, usando a Global User Interface.compositefont que está localizada na sua Pasta Windows\Fonts. Fontes compostas funcionam exatamente sistema autônomo qualquer Outros fonte e podem ser usadas explicitamente, definindo FontFamily um elemento (ou seja FontFamily = “ interface de usuário global ”). Você pode especificar sua própria fonte alternativa de preferência criando sua própria fonte composta e especificando qual fonte será usada para intervalos específicos de codepoint e idiomas.

Para obter mais informações sobre fontes compostas consulte FontFamily.

Localizando a Home Page da Microsoft

Você pode seguir as mesmas etapas do exemplo RunDialog para localizar esse aplicativo. O arquivo .csv localizado para árabe está disponível para você em Exemplo de home page de globalização.