我希望用户为整个应用选择一次首选语言。建议我最简单的步骤。
这样用户只需在登录后选择一次首选语言,然后用选定的文化呈现所有应用程序的视图。
我找到了相关的here
因为我是国际化的新手,所以我得不到它。
我创建了一个示例应用程序,它与浏览器特定的文化一起工作正常,但我希望用户选择首选语言。
答案 0 :(得分:1)
通常,.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);
希望有所帮助!
答案 1 :(得分:0)
我建议您使用Culture参数扩展User实体以将其存储在DB中。 然后可以在Session中添加有关用户文化的信息(例如,也可以使用任何其他技术)
然后你需要添加代码
的新属性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); } } }
并将此属性添加到应该本地化的所有控制器
答案 2 :(得分:0)
一种方法是使用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(注意Cassini配置会有所不同)
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true">
<add name="CookieLocalizationModule"
type="MyProject.CookieLocalizationModule, MyProject" />
</modules>
<handlers>
...