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.
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-
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:
-
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.
-
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); }
-
Korzystanie z zasobów, jak to -
<Button x:Name="btnLogin" Click="btnLogin_Click" Content="{DynamicResource login}" Grid.Row="3" Grid.Column="0" Padding="10" />
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>
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.
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