2012-07-04 13 views
7

Ho un'applicazione WPF (in inglese) e vorrei consentire agli utenti di selezionare lingue diverse. Ho letto alcune possibilità di cambiare lingua nelle applicazioni runtime, ma voglio solo scegliere una lingua durante l'installazione e non cambiarla mai.applicazione wpf multilingue

Pensi che il modo più semplice e veloce per farlo sia sviluppare versioni diverse del programma (cambiando solo il linguaggio del testo) e consentire all'utente di selezionarne una durante l'installazione ?? Probabilmente per ripetere il codice, solo la modifica della casella di testo o delle etichette non è molto elegante, ma si noti che l'applicazione è terminata in inglese e non è necessario cambiare lingua in fase di esecuzione.

risposta

5

Penso che la soluzione proposta da Aghilas è bene; ma è possibile utilizzare StaticResource invece di utilizzare DynamicResource nel passaggio 3, DynamicResource non è necessario nel tuo caso, in quanto non si sta tagliando la lingua mentre l'applicazione è in esecuzione.

hanno anche uno sguardo a questi articoli di avere dettagli su come utilizzare resx per la localizzazione in WPF -

Localizing a WPF Application with ResX Files

WPF Localization

WPF Localization Guidance - Whitepaper

21

È possibile seguire questa procedura

  1. la creazione dei file di risorse

    aggiungere questo file nella directory StringResources.xaml Ressources. Il campione è qui:

    <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"> 
    
        <system:String x:Key="close">Close</system:String> 
    </ResourceDictionary> 
    

    È possibile creare diversi file, uno per ogni lingua.

  2. aggiunge la risorsa (Chiamare questo quando si avvia l'applicazione)

    private void SetLanguageDictionary() 
    { 
        ResourceDictionary dict = new ResourceDictionary(); 
        switch (Thread.CurrentThread.CurrentCulture.ToString()) 
        { 
         case "en-US": 
         dict.Source = new Uri("..\\Resources\\StringResources.xaml", UriKind.Relative); 
         break; 
         case "fr-CA": 
         dict.Source = new Uri("..\\Resources\\StringResources.fr-CA.xaml", UriKind.Relative); 
         break; 
         default : 
         dict.Source = new Uri("..\\Resources\\StringResources.xaml",UriKind.Relative); 
         break; 
        } 
        this.Resources.MergedDictionaries.Add(dict); 
    } 
    
  3. utilizzando la risorsa, come questo -

    <Button  
        x:Name="btnLogin" 
        Click="btnLogin_Click" 
        Content="{DynamicResource login}" 
        Grid.Row="3" 
        Grid.Column="0" 
        Padding="10" /> 
    
+0

Molto utile quando si ripone tutto il testo un database. Grazie! – BendEg

+1

source: http://www.codeproject.com/Articles/123460/Simplest-Way-to-Implement-Multilingual-WPF-Applica – Nick

+0

La risorsa dinamica non viene risolta in fase di progettazione. Quindi, a mio avviso, questo è un inconveniente di questa soluzione. – DrMarbuse

0

Se si desidera utilizzare i file RESX invece di dizionari di risorse, puoi farlo facilmente con riferimenti statici in XAML.

<Window x:Class="MyApp.MainWindow" 
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:res="clr-namespace:MyApp.Resources"> 
    <Button Text="{x:Static res:MainWindow.MyTestKey}"> 
</Window> 

Nella cartella Resource è il MainWindow.resx, MainWindow.de.resx, ecc e ogni file contiene una chiave MyTestKey con una traduzione.

2

solo per migliorare @ risposta corretta di AghilasYakoub, penso che ho bisogno di sottolineare che il seguente codice dovrebbe essere aggiunto al file App.xaml a parte ciò che aveva detto:

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Resources/StringResources.xaml"/> 
      <ResourceDictionary Source="Resources/StringResources.fr-CA.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources>