WPFプリズムモジュールの国際化とローカライズを実現するにはどうすればよいですか?
英語 |簡体字中国語
前の記事では、リソースディクショナリ(XAML)を使用して実装されたメインプロジェクトの国際化について簡単に紹介しました。
過去数日間、私はいくつかのPrismモジュール(モジュール)を追加し、サブモジュールがリソースディクショナリを使用して国際化とローカライズを実現していることを発見しました。実現した。
1.この記事の概要
サブモジュールの国際化とローカライズの要件:
-
- 各モジュールには、独自の言語ファイルが必要です。
-
- メインプロジェクトで言語を動的に切り替える場合、サブモジュールも切り替える必要があります。
-
- Prismは、モジュラーフレームワークを実装するために使用されます。これには、メインプロジェクトと各サブモジュールが参照関係、つまり疎結合を持つことができず、サブモジュールの言語ファイルをメインプロジェクトで直接切り替えることはできません。
上記の要件に基づいて、各モジュールで言語ファイル(XAML)を定義しようとしましたが、メインフォームが言語を切り替えると、モジュールの言語ファイルは常に、対応するリソースディクショナリファイルがないことを通知します。まだ「Accelerider.Windows」国際化方式を参照してください。リソースファイルを使用してローカライズと国際化を実現しており、Xamlの方法に絡んでいません。
次に、変更された効果を示します。
以前のバージョンと同様:
-
- タイトルバーの国際化に変更はありませんが、同じ効果を得るためにテキストバインディングが別の方法で変更されました。
-
- Prismによって動的に読み込まれる3つのサブモジュール(ホーム\クライアント\サーバー)が左側に追加され、言語はメインプロジェクトのメインウィンドウの言語切り替えに従って切り替えられます。
以下は、モジュールを作成する方法、およびメインフォームとモジュールの国際化を行う方法の簡単な紹介です。これは非常に単純な紹介です。コードをプルして、特定の実装を確認できます。
次に、3つのPrismモジュール(モジュール)を追加します。
Prismテンプレートをインストールして、モジュールプロジェクトをすばやく作成できます。もちろん、.Net Coreプロジェクトを手動で作成することもできます。これは、ほんの数ステップです(Prism.Wpfパッケージ(7.2.0.1422)とNugetをインストールする必要があります)。すばやく作成。
2.1モジュールを作成する前の準備
上の画像で検索されたPrismテンプレートをダウンロードしてVSを再起動すると、自動的にインストールされます。新しいプロジェクトを作成すると、Prismモジュールテンプレートが選択されます。
.NET Coreによって作成されたWPFプロジェクトを使用するため、.NET Core 3のバージョンを選択することに注意してください。
2.2モジュールを作成する
以下は、作成された3つのモジュールプロジェクトのスクリーンショットです。
3つのモジュールファイルの現在の構成は似ています。
- I18nResources:Resourcesフォルダー、3つの言語リソースファイルとT4テンプレートファイル(言語キーの参照に使用)を配置します。これらのT4テンプレートファイルは3つのモジュールとメインプロジェクトで定義されており、特定のものをgithubからダウンロードしてソースコードを表示できます。
- ビューはビューファイルを配置し、メインプロジェクトのメインフォーム、つまり、TabItemから継承されたMainTabItem.xamlに表示されるTabItemビューのみを使用します。
- xxxxModule.cs:プリズム検出モジュールで使用されるプリズムテンプレート定義ファイル。
3つのモジュールの要点に注意する必要があります。
-
- モジュールプロジェクトファイルを編集し、モジュールファイルの出力ディレクトリを変更します。
// 省略部分代码,下面这一行设置为False,代表输出目录不带.NET Core版本信息
<AppendTargetFrameworkToOutputPath>Flase</AppendTargetFrameworkToOutputPath>
// 省略部分代码,修改Debug与Release编译输出目录,方便主工程统一加载模块
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<OutputPath>..\Build\Debug\Modules</OutputPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<OutputPath>..\Build\Release\Modules</OutputPath>
</PropertyGroup>
// 省略部分代码
-
- XXXModuleでは、リソースファイルのResourceManager参照を別のライブラリに追加して保存する必要があります。言語を切り替えるには、それを使用する必要があります。たとえば、次のようにHomeModuleのコンストラクターにコードを追加し、このコードの文、モジュールの国際化およびローカリゼーションを追加するだけですそれが終わったとしても:
I18nManager.Instance.Add(TerminalMACS.Home.I18nResources.UiResource.ResourceManager);
-
- 「RegionNames.MainTabRegion」に対する「MainTabItem」ビューは、XXXModuleのRegisterTypesメソッドに登録されています。メインフォームは、「RegionNames.MainTabRegion」に関連付けられたモジュールビューを使用して、表示およびロードします。
_regionManager.RegisterViewWithRegion(RegionNames.MainTabRegion, typeof(MainTabItem));
-
- UIコントロールの国際的なコントロールテキストバインディング、マークアップで使用されるオープンソースライブラリの名前空間、リンクは後で提供されます。このプロジェクトはライブラリをソリューションに直接ロードします。i18NResources:言語は、T4テンプレートファイルによって生成されるクラス、関連するテキストです翻訳されたキー。バインディングテキストのコードは次のとおりです。
<TextBlock Grid.Row="2" Text="{markup:I18n {x:Static i18NResources:Language.MainTabItm_Header}}"
3.主なプロジェクト
メインプロジェクトディレクトリは次のように構成されています。
3.1 Prismモジュールの動的ロード
3つのモジュールを構成およびロードするための重要なコードは、App.xaml.csファイルにあります。上記のコードを見て、3つのモジュールをModulesディレクトリに出力します。メインプロジェクトはこのディレクトリを直接ロードできます。他のロード方法でも構成ファイルを使用します。待ってください。Prismの公式の例を参照できます。リンクは記事の最後にあります。
protected override IModuleCatalog CreateModuleCatalog()
{
string modulePath = @".\Modules";
if (!Directory.Exists(modulePath))
{
Directory.CreateDirectory(modulePath);
}
return new DirectoryModuleCatalog() { ModulePath = modulePath };
}
メインフォームには、サブモジュールによって登録されたTabItemビューが表示されます。Prism:RegionManager.RegionNameは、各サブモジュールに登録された領域文字列です。これは、モジュールに対応するTabItemビューに関連付けられています。コードは次のとおりです。
<TabControl Grid.ColumnSpan="2" SelectedIndex="0"
Style="{StaticResource MainTabControlStyle}"
ItemContainerStyle="{StaticResource MainTabItemStyle}"
prism:RegionManager.RegionName="{x:Static ui:RegionNames.MainTabRegion}"/>
メインフォームは、サブモジュールビューをTabControlコントロールの形式で表示します。
メインプロジェクトがサブモジュールを正常にロードできる場合、メインプロジェクトのプロジェクトファイルもその出力ディレクトリを変更する必要があります。
// 省略部分代码,下面这一行设置为False,代表输出目录不带.NET Core版本信息
<AppendTargetFrameworkToOutputPath>Flase</AppendTargetFrameworkToOutputPath>
// 省略部分代码,修改Debug与Release编译输出目录,方便主工程统一加载模块
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<OutputPath>..\Build\Debug</OutputPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<OutputPath>..\Build\Release</OutputPath>
</PropertyGroup>
// 省略部分代码
3.2言語ファイル形式を変更する
元のXAML言語ファイルを削除し、3つのモジュールのリソースファイルタイプと同様のresxのリソースファイルに置き換えました。以下は、メインプロジェクトのリソースファイルです。
リソースファイルに置き換えられたため、編集はXAMLファイルよりも便利です。当初、国際化を実現するためにリソースファイルを使用することが検討されていました。XAMLファイルを試したかったのです。
3.3言語切り替えのコアコード
動的に言語を切り替えるためのキーコードは次のように変更されます。
public static void SetLanguage(string language = "")
{
if (string.IsNullOrWhiteSpace(language))
{
language = ConfigHelper.ReadKey(KEY_OF_LANGUAGE);
if (string.IsNullOrWhiteSpace(language))
{
language = System.Globalization.CultureInfo.CurrentCulture.ToString();
}
}
ConfigHelper.SetKey(KEY_OF_LANGUAGE, language);
_lastLanguage = language;
var culture = new System.Globalization.CultureInfo(language);
I18nManager.Instance.CurrentUICulture = culture;
}
コア言語切り替えコードは最後の文です。詳細には触れませんが、ソリューションにはライブラリとソースコードがあります。
I18nManager.Instance.CurrentUICulture = culture;
4.ソースコード
-
- 公式サイト:https : //terminalmacs.com
-
- 協力ウェブサイト:https : //dotnet9.com
5.参考資料
-
- プリズムテンプレートパック(プリズムテンプレート):https : //marketplace.visualstudio.com/items?itemName=BrianLagunas.PrismTemplatePack
-
- WPF国際オープンソース補助ライブラリ:https : //github.com/DingpingZhang/WpfExtensions
-
- Accelerider.Windows(サブモジュールの読み込みについてはオープンソースプロジェクトを参照):https : //github.com/Accelerider/Accelerider.Windows
-
- Prism-Samples-Wpf(官方デモ):https : //github.com/PrismLibrary/Prism-Samples-Wpf