由于Api的接口需要返回多语言,因此参考了网上很多篇文章,,有些文章写的太过于理论,看起来比较费劲,今天下午搞了一个下午,总结了一下经验,,

做这个功能时,主要参考了两篇文章:

https://blog.johnwu.cc/article/ironman-day21-asp-net-core-localization.html

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-3.1

大家可对照着看

一般有两种情况: 一种是web项目需要返回多语言,,一种是dll里,需要单独实现多语言的,比如插件中

前提,项目中需要引入 Microsoft.Extensions.Localization 包

一.Web 项目中

如果是默认创建的Asp.net core的项目,以及引用完Microsoft.Extensions.Localization包了,所以不需要额外引入

1.资源文件的位置问题

  网上的教程中,提到一个SharedResource的用法,并且是放在Resources文件夹中,今天试了很多次,发觉是这么用的,

  比如在不同的area中:

  创建一个Resources文件夹,

  然后添加一个叫SharedResource的类,内容啥都不需要就要一个空的类而已

  再添加对应语言的资源文件,如: SharedResource.en.resx  或者 SharedResource.th.resx

  结构:

  

  SharedResource.cs :

  namespace ZKXT.Devices.Api.Areas.AppApi.Resources
  {
    public class SharedResource{}

  }

2.Start.cs 中:

  public void ConfigureServices(IServiceCollection services)

  {

    services.Configure<RequestLocalizationOptions>(options =>
    {
      options.DefaultRequestCulture = new RequestCulture("zn-cn");  //默认的语言
    });

    services.AddLocalization(); //注册相应Service  

  }

  public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

  {

    

    var support = new List<CultureInfo>()
    {
      new CultureInfo("zh-cn"),  //注册多种语言,具体可以查看http://www.lingoes.net/zh/translator/langcode.htm找对应
      new CultureInfo("en"),
      new CultureInfo("th")
    };

    app.UseRequestLocalization(x =>
    {
      x.SetDefaultCulture("zh-cn");
      x.SupportedCultures = support;  //设置支持的语言
      x.SupportedUICultures = support;  //设置UI语言,这里有个很大的坑,如果不设置该属性,在Action中,CultureInfo.CurrentCulture返回的是正确的语言,但是在CultureInfo.CurrentUICulture返回的是默认语言
      x.AddInitialRequestCultureProvider(new AcceptLanguageHeaderRequestCultureProvider());  //设置判断当前语言的方式,我项目中是使用了Accept-Language 的header值作为判断
    });

  }

2.Controller中:

  在构造函数中注入

public DevicesController(IStringLocalizer<SharedResource> localize=null):ControllerBase

  注意: 这里的SharedResource,一定是要对应的area中的,框架会根据SharedResource对应的namespace转换成对应的路径,并读取相应的资源文件,这个比较重要.

二. dll中

  1.需手动引入 Microsoft.Extensions.Localization 包

  2.需要在web项目中注入后,在request中自动设定当前线程的语言

  3.资源文件目录结构如图:

  

  public class Base

  {

    private static IStringLocalizerFactory _factory = null;

    private string _name="";

    static Base()
    {
      _factory = new ResourceManagerStringLocalizerFactory(Options.Create(new LocalizationOptions(){ ResourcesPath = "Resources" }),
NullLoggerFactory.Instance);

      _name=typeof(Base).Assembly.GetName().Name;
    }

    protected virtual IStringLocalizer GetLocalizer()   //后续使用该函数,即可返回对应的Localizer
    {
     return _factory.Create("SharedResource", _name);  //这里能指定名称,就不是非要新建个 SharedResource 类了,看了factory的源码,Create的实现自带缓存功能,所以不会每次都new一个类,因此直接Create就好,不需要自己做缓存
    }

  }

Asp.net core 2.x/3.x 的 Globalization 和 localization 的使用 (一) 使用方法的更多相关文章

  1. ASP.NET Core依赖注入系统学习教程:关于服务注册使用到的方法

    在.NET Core的依赖注入框架中,服务注册的信息将会被封装成ServiceDescriptor对象,而这些对象都会存储在IServiceCollection接口类型表示的集合中,另外,IServi ...

  2. asp.net core不通过构造方法从容器中获取对象及解决通过这种方法NLog获取对象失败的问题

    一般想从容器中获取对象,我们都是通过构造方法获取对象,但有些条件不允许不能通过构造方法获取对象,我们必须单独从容器中单独创建获取找个对象,这样我们就不行把找个容器静态保存起来供全局diaoy 一. 简 ...

  3. ASP.NET Core 1.1 静态文件、路由、自定义中间件、身份验证简介

    概述 之前写过一篇关于<ASP.NET Core 1.0 静态文件.路由.自定义中间件.身份验证简介>的文章,主要介绍了ASP.NET Core中StaticFile.Middleware ...

  4. ASP.NET Core 1.0 静态文件、路由、自定义中间件、身份验证简介

    概述 ASP.NET Core 1.0是ASP.NET的一个重要的重新设计. 例如,在ASP.NET Core中,使用Middleware编写请求管道. ASP.NET Core中间件对HttpCon ...

  5. 细说ASP.NET Core与OWIN的关系

    前言 最近这段时间除了工作,所有的时间都是在移植我以前实现的一个Owin框架,相当移植到到Core的话肯定会有很多坑,这个大家都懂,以后几篇文章可能会围绕这个说下,暂时就叫<Dotnet Cor ...

  6. ASP.NET Core 源码阅读笔记(3) ---Microsoft.AspNetCore.Hosting

    有关Hosting的基础知识 Hosting是一个非常重要,但又很难翻译成中文的概念.翻译成:寄宿,大概能勉强地传达它的意思.我们知道,有一些病毒离开了活体之后就会死亡,我们把那些活体称为病毒的宿主. ...

  7. 在ASP.NET Core中使用Apworks快速开发数据服务

    不少关注我博客的朋友都知道我在2009年左右开发过一个名为Apworks的企业级应用程序开发框架,旨在为分布式企业系统软件开发提供面向领域驱动(DDD)的框架级别的解决方案,并对多种系统架构风格提供支 ...

  8. 10分钟学会在windows/Linux下设置ASP.Net Core开发环境并部署应用

    创建和开发ASP.NET Core应用可以有二种方式:最简单的方式是通过Visual Studio 2017 来创建,其优点是简单方便,但需要安装最新版本Visual Studio 2017 prev ...

  9. ASP.NET Core 运行原理解剖[2]:Hosting补充之配置介绍

    在上一章中,我们介绍了 ASP.NET Core 的启动过程,主要是对 WebHost 源码的探索.而本文则是对上文的一个补充,更加偏向于实战,详细的介绍一下我们在实际开发中需要对 Hosting 做 ...

随机推荐

  1. 洛谷$1220$ 关路灯 记搜/$DP$

    \(Sol\) 约定\(pos\)为老张所处的位置的路灯号,\(i<pos,j>pos\). 显然,如果\(i\)和\(j\)都关了,那么它们之间的所有灯一定也都关了. 设\(f[i][j ...

  2. mysql主从同步--读写分离。

    1.mysql 安装参考 https://www.cnblogs.com/ttzzyy/p/9063737.html 2. 主mysql,从mysql 指定配置文件启动 mysqld --defaul ...

  3. SpringBoot拦截器没有生效的原因

    最近的一个项目中,需要实现一个记录系统请求日志的功能,我通过拦截器实现了这个功能,但是,测试的时候发现拦截器没有发挥作用,检查了很久,没有发现错的地方,系统也没有报错,最终在网上找打了答案. 原来之前 ...

  4. [UWP]XAML中的响应式布局技术

    响应式布局的概念是一个页面适配多个终端及不同分辨率.在针对特定屏幕宽度优化应用 UI 时,我们将此称为创建响应式设计.WPF设计之初响应式设计的概念并不流行,那时候大部分网页设计师都按着宽度960像素 ...

  5. 处理样本不平衡的LOSS—Focal Loss

    0 前言 Focal Loss是为了处理样本不平衡问题而提出的,经时间验证,在多种任务上,效果还是不错的.在理解Focal Loss前,需要先深刻理一下交叉熵损失,和带权重的交叉熵损失.然后我们从样本 ...

  6. .Net Core 认证系统之基于Identity Server4 Token的JwtToken认证源码解析

    介绍JwtToken认证之前,必须要掌握.Net Core认证系统的核心原理,如果你还不了解,请参考.Net Core 认证组件源码解析,且必须对jwt有基本的了解,如果不知道,请百度.最重要的是你还 ...

  7. 不只是安装,Kolla 让 OpenStack 运维变简单

    使用 kolla 部署的 OpenStack 环境和传统直接安装的环境相比较,因为使用了全容器化部署,基本操作上有很大不同.对于初学者,操作变得更清晰和更简单了,但是如果你已经有了一定的经验,可能反而 ...

  8. 2018湘潭邀请赛 AFK题解 其他待补...

    A.HDU6276:Easy h-index Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  9. 基于springboot+thymeleaf+springDataJpa自带的分页插件实现完整的动态分页

    实现百度搜索使用的前五后四原则,效果如下. 下面贴出代码,复制到前端即可,只需要域中放置page对象就可以.(springdatajpa自带的page 注意:第一页是按0开始算的) <div c ...

  10. python条件(三元)运算符

    条件运算符  是 三元运算符 语法: 语句1  if   条件表达式  else  语句2 执行流程: 条件运算符在执行时,会先对条件表达式进行求值判断         如果判断结果为True,则执行 ...