在MVC中的一个页面上本地化文本
我正在学习asp.net MVC,所以我没有那么多经验。 我想在一个页面上本地化文本,但我不想让标签查看模型。 必须本地化太多文本,并且将所有文本放在视图模型属性中看起来不正确。
我想直接从资源文件中用razor读取本地化值。 这可能吗? 我应该在什么文件夹中创建资源文件? 我应该如何命名资源文件? 如何从资源文件中读取页面上的值?
它与您在普通C#代码中所做的没有什么不同。 在本文中可以找到详细描述(即使它不是关于Razor相同的概念仍然适用)。
首先,您必须决定放置资源文件的位置。 选修地点是资源文件夹。 亚历克斯建议(并且这是非常合理的)模仿解决方案结构(视图,模型和控制器),以保持组织和整洁。 在实践中,你将有一个这样的结构:
。 /资源 /楷模 LogInModel.resx /控制器 LogIn.resx /浏览次数 /家 LogIn.resx Index.resx
等等。 本地化资源将简单地使用如下:
查看
@MyProject.Resources.Views.Home.Index.Title @MyProject.Resources.Views.Home.Index.Welcome
楷模
[Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(MyProject.Resources.Models.LogIn))] [ValidatePasswordLength(ErrorMessageResourceName = "PasswordMinLength", ErrorMessageResourceType = typeof(MyProject.Resources.Models.LogIn))] [DataType(DataType.Password)] [DisplayName("Password")] public string Password { get; set; }
控制器
var user = FindUserByName(userName); if (user == User.Nobody) ModelState.AddModelError("1", MyProject.Resources.Controllers.Search.UserNotFound);
现在让我们启用本地化(对于每个线程,然后对于它的请求可能会有所不同)。 这只是一个例子,请参阅完整文章了解所有细节:
protected void Application_AcquireRequestState(object sender, EventArgs e) { if (HttpContext.Current.Session != null) { string name = (CultureInfo)this.Session["Culture"]; if (!String.IsNullOrEmpty(name)) { CultureInfo ci = new CultureInfo(name ); Thread.CurrentThread.CurrentUICulture = ci; Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ci.Name); } } }
参考
- MVC中的国际化和本地化5 。
- ASP.NET MVC 3,JavaScript和jQuery中的全球化,国际化和本地化 。
- ASP.NET MVC本地化完整指南 。