stevenjin 2024-09-25 11:15 采纳率: 100%
浏览 5
已采纳

.net 7.0 mvc中间件语言切换的疑惑

1.NET 7.0 MVC CORE
2.用中间件对语言查询字符串进行拦截,前后端都可以切换语言,查询地址如下:
http://localhost:5230/Home/GetProduct/?culture=zh-CN


 app.Use(async (context, next) =>
 {
     if (context.Request.Query.Count > 0 && context.Request.Query["culture"].ToString() != "")
     {
         Thread.CurrentThread.CurrentCulture =
         Thread.CurrentThread.CurrentUICulture = new CultureInfo(context.Request.Query["culture"].ToString());
         //save current culture to cookide
         context.Response.Cookies.Append(
            CookieRequestCultureProvider.DefaultCookieName,
            CookieRequestCultureProvider.MakeCookieValue
            (new RequestCulture(context.Request.Query["culture"].ToString()))
            , new CookieOptions() { Expires = DateTime.Now.AddYears(1) }
         );
     }
     await next.Invoke();
 });

问题:每个页面都加个语言查询不好,于是用如下方式写入cookine中,再用中间件拦截cookie中的值,设置cultrue。
这种改的方式正确吗?

    [HttpGet]
     public ActionResult SetCulture(string lang)
     { //用于语言切换      
       var culture="zh-CN";
         switch (lang.Trim())
         {
             case "en":
                 culture="en-US";
                 break;
             case "cn":
               culture="zh-CN";
                 break;        
         };
       
         Response.Cookies.Append("culture", culture, new CookieOptions
         {
             Expires = DateTime.Now.AddYears(1)
         });         
         return Json(new { success = true });

 app.Use(async (context, next) =>
 {
     var cookies = context.Request.Cookies;
     var myCookieValue = cookies["culture"]; 
     Thread.CurrentThread.CurrentCulture =
        Thread.CurrentThread.CurrentUICulture = new CultureInfo(myCookieValue);

     if (context.Request.Query.Count > 0 && context.Request.Query["culture"].ToString() != "")
     {
         Thread.CurrentThread.CurrentCulture =
         Thread.CurrentThread.CurrentUICulture = new CultureInfo(context.Request.Query["culture"].ToString());
         //save current culture to cookide
         context.Response.Cookies.Append(
            CookieRequestCultureProvider.DefaultCookieName,
            CookieRequestCultureProvider.MakeCookieValue
            (new RequestCulture(context.Request.Query["culture"].ToString()))
            , new CookieOptions() { Expires = DateTime.Now.AddYears(1) }
         );
     }
     await next.Invoke();
 });
  • 写回答

1条回答 默认 最新

  • 科技梦想家 2024-09-25 13:23
    关注

    以下内容由AIGC 及 gpt.4o 科技梦想家编程波士 共同为您回答解决方案、有用望采纳☀️☀️:

    你的代码思路是正确的,使用中间件来处理语言切换的逻辑,并通过 Cookie 存储当前的语言设置。这种方式能有效避免每个页面都需要手动添加语言查询字符串的麻烦。以下是一些建议和改进点:

    代码结构优化
    中间件顺序:确保你的中间件在 MVC 路由处理之前执行,这样在控制器执行时就可以正确设置文化信息。

    Cookie 名称一致性:你在 SetCulture 方法中使用了 "culture" 作为 Cookie 名称,而在 Use 中间件中使用了 CookieRequestCultureProvider.DefaultCookieName。为了避免混淆,建议统一使用一个 Cookie 名称。

    改进代码示例

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // 其他中间件...
    
        app.Use(async (context, next) =>
        {
            // 优先检查 Cookie 中的语言设置
            if (context.Request.Cookies.TryGetValue("culture", out var culture))
            {
                Thread.CurrentThread.CurrentCulture = 
                Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);
            }
    
            // 检查查询字符串中的语言设置
            if (context.Request.Query.TryGetValue("culture", out var cultureFromQuery) && !string.IsNullOrEmpty(cultureFromQuery))
            {
                Thread.CurrentThread.CurrentCulture = 
                Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureFromQuery);
    
                // 更新 Cookie
                context.Response.Cookies.Append("culture", cultureFromQuery, new CookieOptions { Expires = DateTime.Now.AddYears(1) });
            }
    
            await next.Invoke();
        });
    
        // 其他中间件...
    }
    
    [HttpGet]
    public ActionResult SetCulture(string lang)
    {
        var culture = lang.Trim() switch
        {
            "en" => "en-US",
            "cn" => "zh-CN",
            _ => "zh-CN" // 默认文化
        };
    
        Response.Cookies.Append("culture", culture, new CookieOptions
        {
            Expires = DateTime.Now.AddYears(1)
        });
    
        return Json(new { success = true });
    }
    
    
    

    注意事项
    文化默认值:确保在没有 Cookie 和查询字符串时有一个合理的默认文化设置。

    并发处理:如果你的应用有高并发请求,考虑使用 AsyncLocal 来存储当前请求的文化信息,以避免线程间干扰。

    国际化支持:确保你的视图和资源文件能够根据当前文化正确显示翻译内容。

    测试不同场景:测试在不同的浏览器和设备上的 Cookie 行为,确保语言切换能够正确保存和应用。

    这种方式在用户体验上非常友好,能够有效提高网站的可用性。希望这些建议能帮助你更好地实现语言切换功能!

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

报告相同问题?

问题事件

  • 已采纳回答 9月25日
  • 修改了问题 9月25日
  • 创建了问题 9月25日

悬赏问题

  • ¥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局部变量对蓝图不可见