1.NET 7.0 MVC CORE
2.前台用以下方式可切换语言:
http://localhost:5230/Home/Privacy/?culture=zh-CN //前端变为中文
http://localhost:5230/Home/Privacy/?culture=en-US //前端变为英文?
3.后台用SetCulture去切换语言后,获取失败,调用方式:
3.1 切换语言环境:http://localhost:5230/Home/SetCulture?lang=en
3.2 用以下路径访问均失败:
http://localhost:5230/Home/Get
http://localhost:5230/Home/Get/?culture=zh-CN
http://localhost:5230/Home/Get/?culture=en-US
//启动时配置
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
options.AddSupportedCultures(new string[] { "en-US", "zh-CN", "fr-FR" })
.AddSupportedUICultures(new string[] { "en-US", "zh-CN", "fr-FR" });
//var supportedCultures = new[]
//{
// new CultureInfo("en-US"),
// new CultureInfo("zh-CN"),
// new CultureInfo("fr-FR")
//};
options.DefaultRequestCulture = new RequestCulture("en-US");
//options.SupportedCultures = supportedCultures;
//options.SupportedUICultures = supportedCultures;
});
// Add services to the container.
builder.Services.AddControllersWithViews();
//builder.Services.AddLocalization(options =>
//{
// options.ResourcesPath = "SharedResource";//指定资源文件目录
//});
builder.Services.AddMvc();
builder.Services.AddLocalization();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
}
// 使用请求本地化中间件
app.UseRequestLocalization();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
}
}
//后端注入
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly IStringLocalizer<SharedResource> _localizer;
public HomeController(ILogger<HomeController> logger, IStringLocalizer<SharedResource> localizer)
{
_logger = logger;
this._localizer = localizer;
}
public IActionResult Index()
{
return View();
}
[HttpGet]
public ActionResult SetCulture(string lang)
{ //用于语言切换
switch (lang.Trim())
{
case "en":
CultureInfo.CurrentCulture = new CultureInfo("en-US");
CultureInfo.CurrentUICulture = new CultureInfo("en-US");
break;
case "cn":
CultureInfo.CurrentCulture = new CultureInfo("zh-CN");
CultureInfo.CurrentUICulture = new CultureInfo("zh-CN");
break;
case "tw":
CultureInfo.CurrentCulture = new CultureInfo("zh-TW");
CultureInfo.CurrentUICulture = new CultureInfo("zh-TW");
break;
};
Response.Cookies.Append("culture", lang, new CookieOptions
{
Expires = DateTime.Now.AddYears(1)
});
return Json(new { success = true });
}
public IActionResult Privacy()
{
var lg = HttpContext.Request.Cookies["culture"];
Console.WriteLine(_localizer.GetString("Name").Value);
Console.WriteLine(CultureInfo.CurrentCulture.Name);
return View();
}
//伪类,用来代理共享资源,两个资源文件分别为:
SharedResource.en-US、SharedResource.zh-CN
public class SharedResource
{}
//从后台获取多语言值,失败
/// <summary>
/// 获取多语言
/// </summary>
/// <returns></returns>
[HttpGet]
public string Get()
{
return _localizer.GetString("Name").Value + "\n";
}
//从前台获取多语言值,可访问
@using Microsoft.Extensions.Localization
@using WebApplication3.Resource
@{
ViewData["Title"] = "Privacy Policy";
}
<h1>@ViewData["Title"]</h1>
<p>Use this page to detail your site's privacy policy.</p>
@inject IStringLocalizer<SharedResource> IR;
@{
var d = IR["name"].Value;
<h1>@d</h1>
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}