【译】MVC3 20个秘方-(4)实现多语言
场景
互联网是由千百万个人使用。他们来自数百个不同的国家,使用数百种不同的语言。甚至在加拿大、美国和英国之间英语也有许多方言。
所以,不在你的网站上仅仅呈现一种语言是重要的。
解决方案
创建资源文件,并且以键值对的形式添加静态文本,通过CurrentUICulture来提供改变语言的能力。
讨论
资源文件是基于文本的XML文件,用来支持静态网站多国语言。你创建一个主要的资源文件,包含你的默认语言。为文本创建一些key/value pair。然后,你就可以在你的controller、view、model中的任何地方使用这些文本了。下图是个例子
注意圈红的地方要设置为public。如果一个文件的访问修饰符不是public ,它可能不能被访问到。
下面开始创建你的资源文件。右键单击project,添加->新建文件夹,添加新项,选择资源文件。创建。
正如你在上边例子看到的。我已经为书中的每一个字段创建了一个条目。下一步就是更新这个model ,在DisplayAttribute中引用这些值。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations;
using MvcApplication.Validations;
namespace MvcApplication.Models
{
public class Book
{
public int ID { get; set; }
[Required]
[Display(Name = "TitleDisplay",
ResourceType = typeof(Resources.Resource1))]
public string Title { get; set; }
[Display(Name = "IsbnDisplay",
ResourceType = typeof(Resources.Resource1))]
[Required]
[IsbnValidation]
public string Isbn { get; set; }
[Display(Name = "SummaryDisplay",
ResourceType = typeof(Resources.Resource1))]
[Required]
public string Summary { get; set; }
[Display(Name = "AuthorDisplay",
ResourceType = typeof(Resources.Resource1))]
[Required]
public string Author { get; set; }
[Display(Name = "ThumbnailDisplay",
ResourceType = typeof(Resources.Resource1))]
public string Thumbnail { get; set; }
[Display(Name = "PriceDisplay",
ResourceType = typeof(Resources.Resource1))]
[Range(1, 100)]
public double Price { get; set; }
[Display(Name = "PublishedDisplay",
ResourceType = typeof(Resources.Resource1))]
[DataType(DataType.Date)]
[Required]
public DateTime Published { get; set; }
}
public class BookDBContext : DbContext
{
public DbSet<Book> Books { get; set; }
}
}
在上边的例子中,DisplayAttribute 特性中的“Name”是从资源文件检索的key。resource type 中定义了资源文件的名称。
提示:为了更方便调试资源文件,避免在view中处理数据。我强烈建议在controller里创建一个 ViewBag并且在view中引用这些值。因为如果直接在view里访问资源文件。View不由Visual studio 编译。如果你犯错了,你将遇到一个运行时的错误。而在controller里使用资源文件的好处就是如果定义的key文件没有找到。Visual studio 会编译失败。
下边的例子将更新Book Index view 把静态的文本放到资源文件里。如果你检查那个view 你会发现没有太多的项要放到资源文件里。
下边我们按照下边的表创建key/value pairs。
你们可以注意到,我把后边4个key/value pair 写的比较通用。
因为资源文件是整个网站都可以访问的。在其他的地方我们一样可以用他们来替换静态文本。
更新之后我们的资源文件应该变成这样了
创建完资源文件,让我们打开BookController 并且用如下代码替换Index() action:
public ViewResult Index()
{
#region ViewBag Resources
ViewBag.Title =
Resources.Resource1.BookIndexTitle;
ViewBag.CreateLink =
Resources.Resource1.CreateLink;
ViewBag.TitleDisplay =
Resources.Resource1.TitleDisplay;
ViewBag.IsbnDisplay =
Resources.Resource1.IsbnDisplay;
ViewBag.SummaryDisplay =
Resources.Resource1.SummaryDisplay;
ViewBag.AuthorDisplay =
Resources.Resource1.AuthorDisplay;
ViewBag.ThumbnailDisplay =
Resources.Resource1.ThumbnailDisplay;
ViewBag.PriceDisplay = Resources.Resource1.PriceDisplay;
ViewBag.PublishedDisplay =
Resources.Resource1.PublishedDisplay;
ViewBag.EditLink =
Resources.Resource1.EditLink;
&
补充:Web开发 , 其他 ,