语言管理

介绍

ASP.NET Boilerplate定义了一个强大的UI  本地化系统  ,该系统在服务器端和客户端都使用。它允许我们轻松配置应用程序语言并在不同的源中定义本地化文本(字符串)(资源文件和XML文件是两个预定义的源)。

虽然它对大多数情况都有好处,但我们可能希望动态地在数据库上定义语言和文本。Module Zero允许我们动态管理每个租户的应用程序语言和文本。

关于本地化

我们强烈建议您阅读本文档  之前的  本地化文档。

如何启用

启动模板

如果您从启动模板创建项目,则  可以跳过此部分,因为模板默认启用了基于数据库的本地化。如果您在此功能之前创建了项目,请阅读此内容以便为您的应用程序启用它。

数据库本地化旨在向后兼容ASP.NET Boilerplate现有的本地化系统。它实际上用MultiTenantLocalizationSource替换了所有现有的基于字典的本地化源。

MultiTenantLocalizationSource包装现有的基于DictionaryBasedLocalizationSource的源。我们通常包装  基于XML的本地化  源。它无法包装资源文件源,因为资源文件被设计为硬编码和静态文件,这些文件不适合动态本地化。

由于它是一个包装器,如果文本未在数据库中本地化,则底层XML文件将用作回退源。它可能看起来很复杂,但它很容易为您的应用程序实现。让我们看看如何启用基于数据库的本地化。

EnableDbLocalization

首先,我们启用它:

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

这应该在顶级模块的  PreInitialize  方法中完成(它是Web应用程序的Web模块。导入Abp.Zero.Configuration命名空间(使用Abp.Zero.Configuration)以查看Zero()扩展方法)。

这种配置可以实现所有的魔力,但我们必须添加更多代码才能使其正常工作。

种子数据库语言

由于ABP将从数据库中获取语言列表,因此我们必须在其中插入默认语言。如果您正在使用EntityFramework,则可以  使用此种子代码

删除静态语言配置

如果您具有如下所示的静态语言配置,则可以从配置代码中删除这些行,因为它们将从数据库中获取语言。

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

关于现有XML本地化源的注意事项

不要删除XML本地化文件和源配置代码。这些文件用作后备源,所有本地化密钥都是从此源获取的。

因此,当您需要新的本地化文本时,请像正常情况一样将其定义到XML文件中。您必须至少在默认语言的XML文件中定义它。注意:您无需将本地化文本的默认值添加到数据库迁移代码中。

管理语言

注入 IApplicationLanguageManager接口   并用于管理语言。它具有GetLanguagesAsync,AddAsync,RemoveAsync,UpdateAsync等方法来管理主机和租户的语言。

语言列表逻辑

每个租户和主机存储语言列表,计算方法如下:

ApplicationLanguage实体

ApplicationLanguage实体表示租户或主机的语言。

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

它的基本属性是:

ApplicationLanguage还继承自FullAuditedEntity。这意味着它是一个软删除实体并自动审核( 有关详细信息,请参阅  实体文档)。

ApplicationLanguage实体存储在数据库的AbpLanguages表中。

管理本地化文本

注入 IApplicationLanguageTextManager接口   并用于管理本地化文本。它具有获取/设置租户或主机的本地化文本所需的方法。

本地化文本

让我们看看当你想要本地化文本时会发生什么;

获取本地化文本有点复杂,但由于它使用缓存,因此速度很快  

ApplicationLanguageText实体

ApplicationLanguageText实体用于在数据库中存储本地化值。

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

它的基本属性是;

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

nidie.com.cn - 用心与你沟通