由于Api的接口需要返回多语言,因此参考了网上很多篇文章,,有些文章写的太过于理论,看起来比较费劲,今天下午搞了一个下午,总结了一下经验,, 做这个功能时,主要参考了两篇文章: https://blog./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 } 3.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; }
最后,也是最重要的,,记得发布之后,,发布的目录下,有一堆的语言代码的文件夹,如图:
记得把自己刚刚编写的语言对应的文件夹更新到服务器上,要不然,出来的还是默认语言,因为框架找不到对应的语言文件信息 |
|