stevenjin 2024-09-24 14:26 采纳率: 100%
浏览 5
已采纳

.net7.0 core mvc切换多国语言失败

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
 {}

//以下为验证结果
//验证1:从后台获取多语言值,失败
     /// <summary>
     /// 获取多语言
     /// </summary>
     /// <returns></returns>
     [HttpGet]
     public string Get()
     {
         return _localizer.GetString("Name").Value + "\n";
     }



//验证2:从前台获取多语言值,可访问
@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>
}    
 }

  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-09-24 17:29
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    从你给出的代码和描述来看,你的 ASP.NET Core MVC 项目应该是基本正确的,但可能存在一些问题导致无法成功切换语言。这里有一些可能的解决方案和建议:

    问题 1:SetCulture 方法中修改 CultureInfo 的方式可能不正确

    SetCulture 方法中,你尝试直接修改 CultureInfo.CurrentCultureCultureInfo.CurrentUICulture,这在多线程环境中可能不会按预期工作。这些静态属性应该通过请求作用域进行更改,以确保每个请求有其自己的文化信息设置。你应该在请求管道中使用中间件或在 HttpContext 中设置它们。

    解决方案 1:使用中间件来设置文化信息

    创建一个中间件来读取 cookie 中的语言设置,并设置到 HttpContext 中。这样可以在整个请求过程中访问这些设置。

    问题 2:在 Get 方法中使用 _localizer.GetString("Name").Value 可能不正确

    Get 方法中直接使用 _localizer.GetString("Name").Value 可能无法正确获取本地化字符串,因为 _localizer 可能没有正确设置文化信息。你应该使用从 HttpContext 中获取的本地化服务来获取字符串。

    解决方案 2:使用 IHtmlLocalizerIViewLocalizer 在视图中获取本地化字符串

    在你的控制器或视图中使用 IHtmlLocalizerIViewLocalizer 来获取本地化字符串,并确保它们与当前请求的文化信息相关联。你可以在控制器构造函数中注入 IHtmlLocalizer<SharedResource> 并使用它来获取字符串。在视图中,你可以使用 @inject IHtmlLocalizer<SharedResource> IR 来注入并使用它。确保你的视图和资源文件正确配置和命名。

    问题 3:资源文件命名和配置可能存在问题

    确保你的资源文件命名正确,并且与你的文化信息设置匹配。例如,如果你的文化信息设置为 "en-US",你的资源文件名应该是 SharedResource.en-US.resx。此外,确保你的资源文件中的键是正确的,并且与你在代码中使用的键相匹配。

    其他建议:

    • 确保你的项目已启用中间件 app.UseRequestLocalization()。这确保了请求本地化中间件能够处理文化信息的设置。
    • 确保你的路由配置正确,并且视图中的路径和名称与你的控制器方法匹配。
    • 如果你使用的是自定义中间件或库来管理会话或请求文化信息,请确保它们按预期工作并与 ASP.NET Core 的本地化机制兼容。

    根据这些建议,你可以尝试调整你的代码和配置,以解决文化信息切换的问题。如果你还有其他问题或需要进一步的帮助,请提供更多的详细信息或具体的错误消息。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 9月25日
  • 修改了问题 9月24日
  • 修改了问题 9月24日
  • 修改了问题 9月24日
  • 展开全部

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见