草庐IT

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

雨太阳 2023-03-28 原文
.NET Core WebApi 多语言本地化,动态切换多语言
  1. 原生的.net core webapi 动态多语言本地话

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

    • 首先看效果图

    • 整体项目结构图

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

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

  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
        {
        }
    }
    

  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的多语言切换已经完成了

有关.NET Core WebApi 多语言本地化,动态切换多语言的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  3. ruby-on-rails - Ruby on Rails with Haml - 如何从 erb 切换 - 2

    我正在从erb文件切换到HAML。我将hamlgem添加到我的系统中。我创建了app/views/layouts/application.html.haml文件。我应该只删除application.html.erb文件吗?此外,仍然有/public/index.html文件被呈现为默认页面。我想创建自己的默认index.html.haml页面。我应该把它放在哪里以及如何使系统呈现该文件而不是默认索引文件?谢谢! 最佳答案 是的,您可以删除任何已转换为HAML的View的ERB版本。至于你的另一个问题,删除public/index/h

  4. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  5. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  6. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  7. 7个大一C语言必学的程序 / C语言经典代码大全 - 2

    嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来

  8. ruby - 在 Ruby 中动态创建数组 - 2

    有没有办法在Ruby中动态创建数组?例如,假设我想遍历用户输入的书籍数组:books=gets.chomp用户输入:"TheGreatGatsby,CrimeandPunishment,Dracula,Fahrenheit451,PrideandPrejudice,SenseandSensibility,Slaughterhouse-Five,TheAdventuresofHuckleberryFinn"我把它变成一个数组:books_array=books.split(",")现在,对于用户输入的每一本书,我想用Ruby创建一个数组。伪代码来做到这一点:x=0books_array.

  9. ruby - 是否可以将 IRB 提示配置为动态更改? - 2

    我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO

  10. ruby - 在 Rails 项目中测试本地版本的 gem - 2

    我的Rails站点使用了一个确实不是很好的gem。每次我需要做一些新的事情时,我最终不得不花费与向实际Rails项目添加代码一样多的时间来为gem添加功能。但我不介意,我将我的Gemfile设置为指向我的gem的GitHub分支(我尝试提交PR,但维护者似乎已经下台)。问题是我真的没有找到一种合理的方法来测试我添加到gem的新东西。在railsc中测试它会特别好,但我能想到的唯一方法是a)更改~/.rvm/gems/.../foo。rb,这看起来不对或者b)升级版本,推送到Github,然后运行​​bundleup,这除了耗时之外显然是一场灾难,因为我不确定我所做的promise是否正

随机推荐