ModuleZero之语言管理

返回《Module Zero学习目录》


  • 概览介绍
  • 如何开启
  • 管理语言
  • 管理本地化文本

概览介绍

ABP定义了一个健壮的UI本地化系统,它可用于服务端和客户端。它允许在不同的资源中(Resource文件和XML文件是两种预定义的资源)轻松地配置应用语言以及定义本地化文本(字符串)。

虽然这对于大多数情况是没问题的,但是我们可能想要将语言和文本动态地定义到数据库中。Module-zero允许我们动态地管理每个租户的应用语言和文本。

如何开启

启动模板

如果你是从ABP官网的启动模板创建的项目,那么你可以跳过本节。因为该模板自带的基于数据库的本地化默认是开启的。如果你在这个特征之前创建了项目,那么请通过阅读本节来为你的应用开启此功能。

基于数据库的本地化是为了向后兼容ABP中已存在的本地化系统而设计的。它实际上取代了所有基于MultiTenantLocalizationSource本地化资源的字典。

MultiTenantLocalizationSource包装了基于资源的DictionaryBasedLocalizationSource。因此,我们一般包装基于XML的本地化资源。它可能不会包装Resource文件资源,因为resource文件是为硬编码设计的,而且静态文件也不适合动态本地化。

因为它是一个包装器,所以如果一个文本没有在数据库中本地化,那么潜在的XML文件就会用作回退资源(我理解为xml文件就是退而求其次的资源,也就是优先级小于数据库资源)。可能看着很复杂,但是对于你的应用实现起来很简单。下面让我们看一下如何开启基于数据库的本地化。

开启数据库本地化(EnableDbLocalization)

首先要开启它:

Configuration.Modules.Zero().LanguageManagement.EnableDbLocalization();

这一步应该在高级别的模块中的PreInitialize方法中完成(对于Web应用,它是web module。导入Abp.Zero.Configuration命名空间查看Zero()扩展方法)。

实际上,该配置使得一切变得富有魔力。但是,我们应该多做一点来使它更合适地工作。

种子数据库语言

因为ABP会从数据库中获得所有的语言列表,因此我们应该将默认的语言插入数据库。如果你正在使用的是EF,那么你可以像这里一样使用种子代码。

移除静态的语言配置

如果你使用了像下面一样的静态语言配置,那么你可以删除它们,因为以后会从数据库中获得它们。

Configuration.Localization.Languages.Add(new LanguageInfo("en", "English", "famfamfam-flag-england", true));

注意已存在的XML本地化资源

不要删除XML本地化资源和资源配置代码。因为如果数据库中没有相应的资源的话,这些文件会用作回退资源,并且所有的本地化键值会从这些资源中获得。

这样,当你需要一个新的本地化文本时,你可以像往常一样将它定义到XML文件中。你至少应该将它定义到默认语言的XML文件中。也只有这样,你才不用将默认的本地化文本的值添加到数据库迁移代码中。

管理语言

可以将接口IApplicationLanguageManager进行注入,然后使用它管理语言。该接口有诸如GetLanguagesAsync ,AddAsync,RemoveAsync,UpdateAsync...的方法,可以用来管理租主和租户的语言。

语言列表逻辑

语言列表为每个租户和租主单独存储和计算,如下:

  • 存在一个为租主定义的语言列表。该列表对所有租户都是默认的。
  • 存在为每个租户独立的语言列表。该列表继承了租主的语言列表,并加入了租户特定的语言。租户可以不删除或更新租主定义(默认)的语言(但是可以重写本地化文本,后面会看到)。

应用语言实体(ApplicationLanguage Entity)

应用语言实体表示了一个租户或租主的语言。

[Serializable]
[Table("AbpLanguages")]
public class ApplicationLanguage : FullAuditedEntity, IMayHaveTenant
{
    //...
}

基本属性有:

  • TenantId(nullable):如果该语言是特定租户的,那么该属性就包含相关的租户Id。如果该语言是租主的,那么就是null。
  • Name:语言的名字。该属性必须是来自这里的列表里的文化代码
  • DisplayName:该语言的展示名称。可以是任意的名字,一般是CultureInfo.DisplayName
  • Icon:该语言的一个任意图标或旗帜。这个可用于在UI上展示该语言的旗帜。

而且,应用语言实体继承了FullAuditedEntity。这意味着,它是一个软删除且自动 审计的实体。
应用语言实体存储在数据库中的AbpLanguages表中。

管理本地化文本

可以通过注入IApplicationLanguageTextManager接口来管理本地化文本。该接口拥有为一个租户或租主获取或设置本地化文本需要的方法。

使文本本地化

当你想要本地化一个文本时,让我们看一下发生了什么:

  • 尝试获取当前文化(使用CurrentThread.CurrentUICulture获得)。
    • 检查给定的文本在数据库中是否以当前的文化当前的租户(使用IAbpSession.TenantId获得)已经定义(或重写)。如果定义了就返回该值。
    • 然后检查给定的文本在数据库中是否以当前的文化为该租主已定义(或重写)。如果定义了就返回该值。
    • 然后检查给定的文本是否以当前的文化在潜在的XML文件中已经定义。若定义则返回该值。
  • 尝试找出该回退文化。它是这样计算的:如果当前文化是“en-GB”,那么回退文化就是“en”。
    • 检查给定的文本在数据库中是否以回退文化当前的租户(使用IAbpSession.TenantId获得)已经定义(或重写)。如果定义了就返回该值。
    • 然后检查给定的文本在数据库中是否以回退文化为该租主已定义(或重写)。如果定义了就返回该值。
    • 然后检查给定的文本是否以回退文化在潜在的XML文件中已经定义。若定义则返回该值。
  • 尝试找出默认的文化
    • 检查给定的文本在数据库中是否以默认的文化当前的租户(使用IAbpSession.TenantId获得)已经定义(或重写)。如果定义了就返回该值。
    • 然后检查给定的文本在数据库中是否以默认的文化为该租主已定义(或重写)。如果定义了就返回该值。
    • 然后检查给定的文本是否以默认的文化在潜在的XML文件中已经定义。若定义则返回该值。
  • 获得相同的文本或者抛出异常
    • 如果给定的文本(或键值)压根没有找到,那么ABP会抛出异常或者返回相同的使用[and]包装的文本(或键值)。(可以在启动时配置,详情查看

因此,获得一个本地化的文本有点复杂。但是它运行起来很快,因为它使用了缓存(cache)。

应用语言文本实体(ApplicationLanguageText Entity)

在数据库中,应用语言文本实体存储了本地化的值。

[Serializable]
[Table("AbpLanguageTexts")]
public class ApplicationLanguageText : AuditedEntity<long>, IMayHaveTenant
{
    //...
}

它的基本的属性是:

  • TenantId(nullable):若该本地化的文本是特定租户的,那么它包含了与之相关的租户的Id。如果这是租主本地化的文本,那么该值为null。
  • LanguageName:语言的名称。该属性必须是来自这里的列表里的文化代码。这个和ApplicationLanguage.Name是匹配的,但是没有强制的外键从而使它独立于语言实体。IApplicationLanguageTextManager会合适地对它处理。
  • Source:本地化资源名称。
  • Key:本地化文本的Key或者名称。
  • Value:本地化的值。

ApplicationLanguageText实体存储在数据库中的“AbpLanguageTexts ”表。

更多相关文章
  • 返回<Module Zero学习目录> 开启多租户 租户实体 租户管理者 默认租户 开启多租户 ABP和Module-Zero可以运行多租户或单租户模式.多租户默认是禁用的.我们可以在module类中的PreInitialize方法中开启它,如下所示: [DependsOn(typeof ...
  • 返回<Module Zero学习目录> 角色实体 角色管理者 多租户 角色实体 角色实体代表了该应用的一个角色.它应该派生自AbpRole类,如下所示: public class Role : AbpRole<Tenant, User> { //这里添加你自定义的角色属性 } ...
  • 返回<Module Zero学习目录> 概览介绍 角色权限 用户权限 概览介绍 Module-Zero实现了ABP授权系统的IPermissionChecker接口.这篇文章中,我们将会看到如何给角色和用户授予权限.要定义和检查权限,请转至<ABP理论学习之授权(Authoriza ...
  • 返回<Module Zero学习目录> 用户实体 用户管理者 用户认证 用户实体 用户实体代表应用的一个用户,它派生自AbpUser类,如下所示: public class User : AbpUser<Tenant, User> { //这里添加你自己的用户属性 } 这个类 ...
  • Module-Zero是实现了ASP.NET Boilerplate框架抽象概念的模块,对于企业web应用也添加了一些有用的东西: 实现了ASP.NET Identity框架的用户和角色管理. 提供了基于授权(authorization)系统的角色和权限管理. 提供了开发多租户(multi-tena ...
  • 在Windows8中手动安装语言包
    Windows 8 消费者预览版让我们看到了微软的巨大决心,除了 Metro 界面以外,Windows 中传统的组件也在默默的发生着进化,相信大家对此或多或少都有体会.例如,Windows 8 消费者预览版中,语言管理方面就进行了很好的改进,将以前分散的输入法设置.手写识别设置.界面语言设置统一整合 ...
  • [软件简介]陈灯可重用代码段管理器为一款个人软件作品,其可作为一款个人和团队内部的代码段管理软件使用,实现了可重用代码段的入库.搜索和共享等功能.软件具有代码高亮度显示.类似Google的搜索功能.类似Google的智能搜索框.搜索词导航以及局域网内多人可并发使用等优点.同时软件包括插件版本和桌面版 ...
  • 陈灯可重用代码段管理器VS插件版4.0发布
    [软件简介]    陈灯可重用代码段管理器为一款个人软件作品,其可作为一款个人和团队内部的代码段管理软件使用,实现了可重用代码段的入库.搜索和共享等功能.  软件包括桌面版本和插件版本两种版本,桌面版本为独立的应用程序,不与IDE集成,使用范围更加广泛,目前最新版本为2.3:插件版本集成在Visua ...
一周排行
  •          云计算是当前最炙手可热的IT技术之一,本人自然对云计算也是趋之若鹜.可惜由于机缘不巧,一直对云计算未能亲身体验一番,只能是水中望月,雾里看花,甚是遗憾啊.最近腾出些时间,正想好好体验一把云计算,只是 ...
  • 英文原文:Career Path of a Programmer许多编程的职位都会到达最高峰,并开始衰落--这是很多程序员不想面对的,但却是一个不争的事实.这之后再找一份程序员的工作会变得越来越难,很多人发现这个事实 ...
  • 静态路由主要有以下几种用途:在不会显著增长的小型网络中,使用静态路由便于维护路由表.静态路由可以路由到末节网络,或者从末节网络路由到外部(请参阅第 2 章).使用单一默认路由.如果某个网络在路由表中找不到更匹配的路由 ...
  • 详解Ossim4.3控制台
    在Ossim 4.2以后的发行版中增加了控制台功能下面加以详细说明,当Ossim 启动之后 ...
  • 绝对值:select abs(X); //求绝对值返回圆周率:selectpi();平方根:select  sqrt(X);  //求平方根求余函数:select  mode(x,y); //x被y除后的余数获取整数 ...
  •   先假设有一FTP服务器,FTP服务器:qint.ithot.net,用户名:username 密码:user1234.在本地电脑D:盘创建一个文件夹"qint".将要上传的文件复制到d:\qi ...
  • 使用asp.net 中使用Excel时遇到的问题:1. 访问权限    冲Perforce上用GET Lasted Version的方式获取的源码,都是readonly. 当直接运行程序访问readonly的exce ...
  • 目前流行的源程序版本管理软件和项目管理软件:Microsoft TFS,Github,SVN,Coding 各自的优缺点:Microsoft TFS:优点:任务版上能将需求.项目进度一览无余,对于小团队而言,比甘特图 ...
  • 根据需求现在需要测试mysql主从配置,但是由于本地主机资源有限,现在需要在一台centos主机上面搭建两到三个Mysql实例,以方便测试mysql主从.   实验分三大步骤:   1,在Centos上面安装MySQ ...
  • AzurePack之SCVMM虚拟机WindowsServer2003模版
    AzurePack经过测试支持的独立虚拟机来宾系统有:[非官方确认]今天对WindowsS ...