【问题标题】:get culture info from users browsers for multi language website从用户浏览器获取多语言网站的文化信息
【发布时间】:2018-09-23 10:58:10
【问题描述】:

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

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");
}

【问题讨论】:

    标签: asp.net-mvc multilingual


    【解决方案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");
        }
    

    【讨论】:

    • 非常感谢,这似乎更合乎逻辑。我来检查一下。谢谢
    • userLanguages 为空时,它会在此行中遇到错误 ` if (DoesCultureExist(userLanguages[0]))`。我的意思是当用户没有在用户浏览器的首选语言列表中选择任何语言时。我应该处理这个吗?
    • 如果您添加“?”可能会起作用DoesCultureExist(userLanguages?[0])
    • 我试过了,但是出现了新的错误。它无法识别此DoesCultureExist(userLanguages?[0])
    猜你喜欢
    • 2013-05-20
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 2020-02-12
    相关资源
    最近更新 更多