繁体   English   中英

选择语言并在MVC / C#中更改CultureInfo

[英]Select language and change the CultureInfo in MVC / C#

在选择所需的语言后,我需要帮助来选择语言并动态更改CultureInfo。 我有.resx文件,视图和控制器。 但是我使用Tenant,所以..是否可能或建议更改语言?

我认为:

<div class="form-group" >
  <select id="idiomSelect"  class="form-control" style=" border-color: #FFFFFF;">
    <option id="pt-BR" ng-selected="selected">Português (Brasil)</option>
    <option id="es-CL">Español (Chile)</option>
    <option id="es-ES">Español (España)</option>
    <option id="en-US">English (USA)</option>
   </select>
</div>

我想到了使用以下参数构建方法(例如en-US):

Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
 Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");

有人可以帮我吗?

处理多租户(即, 多个域映射到同一应用程序 )。 答案确实取决于租期的设置方式。 例如,如果您遵循Wikipedia模型,则文化名称会在URL中进行编码(即en.wikipedia.org,ja.wikipedia.org,de.wikipedia.org)。 在这种情况下,您已将CultureInfo编码为URL本身。 您只需要提取它并使用它来检索您的资源。 如果您有另一个用于多租户的模型,那么最好的选择是使用会话变量cookie来记住所请求的区域性。

问题的其余部分与i18n(国际化)和l10n(本地化)直接相关。 ASP.Net的人们撰写了一篇很棒的文章,介绍如何在您的系统中构建该基础结构( 链接到本文 )。 本质上,它使用了我提供的一些线索,但是将它们包装在帮助器类中,因此您始终可以根据需要对其进行访问:

  • 他们建议使用ASPNET_CULTURE cookie( ASPNET_CULTURE )存储区域性信息。
  • 自动检测所需区域性的首选方法是使用Accept-Language HTTP标头。 设置后,它将提供首选的文化顺序。 这为居住在国外但想用其母语阅读的外籍人士提供了更好的体验。
  • .resx文件遵循标准的命名模式:( FileName.resx为默认语言, FileName.fr.resx为法国文化等)。 i18n变体必须与默认.resx文件位于同一名称空间/文件夹中。 (这是ResourceManager根据文化信息解析资源所必需的)。
  • 本文提供了一些示例,这些示例创建了自己的助手来自动查找和解析资源。

“ .resx”文件具有一些您可能不知道的属性和方法。

  • 文化CultureInfo用于按名称进行的所有请求
  • ResourceManager-资源的实际字典

您在“ .resx”文件中定义的每个属性都仅调用以下等效方法:

ResourceManager.GetString("ResourceName", Culture);

没有什么可以自动查看您的Thread.CurrentCulture值。 但是,可以使用nameof()运算符和该值来获取值:

MyResources.ResourceManager.GetString(
    nameof(MyResources.ResourceManager.ResourceName),
    Thread.CurrentUICulture);

谢谢大家..我明白了..

    OutputCache(NoStore = true, Duration = 0)]
    // set language on select(view) and create a cookie  
    [HttpGet]
    public ActionResult SetCulture(string idiomString)
    {

        HttpCookie cookie = Request.Cookies["_culture"];
        if (cookie != null)
            cookie.Value = idiomString;   
        else
        {
            cookie = new HttpCookie("_culture");
            cookie.Value = idiomString;
        }
        Response.Cookies.Add(cookie); 

        return RedirectToAction("Index");
    }

    // set the language 
     protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state) 
    {

        string cultureName = null;

        HttpCookie cultureCookie = Request.Cookies["_culture"];

        if (cultureCookie != null)
            cultureName = cultureCookie.Value;
        else
            cultureName = Request.UserLanguages["0"]; 

        Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cultureName);
        Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;

        return base.BeginExecuteCore(callback, state);
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM