一步一步使用ABP框架搭建正式项目系列教程之本地化详解

返回总目录《一步一步使用ABP框架搭建正式项目系列教程》


本篇目录

  • 扯扯本地化
  • ABP中的本地化
  • 小结

扯扯本地化

本节来说说本地化,也有叫国际化、全球化的,不管怎么个叫法,反正道理都是一样的,就是一个系统具有选择多种语言的能力。比如,我们用的电脑或手机,可以在设置中选择语言,但是这并不影响系统已经具有的功能,只是显示的文字变成你所选语言的文字了。再比如说微信,功能设置里面也能选择语言,比如你选择的是英语,那么我们在中文看到的朋友圈就变成了“Moments”。

一步一步使用ABP框架搭建正式项目系列教程之本地化详解
一步一步使用ABP框架搭建正式项目系列教程之本地化详解

想要更详细地了解本地化的理论知识,请查看本地化文档

其实本地化,一般来说我们用不上,因为我们大多数开发人员开发的软件还是供国人使用的,只需要中文就够了。但是也有些软件的用户是老外(虽然软件很小型),或者软件做大了,需要向国外扩张,也需要本地化,这篇文章就献给有需要的人或者想要了解一下本地化的人。

ABP中的本地化

ABP提供了一个强大而又灵活的本地化系统。你可以将本地化文本存储到资源文件,XML文件,数据库,甚至自定义的数据源。接下来,逐一介绍这几种本地化。

首先从ABP官网的启动模板生成一个项目(包含了Module-zero模块),取名ABPMVCTest,截图如下:

一步一步使用ABP框架搭建正式项目系列教程之本地化详解

然后,接下来就是还原Nuget包,以及更新数据库了。还不熟悉的园友,可以查看该系列之前的文章。

XML文件

首先,打开Core项目,找到本地化Localization文件夹,将下面的Source文件夹重命名为XmlSource(这里只是为了演示需要),如下所示:
一步一步使用ABP框架搭建正式项目系列教程之本地化详解

然后打开Core项目的对应的Module模块文件(此处是ABPMVCTestCoreModule.cs文件),修改代码如下:

一步一步使用ABP框架搭建正式项目系列教程之本地化详解

打开xml资源对应的中文文件ABPMVCTestABPMVCTest-zh-CN.xml,更改下面一句代码:

一步一步使用ABP框架搭建正式项目系列教程之本地化详解

一步一步使用ABP框架搭建正式项目系列教程之本地化详解

编译,生成,刷新页面,可以看到UI上显示的文本已经变成了我们更改后的文本:

一步一步使用ABP框架搭建正式项目系列教程之本地化详解

此外,还要注意,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后缀结尾的是英文文本本地化。
一步一步使用ABP框架搭建正式项目系列教程之本地化详解

在Core层的Module中的PreInitialize方法中加入下面的代码:

  Configuration.Localization.Sources.Add(
                    new ResourceFileLocalizationSource(
                         ABPMVCTestConsts.LocalizationSourceName,
                        AbpMvcTest.ResourceManager)
            );

修改之后的效果(取到的就是上面资源文件定义的文本):

一步一步使用ABP框架搭建正式项目系列教程之本地化详解

Json文件

Json文件也可以存储本地化的文本,和xml文件用法很相似。
首先在Localization文件夹下建立文件夹JosnSource,分别建立两个json文件,对应中文和英文的本地化资源。

一步一步使用ABP框架搭建正式项目系列教程之本地化详解

然后需要在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"
             )
         )
     );

效果都是一样的,效果如下:

一步一步使用ABP框架搭建正式项目系列教程之本地化详解

注意:这里一定要注意Json文件的命名空间。在官方文档中,命名空间是程序集名称+json文件的层次,而我在这次实践中,应该是“默认命名空间+json文件的层次”。

数据库

要将本地化资源存储到数据库中,可以在ABP项目中添加Module-zero模块(在使用启动模板创建项目时勾选包含module-zero模块即可)。

关于使用module-zero模块将本地化资源存储到数据库的理论知识,您可以参考:《Module Zero之语言管理

在一开始的步骤中,我们已经更新了数据库,然后数据库中就会生成下面两张跟语言相关的表AbpLanguages和AbpLanguageTexts。

一步一步使用ABP框架搭建正式项目系列教程之本地化详解

AbpLanguages表用来存储应用程序支持哪些国家的语言,AbpLanguageTexts表存储的是同一个key,对应显示不同的文本。

语言也是一个实体,也需要对它进行CRUD操作,因此一般我们也需要创建一个语言管理的菜单,在语言管理的页面上对所有语言文本进行统一管理。这里只为了演示,就直接在数据库中插入两条数据(以数据库表中的截图为准),如下:

一步一步使用ABP框架搭建正式项目系列教程之本地化详解

一步一步使用ABP框架搭建正式项目系列教程之本地化详解

显示的效果如下:
一步一步使用ABP框架搭建正式项目系列教程之本地化详解

一步一步使用ABP框架搭建正式项目系列教程之本地化详解

这里需要注意一下几点:

  • 在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官网(www.aspnetb ...
  • 关于使用ABP框架搭建的项目升级时需要注意的问题汇总
    ABP理论学习总目录 一步一步使用ABP框架搭建正式项目系列教程 ABP之Module-Zero学习目录 本篇目录 说明 升级方法 问题_01:Log4Net导致编译不成功 2015/12/18更新 问题_02:升级V0.7.5.0 Abp等程序集后需要改的几个类 2015/12/18 更新 问题_ ...
  • 返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 经过前面十二篇的基础教程,现在终于该做个总结了. 第一篇,我们建议新手朋友们先通过ABP官网的启动模板生成解决方案,因为这样既快速又准确,不会因为项目的搭建,而让新手畏而却步. 第二篇,我们说了实体类的创建,这是放在核心层(Cor ...
  • mysql主从复制搭建中几种log和pos详解
    一.主从原理 Replication 线程   Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql instance(我们称之 Slave).在Master 与 Slave 之间的实现整个复制过程主要由三 ...
  • 在Eclipse中使用Struts和Hibernate框架搭建MavenWeb项目
    前言 学习使用Java还是2012年的事情,刚开始学习的Java的时候,使用的是MyEclipse工具和SSH框架.初学者适合使用MyEclipse,因为他将struts.Spring和Hibernate等框架集成在IDE中,可以直接通过添加Capacities将这些框架集成到Web Project ...
  • 这几天因为要做一个项目,需要可以对Web应用中通用功能进行封装,其中一个很重要的涉及到了对用户.角色和权限部分的灵活管理.所以基于TP框架自己封装了一个对操作权限和菜单权限进行灵活配置的可控制模式. RBAC角色权限分配模式大家或许都不陌生,其重要的访问控制原理就是将权限基于角色进行动态分配,在一个 ...
  • Android开源框架Universal-Image-Loader完全解析二---图片缓存策略详解
    本篇文章继续为大家介绍Universal-Image-Loader这个开源的图片加载框架,介绍的是图片缓存策略方面的,如果大家对这个开源框架的使用还不了解,大家可以看看我之前写的一篇文章Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用, 我们一 ...
  • J2EE环境的搭建之二—oracle的安装与详解
    (2)指定产品清单的存放位置(将用于卸载和添加组件)和安装用户组,如下图所示,然后点击"next"继续.(3)选择安装类型:如下图 所示,在安装类型中选择企业版,然后点击"Next"继续.(4)指定主目录:指定Oracle 数据库的主目录名称和路径,如下图所示 ...
一周排行
  • <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><t ...
  • 普通哈希: var x = hash(dataKey) % N 一致性哈希: 将数据的key的hashcode与存放数据的节点(如缓存节点)的IP(或服务器名)的hashcode都分布到同一个环形数值空间,比如0~2 ...
  •    (一)短信发送    短信通常都是由第三方服务商提供的服务,对于其稳定性与可靠度来说,通常也就是打90分吧.对于那些需要发送短信的应用程序来说,通常将其放入队列中去处理,而不是傻傻的等待.    (二)日志记录 ...
  •     估计和规划在软件开发中是必不可少的活动,那敏捷方式下我们如何做呢?以下是今年5月份内部做的一个培训PPT,希望对大家有所帮助.敏捷个人俱乐部QQ群:40961321  加入敏捷个人俱乐部QQ群说明敏捷个人线上 ...
  • angular开发者吐槽react+redux的复杂:一个demo证明你的开发效率低下
    曾经看到一篇文章,写的是jquery开发者吐槽angular的复杂.作为一个angular ...
  • 自己的创建的一个不错的博客: http://zzljz.lofter.com/
  • foreach的一点理解
    首先什么样的数据才能实现foreach  1 实现IEnumerable这个接口 2 有G ...
  • 目前从国内来看,比较知名的,适合前端程序员使用的游戏框架,基本是 egret 和cocos2d-js;刚好两个框架都学习了下, egret的是最近兴起的一个框架主要使用TypeScript.js语言做为开发语言.Ty ...
  • HttpLib-一个对Http协议进行封装的库
    今日,在 Codeplex 上看到一个开源项目,对 Http 协议进行了封装,这下可以方便 ...
  • Windows Phone 7开发工具包(Windows Phone Developer Tools RTW)下载地下:http://www.microsoft.com/download/en/details.asp ...