.net core全球化配置、使用

2021-03-29 10:25

阅读:452

标签:区别   阶段   补充   default   efault   public   hat   个人   view   

相关的资源还是比较多的,主要参考微软的官方文档(地址)

本地化和全球化

要做本地化(Localization),需要先让程序全球化(Globalization)。

  • 所谓全球化,就是指让程序具有支持多语言的能力,通俗来说,就是每个需要展示内容的地方的内容,都能支持多语言显示。(实际上不单单是文字,还有单位、日期、显示方式等等内容,细说就很麻烦了)
  • 而本地化,就是在应用全球化的基础上,增加一种语言(culture)支持。

.net core中的全球化和本地化

使用

.net core中,可以通过IHtmlLocalizerIStringLocalizer两个服务实现全球化,这两个服务在初始化时添加,有组件需要显示全球化字符串时,依赖注入他们,然后通过索引引用需要的文本:

using System;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Localization;

namespace Localization.Controllers
{
    [Route("api/[controller]")]
    public class AboutController : Controller
    {
        private readonly IStringLocalizer _localizer;

        public AboutController(IStringLocalizer localizer)
        {
            _localizer = localizer;
        }

        [HttpGet]
        public string Get()
        {
            return _localizer["About Title"];
        }
    }
    
    public class BookController : Controller
    {
        private readonly IHtmlLocalizer _localizer;

        public BookController(IHtmlLocalizer localizer)
        {
            _localizer = localizer;
        }

        public IActionResult Hello(string name)
        {
            ViewData["Message"] = _localizer["Hello {0}", name];

            return View();
        }
    }
}

两个类中,分别使用了IStringLocalizerIHtmlLocalizer获取本地化字符。使用方式相同,区别在于IHtmlLocalizer会把字符串中的html特殊标志进行转码,防止页面显示问题。

另外在Razor页面中,也可以注入,一般是个使用IHtmlLocalizer,防止页面布局受格式化字符串影响:

@using Microsoft.AspNetCore.Mvc.Localization

@page
@inject IHtmlLocalizer Localizer

IHtmlLocalizer类还有一个优点,就是在程序开发阶段,可以不配置任何本地化文件,此时该类会直接返回Key值作为字符串内容,方便开发。

初始化

一个题外话,在学习一个概念时,一般包括这几个方面的内容:配置、使用、整体概念。如果先看概念,往往会比较抽象难以理解;如果先看配置,可能会分不清主次,陷入一些细节;而先看使用,又可能产生“我是谁,我从哪来”这样的疑惑。
综合来看,我个人觉得可能先看使用稍好点,因为直奔主题,然后再是配置这块。对于不需要深入了解的情况下,整体概念可以略去,因为能从使用和配置上略见一斑。

回归主题,初始化还是像常见的功能那样,分为添加服务,和注册中间件两部分:

//in Startup.ConfigureServices
services.AddLocalization(options => options.ResourcesPath = "Resources");

services.AddMvc()
    .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
    .AddDataAnnotationsLocalization();
    
//in Startup.Configure
var supportedCultures = new[]
{
    new CultureInfo("en-US"),
    new CultureInfo("fr"),
};

app.UseRequestLocalization(new RequestLocalizationOptions
{
    DefaultRequestCulture = new RequestCulture("en-US"),
    // Formatting numbers, dates, etc.
    SupportedCultures = supportedCultures,
    // UI strings that we have localized.
    SupportedUICultures = supportedCultures
});

在注册中间件时,通过RequestLocalizationOptions配置默认的语言和所有可以支持的语言。

另外,其实通过添加服务时的RequestLocalizationOptions,也能做到同样的效果:

services.Configure(options =>
            {
                var supportedCultures = new[]
                {
                    new CultureInfo("en-US"),
                    new CultureInfo("ru-RU"),
                    new CultureInfo("zh-cn"),
                    new CultureInfo("zh-tw")
                };

                options.DefaultRequestCulture = new RequestCulture(culture: "zh-cn", uiCulture: "zh-cn");
                options.SupportedCultures = supportedCultures;
                options.SupportedUICultures = supportedCultures;
            });

资源文件

有了服务,有了使用,真正的字符串资源是存储在资源文件中的。

资源文件的命名,符合使用资源文件的类名相同,有两种方式,例如对于HomeController使用IHtmlLocalizer

Resource name Dot or path naming
Resources/Controllers.HomeController.fr.resx Dot
Resources/Controllers/HomeController.fr.resx Path

这里的基础目录Resources,是在services.AddLocalization(options => options.ResourcesPath = "Resources");这里配置的。
可以看出,每个语言每个使用的类,需要一个单独的文件存放。

这里的资源文件resx文件格式,可以在VS中右键添加,然后在VS中直接编辑。

总结

这里分使用、配置、资源文件三部分总结了.net core本地化方法。
后续应该还会补充一个使用Json文件作为资源文件的方法。

.net core全球化配置、使用

标签:区别   阶段   补充   default   efault   public   hat   个人   view   

原文地址:https://www.cnblogs.com/mosakashaka/p/12608963.html


评论


亲,登录后才可以留言!