stevenjin 2024-09-24 14:16 采纳率: 100%
浏览 3
已采纳

asp.net 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
 {}

//从后台获取多语言值,失败

     /// <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 });
     }
 }
  • 写回答

1条回答 默认 最新

  • 关注

    下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    问题分析:

    1. 后台用SetCulture去切换语言后,获取失败。
    2. 需要先设置默认的翻译,然后再使用SetCulture进行语言切换。

    解决方案:

    1. Startup.cs中设置默认的翻译,并将默认的语言作为参数传递给SetCulture方法。
    2. 在处理HTTP请求时,使用Request localization options来初始化并应用默认的翻译。

    以下是修改后的代码:

    // ...
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();
            services.AddSingleton<IStringLocalizer<SharedResource>>((局部变量) => LocalizerFactory.Get localizedizer($"SharedResource.{局部变量}$"));
    
            services.AddRequestLocalization(options =>
            {
                options.SetDefaultRequestCulture(new RequestCulture("en-US"));
                options.SupportedCultures = new[]
                {
                    new CultureInfo("en-US"),
                    new CultureInfo("zh-CN"),
                    new CultureInfo("fr-FR")
                };
            });
    
            // ...
        }
    
        // ...
    
        [HttpGet]
        public ActionResult SetCulture(string lang)
        { //用于语言切换      
           
             switch (lang.Trim())
             {
                 case "en":
                     CultureInfo.CurrentUICulture = new CultureInfo("en-US");
                     CultureInfo.CurrentUICulture = new CultureInfo("en-US");
                     break;
                 case "cn":
                     CultureInfo.CurrentUICulture = new CultureInfo("zh-CN");
                     CultureInfo.CurrentUICulture = new CultureInfo("zh-CN");
                     break;
                 case "tw":
                     CultureInfo.CurrentUICulture = 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 });
         }
    
         //从前台获取多语言值,可访问 @using Microsoft.Extensions.Localization
    @using WebApplication3.Res和平量生成器
    public classSharedResource
    {
    }
    

    注意:这里的示例中没有考虑到当加载不同文化和语言的页面时可能会出现的问题。如果你的应用有这种情况,可能需要对应用程序进行一些改进以更好地适应不同的文化和语言。

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

报告相同问题?

问题事件

  • 已采纳回答 9月24日
  • 修改了问题 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局部变量对蓝图不可见