core全球化配置、使⽤
相关的资源还是⽐较多的,主要参考微软的官⽅⽂档()
本地化和全球化
要做本地化(Localization),需要先让程序全球化(Globalization)。
所谓全球化,就是指让程序具有⽀持多语⾔的能⼒,通俗来说,就是每个需要展⽰内容的地⽅的内容,都能⽀持多语⾔显⽰。(实际上不单单是⽂字,还有单位、⽇期、显⽰⽅式等等内容,细说就很⿇烦了)
⽽本地化,就是在应⽤全球化的基础上,增加⼀种语⾔(culture)⽀持。
core中的全球化和本地化
使⽤
core中,可以通过IHtmlLocalizer和IStringLocalizer两个服务实现全球化,这两个服务在初始化时添加,有组件需要显⽰全球化字符串时,依赖注⼊他们,然后通过索引引⽤需要的⽂本:
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<AboutController> _localizer;
public AboutController(IStringLocalizer<AboutController> localizer)
{
_localizer = localizer;
}
[HttpGet]
public string Get()
{
return _localizer["About Title"];
}
}
public class BookController : Controller
{
private readonly IHtmlLocalizer<BookController> _localizer;
public BookController(IHtmlLocalizer<BookController> localizer)
朱翊钧怎么读{
_localizer = localizer;
}
public IActionResult Hello(string name)
{
ViewData["Message"] = _localizer["<b>Hello</b><i> {0}</i>", name];
return View();
}
}
}
两个类中,分别使⽤了IStringLocalizer和IHtmlLocalizer获取本地化字符。使⽤⽅式相同,区别在于IHtmlLocalizer会把字符串中的html特殊标志进⾏转码,防⽌页⾯显⽰问题。
另外在Razor页⾯中,也可以注⼊,⼀般是个使⽤IHtmlLocalizer,防⽌页⾯布局受格式化字符串影响:
@using Microsoft.AspNetCore.Mvc.Localization
@page
天下乐@inject IHtmlLocalizer<SharedResource> Localizer
IHtmlLocalizer类还有⼀个优点,就是在程序开发阶段,可以不配置任何本地化⽂件,此时该类会直接返回Key值作为字符串内容,⽅便开发。
初始化
新宝马x1⼀个题外话,在学习⼀个概念时,⼀般包括这⼏个⽅⾯的内容:配置、使⽤、整体概念。如果先看概念,往往会⽐较抽象难以理解;如果先看配置,可能会分不清主次,陷⼊⼀些细节;⽽先看使⽤,⼜可能产⽣“我是谁,我从哪来”这样的疑惑。
综合来看,我个⼈觉得可能先看使⽤稍好点,因为直奔主题,然后再是配置这块。对于不需要深⼊了解的情况下,整体概念可以略去,因为能从使⽤和配置上略见⼀斑。
回归主题,初始化还是像常见的功能那样,分为添加服务,和注册中间件两部分:
//in Startup.ConfigureServices
rvices.AddLocalization(options => options.ResourcesPath = "Resources");
rvices.AddMvc()
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization();
//in Startup.Configure
var supportedCultures = new[]
{
new CultureInfo("en-US"),
new CultureInfo("fr"),
};
app.URequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("en-US"),
// Formatting numbers, dates, etc.
SupportedCultures = supportedCultures,
// UI strings that we have localized.
SupportedUICultures = supportedCultures
});
在注册中间件时,通过RequestLocalizationOptions配置默认的语⾔和所有可以⽀持的语⾔。
另外,其实通过添加服务时的RequestLocalizationOptions,也能做到同样的效果:喜贴
rvices.Configure<RequestLocalizationOptions>(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<HomeController>:不足挂齿的意思
Resource name Dot or path naming
Resources/Controllers.sx Dot
Resources/Controllers/sx Path
这⾥的基础⽬录Resources,是在rvices.AddLocalization(options => options.ResourcesPath = "Resources");这⾥配置的。
可以看出,每个语⾔每个使⽤的类,需要⼀个单独的⽂件存放。
文过饰非的意思这⾥的资源⽂件resx⽂件格式,可以在VS中右键添加,然后在VS中直接编辑。
总结
这⾥分使⽤、配置、资源⽂件三部分总结了 core本地化⽅法。
后续应该还会补充⼀个使⽤Json⽂件作为资源⽂件的⽅法。