前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NetCore 国际化最佳实践

NetCore 国际化最佳实践

作者头像
leon公众号精选
发布2022-09-01 11:36:28
6020
发布2022-09-01 11:36:28
举报
文章被收录于专栏:架构师高级俱乐部

NetCore 国际化最佳实践

ASP.NET Core中提供了一些本地化服务和中间件,可将网站本地化为不同的语言文化。ASP.NET Core中我们可以使用Microsoft.AspNetCore.Localization库来实现本地化。但是默认只支持使用资源文件方式做多语言存储,很难在实际场景中使用。有没有可能支持官方资源文件的基础上还能支持动态添加修改多语言呢,答案是有的,那就是NetPro.Globalization

安装

Package Manager方式:

代码语言:javascript
复制
Install-Package NetPro.Globalization 6.0.10

.NET CLI 方式:

代码语言:javascript
复制
dotnet add package NetPro.Globalization --version 6.0.10

PackageReference:

代码语言:javascript
复制
<PackageReference Include="NetPro.Globalization" Version="6.0.10" />

.NET CLI 方式:

代码语言:javascript
复制
paket add NetPro.Globalization --version 6.0.10

基于NetPro环境的初始化

如基于NetPro环境的使用,比较简单,在执行安装步骤后配置多语言持久化的sqlite地址即可

代码语言:javascript
复制
"Globalization": {
  "UIQueryStringKey": "language", //请求的query携带的多语言参数名,默认为language
  "ConnectionString": "Data Source=Globalization.db;Cache=Shared", //sqlite地址
  "Cultures": [
   "zh-CN",
   "en-US"
  ],
  "Annotations": true, //是否打开注册数据注解本地化服务
  "Record": true //不存在是否记录(自动插入数据库默认语系),默认true
 }

脱离NetPro环境的使用

如不是基于NetPro环境的使用,比需要手动进行各项初始化

代码语言:javascript
复制
 public void ConfigureServices(IServiceCollection services)
        {
            services.AddGlobalization();
        }

代码语言:javascript
复制
 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            //置于app.UseRouting()后便可;
            var configuration = app.ApplicationServices.GetService<IConfiguration>();

            var globalization = configuration.GetSection(nameof(Globalization)).Get<Globalization>();

            var cultures = globalization?.Cultures ?? new string[] { };

            var localizationOptions = new RequestLocalizationOptions()
                .AddSupportedUICultures(cultures)
                ;
            localizationOptions.RequestCultureProviders.Insert(0, new QueryStringRequestCultureProvider { UIQueryStringKey = globalization.UIQueryStringKey });
            localizationOptions.RequestCultureProviders.Insert(1, new AcceptLanguageHeaderRequestCultureProvider());
            localizationOptions.RequestCultureProviders.Insert(2, new CookieRequestCultureProvider());
            app.UseRequestLocalization(localizationOptions);
        }

使用

代码语言:javascript
复制
 public class GlobalizationDemoController : ControllerBase
    {
        private readonly IStringLocalizer<NetPro.Globalization.Globalization> _localizer;//建议使用NetPro.Globalization.Globalization 统一的类提供字符串承载,过多语言碎片

       
        public GlobalizationDemoController(
            , IStringLocalizer<NetPro.Globalization.Globalization> localizer)
        {
            _localizer = localizer;
        }
        /// <summary>
        /// 多语言国际化示例
        /// </summary>
        [HttpGet("globalization")]
        public IActionResult Globalization()
        {
            var localMsg = _localizer["当前时间为"] + $":{DateTime.Now}";
            return Ok(new { localMsg });
        }
  }

客户端处理

客户端请求接口时,依次支持,query,header,cookie等三种方式携带多语言标识

  • query 默认 language; 支持修改UIQueryStringKey节点覆盖默认参数名,推荐query方式
  • header 默认 Accept-Language
  • cookie 默认为 .AspNetCore.Culture 既:(Microsoft.AspNetCore.Localization.CookieRequestCultureProvider.DefaultCookieName)

实验:

中文环境:

代码语言:javascript
复制
request http://localhost:5001/api/globalizationdemo/globalization?language=zh-CN
代码语言:javascript
复制
response localMsg: "当前时间为:2022/6/11 14:47:01"

英文环境:

代码语言:javascript
复制
request http://localhost:5001/api/globalizationdemo/globalization?language=en-US
代码语言:javascript
复制
response localMsg: "当前时间为:2022/6/11 14:47:01"

发现依然中文,原因是找不到对应的语言,会自动将_localizer[string]中的字符串作为默认值插入,此时只需要手动再插入一条en-US的翻译即可

再次请求:

代码语言:javascript
复制
request http://localhost:5001/api/globalizationdemo/globalization?language=en-US
代码语言:javascript
复制
response localMsg: "This  time is:2022/6/11 14:50:25"

总结

除了以上支持sqlite数据库存储多语言信息,同时也支持微软默认的资源文件方式,并且使用方式与原生一致,不会有新的学习成本。

NetPro.Globalizatio: https://github.com/LeonKou/NetPro/tree/dev_6.0/src/Library/NetPro.Globalization

NetPro框架Github地址: https://github.com/LeonKou/NetPro

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构师高级俱乐部 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • NetCore 国际化最佳实践
  • 安装
  • 基于NetPro环境的初始化
  • 脱离NetPro环境的使用
  • 使用
    • 客户端处理
    • 实验:
    • 总结
    相关产品与服务
    消息队列 TDMQ
    消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档