今日のグローバル化されたソフトウェア開発環境において、アプリケーションの国際化はますます重要になっています。これにより、ソフトウェアを異なる地域や言語のユーザーに適応させ、ユーザーエクスペリエンスを向上させることができます。本記事は 『AvaloniaでXMLファイルを使用して国際化を実現する』 と似ていますが、本日紹介するパッケージはWPFプログラム専用です。以下でその使い方を簡単に説明します。
必要な NuGet パッケージのインストール
WPFプログラムでカスタムXMLファイルを使用して国際化を実現するには、まず重要なNuGetパッケージをインストールする必要があります。Visual StudioのNuGetパッケージマネージャーコンソールで、次のコマンドを実行します。
Install-Package WPFXmlTranslator
このパッケージは、国際化に必要なコア機能とツールを提供します。
言語リストの動的取得
多言語をサポートするアプリケーションでは、ユーザーが希望する言語を選択できるようにすることが重要です。以下のコードで、言語リストを簡単に取得できます。
List<LocalizationLanguage> languages = I18nManager.Instance.Resources.Select(kvp => kvp.Value).ToList();
ここで I18nManager は WPFXmlTranslator パッケージが提供する管理クラスで、国際化関連のリソースを処理します。Resources プロパティは利用可能なすべての言語リソースを格納しており、Select メソッドで LocalizationLanguage オブジェクトのリストに変換します。
LocalizationLanguage クラスの定義は次のとおりです。
public class LocalizationLanguage
{
public string Language { get; set; } = (string) null;
public string Description { get; set; } = (string) null;
public string CultureName { get; set; } = (string) null;
//...
}
LocalizationLanguage クラスには、言語名、説明、カルチャ名などの基本情報が含まれています。言語リストを取得したら、それをUIにバインドして、例えばドロップダウンメニューでユーザーが選択できる言語オプションを表示したり、言語情報を表示する他のUI要素にデータバインドしたりできます。
<ComboBox ItemsSource="{Binding Languages}"
SelectedItem="{Binding SelectLanguage}"
DisplayMemberPath="Language" />
このXAMLコードでは、ComboBox コントロールを作成し、ItemsSource プロパティを Languages リストに、SelectedItem プロパティを SelectLanguage プロパティに、DisplayMemberPath プロパティを Language にバインドしています。これにより、ドロップダウンメニューに言語リストが表示され、ユーザーが選択できるようになります。
言語の動的切り替え
ユーザーがUIで別の言語を選択したら、コード内で言語を動的に切り替える必要があります。以下は言語切り替えを実装するコード例です。
var culture = new CultureInfo(language);
I18nManager.Instance.Culture = culture;
ここでの language パラメータは LocalizationLanguage クラスの CultureName プロパティ値です。CultureInfo クラスは.NET Frameworkで特定のカルチャを表すクラスであり、I18nManager.Instance.Culture プロパティを対応する CultureInfo オブジェクトに設定することで、UI言語を即座に切り替え、シームレスな国際化体験を提供できます。
コード内での翻訳文字列の使用
コード内では、強型のKeyを使用して現在の言語カルチャの翻訳文字列を簡単に取得できます。例えば:
var titleCurrentCulture = I18nManager.Instance.GetResource(Localization.Main.MainView.Title); // 現在の言語を取得
var titleZhCN = I18nManager.Instance.GetResource(Localization.Main.MainView.Title, "zh-CN"); // 簡体字中国語を取得
var titleEnUS = I18nManager.Instance.GetResource(Localization.Main.MainView.Title, "en-US"); // 英語を取得
I18nManager.Instance.GetResource メソッドは、指定された言語の翻訳文字列を取得します。最初の引数は強型の言語Keyで、XML言語ファイル内の特定の翻訳項目を指します。2番目の引数はオプションで、特定の言語カルチャ名を指定します。これにより、コードの任意の場所で翻訳テキストを柔軟に使用でき、UIに表示される内容がユーザーが選択した言語と一致するようにできます。
XAML インターフェイスでの適用
XAMLインターフェイスでXML翻訳ファイルを使用するのも非常に便利です。まず、対応する名前空間をインポートする必要があります。
xmlns:language="clr-namespace:Localization"
xmlns:markup="https://codewf.com"
ここで markup は先ほどインストールした補助ライブラリの名前空間で、UIで翻訳テキストをバインドするための I18n マークアップ拡張ヘルパークラスを提供します。language はT4ファイルで生成されたC#の強型言語Key関連クラスの名前空間で、これによりXML言語ファイルの言語Keyと関連付けることができます。
以下は、コントロールで翻訳テキストを使用する例です。
<Button Content="{markup:I18n {x:Static language:ChoiceLanguagesView.LanguageKey}}" />
上記の例では、Button コントロールの Content プロパティが、I18n マークアップ拡張を介して ChoiceLanguagesView.LanguageKey に対応する翻訳テキストにバインドされています。これにより、UI言語が変更されると、ボタンの表示テキストも自動的に対応する言語の翻訳内容に更新されます。
もちろん、言語を指定することもできます。
<StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Current Thread" />
<TextBlock Text="{markup:I18n {x:Static language:DevelopModule.Title2SlugView.Title}}"></TextBlock>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="en-US" />
<TextBlock Text="{markup:I18n {x:Static language:DevelopModule.Title2SlugView.Title}, CultureName=en-US}" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="ja-JP" />
<TextBlock Text="{markup:I18n {x:Static language:DevelopModule.Title2SlugView.Title}, CultureName=ja-JP}" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="zh-CN" />
<TextBlock Text="{markup:I18n {x:Static language:DevelopModule.Title2SlugView.Title}, CultureName=zh-CN}" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="zh-Hant" />
<TextBlock Text="{markup:I18n {x:Static language:DevelopModule.Title2SlugView.Title}, CultureName=zh-Hant}" />
</StackPanel>
</StackPanel>
この例では、StackPanel レイアウトを作成し、複数の子 StackPanel を含めています。各子 StackPanel は異なる言語の翻訳テキストを表示します。I18n マークアップ拡張で CultureName プロパティを指定することにより、特定の言語の翻訳内容を表示できます。
さらに、XAMLインターフェイスでは動的Keyのバインディングもサポートしています。例えば:
<u:Banner
Content="{markup:I18n {Binding SelectedMenuItem.Description}}"
Header="{markup:I18n {Binding SelectedMenuItem.Name}}"
Type="{Binding SelectedType}" />
この例では、Banner コントロールの Content プロパティと Header プロパティが、動的な SelectedMenuItem.Description および SelectedMenuItem.Name プロパティにバインドされ、I18n マークアップ拡張を通じて動的な翻訳テキストの表示を実現しています。
まとめ
使い方はAvalonia版と同様です。以下はWPF版のソースコードで、NuGetパッケージのソースコードと使用例が含まれています。
カスタムXMLファイルと WPFXmlTranslator パッケージを使用することで、WPFアプリケーションの国際化を簡単に実現できます。この方法は簡便で使いやすいだけでなく、柔軟性が高く、さまざまなアプリケーションシナリオの要件を満たすことができます。本記事がお役に立ち、あなたのWPFアプリケーションがより広い国際市場に進出する一助となることを願っています。