Pergunta

Você pode recomendar uma boa maneira de implementar um sistema de Multilanguage para um aplicativo WPF? O método que eu estou usando agora envolve XML, aulas e uma extensão de XAML. Ele funciona muito bem na maioria dos casos, mas quando eu tenho que lidar com rótulos dinâmicos ou texto dinâmico, em geral, exigem algum esforço extra. Gostaria de deixar o programador trabalhando apenas no problema principal e esqueceu as questões lang.

Foi útil?

Solução

Eu estou usando o WPF Localização Extensão . É realmente uma maneira fácil de localizar qualquer tipo de DependencyProperty em DependencyObjects.

  • está em um verdadeiro estado estável
  • vinculativo-like
  • Suporta a gravação de estilo como Text = {LocText ResAssembly:ResFile:ResKey}
  • funciona com o mecanismo .resx-fallback (por exemplo, en-us -> en -> cultura independente)
  • suportes cultura forçando (por exemplo, "isso tem que ser Inglês o tempo todo")
  • trabalha com propriedades de dependência normais
  • trabalha com controle de modelos
  • pode ser usado em XAML (realmente: P), sem quaisquer namespaces adicionais
  • pode ser usado no código para trás para valores localizados de ligação para dinâmicas gerado controlos
  • implementos INotifyPropertyChanged para uso avançado
  • string suportes formatação por exemplo "this is the '{0}' value"
  • suportes prefixo e sufixo valores (atualmente com extensão LocText)
  • está em uso em sistemas produtivos (como o meu produto de relações públicas)
  • comutação da língua para runtime afeta NÃO timeslice
  • pode ser usado com qualquer arquivo de recurso (.resx) em todas as assembleias (também a dinâmica carregado um em tempo de execução)
  • não precisa de nenhum processo de inicialização (como "xyz chamada para registrar um dicionário especial Localize")
  • está disponível em tempo de design (MS Expression Blend, MS Visual Studio 2008 (Normal e SP1)
  • mudança da linguagem escolhida é possível, em tempo de design
  • pode localizar qualquer tipo de tipo de dados, o tempo que um conversor (TypeConverter) para que existe (se estende LocalizeExtension)
  • tem suporte embutido para Text, Text superior, Text inferior, Images, Brushes, Double e Thickness
  • não afeta quaisquer vazamentos de memória
  • deixa a propriedade UID intocado
  • ofertas um SpecificCulture para utilização como IFormatProvider (por exemplo (123.20).ToString(LocalizeDictionary.SpecificCulture) = "123.20" ou "123,20")
  • oferece alguma funcionalidade para verificar e obter valores de recursos no código por trás
  • não altera a cultura em Thread.CurrentCulture ou Thread.CurrentUICulture (pode ser mudado facilmente)

Outras dicas

Siga estas etapas:

1) Coloque todos os fragmentos String em um arquivo de recurso separado.

Exemplo: StringResources.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:system="clr-namespace:System;assembly=mscorlib">

    <!-- String resource that can be localized -->
    <system:String x:Key="All_Vehicles">All Vehicles</system:String>

</ResourceDictionary>

2) fazer cópias para cada idioma e adicioná-los (traduzido) ao dicionários mescladas. Não se esqueça de adicionar o código ISO do país para facilitar as coisas.

Exemplo App.xaml:

<Application x:Class="WpfStringTables.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Window1.xaml">
    <Application.Resources>
        <ResourceDictionary >
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="StringResources.de-DE.xaml" />
                <ResourceDictionary Source="StringResources.nl-NL.xaml" />
                <ResourceDictionary Source="StringResources.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

O arquivo de último recurso com cordas será usado para substituir partes de texto no código.

3a) Use as partes do texto da tabela String:

Exemplo Window1.xaml:

<Window x:Class="WpfStringTables.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
    <Grid>
        <Button Margin="51,82,108,129" Name="AllVehiclesButton" 
                Content="{StaticResource All_Vehicles}"/>
    </Grid>
</Window>

3b) carregar o recurso de código (Apenas usar este código se você não quer set via XAML):

void PageLoad()
{
  string str = FindResource("All_Vehicles").ToString();
}

4) Mudar para nova cultura no início do aplicativo:

Codesnippet de App.xaml.cs:

public static void SelectCulture(string culture)    
{      
    if (String.IsNullOrEmpty(culture))
        return;

    //Copy all MergedDictionarys into a auxiliar list.
    var dictionaryList = Application.Current.Resources.MergedDictionaries.ToList();

    //Search for the specified culture.     
    string requestedCulture = string.Format("StringResources.{0}.xaml", culture);
    var resourceDictionary = dictionaryList.
        FirstOrDefault(d => d.Source.OriginalString == requestedCulture);

    if (resourceDictionary == null)
    {
        //If not found, select our default language.             
        requestedCulture = "StringResources.xaml";
        resourceDictionary = dictionaryList.
            FirstOrDefault(d => d.Source.OriginalString == requestedCulture);
    }

    //If we have the requested resource, remove it from the list and place at the end.     
    //Then this language will be our string table to use.      
    if (resourceDictionary != null)
    {
        Application.Current.Resources.MergedDictionaries.Remove(resourceDictionary);
        Application.Current.Resources.MergedDictionaries.Add(resourceDictionary);
    }

    //Inform the threads of the new culture.     
    Thread.CurrentThread.CurrentCulture = new CultureInfo(culture);
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);

}

Josh Smith escreveu um tutorial em profundidade sobre o seu método preferido para este: Criando um internacionalizada Assistente em WPF .

Pode apontá-lo para um grande redesign (é um MVVM solução ), mas usando MVVM parece valer a pena por outras razões também.

Usando este artigo eu consegui usar facilmente arquivos de recursos para lidar com janelas WPF multilingues. http://www.codeproject.com/KB/WPF/WPF_Resx_Localization.aspx Você deve dar-lhe um cheque porque é muito simples e eficaz.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top