首页 > 其他分享 >.NET Core WebApi 多语言本地化,动态切换多语言

.NET Core WebApi 多语言本地化,动态切换多语言

时间:2022-10-28 14:56:45浏览次数:56  
标签:WebApi Core zh 语言 StringSegment Hans var new

.NET Core WebApi 多语言本地化,动态切换多语言
  1. 原生的.net core webapi 动态多语言本地话

    • 具体更多详细内容,可以参考官方文档

    • 首先看效果图

      • cultures1
    • 整体项目结构图

      • image-20221028120743455
    • 开始前需要讲一些重要的点

      • 1.是通过文件命名空间的路径去找寻的,比如 Resource.cs 是在和多语言Resource.xxxx.resx文件同一级别的
        2.参考下图,不然多语言翻译时是找寻不到的
        
      • image-20221028141023977

  2. ConfigureServices里面进行以下配置

    services.AddLocalization();
                services.Configure<RequestLocalizationOptions>(options =>
                {
                    var supportedCultures = new List<CultureInfo>
                    {
                        new CultureInfo("en-US"),//英文
                        new CultureInfo("zh-Hans"),//简体中文
                        new CultureInfo("zh-Hant")//繁体中文-台湾
                    };
                    
                    options.DefaultRequestCulture = new RequestCulture(culture: "en-US", uiCulture: "en-US");
                    options.SupportedCultures = supportedCultures;
                    options.SupportedUICultures = supportedCultures;
                    options.RequestCultureProviders = new List<IRequestCultureProvider> { new CultureRequestCultureProvider() };
                });
    
  3. Configure下加入如下代码

    //多语言配置
                var localizeOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
                app.UseRequestLocalization(localizeOptions.Value);
    
  4. 其中关键的 CultureRequestCultureProvider.cs 代码内容如下 (通过HttpContext 的Headers 传参 Accept-Language来实现动态切换语言的)

     public class CultureRequestCultureProvider : RequestCultureProvider
        {
            public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
            {
                if (httpContext == null)
                {
                    throw new ArgumentNullException();
                }
    
                #region 方式一从Cookies里面按需获取语言 注释
                //var CULTURE_String = "CULTURE";
                //var CultureValue = httpContext.Request.Cookies[CULTURE_String]?.ToString() ?? "";
                //if (string.IsNullOrWhiteSpace(CultureValue))
                //{
                //    CultureValue = "zh-Hans";
                //    httpContext.Response.Cookies.Append(key: CULTURE_String, value: CultureValue, options: new CookieOptions() { Expires = DateTime.Now.AddYears(1) });
                //} 
                #endregion
    
                //方式二 从Headers里面按需获取语言
                var culture = new StringSegment("zh-Hans");
                var uiCulture = new StringSegment("zh-Hans");
                var lang = httpContext.Request.Headers["Accept-Language"].ToString() ?? "";
                switch (lang)
                {
                    case "en-US":
                        //英文
                        culture = new StringSegment("en-US");
                        uiCulture = new StringSegment("en-US");
                        break;
                    case "zh-Hans":
                        //简体中文
                        culture = new StringSegment("zh-Hans");
                        uiCulture = new StringSegment("zh-Hans");
                        break;
                    case "zh-Hant":
                        //繁体中文-台湾
                        culture = new StringSegment("zh-Hant");
                        uiCulture = new StringSegment("zh-Hant");
                        break;
                    default:
                        goto case "zh-Hans";
                }
                return Task.FromResult(new ProviderCultureResult(culture, uiCulture));
            }
        }
    
  5. Resource.cs 以及多语言文件的代码如下

    namespace DynamicMultilanguage.Localize
    {
        public class Resource
        {
        }
    }
    

    image-20221028121109966

    image-20221028121117622

    image-20221028121132130

  6. 在控制器里面使用时

    		private readonly IStringLocalizer<Resource> _localizer;
    
            public HomeController(IStringLocalizer<Resource> localizer)
            {
                _localizer = localizer;
            }
    
    
    		[HttpGet]
            public object Get()
            {
                var culturesValue = _localizer["Home"];
                var culturesValueParams = _localizer["HomeTitie", "雨太阳", "66666"];
    
                return new { culturesValue, culturesValueParams };
            }
    

    按照以上操作,一个简答的WebApi的多语言切换已经完成了

标签:WebApi,Core,zh,语言,StringSegment,Hans,var,new
From: https://www.cnblogs.com/goodluckily/p/16835908.html

相关文章

  • C语言笔记 | C与汇编
    函数通过栈传递参数平衡栈(函数调用约定)cdecl参数从右至左入栈调用者清栈stdcall参数从右至左入栈自身清栈fastcall:ecx和edx传前两个参数,剩下的参......
  • Java — 程序设计基础(Core Java I)
    了解基本程序设计结构:这章节有几个以前没注意的坑,在这里贴出来~提醒以后的自己也希望过路的朋友踩。基本数据类型/运算符1.System.out.println(2.0-1.1)打出来的是0.89......
  • Java — 集合(1)(Core Java I)
    13.1集合接口本节将介绍Java结合框架的基本设计,展示使用他们的方法,并解释一些颇具争议的特性背后的考虑。13.1.1将集合的接口与实现分离队列接口指出可以在队列的尾部添加......
  • C语言习题:使用指针交换两个变量的数据
    题目在主程序通过键盘输入两个正整数,编写并调用自定义函数voidswap(int*x,int*y)实现两个整数变量值的交换并输出交换后的结果。代码#include<stdio.h>voidswap(......
  • 关系数据库标准语言sql(练习题)
    学生选课数据库中表结构如下:学生(学号,姓名,年龄,性别,所在系);课程(课程号,课程名,学分,先行课);选课(学号,课程号,成绩);在学生选课数据库中运用SQL语言实现下面的数据查询操作。求选修......
  • Dapr实现.Net Grpc服务之间的发布和订阅,并采用WebApi类似的事件订阅方式
    大家好,我是失业在家,正在找工作的博主Jerry,找工作之余,总结和整理以前的项目经验,动手写了个洋葱架构(整洁架构)示例解决方案OnionArch。其目的是为了更好的实现基于DDD(领域驱......
  • .Net Core通过GDI+在CentOS 7(Docker)环境中绘图报错The type initializer for 'Gdip'
    记一次.NetCore通过GDI+在CentOS7(Docker)环境中绘图报错Thetypeinitializerfor'Gdip'threwanexception的问题及处理方式  目录一、前言二、问题分析......
  • 论人类下一代语言的可能—6.3.2等价-替换原理
    继续回到前面关于算术计算与命题逻辑演算的内容。在算术的计算中,加法计算可分解为一系列的步骤,其中每一步的操作是匹配运算律或加法表中的一项,将算式当中与运算律或加法表......
  • 汇编语言-8086指令(上)
    数据传送指令汇编语言中字母开头通常表示标识符(如常量、变量、标号),所以MASM规定十六进制数如果以字母开头需要添加前导0。当目的操作数是存储单元,而源操作数既可以是字又......
  • 【HMS Core】定位服务逆地理编码问题
    ​关于华为HMS-定位服务非华为手机逆地理编码不可用的问题。背景:在非华为手机例如小米手机上集成华为定位服务的逆地理编码功能运行后,报错HMSSDK_ServiceErrorCodeAdapto......