一步一步使用ABP框架搭建正式项目系列教程之本地化详解
本篇目录
扯扯本地化 ###
本节来说说本地化,也有叫国际化、全球化的,不管怎么个叫法,反正道理都是一样的,就是一个系统具有选择多种语言的能力。比如,我们用的电脑或手机,可以在设置中选择语言,但是这并不影响系统已经具有的功能,只是显示的文字变成你所选语言的文字了。再比如说微信,功能设置里面也能选择语言,比如你选择的是英语,那么我们在中文看到的朋友圈就变成了“Moments”。
想要更详细地了解本地化的理论知识,请查看本地化文档。
其实本地化,一般来说我们用不上,因为我们大多数开发人员开发的软件还是供国人使用的,只需要中文就够了。但是也有些软件的用户是老外(虽然软件很小型),或者软件做大了,需要向国外扩张,也需要本地化,这篇文章就献给有需要的人或者想要了解一下本地化的人。
ABP中的本地化 ###
ABP提供了一个强大而又灵活的本地化系统。你可以将本地化文本存储到资源文件,XML文件,数据库,甚至自定义的数据源。接下来,逐一介绍这几种本地化。
首先从ABP官网的启动模板生成一个项目(包含了Module-zero模块),取名ABPMVCTest,截图如下:
然后,接下来就是还原Nuget包,以及更新数据库了。还不熟悉的园友,可以查看该系列之前的文章。
XML文件
首先,打开Core项目,找到本地化Localization文件夹,将下面的Source文件夹重命名为XmlSource(这里只是为了演示需要),如下所示:
然后打开Core项目的对应的Module模块文件(此处是ABPMVCTestCoreModule.cs文件),修改代码如下:
打开xml资源对应的中文文件ABPMVCTestABPMVCTest-zh-CN.xml,更改下面一句代码:
编译,生成,刷新页面,可以看到UI上显示的文本已经变成了我们更改后的文本:
此外,还要注意,Module文件中还有另一种写法,见下:
Configuration.Localization.Sources.Add(new DictionaryBasedLocalizationSource(
ABPMVCTestConsts.LocalizationSourceName,
new XmlFileLocalizationDictionaryProvider(
HttpContext.Current.Server.MapPath("~/Localization/XmlSource")
)
)
);
与上一种写法不一样的是,这种写法针对的是文件系统,需要写明资源文件的路径,而上一种写法,需要指定xml文件为可嵌入的资源。更多信息请看《ABP理论学习之本地化》。
注意:在Web项目中建立一个Localization文件夹,再在其下建立一个文件夹XmlSource,放置各类语言的Xml文件,因为Core层的MapPath方法的根目录就是Web项目的根目录。其实本人觉得,将本地化放在Web层是更为合理的,因为这本来就是跟UI相关的东西嘛,而且使用文件系统访问的方式必须将本地化资源放在web项目。
资源文件
如下图所示,在Core层的Localization文件夹下再建立一个文件夹ResSource,在该文件夹下为每种语言建立一个文件,这里只建立两个文件,一个是中文的文本本地化,以en后缀结尾的是英文文本本地化。
在Core层的Module中的PreInitialize方法中加入下面的代码:
Configuration.Localization.Sources.Add(
new ResourceFileLocalizationSource(
ABPMVCTestConsts.LocalizationSourceName,
AbpMvcTest.ResourceManager)
);
修改之后的效果(取到的就是上面资源文件定义的文本):
Json文件
Json文件也可以存储本地化的文本,和xml文件用法很相似。
首先在Localization文件夹下建立文件夹JosnSource,分别建立两个json文件,对应中文和英文的本地化资源。
然后需要在Core层的Module的PreInitialize方法中进行配置,Json文件可以存储到文件系统中,也可以内嵌到程序集中,可以参考xml文件的配置:
文件系统的json文件,配置方法如下:
因为路径问题(MapPath会到网站的根目录下去找,所以core层中的资源找不到),应该在web项目下创建json本地化资源文件。
Configuration.Localization.Sources.Add(new DictionaryBasedLocalizationSource(
ABPMVCTestConsts.LocalizationSourceName,
new JsonFileLocalizationDictionaryProvider(
HttpContext.Current.Server.MapPath("~/Localization/JsonSource")
)
)
);
内嵌在程序集中的json文件,配置方法如下:
首先将所有的json文件在属性面板中设置为“可嵌入的资源”,然后在Module中配置代码
Configuration.Localization.Sources.Add(
new DictionaryBasedLocalizationSource(
ABPMVCTestConsts.LocalizationSourceName,
new JsonEmbeddedFileLocalizationDictionaryProvider(
Assembly.GetExecutingAssembly(),
"ABPMVCTest.Localization.JsonSource"
)
)
);
效果都是一样的,效果如下:
注意:这里一定要注意Json文件的命名空间。在官方文档中,命名空间是程序集名称+json文件的层次,而我在这次实践中,应该是“默认命名空间+json文件的层次”。
数据库
要将本地化资源存储到数据库中,可以在ABP项目中添加Module-zero模块(在使用启动模板创建项目时勾选包含module-zero模块即可)。
关于使用module-zero模块将本地化资源存储到数据库的理论知识,您可以参考:《Module Zero之语言管理》
在一开始的步骤中,我们已经更新了数据库,然后数据库中就会生成下面两张跟语言相关的表AbpLanguages和AbpLanguageTexts。
AbpLanguages表用来存储应用程序支持哪些国家的语言,AbpLanguageTexts表存储的是同一个key,对应显示不同的文本。
语言也是一个实体,也需要对它进行CRUD操作,因此一般我们也需要创建一个语言管理的菜单,在语言管理的页面上对所有语言文本进行统一管理。这里只为了演示,就直接在数据库中插入两条数据(以数据库表中的截图为准),如下:
显示的效果如下:
这里需要注意一下几点:
- 在webmodule的PreInitialize中开启
Configuration.Modules.Zero().LanguageManagement.EnableDbLocalization();
- AbpLaguages表和AbpLanguageTexts表中要有数据。尤其注意AbpLanguageTexts表的TenantId,Source,LanguageName,Key这几个字段的值一定是存在的(TenantId是AbpTenants表中的值,Source是你在代码中定义的资源名称,LanguageName是AbpLaguages表的Name字段,Key是代码中使用到的L("Key")),因为这几张表之间没有外键约束,所以出错你也很难找到原因,楼主就是这样,耽误了不少时间。
- 已经存在的xml或者json本地化资源不要移除,因为这些都是次级资源或者回退资源,数据库中找不到时就去这些静态资源中去找。
- 每次更改数据库中的文本数据时,要重置你的应用程序,因为这些本地化文本都是从缓存中取得的。
小结
ABP中的本地化系统很强大、健壮。可以从静态资源中(xml文件和json文件)获得,也可以从数据库中获得,最主要的是配置很简单,我们只需要写一点儿代码(甚至一句代码)就可以搞定,最主要工作就是我们根据自己的需要添加本地化文本。这个需要我们以后专门写一个功能,来实现在界面上进行对数据库中的本地化文本进行CRUD。这里就不实现这个功能了,大家知道原理就可以了。
一步一步使用ABP框架搭建正式项目系列教程之本地化详解的更多相关文章
- 一步一步使用ABP框架搭建正式项目系列教程
研究ABP框架好多天了,第一次看到这个框架的名称到现在已经很久了,但由于当时内功有限,看不太懂,所以就只是大概记住了ABP这个名字.最近几天,看到了园友@阳光铭睿的系列ABP教程,又点燃了我内心要研究 ...
- 关于使用ABP框架搭建的项目升级时需要注意的问题汇总
ABP理论学习总目录 一步一步使用ABP框架搭建正式项目系列教程 ABP之Module-Zero学习目录 本篇目录 说明 升级方法 问题_01:Log4Net导致编译不成功 2015/12/18更新 ...
- ABP框架搭建项目系列教程基础版完结篇
返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 经过前面十二篇的基础教程,现在终于该做个总结了. 回顾 第一篇,我们建议新手朋友们先通过ABP官网的启动模板生成解决方案,因为这样 ...
- NET使用ABP框架搭建项目
NET使用ABP框架搭建博客项目(一) 有很多学NET开发的小伙伴建项目都比较茫然,我用什么开发?我都使用什么框架?我怎么起名字?种种问题,让一些低等.中等的工程师(甚至是高级工程师)很烦躁. 推荐一 ...
- 如何用ABP框架快速完成项目(面向项目交付编程面向客户编程篇)(1) - 目录
昨天发表了<如何用ABP框架快速完成项目 - 自动化测试 - 前端angular e2e protractor>后,大家十分热情,几个小时内就收到了不少问题,包括: 对于ui自动化测试这方 ...
- 如何用ABP框架快速完成项目 - 自动化测试 - 前端angular e2e protractor
要想快速完成一个项目, 自动化是很关键很有用的一块. 自动化测试比人工测试快很多. 特别是在回归测试中. 实践证明, 虽然投入了时间在写自动化测试代码上, 但是在回归测试中节省了大量的时间,同时及时发 ...
- webapi框架搭建-创建项目(二)-以iis为部署环境的配置
上篇:webapi快速框架搭建-创建项目(一) 在"创建项目(一)"这一篇里已经创建了一个空的项目,但项目上什么都没有,本篇描述如何将webapi配置成部署在iis上. 步骤 用n ...
- 如何用ABP框架快速完成项目(4) - 如何正确使用ABP?
正如我在<如何用ABP框架快速完成项目(2) - 快的定义!>提到的, 很多同学在使用ABP中遇到很多问题, 花了很多时间和精力, 然而从最根本的角度和方向上来看这些问题应该是不存在. 这 ...
- 如何用ABP框架快速完成项目(8) - 用ABP一个人快速完成项目(4) - 能自动化就不要手动 - 使用自动化测试(BDD/TDD)
做为一个程序员, 深深知道计算机自动化的速度是比人手动的速度快的, 所以”快速”完成项目的一个重要武器就是: 能自动化就不要手动. BDD/TDD有很多优势, 其中之一就是自动化, 我们这节文章先 ...
随机推荐
- 前端css兼容性与易混淆的点
一.常用的骨灰级清除浮动 .clearfix:after { content: "."; display: block; height:; clear: both; visibil ...
- C++实现线程安全的单例模式
在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...
- 搞个这样的APP要多久?
这是一个“如有雷同,纯属巧合”的故事,外加一些废话,大家请勿对号入座.开始了…… 我有些尴尬地拿着水杯,正对面坐着来访的王总,他是在别处打拼的人,这几年据说收获颇丰,见移动互联网如火如荼,自然也想着要 ...
- ABP文档 - 本地化
文档目录 本节内容: 简介 应用语言 本地化源 XML文件 注册XML本地化源 JSOn文件 注册JSON本地化源 资源文件 自定义源 获取一个本地文本 在服务端 在MVc控制器里 在MVC视图里 在 ...
- hadoop 2.7.3本地环境运行官方wordcount
hadoop 2.7.3本地环境运行官方wordcount 基本环境: 系统:win7 虚机环境:virtualBox 虚机:centos 7 hadoop版本:2.7.3 本次先以独立模式(本地模式 ...
- 前端学HTTP之报文首部
前面的话 首部和方法配合工作,共同决定了客户端和服务器能做什么事情.在请求和响应报文中都可以用首部来提供信息,有些首部是某种报文专用的,有些首部则更通用一些.本文将详细介绍HTTP报文中的首部 结构 ...
- SDWebImage源码解读之SDWebImageCache(上)
第五篇 前言 本篇主要讲解图片缓存类的知识,虽然只涉及了图片方面的缓存的设计,但思想同样适用于别的方面的设计.在架构上来说,缓存算是存储设计的一部分.我们把各种不同的存储内容按照功能进行切割后,图片缓 ...
- Kooboo CMS技术文档之四:Kooboo CMS的站点组成部分
Kooboo CMS本着功能独立分离的原则,将站点分为三部分组成:用户管理,站点管理和内容数据库管理.各个功能之间既可独立使用,也可以容易组成在一起形成一个完整的系统. 用户管理 管理整个系统内的用户 ...
- 简单酷炫的canvas动画
作为一个新人怀着激动而紧张的心情写了第一篇帖子还请大家多多支持,小弟在次拜谢. 驯鹿拉圣诞老人动画效果图如下 html如下: <div style="width:400px;heigh ...
- BI分析受阻?FineBI推出SPA螺旋式分析新功能!
过去,企业级的数据分析通常会有这么几种场景,业务部门托信息部门分析数据,结果报表一出,唇枪舌剑争论你我高低,数据不准,指标不对.信息部门欠缺业务概念,业务部门不懂技术逻辑,数据分析之路,暂时搁浅. 后 ...