背景本文介紹了多語言的三種技術(shù)處理策略,每種策略對應(yīng)一種場景,這三種場景是:
下文我們就一個一個場景的分析。 第一種場景:多語言資源信息只被.NET使用這種場景的技術(shù)處理最簡單,可以充分利用VisualStudio提供的資源編輯器及資源文件。 實現(xiàn)步驟 1、定義資源文件。 2、使用資源文件。 1 <h1>Classic:@Strings.Title </h1> 第二種場景:多語言資源信息只被Javascript使用這種場景的技術(shù)實現(xiàn)需要參考使用的Javascript類庫,自己做也不難(無非是原型覆蓋或變量覆蓋)。 實現(xiàn)步驟 1、定義Javascript本地化文件。 2、引入需要的本地化文件(可以靜態(tài)引入或動態(tài)根據(jù)配置引入)。 1 <script src="../../../Javascript/Ext/locale/ext-lang-zh_CN.js"></script> 第三種場景:多語言資源信息同時被.NET和Javascript使用這種場景多少有些復(fù)雜,因為資源信息需要在兩個地方使用,我們可以重復(fù)定義兩次,或者用代碼生成器,不過這里介紹另外一種方式:服務(wù)器生成Javascript。 實現(xiàn)步驟 1、定義生成Javascript代碼的控制器(會把服務(wù)器的資源文件生成為Javascript代碼,這樣就保證資源只需要定義一次)。 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Mvc; 6 7 using Happy.Web.Mvc; 8 9 namespace Happy.MvcExample.Controllers 10 { 11 public class JavascriptResourceController : Controller 12 { 13 // 14 // GET: /JavascriptResource/Strings 15 16 public ActionResult Strings() 17 { 18 return new JavascriptResourceResult("MvcExample.Strings", typeof(Resource.Strings)); 19 } 20 } 21 } 2、使用服務(wù)器生成的Javascript代碼。 1 <script src="~/Scripts/jquery-2.0.3.js"></script> 2 <script type="text/javascript" src="JavascriptResource/Strings"></script> 3 <script type="text/javascript"> 4 $("#ClientTitle").text(MvcExample.Strings.Title); 5 </script> 3、JavascriptResourceResult實現(xiàn)。 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Web.Mvc; 7 8 using Happy.Infrastructure.ExtentionMethods; 9 10 namespace Happy.Web.Mvc 11 { 12 /// <summary> 13 /// 將服務(wù)器端的資源文件轉(zhuǎn)換為Javascript代碼,主要為了在服務(wù)端和客戶端之間共享資源文件。 14 /// </summary> 15 public sealed class JavascriptResourceResult : JavaScriptResult 16 { 17 public JavascriptResourceResult(string javascriptObjectName, Type resourceType) 18 { 19 javascriptObjectName.MustNotNullAndNotWhiteSpace("javascriptObjectName"); 20 resourceType.MustNotNull("resourceType"); 21 22 var namespaceDefinitionString = GetNamespaceDefinitionString(javascriptObjectName); 23 var keyValueStrings = GetKeyValueString(resourceType); 24 25 this.Script = string.Format("{0};{1} = {{{2}}}", namespaceDefinitionString, javascriptObjectName, keyValueStrings); 26 } 27 28 private static string GetNamespaceDefinitionString(string javascriptObjectName) 29 { 30 var names = javascriptObjectName.Split('.'); 31 32 var namespaces = names.Take(names.Length - 1).Select((x, index) => 33 { 34 return String.Join(".", names.Take(index + 1).ToArray()); 35 }); 36 37 var sb = new StringBuilder(); 38 sb.AppendFormat("var {0} = {0} || {{}}", namespaces.First()); 39 foreach (var item in namespaces.Skip(1)) 40 { 41 sb.AppendFormat("{0} = {0} || {{}}", item); 42 } 43 44 return sb.ToString(); 45 } 46 47 private static string GetKeyValueString(Type resourceType) 48 { 49 var keyvalues = resourceType 50 .GetProperties() 51 .Select(x => 52 { 53 return string.Format("{0}: '{1}'", x.Name, x.GetValue(null)); 54 }).ToArray(); 55 56 return String.Join(",", keyvalues); 57 } 58 } 59 } 最終的運行效果切換語言需要修改Web.Config,配置如下: 1 <globalization uiCulture="en-US"/> 中文 英文 注:不同的顏色是不同的模板導(dǎo)致的。 代碼下載地址:http://happy./SourceControl/latest。 備注簡單的多語言容易實現(xiàn),如果是跨國的企業(yè)應(yīng)用,難度就非常大了,因為同一個系統(tǒng)運行在不同的時區(qū)和區(qū)域文化中,我還沒有深入想這塊咋處理(沒有需求)。 在博客系統(tǒng)中 |
|