WPFアプリケーションをローカライズするには多くの方法がありますが、フォームを閉じて再度開いたり、アプリケーションを完全に再起動したりすることなく、自動モードで要素のラベルを変更できる方法を見つけることは困難です。 この出版物では、WPFアプリケーションをローカライズする方法について説明します。これにより、アプリケーションとフォームを再起動せずにアプリケーションのカルチャを変更できます。 このソリューションでは、ResourceDictionary(XAML)を使用してインターフェイス(UI)を変換し、コードからのメッセージをローカライズするために、リソースファイル(RESX)を使用できます。リソースファイル(RESX)は、コードで使用したり、便利なエディター(
ResX Resource Manager )でプラグインがある編集に便利です。
このプロジェクトは、Visaul Basic .NETとC#で記述されています。 これにより、Visaul Basic .NETまたはC#に慣れていない人でもコードが読みやすくなることを願っています。
最初に、新しいWPFアプリケーションプロジェクトを作成します。

プロジェクト全体に対して中立的な文化を示すことを忘れないでください- プロジェクトのプロパティを開きます。
- [ アプリケーション ]タブに移動します。
- アセンブリ情報を開きます。
- 中立的な文化の選択

- OKをクリックします。
次に、ローカライズファイルの
Resourcesフォルダーをプロジェクトに追加します。
リソースフォルダーで、
リソースディクショナリ(WPF)ファイルを作成し、
lang.xamlを呼び出し、作成済みの
ResourceDictionary要素に属性を追加します。これにより、タイプを示す値を使用して値を記述できます。
xmlns:v="clr-namespace:System;assembly=mscorlib"
次に、ファイルをアプリケーションリソースに追加します。
- ファイルApplication.xaml (C#のApp.xaml)を開きます。
- Application.Resourcesに ResourceDictionary要素を追加します 。
- ResourceDictionary要素に、 ResourceDictionary.MergedDictionaries要素を追加します (ここでは、すべてのResourceDictionaryを保存します)。
- ResourceDictionary.MergedDictionaries要素で、 lang.xamlファイルを参照するSource属性を持つResourceDictionary要素を追加します。
結果の例 <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="Resources/lang.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources>
次に、
lang.xamlファイルの
ResourceDictionary要素内にUIのローカライズされたデータを追加する必要があります。
<v:String x:Key="m_Title">WPF Localization example</v:String>
この場合、
m_Titleキーでアクセスできるテキスト値(String)を配置しました。
アプリケーションのサンプルデータ <v:String x:Key="m_Title">WPF Localization example</v:String> <v:String x:Key="m_lblHelloWorld">Hello world!</v:String> <v:String x:Key="m_menu_Language">Language</v:String> <v:Double x:Key="m_Number">20.15</v:Double>
他のアプリケーション
カルチャの場合 、
Resourcesフォルダーで
lang.xamlファイルを複製し、名前を
langに変更します
。 ru-RU .xaml 、ここで
ru-RUは
文化の名前 (
Culture name )です。 複製後、値を翻訳できます。 すべての値を
lang.xamlリソース
ファイルに追加した後、これを行うことをお勧めし
ます 。
リソースファイルをロシア文化に翻訳(ru-RU) <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:v="clr-namespace:System;assembly=mscorlib"> <v:String x:Key="m_Title"> WPF </v:String> <v:String x:Key="m_lblHelloWorld"> !</v:String> <v:String x:Key="m_menu_Language"></v:String> <v:Double x:Key="m_Number">10.5</v:Double> </ResourceDictionary>
次に、ウィンドウの
xamlコードに要素を追加し、動的リソースを使用してそれらのテキストを取得します。

上の図からわかるように、Visual Studioには先ほど作成したリソースが表示されます。
Slider要素に関する注意:
Valueプロパティは
Double型であるため、同じ型のリソースのみを使用できます。
最初の打ち上げウィンドウタイトル、アプリケーションカルチャを変更するためのメニュー名、Labelのテキスト、およびリソースのSlider要素の値を取り出しました。

それでは、コードの記述を始めましょう。
まず、
Applicationクラス(
App for C#)で、アプリケーションがサポートするカルチャを示します。
Visual Basic .NET Class Application Private Shared m_Languages As New List(Of CultureInfo) Public Shared ReadOnly Property Languages As List(Of CultureInfo) Get Return m_Languages End Get End Property Public Sub New() m_Languages.Clear() m_Languages.Add(New CultureInfo("en-US"))
C# public partial class App : Application { private static List<CultureInfo> m_Languages = new List<CultureInfo>(); public static List<CultureInfo> Languages { get { return m_Languages; } } public App() { m_Languages.Clear(); m_Languages.Add(new CultureInfo("en-US"));
アプリケーションレベルでは、重複するコードなしで任意のウィンドウからカルチャを切り替えることができる機能を実装しています。
静的なLanguageプロパティを
Applicationクラス(
App for C#)に追加します。これにより、現在のカルチャが返されます。カルチャを変更すると、以前のカルチャのリソースディクショナリが新しいものに置き換えられ、カルチャを変更するときにすべてのウィンドウが追加のアクションを実行できるイベントがトリガーされます。
まあ、プログラムの文化を変えるために私たちの窓を教えることは残っています。 新しいウィンドウを作成する場合、アプリケーションでサポートされているすべてのカルチャをカルチャ変更メニューに追加するとともに、以前に作成したイベントハンドラー
Application.LanguageChangedを追加します。 また、ChangeLanguageClickカルチャ
パントをクリックするためのハンドラーを追加します。これにより、アプリケーションのカルチャと
LanguageChanged関数が変更され、
Application.LanguageChangedイベントが処理され
ます 。
Visual Basic .NET Class MainWindow Public Sub New() InitializeComponent()
C# namespace WPFLocalizationCSharp {
アプリケーションの準備ができました。 しかし、完全に幸福にするために、アプリケーションの起動時に選択した文化を記憶するようにアプリケーションを構成します。
DefaultLanguage設定をプロジェクトに追加し、タイプ
System.Globalization.CultureInfo (
mscorlibライブラリにあります)を指定し、プロジェクトのデフォルトの中立カルチャを指定します。

また、
Applicationクラスに2つの関数を追加します。
Visaul Basic .NET Private Sub Application_LoadCompleted(sender As Object, e As NavigationEventArgs) Handles Me.LoadCompleted Language = My.Settings.DefaultLanguage End Sub Private Shared Sub OnLanguageChanged(sender As Object, e As EventArgs) Handles MyClass.LanguageChanged My.Settings.DefaultLanguage = Language My.Settings.Save() End Sub
C# private void Application_LoadCompleted(object sender, System.Windows.Navigation.NavigationEventArgs e) { Language = WPFLocalizationCSharp.Properties.Settings.Default.DefaultLanguage; } private void App_LanguageChanged(Object sender, EventArgs e) { WPFLocalizationCSharp.Properties.Settings.Default.DefaultLanguage = Language; WPFLocalizationCSharp.Properties.Settings.Default.Save(); }
App.xamlで 、
LoadCompletedイベントハンドラーを
Application要素
に追加します。
LoadCompleted="Application_LoadCompleted"
Appクラスのコンストラクターで、
App.LanguageChangedイベントハンドラーを追加し
ます 。
App.LanguageChanged += App_LanguageChanged;
これで、アプリケーションは、アプリケーションが閉じられたときに選択されたカルチャで開始されます。
プロジェクト全体が
GitHubに投稿され
ています 。
UDP :(2017.02.13)
カルチャを保持し、デフォルトのカルチャではないカルチャでプログラムを初期化するコードにバグがあります。 このバグはGitHubで修正されました。