日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

怎样实现WPF Prism Module的国际化和本地化?

發布時間:2023/12/4 asp.net 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 怎样实现WPF Prism Module的国际化和本地化? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

English?| 簡體中文

上一篇有簡單介紹主工程的國際化,使用的資源字典(XAML)實現的。這幾天我添加了幾個Prism模塊(Module),發現子模塊使用資源字典的方式實現國際化和本地化不好做,沒有找到比較好的參考文章,所以換了一種方式,使用資源文件實現了。

讓WPF項目走上國際化路線

一、本文概述

子模塊的國際化和本地化要求:

  • 各模塊需要有自己單獨的語言文件。

  • 在主工程中動態切換語言時,子模塊也需要跟著切換。

  • 使用了Prism實現模塊化框架,即要求主工程與各子模塊不能有引用關系,即松耦合,不能直接在主工程中切換子模塊的語言文件。

基于上面的要求,我嘗試在各模塊(Module)中也定義了語言文件(XAML),主窗體切換語言時,加載模塊語言文件老是提示不存在對應的資源字典文件,我惱火呀,后面還是參考“Accelerider.Windows”國際化的方式,使用資源文件實現本地化和國際化了,不糾結Xaml的方式了,唉。

此路不通,我換條路走

下面是修改后的效果:

和上一版異同:

  • 標題欄國際化無變化,只是文字綁定換了種方式,實現效果一致。

  • 左側添加了三個子模塊(Home\Client\Server),使用Prism動態加載的,并且跟隨主工程主窗體語言切換而切換語言。

下面簡單介紹怎么創建模塊,以及主窗體和模塊國際化怎么做的,真的是很簡單的介紹,具體的實現可以拉代碼看看。

跌到,爬起來,繼續趟坑

二、 添加三個Prism模塊(Module)

可安裝Prism模板,快速創建模塊工程,當然手工創建.Net Core工程也是可以的,就是多了幾個步驟而已(需要用Nuget安裝Prism.Wpf包(7.2.0.1422)),我使用得的Prism模板快速創建的。

2.1 創建模塊之前的準備工作

VS2019下載Prism模板

下載上圖搜索到的Prism模板,重啟VS,它會自動安裝,新建項目時,就有Prism模塊模板選擇了:

Prism模板工程

注意要選擇.NET Core 3的版本,因為我是使用.NET Core創建的WPF項目。

2.2 創建模塊

下面是已經創建好的三個模塊工程截圖:

目前三個模塊文件組織結構類似:

  • I18nResources:資源文件夾,放3個語言資源文件和一個T4模板文件(用于引用語言Key),其中T4模板文件在3個模塊和主工程中定義是一樣的,具體可從github下載源碼查看。

  • Views放置視圖文件,現在只使用到了主工程主窗體中顯示的TabItem視圖,即MainTabItem.xaml,繼承自TabItem。

  • xxxxModule.cs:prism模板定義文件,prism發現模塊使用。

三個模塊關鍵點需要注意:

  • 1. 編輯模塊工程文件,修改模塊文件輸出目錄:

//?省略部分代碼,下面這一行設置為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>?? //?省略部分代碼
  • 2. XXXModule中需要將資源文件的ResourceManager引用添加到另一個庫中保存,待切換語言時需要使用,如在HomeModule的構造函數中添加代碼如下,只添加這一句代碼就好,模塊的國際化及本地化就算完事了:

I18nManager.Instance.Add(TerminalMACS.Home.I18nResources.UiResource.ResourceManager);
  • 3. XXXModule的RegisterTypes方法中注冊視圖"MainTabItem"到"RegionNames.MainTabRegion",主窗體使用"RegionNames.MainTabRegion"關聯模塊視圖顯示加載。

_regionManager.RegisterViewWithRegion(RegionNames.MainTabRegion,?typeof(MainTabItem));
  • 4. UI控件國際化文字綁定,其中markup使用的一個開源庫命名空間,后面會給出鏈接,本項目直接將該庫加載進了解決方案中;i18NResources:Language即T4模板文件生成的類,關聯文字翻譯的Key。綁定文字部分代碼如下:

<TextBlock?Grid.Row="2"?Text="{markup:I18n?{x:Static?i18NResources:Language.MainTabItm_Header}}"

三、 主工程

主工程目錄組織結構如下:

3.1 動態加載Prism模塊

配置加載3個模塊的關鍵代碼在App.xaml.cs文件中,看上面的代碼,我將三個模塊輸出到了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的控件形式展示子模塊視圖:

子模塊的TabItem視圖

主工程要能正常加載子模塊,主工程的工程文件也需要修改其輸出目錄:

//?省略部分代碼,下面這一行設置為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的資源文件,和三個模塊的資源文件類型類似,下面是主工程的資源文件:

資源文件作為語言文件使用

替換成資源文件,編輯是要比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;

四. 源碼

關于
  • 源碼地址,歡迎star:https://github.com/dotnet9/TerminalMACS/tree/master/src/TerminalMACS.Manager/TerminalMACS.ManagerForWPF

  • 官方網站:https://terminalmacs.com

  • 合作網站:https://dotnet9.com

四. 參考資料

  • Prism Template Pack(Prism模板):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(官方Demo):https://github.com/PrismLibrary/Prism-Samples-Wpf

總結

以上是生活随笔為你收集整理的怎样实现WPF Prism Module的国际化和本地化?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。