在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本地化完整指南 。