[Abp 源码分析]十三、多语言(本地化)处理 (2)

那么如果我们需要注册之前的两个 XML 资源到 Abp 框架当中的话,则需要在预加载模块处通过如下代码来执行注册,并且需要右键 XML 文件,更改其构建操作为 内嵌资源

[Abp 源码分析]十三、多语言(本地化)处理

Configuration.Localization.Sources.Add( new DictionaryBasedLocalizationSource( // 本地化资源名称 AbpConsts.LocalizationSourceName, // 数据源提供者,这里使用的是 XML ,除了 XML 提供者,还有 JSON 等 new XmlEmbeddedFileLocalizationDictionaryProvider( typeof(AbpKernelModule).GetAssembly(), "Abp.Localization.Sources.AbpXmlSource" ))); 0.1.4 获取多语言文本

如果你需要在某处获取指定 Key 所对应的具体显示文本,只需要注入 ILocalizationManager ,通过其 GetString() 方法就可以获得具体的值。如果你需要获取本地化资源的地方不能够使用依赖注入,你可以使用 LocalizationHelper 静态类来进行操作。

var @string = _localizationManager.GetString("Abp", "MainMenu");

它默认是从 Thread.CurrentThread.CurrentUICulture 获取到的当前区域信息,从而来取得某个 Key 所对应的显示值,而当前区域信息是由 Abp 注入的一系列 RequestCultureProviders 所提供的,他按照以下顺序来进行设置。

QueryStringRequestCultureProvider(ASP .NET Core 默认提供):该默认提供器使用的是 QueryString 的 culture&ui-culture 所提供的区域文化信息来初始化该值,例如:culture=es-MX&ui-culture=es-MX。

AbpUserRequestCultureProvider (Abp 提供):该提供器会读取当前用户的 IAbpSession 信息,并且从 ISettingManager 中获取用户所配置的 "Abp.Localization.DefaultLanguageName" 属性,将其作为默认的区域文化信息。

AbpLocalizationHeaderRequestCultureProvider (Abp 提供):使用每次请求头当中的 .AspNetCore.Culture 值作为当前的区域文化信息,例如 c=en|uic=en-US。

CookieRequestCultureProvider (ASP .NET Core 提供):使用每次请求的 Cookie 当中 Key 为 .AspNetCore.Culture 值作为当前区域文化信息。

AbpDefaultRequestCultureProvider (Abp 提供):如果之前这些提供器都没有为当前区域文化赋值,则从 ISettingMananger 当中取得 Abp.Localization.DefaultLanguageName 的默认值。

AcceptLanguageHeaderRequestCultureProvider (ASP .NET Core 默认提供):该提供器最终会使用用户每次请求时传递的 Accept-Language 头部作为当前区域文化信息。

小提示:

这里 Abp 注入的提供器是有顺序的,注入这么多提供器就是为了最后确定当前用户的区域文化信息以便展示相应的语言文本。

1.启动流程 1.1 启动流程图

[Abp 源码分析]十三、多语言(本地化)处理

1.2 代码流程

根据使用方法我们可以得知,要配置 Abp 的多语言,必须得等 IAbpStartupConfiguration 初始化完毕才可以。即在 AbpBootstrapper 的 Initialize() 方法之中:

public virtual void Initialize() { // ... 其他代码 // 注入 IAbpStartupConfiguration 配置与本地化资源配置 IocManager.IocContainer.Install(new AbpCoreInstaller()); // ... 其他代码 // 初始化 AbpStartupConfiguration 类型 IocManager.Resolve<AbpStartupConfiguration>().Initialize(); // ... 其他代码 }

配置类里面包含了用户所配置的所有语言与多语言资源信息,在被成功注入到 Ioc 容器之后,Abp 就开始使用本地化资源管理器来初始化这些多语言数据了。

public override void PostInitialize() { // 注册缺少的组件,防止遗漏注册组件 RegisterMissingComponents(); IocManager.Resolve<SettingDefinitionManager>().Initialize(); IocManager.Resolve<FeatureManager>().Initialize(); IocManager.Resolve<PermissionManager>().Initialize(); // 重点在这里,这个 PostInitialize 方法是存放在核心模块当中的,在这里调用了本地化资源管理器的初始化方法 IocManager.Resolve<LocalizationManager>().Initialize(); IocManager.Resolve<NotificationDefinitionManager>().Initialize(); IocManager.Resolve<NavigationManager>().Initialize(); if (Configuration.BackgroundJobs.IsJobExecutionEnabled) { var workerManager = IocManager.Resolve<IBackgroundWorkerManager>(); workerManager.Start(); workerManager.Add(IocManager.Resolve<IBackgroundJobManager>()); } }

具体 LocalizationManager 及其内部的实现我们在下一节代码分析中详细进行讲述。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzfsd.html