试想下在MVC的前端页面JS或者html中需要使用多语言,而后端的多语言是维护在资源文件中的,前端如果使用的话需要使用AJAX频繁的获取,一个页面中可能会存在大量的需要语言转换的地方,频繁使用AJAX是不靠谱的。
参照ABP中的方式,可以使用修改PageBaseType的方式来实现。
MVC的Page页面是继承自System.Web.Mvc.WebViewPage的,我们可以写个类来继承自这个类并修改Page的默认继承即可,在这个类中,我们增加多语言的方法。
首先,在Views目录下新建一个类:MultiPageWebViewPageBase.cs。内容如下:
using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Resources; using System.Web; using System.Web.Mvc; using TaskManagement.Infrastructure.Extensions; namespace TaskManagement.UI.Views { public abstract class MultiPageWebViewPageBase : MultiPageWebViewPageBase<dynamic> { } public abstract class MultiPageWebViewPageBase<TModel> : WebViewPage<TModel> { public ResourceManager rm = Resource.Resource.ResourceManager; /// <summary> /// Constructor. /// </summary> protected MultiPageWebViewPageBase() { } /// <summary> /// Gets localized string for given key name and current language. /// </summary> /// <param name="name">Key name</param> /// <returns>Localized string</returns> protected virtual string L(string name) { return rm.GetString(name) ?? name; } /// <summary> /// Gets localized string for given key name and current language with formatting strings. /// </summary> /// <param name="name">Key name</param> /// <param name="args">Format arguments</param> /// <returns>Localized string</returns> protected virtual string L(string name, params object[] args) { return rm.GetString(name, args) ?? name; } /// <summary> /// Gets localized string for given key name and specified culture information. /// </summary> /// <param name="name">Key name</param> /// <param name="culture">culture information</param> /// <returns>Localized string</returns> protected virtual string L(string name, CultureInfo culture) { return rm.GetString(name, culture) ?? name; } /// <summary> /// Gets localized string for given key name and current language with formatting strings. /// </summary> /// <param name="name">Key name</param> /// <param name="culture">culture information</param> /// <param name="args">Format arguments</param> /// <returns>Localized string</returns> protected string L(string name, CultureInfo culture, params object[] args) { return rm.GetString(name, culture, args) ?? name; } } }
至web.config中的
<system.web.webPages.razor>
下pages节,将
<pages pageBaseType="System.Web.Mvc.WebViewPage">
修改为:
<pages pageBaseType="TaskManagement.UI.Views.MultiPageWebViewPageBase">
至此,我们就可以在前端使用@L("Field_Common_ID")的方式来使用多语言了。当然,在js中也可以这样使用:
if (confirm("@L("Msg_Common_Confirm")"))
同样的方式,可以在该MultiPageWebViewPageBase添加多个公用的方法以扩展前端。
缺点:这种多语言无法在单独的js文件中使用,必须在继承于MultiPageWebViewPageBase的页面中使用。