天天看点

ASP.NET MVC 多语言开发简单案例

首先,新建一个空的MVC项目,增加一个名叫Language的文件夹用于存放资源文件,如下图所示:
ASP.NET MVC 多语言开发简单案例
在Language文件夹中,增加两个资源文件,分别用于存储中文和英文,如下图所示:
ASP.NET MVC 多语言开发简单案例
如何添加资源文件?右击Home文件夹,先选择“添加” ,再选择“类”,如下图所示:
ASP.NET MVC 多语言开发简单案例
然后找到资源文件一栏,点击选择即可,如下图所示: 
ASP.NET MVC 多语言开发简单案例
编辑资源文件,输入对应对应字段对照表,在“访问修饰符”一栏,选择“public”,不然无法在其他地方引用资源文件,如下图所示:
ASP.NET MVC 多语言开发简单案例
ASP.NET MVC 多语言开发简单案例
在前端页面增加语言选择功能,并将需要多语言切换的字段用资源文件替换,HTML代码如下: 
<div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li>@Html.ActionLink(Language.index, "Index", "Home")</li>@*替换Index*@
                    <li>@Html.ActionLink(Language.about, "About", "Home")</li>@*替换About*@
                    <li>@Html.ActionLink(Language.contact, "Contact", "Home")</li>@*替换Contact*@
                </ul>
                <ul class="nav navbar-nav navbar-right">
                    <li class="dropdown">
                        <a data-toggle="dropdown" class="dropdown-toggle" href="#" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" ><i class="fa fa-globe fa-lg fa-fw"></i><span>简体中文</span><b class="caret"></b></a>
                        <ul role="menu" class="dropdown-menu language-list" style="width:100px;">
                            <li><a href="#" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  >简体中文</a></li>
                            <li class="divider"></li>
                            <li><a href="#" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  >English</a></li>
                        </ul>
                    </li>
                </ul>
</div>
           
当用户切换时,触发Action,JS代码如下: 
<script type="text/javascript">

    $(document).ready(function () {
        //切换语言时设置MVC语言环境、设置语言全局变量
        $(".language-list a").click(function () {
            alert("hello")
            setLanguage($(this).attr("lang"));
        })
        function setLanguage(language) {
            $.ajax({
                url: "/Home/setGlobalLanguage?lan=" + language,
                type: "GET",
                cache: false,
                success: function () {
                    location.reload();
                }
            })
        }
    })
</script>
           
 触发Action后将语言设置存入session,Control中的代码如下:
public class HomeController : Controller
    {
        public void setGlobalLanguage()
        {
            string language = Request.QueryString["lan"];
            HttpContext.Session["language_id"] = language;
        }
    }
           
 增加过滤器,用于检测和切换多语言的设置,代码如下:
public class LocalizationAttribute: ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            string browserLanguage = filterContext.HttpContext.Request.Headers["Accept-Language"].Split(',')[0];
            if (browserLanguage.ToLower().Contains("en"))
            {
                browserLanguage = "en";
            }
            else if (browserLanguage.ToLower().Contains("cn"))
            {
                browserLanguage = "zh-CN";
            }
            else
            {
                browserLanguage = "zh-CN";
            }
            string sessionLanguage = filterContext.HttpContext.Session["language_id"] != null ? filterContext.HttpContext.Session["language_id"].ToString() : string.Empty;
            //如果浏览器语言与session中语言不一致,以session语言为基准,设置语言环境
            if (browserLanguage != sessionLanguage)
            {
                string language = string.Empty;
                //第一次访问,session中无语言全局变量时,用览器语言设置语言环境
                if (filterContext.HttpContext.Session["language_id"] == null)
                {
                    language = browserLanguage;
                    filterContext.HttpContext.Session["language_id"] = browserLanguage;
                }
                //session中有语言全局变量时,用session中语言全局变量设置语言环境
                else
                {
                    language = filterContext.HttpContext.Session["language_id"].ToString();
                }
                //当前线程的语言采用哪种语言(比如zh,en等)
                Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language);
                //决定各种数据类型是何组织,如数字与日期
                Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(language);
            }
        }
    }
           
 最后一步,在App_Start的FilterConfig文件中注册此过滤器,如下图所示:
ASP.NET MVC 多语言开发简单案例
运行程序,默认是中文设置,如下图所示: 
ASP.NET MVC 多语言开发简单案例
点击选择英文,查看是否切换语言成功: 
ASP.NET MVC 多语言开发简单案例
至此为止,一个简单的多语言开发就好了,我还是菜鸟,如果有更好的方法或者建议,请赐教 。