我希望用户为整个应用程序选择一次首选语言。向我建议最简单的步骤。
这样,用户只需在登录后选择首选语言一次,然后使用选定的文化呈现所有应用的视图。
我发现与某人有关here使用ASP.Net MVC3进行国际化(用户选择所有视图的首选语言)
因为我是国际化的新手,我没有正确地得到它。
我创建了一个示例应用程序,它使用浏览器特定的文化工作正常,但在这里我希望用户选择首选语言。
我希望用户为整个应用程序选择一次首选语言。向我建议最简单的步骤。
这样,用户只需在登录后选择首选语言一次,然后使用选定的文化呈现所有应用的视图。
我发现与某人有关here使用ASP.Net MVC3进行国际化(用户选择所有视图的首选语言)
因为我是国际化的新手,我没有正确地得到它。
我创建了一个示例应用程序,它使用浏览器特定的文化工作正常,但在这里我希望用户选择首选语言。
通常,.NET将使用与用户最匹配的CultureSetting,然后确定用于全球化的适当资源文件。
一旦你“保存”了用户适当的文化,就可以在数据库,会话或cookie中。
我要做的就是线程切换到适当的语言:
var language = "fr"; // Pull from your "saved" location (database, session, cookie, etc.)
// This changes UI only
Thread.CurrentThread.CurrentUICulture = new CultureInfo(language);
// This changes how number, date formatting is handled
Thread.CurrentThread.CurrentCulture = new CultureInfo(language);
希望帮助!
我建议你扩展具有Culture参数的用户实体以将其存储在数据库中。 然后,它可以在会话中添加有关用户的文化,例如(但任何其它技术也可使用)
,那么你需要增加新的属性与代码
public class LocalizationAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { try { string culture = UserSession.Culture;//Other mechanism of getting userinfo could be used there if (!string.IsNullOrEmpty(culture)) { CultureInfo cultureInfo = new CultureInfo(culture); Thread.CurrentThread.CurrentCulture = cultureInfo; Thread.CurrentThread.CurrentUICulture = cultureInfo; } } catch (Exception e) { Logger logger = new Logger(); logger.LogException(e); } } }
并添加此属性适用于所有应该本地化的控制器
一种方法是使用cookie。
假设您有一个下拉列表或用户可以选择语言的某种输入,请将该输入帖子添加到操作方法中。在这种操作方法,写的语言ID将Cookie:
public class LanguageController
{
[ActionName("change-to")]
public virtual RedirectResult Change(LanguageChanger model)
{
var langCookie = new HttpCookie(CookieNames.Language);
langCookie.Value = model.SelectedIsoCode;
langCookie.Expires = DateTime.UtcNow.AddDays(28);
HttpContext.Response.Cookies.Add(langCookie);
return Redirect(model.ReturnUrl);
}
}
然后,您可以使用一个HttpModule来设置文化为每个请求。你知道文化通过这种方式被设置在整个请求处理管道,而不是只当你的控制器操作执行:
public class CookieLocalizationModule : IHttpModule
{
public void Dispose() { }
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
void context_BeginRequest(object sender, EventArgs e)
{
// read the cookie (if any) and set the culture
if (HttpContext.Current.Request.Cookies[CookieNames.Language] != null)
{
var cookie = HttpContext.Current.Request
.Cookies[CookieNames.Language];
var lang = cookie.Value;
var culture = new System.Globalization.CultureInfo(lang);
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
}
}
}
向IIS注册& IIS Express中的模块,看到这个web.config文件(注意卡西尼配置会略有不同)
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true">
<add name="CookieLocalizationModule"
type="MyProject.CookieLocalizationModule, MyProject" />
</modules>
<handlers>
...
我在MVC 2项目工作CookieLocalizationModule的相同的设置,但在MVC 4中context_BeginRequest达到永不失败。问题是什么?谢谢。 – user585440