wielojęzyczna aplikacja wpf

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

Czy uważasz, że najszybszym i najłatwiejszym sposobem jest stworzenie różnych wersji programu (Zmiana tylko języka tekstu) i umożliwienie użytkownikowi wybrania jednej z nich podczas instalacji?? Prawdopodobnie do powtórzenia kodu tylko zmiana pola tekstowego lub etykiet nie jest zbyt elegancka, ale zauważ, że mam aplikację ukończoną w języku angielskim i nie muszę zmieniać języka w czasie wykonywania.

Author: akjoshi, 2012-07-04

4 answers

Myślę, że rozwiązanie zaproponowane przez Aghilasa jest dobre, ale możesz użyć StaticResource zamiast DynamicResource w kroku 3, DynamicResource nie jest wymagane w Twoim przypadku, ponieważ nie będziesz chnage języka podczas działania aplikacji.

Spójrz również na te artykuły zawierające szczegóły dotyczące korzystania z plików Resx do lokalizacji w WPF-

Lokalizacja aplikacji WPF z plikami ResX

Lokalizacja WPF

Wskazówki dotyczące lokalizacji WPF - Whitepaper

 5
Author: akjoshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-04 13:14:45

Możesz wykonać następujące kroki:

  1. Tworzenie plików zasobów

    Dodaj ten plik StringResources.xaml do katalogu zasobów. Oto przykład:

    <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żesz utworzyć kilka plików, po jednym dla każdego języka.

  2. Dodawanie zasobu (wywołaj 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, jak to -

    <Button      
       x:Name="btnLogin"
       Click="btnLogin_Click"
       Content="{DynamicResource login}"
       Grid.Row="3"
       Grid.Column="0" 
       Padding="10" />
    
 23
Author: Aghilas Yakoub,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-29 17:55:21

Dla poprawienia poprawnej odpowiedzi @AghilasYakoub, chyba muszę zaznaczyć, że do pliku App.xaml oprócz tego, co powiedział, należy dodać następujący kod:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Resources/StringResources.xaml"/>
            <ResourceDictionary Source="Resources/StringResources.fr-CA.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>
 3
Author: Cristian Alonso Vallejo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-17 13:21:42

Jeśli chcesz używać plików RESX zamiast słowników zasobów, możesz to zrobić łatwo za pomocą statycznych odniesień 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 znajduje się MainWindow.resx, MainWindow.de.resx, itd. każdy plik zawiera klucz MyTestKey z tłumaczeniem.

 0
Author: modiX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-18 12:23:54