代码之家  ›  专栏  ›  技术社区  ›  neda Derakhshesh

从多语言网站的用户浏览器获取文化信息

  •  0
  • neda Derakhshesh  · 技术社区  · 7 年前

    我发现这个链接是一个多语言网站的指南,它应该使用用户在浏览器上设置的首选语言运行。

    Get CultureInfo from current visitor and setting resources based on that?

    正如你所见,它有这样的代码

    // Get Browser languages.
     var userLanguages = Request.UserLanguages;
     CultureInfo ci;
     if (userLanguages.Count() > 0)
      {
       try
        {
          ci = new CultureInfo(userLanguages[0]);
        }
       catch(CultureNotFoundException)
        {
         ci = CultureInfo.InvariantCulture;
        }
       }
        else
         {
            ci = CultureInfo.InvariantCulture;
         }
        // Here CultureInfo should already be set to either user's preferable language
       // or to InvariantCulture if user transmitted invalid culture ID
    

    但我的问题是我不知道 CultureInfo.InvariantCulture 在我的项目中根本不起作用。它总是空的。

    我把代码改成了这个,它工作得很好,但是我不确定它可能有什么异常。我真的很感谢你的帮助。 这是我所拥有的,它工作得很好,但只是不确定可能的例外。我希望默认语言是 "en-US"

      public ActionResult Index()
    {
        CultureInfo ci;
        var userLanguages = Request.UserLanguages;
    
    
        if (userLanguages == null)
        {
            ci = new CultureInfo("en-US");
        }
    
        else if (userLanguages.Count() > 0)
        {
            try
            {
                ci = new CultureInfo(userLanguages[0]);
            }
            catch (CultureNotFoundException)
            {
                ci = new CultureInfo("en-US");
            }
        }
        else
        {
            ci = new CultureInfo("en-US");
        }
    
        return RedirectToAction(ci.TwoLetterISOLanguageName, "Home");
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Yanga    7 年前

    您的代码看起来不错,如果用户传输了无效的区域性ID,它将使用“ en-US “文化!

    这个 CultureInfo.InvariantCulture 属性用于格式化或分析一个字符串,该字符串应由一个独立于用户本地设置的软件进行分析。

    默认值为 CultureInfo.InstalledUICulture 所以违约 CultureInfo 取决于执行操作系统的设置。

    下面的代码也可以用来设置区域性:

        private static bool DoesCultureExist(string cultureName)
        {
            return CultureInfo.GetCultures(CultureTypes.AllCultures).Any(culture => string.Equals(culture.Name, cultureName, StringComparison.CurrentCultureIgnoreCase));
        }
        public ActionResult Index()
        {
            CultureInfo ci;
            var userLanguages = Request.UserLanguages;
    
            if (DoesCultureExist(userLanguages?[0]))
            {
                ci = new CultureInfo(userLanguages[0]);
            }
            else
            {
                ci = new CultureInfo("en-US");
            }
    
            return RedirectToAction(ci.TwoLetterISOLanguageName, "Home");
        }