You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:47:04