WPF カスタムXMLファイルによる国際化

WPF カスタムXMLファイルによる国際化

この記事では、WPFプログラムでカスタムXMLファイルを使用して国際化を実現する方法について詳しく説明します。必要なNuGetパッケージのインストール、言語リストの動的取得、言語の動的切り替え、コードおよびXAMLインターフェースでの翻訳文字列の使用などを含み、ソースコードのリンクも提供し、開発者がWPFアプリケーションの国際化を簡単に実装できるように支援します。

最終更新 2025/01/26 6:02
沙漠尽头的狼
読了目安 4 分
カテゴリ
WPF
タグ
.NET C# WPF NuGet 国際化

今日のグローバル化されたソフトウェア開発環境において、アプリケーションの国際化はますます重要になっています。これにより、ソフトウェアを異なる地域や言語のユーザーに適応させ、ユーザーエクスペリエンスを向上させることができます。本記事は 『AvaloniaでXMLファイルを使用して国際化を実現する』 と似ていますが、本日紹介するパッケージはWPFプログラム専用です。以下でその使い方を簡単に説明します。

必要な NuGet パッケージのインストール

WPFプログラムでカスタムXMLファイルを使用して国際化を実現するには、まず重要なNuGetパッケージをインストールする必要があります。Visual StudioのNuGetパッケージマネージャーコンソールで、次のコマンドを実行します。

Install-Package WPFXmlTranslator

このパッケージは、国際化に必要なコア機能とツールを提供します。

言語リストの動的取得

多言語をサポートするアプリケーションでは、ユーザーが希望する言語を選択できるようにすることが重要です。以下のコードで、言語リストを簡単に取得できます。

List<LocalizationLanguage> languages = I18nManager.Instance.Resources.Select(kvp => kvp.Value).ToList();

ここで I18nManagerWPFXmlTranslator パッケージが提供する管理クラスで、国際化関連のリソースを処理します。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アプリケーションがより広い国際市場に進出する一助となることを願っています。

さらに探索

関連読書

その他の記事
同じカテゴリ / 同じタグ 2024/01/25

C# WPFにおけるFluentValidationの応用

この記事では、C# WPFプロジェクトでFluentValidationを使用してプロパティ検証を行う方法と、MVVMパターンを通じてこの機能を実装する方法について詳しく説明します。

続きを読む