2012-07-04 9 views
7

Mam aplikację WPF (w języku angielskim) i chciałbym, aby użytkownicy mogli wybierać różne języki. Czytałem pewne możliwości zmiany języków w aplikacjach uruchomieniowych, ale chcę tylko wybrać język podczas instalacji i nigdy go nie zmieniać.wielojęzyczna aplikacja wpf

Myślisz, najszybszy i najprostszy sposób to zrobić rozwija różne wersje programu (zmieniając tylko język tekstowy) i pozwolić użytkownikowi na wybór jednego z nich podczas instalacji ?? Prawdopodobnie powtórzenie kodu zmienia tylko textbox lub etykiety nie jest zbyt eleganckie, ale zauważ, że mam aplikację zakończoną w języku angielskim i nie muszę zmieniać języka w czasie wykonywania.

Odpowiedz

5

Myślę, że rozwiązanie proponowane przez Aghilas jest dobry; ale możesz użyć StaticResource zamiast używać DynamicResource w kroku 3, DynamicResource nie jest wymagane w twoim przypadku, ponieważ nie będziesz chłonąć języka podczas działania aplikacji.

Również spojrzeć na te artykuły posiadające dane o użyciu plików RESX dla lokalizacji w WPF -

Localizing a WPF Application with ResX Files

WPF Localization

WPF Localization Guidance - Whitepaper

21

Możesz śledzić kroki

  1. Tworzenie plików zasobów

    Dodaj ten plik do katalogu StringResources.xaml Ressources. Próbka jest tutaj:

    <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> 
    

    Można utworzyć kilka plików, po jednym dla każdego języka.

  2. Dodawanie zasobu (nazywają to po uruchomieniu aplikacji)

    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. Korzystanie z zasobów, tak -

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

Bardzo przydatne podczas przechowywania cały tekst w baza danych. Dziękuję Ci! – BendEg

+1

źródło: http://www.codeproject.com/Articles/123460/Simplest-Way-to-Implement-Multilingual-WPF-Applica – Nick

+0

Dynamiczny Ressource nie został rozwiązany w czasie projektowania. Moim zdaniem jest to wada tego rozwiązania. – DrMarbuse

0

Jeśli chcesz użyć RESX plików zamiast słowniki zasobów, możesz to łatwo zrobić za pomocą odwołań statycznych w 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> 

W folderze Resource jest MainWindow.resx, MainWindow.de.resx, itd. I każdy plik zawiera klucz MyTestKey z tłumaczeniem.

2

Wystarczy poprawić @ poprawnej odpowiedzi AghilasYakoub jest, myślę, muszę podkreślić, że następujący kod powinien być dodany do pliku App.xaml oprócz tego, co powiedział:

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