1、前言
前一篇博客介绍了基于资源文件(*.resx
)的国际化多语言实现方法。但从个人角度来说,我并不是很喜欢这种做法,因为如果一个系统要支持5
种国际语言,那么就代表一个Controller
需要对应5
个资源文件。而如果系统中有20
个Controller
,则表示需要创建100
个资源文件。另一方面,如果从项目迁移的角度来考虑,之前的老项目可能都是把某个语言中的所有文本信息都写在了一个文件里,如果使用资源文件来处理,可能并不利于项目的迁移。下面就开始介绍如何利用JSON
文件来实现多语言。
2、创建JSON文件
首先创建一个Resources
文件夹,然后添加两个JSON
文件,如下图所示:
- Language.zh-CN.json
- Language.en-US.json
在JSON
文件中添加一些文本信息,代码如下所示:
{
"Name": "姓名",
"Gender": "性别",
"Age": "年龄"
}
{
"Name": "Name",
"Gender": "Gender",
"Age": "Age"
}
这里需要注意:由于JSON
文件的默认编码格式为GB2312
,这会导致在读取中文配置项时产生乱码,因此需要将这两个JSON
文件的编码格式改为UTF-8
格式,如下图所示:
3、创建多语言类
在基于资源文件实现多语言的方法中,我们需要在IStringLocalizer
的泛型参数中注入一个控制器,比如HomeController
,而现在我们需要注入的是一个Language
类,如下图所示:
Language
类不需要添加任何代码,如下所示:
namespace App
{
/// <summary>
/// 多语言类
/// </summary>
public class Language
{
}
}
4、多语言的实现
在NuGet
中引入My.Extensions.Localization.Json
组件,注意选择2.1.0
版本,如下图所示:
My.Extensions.Localization.Json
4.1、添加多语言服务
在Startup.cs
中添加JSON
多语言的支持,代码如下所示:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Localization;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.Collections.Generic;
using System.Globalization;
namespace App
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
// 添加JSON多语言
services.AddJsonLocalization(options =>
{
options.ResourcesPath = "Resources";
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
// 中英文支持
var supportedCultures = new List<CultureInfo>
{
new CultureInfo("en-US"),
new CultureInfo("zh-CN"),
};
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("zh-CN"),
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
});
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
4.2、注入IStringLocalizer接口
然后在Controller
中注入IStringLocalizer
接口即可。需要注意的是,这里的接口泛型参数需要改成Language
类,代码如下所示:
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;
namespace App.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class HomeController : ControllerBase
{
private readonly IStringLocalizer<Language> localizer;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="localizer"></param>
public HomeController(IStringLocalizer<Language> localizer)
{
this.localizer = localizer;
}
/// <summary>
/// 获取多语言
/// </summary>
/// <returns></returns>
[HttpGet]
public string Get()
{
return localizer.GetString("Name").Value + "\n" +
localizer.GetString("Gender").Value + "\n" +
localizer.GetString("Age").Value;
}
}
}
4.3、测试效果
4.3.1、基于URL
将URL
设置为https://localhost:5001/api/Home/Get?ui-culture=zh-CN
,输出结果为中文:
将URL
设置为https://localhost:5001/api/Home/Get?ui-culture=en-US
,输出结果为英文:
4.3.2、基于Cookie
在当前网页中添加一个Cookie
,名称为.AspNetCore.Culture
,值为c=zh-CN|uic=zh-CN
,输出结果为中文:
将.AspNetCore.Culture
的值改为c=en-US|uic=en-US
,输出结果为英文:
4.3.3、基于请求头Header
将浏览器设置为中文模式,输出结果为中文:
将浏览器设置为英文模式,输出结果为英文:
5、结语
本文主要介绍了基于JSON
文件的国际化多语言实现方法。个人比较喜欢这种方式,因为不需要给每个Controller
都配置好几个资源文件,而且JSON
文件看起来更加直观,也更加易于编辑。