之前做了一个多语言架构一,就是根据业务需要,自己去弄的一个架构,但是实现方式其实比较生硬,今天在这就是根据微软的一些好的api从新把之前的框架优化一下。
优化修改内容如下:
1、资源文件的添加(资源文件的名称添加一个语言类别的扩展名)
Language的资源文件,存储中文字符,Language.en-US存储英文,这里的".en-US"就是扩展名,如果在需要添加其它的语言资源文件可以以相同格式添加。这一点很重要
2、添加一个特性,用于检测用户的语言设置,来设置资源文件的语言类型
public class LocalizationAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//获取客户端语言
string CLstr = filterContext.HttpContext.Request.UserLanguages[0];
//查询是否存在客户端语言缓存
if (filterContext.HttpContext.Request.Cookies["CurLanguageType"] != null) {
CLstr = filterContext.HttpContext.Request.Cookies["CurLanguageType"].Value;
HttpCookie _cookie = new HttpCookie("CurLanguageType", CLstr);
_cookie.Expires = DateTime.Now.AddYears(1);
filterContext.HttpContext.Response.SetCookie(_cookie);
}
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(CLstr);
}
}
这里先判断客户端语言,然后在判断用户是否有设置语言缓存,如果有把缓存添加到用户客户端,同时设置当前线程的语言特征
3、后台数据的使用
[Localization]
public class HomeController : Controller
{
// GET: Home
public ActionResult Index()
{
string test1 = Resours.Language.Test1;
//Stopwatch watch = new Stopwatch();
//watch.Start();
//for (int i = 0; i < 1000000; i++) {
// test1 = Resours.Language.Test1;
//}
//watch.Stop();
//string time = watch.ElapsedMilliseconds.ToString();
return View();
}
}
这里直接使用使用Language资源文件,因为这里的Home控制器添加了特性,在执行Home控制器下面的方法都会先执行localization特性,而在此特性中设置了对当前线程的语言资源特性进行了设置。而在语言资源类型中,获取属性数据,都是使用ResourceManager来获取,而ResourceManager会通过判断当前线程特性来从对应的资源文件中找到数据
public static string Test1 {
get {
return ResourceManager.GetString("Test1", resourceCulture);
}
}
所以在这里,如果我们想要Resours.Language.Test1显示未中文,只需要把CurrentUICulture设置为“zh-CN”,为英文则是“en-US”
4、前端显示方式不变
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div id="Content">
<span>语言切换:</span>
<select id="Language_change">
<option value="zh-CN">中文</option>
<option value="en-US">英文</option>
</select>
<br />
<p id="p_Test"></p>
<p>@Multi_L_Two.Resours.Language.Test1</p>
</div>
<!--全局js-->
<script src="~/scripts/jquery-2.1.3-min.js"></script>
<script src="~/scripts/utils.js"></script>
<!--语言-->
<script type="text/javascript" src="@Url.Action("Language","Common")"></script>
<script>
$(document).ready(function () {
loadInit();
$("#p_Test").text(Base.Language["Test1"]);
});
function loadInit() {
//设置当前语言版本
var cltFlag = $.utilfn.checkCookie("CurLanguageType");
if (cltFlag) {
//存在
var getclt = $.utilfn.getCookie("CurLanguageType");
$("#Language_change").find("option[value='" + getclt + "']").attr("selected", true);
}
}
//语言切换
$("#Language_change").change(function () {
var value = $(this).find("option:selected").attr("value");
console.log(value);
$.utilfn.setCookie("CurLanguageType", value);
setTimeout(function () {
window.location.reload();
}, 300);
});
</script>
</body>
</html>
在这里和之前不同的是,我直接在前台执行了后台代码,这个是razor带给我们的便利。
和多语言架构一相比,无论是获取资源内容的速度和方便上都有很大的提高。后期如果有了更好的方法我会在继续分享给大家。同时这个多语言架构也是我一次搭建,有不足欢迎大家留言指正,沟通讨论才会有进步。后面我会把代码上传上来,大家可以下载查看源代码。
最后在推荐一下资源文件管理工具"ResX Manager",直接在微软官方工具可以找到,可以在工具页面添加不同语言的文字,不需要页面切来切去,而且提供外部翻译,很方便很实用
地址:https://marketplace.visualstudio.com/items?itemName=TomEnglert.ResXManager#overview