前回の記事では、XAML Resource Dictionaryを使用して、メインプロジェクトの国際化について簡単に紹介しました。ここ数日、私はいくつかのPrismモジュールModuleを追加しましたが、サブモジュールがリソース辞書を使用して国際化とローカライズを実現する方法がよくないことを発見しました。良い参考記事が見つからなかったので、別の方法を変更して、リソースファイルを使用して実装しました。

I.はじめにこの記事の概要
サブモジュールの国際化とローカライズの要件
- 各モジュールは独自の言語ファイルを持つ必要があります
- メインプロジェクトで動的に言語を切り替えると、サブモジュールも切り替える必要があります。
- Prismを使用してモジュール化フレームワークを実現します。すなわち、メインプロジェクトと各サブモジュールが参照関係を持たないこと、すなわち緩い結合、メインプロジェクトでサブモジュールの言語ファイルを直接切り替えることができないことが要求されます。
上記の要件に基づいて、私はまた、各モジュールModuleで言語ファイルXAMLを定義しようとしました。メインフォームが言語を切り替えるとき、モジュール言語ファイルをロードすると、対応するリソース辞書ファイルが存在しないことが常にプロンプトされます。私はイライラします。後はまだ“Accelerider.Windows”国際化の方法を参照して、リソースファイルを使用してローカライズと国際化を実現し、Xamlの方法をもつれないでください。

以下は変更後の効果です:

前のバージョンとの違い:
タイトルバーの国際化は変更されませんが、テキストバインディングが異なる方法で、効果は一貫しています。
左側には3つのサブモジュール(Home\Client\Server)が追加され、Prismを使用して動的にロードされ、メインプロジェクトのメインフォーム言語切り替えに続いて言語を切り替えます。
モジュールの作成方法、メインフォームとモジュールの国際化方法については、本当に簡単な紹介であり、具体的な実装はコードをプルすることができます。

II.はじめに3つのPrismモジュールModuleを追加
Prismテンプレートをインストールし、モジュールプロジェクトをすばやく作成できます。もちろん、. NET Coreプロジェクトを手動で作成することもできますが、いくつかのステップが追加されました(NuGetでPrism.Wpfパッケージ(7.2.0.14 2 2)をインストールする必要があります)、私はPrismテンプレートを使用してすばやく作成しました。
2.1モジュール作成前の準備作業

上の図で検索したPrismテンプレートをダウンロードし、VSを再起動すると自動的にインストールされ、新しいプロジェクトでPrismモジュールテンプレートが選択されます。

NET Coreを使用してWPFプロジェクトを作成しているため、. NET Core 3のバージョンを選択します。
2.2モジュールの作成→
以下は、作成した3つのモジュールプロジェクトのスクリーンショットです。

現在、3つのモジュールファイルの構成は類似しています。
- I 18 nResources:リソースフォルダには、3つの言語リソースファイルとT 4テンプレートファイル(言語キーを参照するため)があります。T 4テンプレートファイルは3つのモジュールとメインプロジェクトで定義されており、Githubからソースコードをダウンロードして表示することができます。
- ビュー配置ビューファイルは、メインプロジェクトのメインフォームに表示されるTabItemビュー、すなわちTabItemから継承されたMainTabItem.xamlでのみ使用されます。
- xxxxModule.cs:prism検出モジュールが使用するprismテンプレート定義ファイル。
注意すべき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);
- XXXModuleのRegisterTypesメソッドには、ビュー“MainTabItem”から“RegionNames.MainTabRegion”が登録され、メインフォームでは“RegionNames.MainTabRegion”関連モジュールビューを使用してロードが表示されます。
_regionManager.RegisterViewWithRegion(RegionNames.MainTabRegion, typeof(MainTabItem));
- UIコントロールの国際化テキストバインディング、その中でmarkupはオープンソースライブラリ名前空間を使用して、後にリンクを与えます。このプロジェクトは直接このライブラリをソリューションにロードしました。i18NResources LanguageつまりT4テンプレートファイルによって生成されたクラス、関連テキスト翻訳のKey。バインドテキスト部分コードは以下のとおりです。
<TextBlock Grid.Row="2" Text="{markup:I18n {x:Static i18NResources:Language.MainTabItm_Header}}"
III.ザ·フー主なプロジェクト
マスタープロジェクトディレクトリの組織構造は次のとおりです。

3.1 Prismモジュールの動的ロード
App.xaml.csファイルで3つのモジュールのキーコードをロードする設定は、上記のコードを見て、私はモジュールディレクトリの下に3つのモジュールを出力し、メインプロジェクトは直接このディレクトリをロードすることができ、他のロード方法は設定ファイルなどを使用して、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}"/>
メインフォームは、タブコントロールの形でサブモジュールビューを表示します。

メインプロジェクトがサブモジュールを正しくロードできるようにするには、メインプロジェクトのプロジェクトファイルも出力ディレクトリを変更する必要があります。
// 省略部分代码,下面这一行设置为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言語ファイルは削除され、resxリソースファイルに置き換えられました。3つのモジュールのリソースファイルタイプに似ています。

リソースファイルに置き換えると、編集は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;
IV.ザ·フーソースコードソース
- ソースコードアドレス、ようこそstar:https//github.com/dotnet9/TerminalMACS/tree/master/src/TerminalMACS.Manager/TerminalMACS.ManagerForWPF
V.ザ·フーリファレンス·リソース
- Prism Template Pack https//marketplace.visualstudio.com/items? itemName= Brianunas. matePack
- WPF国際化オープンソース補助ライブラリhttps//github.com/DingpingZhang/WpfExtensions
- Accelerider.Windowsサブモジュールの読み込みリファレンスオープンソースプロジェクトhttps//github.com/Accelerider/Accelerider.Windows
- Prism-Samples-Wpf(公式デモ):https://github.com/PrismLibrary/Prism-Samples-Wpf