.net core及ABP的本地化/多语言

309 阅读2分钟

Microsoft.Extensions.Localization 是 .NET Core 中的一个类库,它提供了本地化支持,允许开发者为应用程序添加多语言支持 。 可以根据用户的区域设置(culture)动态地选择和加载相应的本地化资源(如字符串)。 全球化(globalization)和本地化(localization)

本地化使用

添加本地化支持,指定资源文件存放的位置。

在 Configure 方法中使用中间件来确定每个请求的区域设置。

注入IStringLocalizer,并使用它来获取本地化的字符串。

_localizer["WelcomeMessage"] 将根据当前区域设置查找并返回相应的本地化字符串。

//ResourcesPath 指定了资源文件存放的位置
services.AddLocalization(options => options.ResourcesPath = "Resources");

app.UseRequestLocalization(new RequestLocalizationOptions
{
    // 设置支持的文化和 UI 文化
    SupportedCultures = new List<CultureInfo> { new CultureInfo("en-US"), new CultureInfo("fr-FR") },
    SupportedUICultures = new List<CultureInfo> { new CultureInfo("en-US"), new CultureInfo("fr-FR") }
});
public class HomeController : Controller
{
    private readonly IStringLocalizer<HomeController> _localizer;

    public HomeController(IStringLocalizer<HomeController> localizer)
    {
        _localizer = localizer;
    }

    public IActionResult Index()
    {
        // 使用 _localizer 获取本地化字符串
        var welcomeMessage = _localizer["WelcomeMessage"];
        return View();
    }
}

ABP 增强了这个功能

ABP 的本地化

AbpLocalizationModule 依赖项添加到模块:

可以为本地化资源设置一个简短名称,可以继承其他资源

本地化资源可以有格式化参数,传进去

资源类,它包含了本地化字符串的键和值。 用于存储特定语言的本地化字符串

[DependsOn(typeof(AbpLocalizationModule))]
public class MyModule : AbpModule
{
    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        Configure<AbpVirtualFileSystemOptions>(options =>
        {
            //使用虚拟文件系统 将JSON文件嵌入到程序集中
            // "YourRootNameSpace" 是项目的根命名空间名字. 如果你的项目的根命名空间名字为空,则无需传递此参数.
            options.FileSets.AddEmbedded<MyModule>("YourRootNameSpace");
        });

        Configure<AbpLocalizationOptions>(options =>
        {
            //默认资源
            options.DefaultResourceType = typeof(TestResource);
            
            //添加了一个新的本地化资源, 使用"en"(英语)作为默认的本地化
            options.Resources
                .Add<TestResource>("en")
                //用JSON文件存储本地化字符串
                .AddVirtualJson("/Localization/Resources/Test")
                //集成其他资源
                .AddBaseTypes(typeof(AbpValidationResource));
        });
    }
}

//创建本地化资源类
[LocalizationResourceName("Test")]
[InheritResource(typeof(AbpValidationResource))]
public class TestResource
{
}

_localizer["HelloMessage", "John"].

{
  "culture": "en",
  "texts": {	//本地化字符串的键值集合
    "HelloWorld": "Hello World!"
  }
}