求助:基于ASP.NET Core 6 MVC实现无.resx多语言网站(Cookie+列表)
搭建ASP.NET Core 6 MVC多语言网站(无.resx实现)
1. 准备语言资源文件
在项目根目录新建Resources文件夹,创建三个JSON文件分别存储对应语言的文本:
en.json(英语)
{ "Home": { "Title": "Welcome", "Subtitle": "This is a multilingual website" }, "Common": { "SwitchLanguage": "Switch Language", "Save": "Save" } }
es.json(西班牙语)
{ "Home": { "Title": "Bienvenido", "Subtitle": "Este es un sitio web multilingüe" }, "Common": { "SwitchLanguage": "Cambiar idioma", "Save": "Guardar" } }
ar.json(阿拉伯语)
{ "Home": { "Title": "أهلاً بك", "Subtitle": "هذا موقع متعدد اللغات" }, "Common": { "SwitchLanguage": "تبديل اللغة", "Save": "حفظ" } }
2. 实现自定义资源读取服务
创建JsonLocalizationService类,负责读取对应语言的JSON资源:
public class JsonLocalizationService { private readonly IWebHostEnvironment _env; private readonly Dictionary<string, object> _resources = new(); public JsonLocalizationService(IWebHostEnvironment env) { _env = env; } public void LoadResources(string cultureName) { _resources.Clear(); var filePath = Path.Combine(_env.ContentRootPath, "Resources", $"{cultureName}.json"); if (!File.Exists(filePath)) return; var jsonContent = File.ReadAllText(filePath); var resources = JsonSerializer.Deserialize<Dictionary<string, Dictionary<string, string>>>(jsonContent); if (resources == null) return; foreach (var section in resources) { foreach (var keyValue in section.Value) { _resources.Add($"{section.Key}.{keyValue.Key}", keyValue.Value); } } } public string GetString(string key) { return _resources.TryGetValue(key, out var value) ? value.ToString() : key; } }
在Program.cs中注册服务并配置请求文化:
var builder = WebApplication.CreateBuilder(args); // 添加MVC服务 builder.Services.AddControllersWithViews(); // 注册自定义本地化服务 builder.Services.AddScoped<JsonLocalizationService>(); // 配置请求文化选项 builder.Services.Configure<RequestLocalizationOptions>(options => { var supportedCultures = new[] { new CultureInfo("en"), new CultureInfo("es"), new CultureInfo("ar") }; options.DefaultRequestCulture = new RequestCulture("en"); options.SupportedCultures = supportedCultures; options.SupportedUICultures = supportedCultures; // 设置从Cookie读取文化 options.RequestCultureProviders.Insert(0, new CookieRequestCultureProvider { CookieName = "Culture" }); }); var app = builder.Build(); // 启用请求本地化中间件 app.UseRequestLocalization(); // 其他中间件配置 app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
3. 实现语言切换功能
创建LanguageController处理语言切换的Cookie设置:
public class LanguageController : Controller { private readonly JsonLocalizationService _localizationService; public LanguageController(JsonLocalizationService localizationService) { _localizationService = localizationService; } [HttpPost] public IActionResult SetLanguage(string culture, string returnUrl) { Response.Cookies.Append( CookieRequestCultureProvider.DefaultCookieName, CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)), new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }); // 加载对应语言的资源 _localizationService.LoadResources(culture); return LocalRedirect(returnUrl); } }
在布局视图_Layout.cshtml中添加语言切换下拉列表(先注入服务):
@inject JsonLocalizationService _localizationService <div class="language-switcher"> <form asp-controller="Language" asp-action="SetLanguage" asp-route-returnUrl="@Context.Request.Path" method="post"> <label>@_localizationService.GetString("Common.SwitchLanguage"):</label> <select name="culture" onchange="this.form.submit()"> <option value="en" @(Context.Request.Cookies["Culture"]?.Contains("en") == true ? "selected" : "")>English</option> <option value="es" @(Context.Request.Cookies["Culture"]?.Contains("es") == true ? "selected" : "")>Español</option> <option value="ar" @(Context.Request.Cookies["Culture"]?.Contains("ar") == true ? "selected" : "")>العربية</option> </select> </form> </div>
4. 在视图中使用本地化文本
在Home/Index.cshtml中直接调用服务获取本地化文本:
@inject JsonLocalizationService _localizationService <h1>@_localizationService.GetString("Home.Title")</h1> <p>@_localizationService.GetString("Home.Subtitle")</p>
5. 处理阿拉伯语RTL布局
在_Layout.cshtml的<html>标签中根据当前文化设置布局方向:
<html dir="@(Context.Request.Cookies["Culture"] == "ar" ? "rtl" : "ltr")" lang="@Context.Request.Cookies["Culture"] ?? "en">
6. 初始化资源加载
在HomeController的Index方法中确保首次访问加载对应资源:
public class HomeController : Controller { private readonly JsonLocalizationService _localizationService; public HomeController(JsonLocalizationService localizationService) { _localizationService = localizationService; } public IActionResult Index() { var culture = Request.Cookies["Culture"] ?? "en"; _localizationService.LoadResources(culture); return View(); } }
内容的提问来源于stack exchange,提问作者gazel alaryan
相关产品推荐
相关产品推荐

