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

时间:2018-09-23 10:58:11

标签: asp.net-mvc multilingual

我发现此链接作为制作多语言网站的指南,该网站应使用用户在浏览器中设置的首选语言来运行。

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的确切职责是什么,并且在我的项目中根本不起作用。它始终为null。

我将代码更改为此,它可以正常工作,但是我不确定它可能存在异常。我真的很感谢任何帮助。 这是我所拥有的,它可以正常工作,但是不确定可能的例外情况。我希望默认语言为"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 个答案:

答案 0 :(得分:1)

您的代码看起来不错,如果用户传输了无效的区域性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");
    }