[英]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
用于按名称进行的所有请求 您在“ .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.