MVC:如何做一个多语言网站
原文链接:
https://www.c-sharpcorner.com/article/how-to-create-multiple-languages-in-asp-net-mvc-4-5-framework/
Step1:建立一个空的MVC网站
Step2:添加两个Resources File
Step3:在Models文件夹中添加一个Registration类
namespace MultipleLanguage.Models { public class Registration { [Display(Name = "FirstName", ResourceType = typeof(Resource))] [Required(ErrorMessageResourceType = typeof(Resource), ErrorMessageResourceName = "FirstNameRequired")] public string FirstName { get; set; } [Display(Name = "LastName", ResourceType = typeof(Resource))] [Required(ErrorMessageResourceType = typeof(Resource), ErrorMessageResourceName = "LastNameRequired")] public string LastName { get; set; } [Display(Name = "Email", ResourceType = typeof(Resource))] [Required(ErrorMessageResourceType = typeof(Resource), ErrorMessageResourceName = "EmailRequired")] [RegularExpression(@"^([0-9a-zA-Z]([\+\-_\.][0-9a-zA-Z]+)*)+@(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]*\.)+[a-zA-Z0-9]{2,3})$", ErrorMessageResourceType = typeof(Resource), ErrorMessageResourceName = "EmailInvalid")] public string Email { get; set; } [Display(Name = "Country", ResourceType = typeof(Resource))] [Required(ErrorMessageResourceType = typeof(Resource), ErrorMessageResourceName = "CountryNameRequired")] public string Country { get; set; } } }
Step4:添加一个语言控制的类LanguageMang
namespace MultipleLanguage { public class LanguageMang { public static ListAvailableLanguages = new List { new Languages { LanguageFullName = "English", LanguageCultureName = "en" }, new Languages { LanguageFullName = "Chinese", LanguageCultureName = "Zh" } }; public static bool IsLanguageAvailable(string lang) { return AvailableLanguages.Where(a => a.LanguageCultureName.Equals(lang)).FirstOrDefault() != null ? true : false; } public static string GetDefaultLanguage() { return AvailableLanguages[0].LanguageCultureName; } public void SetLanguage(string lang) { try { if (!IsLanguageAvailable(lang)) lang = GetDefaultLanguage(); var cultureInfo = new CultureInfo(lang); Thread.CurrentThread.CurrentUICulture = cultureInfo; Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name); HttpCookie langCookie = new HttpCookie("culture", lang); langCookie.Expires = DateTime.Now.AddYears(1); HttpContext.Current.Response.Cookies.Add(langCookie); } catch (Exception) { } } } public class Languages { public string LanguageFullName { get; set; } public string LanguageCultureName { get; set; } } }
Step5:添加MyController基类用来判断设置当前需要用的语言(关键在这边,一开始就要判断):
namespace MultipleLanguage { public class MyController : Controller { protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state) { string lang = null; HttpCookie langCookie = Request.Cookies["culture"]; if (langCookie != null) { lang = langCookie.Value; } else { var userLanguage = Request.UserLanguages; var userLang = userLanguage != null ? userLanguage[0] : ""; if (userLang != "") { lang = userLang; } else { lang = LanguageMang.GetDefaultLanguage(); } } new LanguageMang().SetLanguage(lang); return base.BeginExecuteCore(callback, state); } } }
Step 6:添加测试的例子
1)Controller:
namespace MultipleLanguage.Controllers { public class HomeController : MyController { // GET: Home public ActionResult Index() { return View(); } [HttpPost] public ActionResult Index(Registration r) { return View(r); } public ActionResult ChangeLanguage(string lang) { new LanguageMang().SetLanguage(lang); return RedirectToAction("Index", "Home"); } } }
2)Views:
@model MultipleLanguage.Models.Registration @{ ViewBag.Title = MultipleLanguage.Resource.Register; }@MultipleLanguage.Resource.Register
"padding:5px"> @{ foreach (var i in MultipleLanguage.LanguageMang.AvailableLanguages) { @Html.ActionLink(i.LanguageFullName, "ChangeLanguage", "Home", new { lang = i.LanguageCultureName }, null)@using (Html.BeginForm()) { @Html.AntiForgeryToken()} } class="form-horizontal">}@MultipleLanguage.Resource.Register
@Html.ValidationSummary(true, "", new { @class = "text-danger" })class="form-group"> @Html.LabelFor(model => model.FirstName, htmlAttributes: new { @class = "control-label col-md-2" })class="col-md-10"> @Html.EditorFor(model => model.FirstName, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.FirstName, "", new { @class = "text-danger" })class="form-group"> @Html.LabelFor(model => model.LastName, htmlAttributes: new { @class = "control-label col-md-2" })class="col-md-10"> @Html.EditorFor(model => model.LastName, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.LastName, "", new { @class = "text-danger" })class="form-group"> @Html.LabelFor(model => model.Email, htmlAttributes: new { @class = "control-label col-md-2" })class="col-md-10"> @Html.EditorFor(model => model.Email, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })class="form-group"> @Html.LabelFor(model => model.Country, htmlAttributes: new { @class = "control-label col-md-2" })class="col-md-10"> @Html.EditorFor(model => model.Country, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Country, "", new { @class = "text-danger" })class="form-group">class="col-md-offset-2 col-md-10"> "submit" value="@MultipleLanguage.Resource.Register" class="btn btn-default" />@Html.ActionLink("Back to List", "Index")<script src="~/Scripts/jquery-1.10.2.min.js"></script> <script src="~/Scripts/jquery.validate.min.js"></script> <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
Step7: 测试效果
1.中文版
2.英文版