微服务解决方案:本地化系统
您必须拥有ABP商业版或更高级别的许可证才能创建微服务解决方案。
Administration微服务负责管理本地化,解决方案中的所有服务和应用程序都使用它。本文档解释了本地化在微服务解决方案中的工作原理。当我们向 /api/abp/application-localization 发送请求时,网关应用程序会将请求转发给Administration微服务。Administration微服务返回应用程序本地化,其中包含解决方案的本地化资源。您可以在 应用程序本地化 端点查看详细信息。
与其他基础功能模块(权限管理、功能管理)一样,每个微服务都依赖于Volo.Abp.LanguageManagement.EntityFrameworkCore或Volo.Abp.LanguageManagement.MongoDB包。这些模块提供访问所有本地化所需的基础设施(例如IExternalLocalizationStore)。此外,如果您在创建解决方案时勾选了语言管理模块,Administration微服务可能还会依赖Volo.Abp.LanguageManagement.Application和Volo.Abp.LanguageManagement.HttpApi包来管理本地化。
语言管理
如果启用了动态本地化选项,那么语言管理模块将从可选模块中移除,并创建一个名为
LanguageService的新微服务。LanguageService在内部使用语言管理模块。
Administration微服务提供一组API来管理本地化。本地化资源在每个微服务中定义,当微服务启动时,它会自动将其本地化资源注册到相关的本地化表中。之后,您可以从语言文本页面查看和管理这些本地化资源。
语言管理模块是可选的。如果不需要通过用户界面管理本地化资源,可以在创建解决方案时取消勾选语言管理模块。但是,每个微服务的本地化资源仍会注册到数据库中,并可供应用程序使用。
动态本地化
创建新的微服务解决方案时,您可以启用动态本地化选项,这允许您在应用程序用户界面上添加/删除语言并更改本地化文本:
启用此选项后,将添加一个名为LanguageService的新微服务(已集成语言管理模块),您可以使用其LanguageServiceResource类在您的UI应用程序中使用本地化条目。它已经在您的最终宿主应用程序中配置好了,因此您无需进行任何相关配置。要定义新的本地化条目,您既可以使用LanguageService中的语言文件,也可以在用户界面上(语言文本页面)更新已定义的本地化条目。
定义或更新本地化条目后,您可以注入IStringLocalizer<>或IHtmlLocalizer<>服务,并在您的页面中使用本地化的值,例如对于MVC/Razor Pages UI:
@page
@using Microsoft.Extensions.Localization
@inject IStringLocalizer<MyProjectNameWebResource> L
<div>
<h1>@L["LongWelcomeMessage"]</h1>
</div>
UI本地化
在微服务架构中,如果本地化只需要在UI中定义,也可以在最终的宿主应用程序中定义本地化。当您创建新的微服务解决方案模板时,所有配置都是独立于UI完成的,您可以直接定义本地化条目,并在最终的UI应用程序中使用它们。
注意: 当您在宿主应用程序中定义本地化条目时,将无法使用语言管理模块进行动态本地化!(因为语言管理模块将无法感知UI端定义的本地化条目)
MVC/Razor Pages 和 Blazor UI
对于MVC和Blazor UI,您可以在最终应用程序中看到Localization目录,如下图所示:
在此目录中,您可以看到语言文件,这些是预定义的,可以直接添加本地化条目。相关配置已经在模块类中为您配置好(在ConfigureLocalization方法内),如下所示:
private void ConfigureLocalization(IWebHostEnvironment hostingEnvironment)
{
// 为简洁起见省略了代码...
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Add<CloudCrmWebResource>("en")
.AddVirtualJson("/Localization/CloudCrmWeb");
options.DefaultResourceType = typeof(CloudCrmWebResource);
});
}
您可以在Localization文件夹下的语言文件中定义新的本地化条目,并通过使用IStringLocalizer<>或IHtmlLocalizer<>服务直接在您的应用程序中使用它们:
@page
@using Microsoft.Extensions.Localization
@inject IStringLocalizer<CloudCrmWebResource> L
<div>
<h1>@L["LongWelcomeMessage"]</h1>
</div>
Angular UI
Angular UI从application-localization API的响应中获取本地化资源,并在ConfigStateService中合并这些资源,用于来自后端的本地化条目/资源。
此外,您可能需要定义一些本地化条目,并仅在UI端使用它们。ABP已经为您提供了相关配置,因此您无需进行任何相关配置,而是可以直接在Angular应用程序的app.config.ts文件中定义本地化条目,如下所示:
import { provideAbpCore, withOptions } from '@abp/ng.core';
export const appConfig: ApplicationConfig = {
providers: [
// ...
provideAbpCore(
withOptions({
environment,
registerLocaleFn: registerLocale(),
localizations: [
{
culture: 'en',
resources: [
{
resourceName: 'MyProjectName',
texts: {
"LongWelcomeMessage": "欢迎使用本应用。这是一个基于ABP框架的启动项目。更多信息请访问"
}
}
]
}
]
}),
),
],
};
定义本地化条目后,可以按以下方式使用:
<div>{{ 'MyProjectName::LongWelcomePage' | abpLocalization }}</div>
更多信息,请参考Angular本地化文档中的UI本地化部分。
创建新的本地化资源
要创建新的本地化资源,您可以在相关微服务的Contracts项目中创建一个名为MicroservicenameResource的类,该模板已由解决方案模板创建。例如,Identity微服务有一个IdentityServiceResource类和本地化JSON文件。
[LocalizationResourceName("IdentityService")]
public class IdentityServiceResource
{
}
此外,它还在IdentityServiceContractsModule类中配置了本地化资源。
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<BookstoreIdentityServiceContractsModule>();
});
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Add<IdentityServiceResource>("en")
.AddBaseTypes(typeof(AbpValidationResource), typeof(AbpUiResource))
.AddVirtualJson("/Localization/IdentityService");
});
Configure<AbpExceptionLocalizationOptions>(options =>
{
options.MapCodeNamespace("IdentityService", typeof(IdentityServiceResource));
});
}
解决方案中现有的微服务不包含本地化文本。这些本地化资源定义在它们自己的模块中。您可以通过遵循上述步骤向现有微服务添加新的本地化资源。
抠丁客





