奕玖科技 > 新闻中心 > 技术文章

C# Asp.Net Core 多语言配置 本地化配置 附源码

来源: 奕玖科技 瘦死的猪 | 2023/1/14 15:53:23

如果我们制作的网站需要面对不同的国家,那么就需要一套多语言的系统来做区分,使用C# Asp.Net Core可以很容易实现这一点,下面我将手把手教大家如何配置多语言,首先我使用的的是Asp.net6 IED使用的是Visual Studio 2022。

第一步:创建Asp.Net Core(空)

这个没什么好说的,打开Vs创建新项目,然后搜索Asp.net core如我下图所示

使用空的模板是为了没啥垃圾代码干扰,反正自己后期需要什么功能可以直接引入,所以我一般比较喜欢使用空,创建项目应该不需要再做介绍了把?我创建的项目名称命名为Multilingual

第二步:增加语言文件

首先在项目的根目录创建文件夹Language->Views->Home按照顺序创建者3个文件夹,至于为什么需要这3个文件后期会讲解到,现在咱们要做的就是跟着我做就行了啊。然后Home文件夹右键 添加->新建项 搜索框里搜索资源文件如下图

添加2个资源文件命名为:Index.en-US.resx,Index.zh-CN.resx。看文件名称我们就知道一个代表英文,一个代表中文,咱们做的时候这2个名字每一个字符都不要改动啊,包括大小写,最终文件夹结构如下

第三步:修改Program.cs入口文件

//语言包路径,Language对应的是我们刚才的Language文件夹
builder.Services.AddLocalization(options => options.ResourcesPath = "Language");
//mvc框架
builder.Services.AddControllersWithViews(config => { })
    .AddXmlSerializerFormatters()//xml支持,这个不是多语言功能的范围内
    .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)//视图里使用语言包
    .AddDataAnnotationsLocalization();//IStringLocalizer 抽象对本地化 DataAnnotations 验证消息的支持
Var App = builder.Build();
var supportedCultures = new[] { "en-US", "zh-CN" };
var localizationOptions = new RequestLocalizationOptions().SetDefaultCulture("en-US")//默认语言
    .AddSupportedCultures(supportedCultures)
    .AddSupportedUICultures(supportedCultures)
    .AddInitialRequestCultureProvider(new CustomRequestCultureProvider(Async context =>
    {
        //浏览器请求头.不设置这个,你浏览的时候一直会显示简体中文。
        return Await Task.FromResult(new ProviderCultureResult("en-US"));
    }));
app.UseRequestLocalization(localizationOptions);


//下方代码是增加静态文件和路由配置,不在多语言范围内,但开启mvc需要下方的代码

app.UseStaticFiles();
app.UseRouting(); //将请求与端点匹配,路由规则
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}");
});

app.Run();

这里需要特别注意的是AddInitialRequestCultureProvider一定要根据情况设置,c#的多语言功能在切换语言的时候有一个方法就是设置accept-language来实现语言的切换,但是现代浏览器会自动加载系统默认语言,比如我使用的Chrom它的accept-language值为zh-CN,zh。所以不管我在SetDefaultCulture里设置的默认语言是啥,它都优先显示zh-Cn或则zh语言包。

第四步:为语言包赋值

上面就配置完成了,然后我们开始为语言包赋值

中文的Index.zh-Cn.resx 这个msg值为中文,然后配置到此完成了,我们进行最后一部分使用。

第五步:使用语言包

首先创建文件夹和Razor(cshtml)页面步骤如下Views->Home->Index.cshtml 在Index.cshtml里写入如下代码

@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@Localizer["msg"]

当然,因为我们用的是mvc,还需要控制台步骤如下 根目录->Controllers->HomeController.cs HomeController.cs代码如下

using Microsoft.AspNetCore.Mvc;
namespace ide.Controllers
{
    public class HomeController : Controller
    {
        public HomeController()
        {
        }
        public IActionResult Index()
        {
            return View();
        }
    }

}

好了,可以直接预览了,我们可以看到

这刚好就对应了我们的英文语言包,如果想切换中文的话,可以在AddInitialRequestCultureProvider里设置zh-CN它就会显示Index.zh-CN.resx里的msg的值:“中文“。

第六步:其他切换语言的3种方法

我们要切换语言包,有3种方法,Cookie Url 请求标头:accept-language:

Cookie是默认方法,值得格式为

c=zh-CN|uic=zh-CN
c=zh-CN
uic=zh-CN
//c是Culture,uic是UICulture

Url得格式为增加参数示例如下以下3种效果是一样得。

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

accept-language方法,通过改变accept-language请求头的值来实现切换,比如设置它得值为zh-CN显示中文,设置en-US就显示英文

第七步:其他注意事项

上面六步就已经实现了多语言改造的基本过程了,其他的也没啥好说的了,需要更具体的内容可以去查询一下官网的文档。我这里唯一可以说的就是语言包像我们为什么要放在Language->Views->Home里,那是因为语言包的路径要跟我们使用的路径要对应上,比如我们使用在Views->Home->index.cshtml里,那么在Language文件夹里也要设置对应的路径文件,所以这就是为什么取名为Index.zh-CN.resx的原因,它需要对应上index.cshtml。当然你也可以这样取名Language/Views.Home.Index.zh-CN.resx。那种取名方式就取决与你自己了。

当然我们也提供完成的源码大家可以下载后直接运行

20230114638093083796327365.rar


栏目导航
相关文章
文章标签
关于我们
公司简介
企业文化
资质荣誉
服务项目
高端网站定制
微信小程序开发
SEO排名推广
新闻动态
行业新闻
技术学院
常见问题
联系我们
联系我们
人才招聘
联系方式
Q Q:24722
微信:24722
电话:13207941926
地址:江西省抚州市赣东大道融旺国际3栋
Copyright©2008-2022 抚州市奕玖科技有限公司 备案号:赣ICP备2022010182号-1