红音,五福到,qq输入法纯净版
english | 简体中文
上一篇有简单介绍主工程的国际化,使用的资源字典(xaml)实现的。
这几天我添加了几个prism模块(module),发现子模块使用资源字典的方式实现国际化和本地化不好做,没有找到比较好的参考文章,所以换了一种方式,使用资源文件实现了。
子模块的国际化和本地化要求:
基于上面的要求,我尝试在各模块(module)中也定义了语言文件(xaml),主窗体切换语言时,加载模块语言文件老是提示不存在对应的资源字典文件,我恼火呀,后面还是参考“accelerider.windows”国际化的方式,使用资源文件实现本地化和国际化了,不纠结xaml的方式了,唉。
下面是修改后的效果:
和上一版异同:
下面简单介绍怎么创建模块,以及主窗体和模块国际化怎么做的,真的是很简单的介绍,具体的实现可以拉代码看看。
可安装prism模板,快速创建模块工程,当然手工创建.net core工程也是可以的,就是多了几个步骤而已(需要用nuget安装prism.wpf包(7.2.0.1422)),我使用得的prism模板快速创建的。
下载上图搜索到的prism模板,重启vs,它会自动安装,新建项目时,就有prism模块模板选择了:
注意要选择.net core 3的版本,因为我是使用.net core创建的wpf项目。
下面是已经创建好的三个模块工程截图:
目前三个模块文件组织结构类似:
三个模块关键点需要注意:
// 省略部分代码,下面这一行设置为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> // 省略部分代码
i18nmanager.instance.add(terminalmacs.home.i18nresources.uiresource.resourcemanager);
_regionmanager.registerviewwithregion(regionnames.maintabregion, typeof(maintabitem));
<textblock grid.row="2" text="{markup:i18n {x:static i18nresources:language.maintabitm_header}}"
主工程目录组织结构如下:
配置加载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的控件形式展示子模块视图:
主工程要能正常加载子模块,主工程的工程文件也需要修改其输出目录:
// 省略部分代码,下面这一行设置为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> // 省略部分代码
删除了原有的xaml语言文件,替换为resx的资源文件,和三个模块的资源文件类型类似,下面是主工程的资源文件:
替换成资源文件,编辑是要比xaml文件要方便点,起初是有考虑使用资源文件实现国际化的,作死想尝试xaml文件。
动态切换语言的关键代码改为:
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;
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Blazor server side 自家的一些开源的, 实用型项目的进度之 CEF客户端
.NET IoC模式依赖反转(DIP)、控制反转(Ioc)、依赖注入(DI)
vue+.netcore可支持业务代码扩展的开发框架 VOL.Vue 2.0版本发布
网友评论