zoukankan      html  css  js  c++  java
  • .net core全球化配置、使用

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

    本地化和全球化

    要做本地化(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<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();
            }
        }
    }
    

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

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

    @using Microsoft.AspNetCore.Mvc.Localization
    
    @page
    @inject IHtmlLocalizer<SharedResource> 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<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.HomeController.fr.resx Dot
    Resources/Controllers/HomeController.fr.resx Path

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

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

    总结

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

  • 相关阅读:
    过完年又是跳槽涨工资的好机会了,许多毕业生也正打算参与社会,希望我的经历能给你们带来点什么
    临时表dataTable 求助,
    C#代码与javaScript函数的相互调用(转)
    一些基本的GIS 和国土方面知识(来自网上,序号都没改)
    VS 2008 安装求助 麻烦看下 下班就取下来,感觉不适合放这
    有关环境 错误 的记录
    我公司在招人 AE的
    ARCgis server 安装与起步(转自冬儿的BLOG )
    pytorch入门之安装和配置
    python出现编码问题的原因及编码问题的解决
  • 原文地址:https://www.cnblogs.com/mosakashaka/p/12608963.html
Copyright © 2011-2022 走看看