.netcore多语言解决方案

这里本文使用Microsoft.AspNetCore.Localization来实现多语言的解决方案

默认是包含这个包的,所有不需要再额外安装

首先需要注入我们需要的服务

1.在startup.cs中注入

public void ConfigureServices(IServiceCollection services)
{
            //设置语言包文件夹名称
            services.AddLocalization(o =>
            {
                o.ResourcesPath = "Language";
            });

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}    

这里的路径是根据项目根目录寻找的相对路径,设置成最后语言文件保存的路径即可

然后在Configure中添加我们需要的语言文件的文件名,后面会再次提及文件名,

然后可以指定默认使用的语言文件DefaultRequestCulture

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            IList<CultureInfo> supportedCultures = new List<CultureInfo>
            {
                new CultureInfo("zh-CN"),
                new CultureInfo("zh"),
                new CultureInfo("en-US")
            };
            app.UseRequestLocalization(new RequestLocalizationOptions
            {
                //这里指定默认语言包
                DefaultRequestCulture = new RequestCulture("zh-CN"),
                SupportedCultures = supportedCultures,
                SupportedUICultures = supportedCultures
            });

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseMvc();
        }

至此我们完成了需要的配置,然后添加最重要的语言文件,

语言文件有两种添加方式

1.根据使用的控制器名称进行命名,如默认的ValuesController,则语言文件需要命名为Controllers.ValuesController.zh-CN.resx

2.可以在我们保存语言文件的路径下创建一级Controllers目录,然后语言文件在名称上就可以去掉开头的Controllers.

虽然这种方式也不太美观,不过也算好了一步,其实也可以自己手写注入,然后通过过滤器实现类似的效果

接下来在语言文件中添加我们需要的数据进行测试

在en-US中添加

在另外两个文件中添加相同的名称

接下来测试调用,这里我们有三种方法可以告知服务端需要使用哪一个语言文件

1.cookie

2.http报文

3.url参数

在控制器中注入语言文件

[Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        private readonly IStringLocalizer<ValuesController> _localizer;

        public ValuesController(IStringLocalizer<ValuesController> localizer)
        {
            _localizer = localizer;
        }

        // GET api/values
        [HttpGet]
        public string Get()
        {
            return _localizer["Error"].Value;
        }
    }

使用注入的对象就可以获取我们需要的键

_localizer["Error"]我们需要显示的数据保存在Value属性中

访问页面显示如下

这里是因为我们设置的默认语言,所以加载了中文文件

接下来通过url参数传递来访问不同的语言,加上参数culture=en-US

这样便会自动返回英文的结果

需要注意的是参数传递可以用三种写法,效果一致

?culture=zh-CN&ui-culture=zh-CN

?culture=zh-CN

?ui-culture=zh-CN

如果是使用cookie方式的话,使用cookie名称.AspNetCore.Culture,值如下

c=zh-CN|uic=zh-CN
c=zh-CN
uic=zh-CN

如果是使用http请求的话,则和常见请求一样添加Accept-Language请求头即可

Accept-Language:zh-CN

原文地址:https://www.cnblogs.com/ives/p/language.html

时间: 2024-12-13 02:06:03

.netcore多语言解决方案的相关文章

最省力的多语言解决方案

微软的ASP.NET localization(本地化,多语言)的方案,在使用的过程中,碰到许多的问题,这些问题都不是技术实现上的.主要是他浪费了我们许多的时间和精力. 1.在页面上使用许多key来替换页面的汉字文本,导致页面不可读,很难定位,维护困难. 2.要把全部的文本换成key,工作量巨大,繁重枯燥,很容易出错,忘记转换,忘记后很难发现. 3.key很容易发生冗余,因为不同时间加入的文字到底以前加过没有,要查找,挺烦的, 4.key和文本的一致性不好维护, 最近在开发了几天和python

Yii 2 —— 基于Mustache的页面多语言解决方案

在Yii 2中,官方的页面多语言解决方案有两个: 方案1,使用Yii::t()函数,在页面中需要输出文字的地方,使用类似如下代码: <?= Yii::t('views/login', 'hello')?> 这样做的后果是页面上大量充斥着类似的代码,导致页面可读性很差,而且对于同一个页面来说,Yii::t()函数的第一个参数基本上都是一样的,看到这些重复代码,也是心塞.我曾经在项目中采用这种方式实现多语言,一个简单的登录页面都能写到心烦的要命. 方案2,为指定语言做一个专门的视图,假设你有个页面

C++ 软件开发多国语言解决方案汇总

暂时汇总出了以下几种方法 以Unicode为核心 采用 GNU gettext  基于Qt的多语言开发工具:Qt Linguist  以Unicode为核心 参考:http://www.ibm.com/developerworks/cn/linux/l-cn-ccppglb/ 多国语言的存在,使程序员在编码处理上花费了大量时间和精力:然而各种各样的乱码问题,如 XML 格式错误.文本显示异常.解析器异常等依然层出不穷.特别的,相对于 JAVA 语言,C/C++ 在处理编码问题上有更大的困难.本文

多国语言解决方案gun.gettext + poedit

1.关于i18n i18n其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数是“国际化”的简称. i10n为资源本地化,全称为Localization,因为首字母I与末字母N之间共10个字母,又称为I10N.资源本地化就是要让这个软件产品使用当地的环境,如语言.文化.使用习惯等 一般涉及到具体国家的语言文件,以i10n来表示,而多国语言相关的解决方案以i18n表示. 2.关于gun.gettext wqe

c#开发之多国语言解决方案gun.gettext + poedit

1.工具简介 1.1.关于i18n i18n其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数是“国际化”的简称. i10n为资源本地化,全称为Localization,因为首字母I与末字母N之间共10个字母,又称为I10N.资源本地化就是要让这个软件产品使用当地的环境,如语言.文化.使用习惯等 一般涉及到具体国家的语言文件,以i10n来表示,而多国语言相关的解决方案以i18n表示. 1.2.关于gun.gettext gun.gettext软件国际化

在Linux下开发多语言软件(gettext解决方案)

最近的项目出现了一个bug.项目是基于一个已有的成熟开源软件之上做修改的,新写了加解密库,用于为该成熟开源软件增添加解密功能.功能增加完成后效果都很好,可是就是中文出不来了,也就是说没办法自适应多语言环境了(提示信息在中文操作系统下是中文,英文操作系统下是英文).使用strace -o log [要调试的命令]定位出了其在执行期间调用的语言包情况,发现它并没有调用自有的语言包,反而调用了加解密库的语言包(但是这个加解密库就没有开发任何语言包),导致找不到该语言包而默认显示代码中的英文提示信息.经

ASP.NET MVC 多语言实现——URL路由

考虑实现一个完整的基于asp.net mvc的多语言解决方案,从路由到model再到view最后到数据库设计(先挖好坑,后面看能填多少). 我所见过的多语言做得最好的网站莫过于微软的msdn了,就先从模仿它的路由开始 仅实现相同的url格式很简单,只要将默认的路由加上一个表示语言的变量就可以了 public static void RegisterRoutes(RouteCollection routes) { //other routes routes.MapRoute( name: "Def

在WinForm应用程序中快速实现多语言的处理(2)--开发框架模块的整合

我在上篇随笔<在WinForm应用程序中快速实现多语言的处理>里面介绍了Winform开发中多语言的处理解决方案,整个多语言解决方案是以实际需求为驱动,以减少代码改动,高效处理为目的,通过基类继承的方式减少代码修改,通过引入翻译API方式减少翻译处理时间,本随笔继续深化这个多语言处理方案的介绍,是指整合在开发框架中进行无缝的使用. 1.多语言的处理步骤 1)提取多语言处理JSON文件 我们通过把程序界面或者代码里面的中文提取出来,放到JSON文件中,对不同模块可以分为不同的JSON文件,如下所

搭建连接MySql的三层架构的ASP.NetCore2.0的WebApi

里我们用三层架构搭建一个连接MySql的ASP.netCore模板的WebApi项目 首先添加WebApi项目(ASP.NetCore版本) 右键解决方案>新建项目> 选择Web>ASP.NET Core Web应用程序(.NET Core) 选择Web API 此时的目录结构: 添加实体层Entity 右键添加>新建项目>.Net Core类库 添加后的目录结构 BaseEntity: using System; using System.Collections.Gener