项目

微服务解决方案:本地化系统

您必须拥有ABP商业版或更高级别的许可证才能创建微服务解决方案。

Administration微服务负责管理本地化,解决方案中的所有服务和应用程序都使用它。本文档解释了本地化在微服务解决方案中的工作原理。当我们向 /api/abp/application-localization 发送请求时,网关应用程序会将请求转发给Administration微服务。Administration微服务返回应用程序本地化,其中包含解决方案的本地化资源。您可以在 应用程序本地化 端点查看详细信息。

与其他基础功能模块(权限管理功能管理)一样,每个微服务都依赖于Volo.Abp.LanguageManagement.EntityFrameworkCoreVolo.Abp.LanguageManagement.MongoDB包。这些模块提供访问所有本地化所需的基础设施(例如IExternalLocalizationStore)。此外,如果您在创建解决方案时勾选了语言管理模块,Administration微服务可能还会依赖Volo.Abp.LanguageManagement.ApplicationVolo.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));
    });
}

解决方案中现有的微服务不包含本地化文本。这些本地化资源定义在它们自己的模块中。您可以通过遵循上述步骤向现有微服务添加新的本地化资源。


在本文档中