ASP.NET MVC:多語言的三種技術處理策略


背景

本文介紹了多語言的三種技術處理策略,每種策略對應一種場景,這三種場景是:

  1. 多語言資源信息只被.NET使用。
  2. 多語言資源信息只被Javascript使用。
  3. 多語言資源信息同時被.NET和Javascript使用。

下文我們就一個一個場景的分析。

第一種場景:多語言資源信息只被.NET使用

這種場景的技術處理最簡單,可以充分利用VisualStudio提供的資源編輯器及資源文件。

實現步驟

1、定義資源文件。

2、使用資源文件。

1 <h1>Classic:@Strings.Title </h1>

第二種場景:多語言資源信息只被Javascript使用

這種場景的技術實現需要參考使用的Javascript類庫,自己做也不難(無非是原型覆蓋或變量覆蓋)。

實現步驟

1、定義Javascript本地化文件。

2、引入需要的本地化文件(可以靜態引入或動態根據配置引入)。

1 <script src="../../../Javascript/Ext/locale/ext-lang-zh_CN.js"></script>

第三種場景:多語言資源信息同時被.NET和Javascript使用

這種場景多少有些復雜,因為資源信息需要在兩個地方使用,我們可以重復定義兩次,或者用代碼生成器,不過這里介紹另外一種方式:服務器生成Javascript。

實現步驟

1、定義生成Javascript代碼的控制器(會把服務器的資源文件生成為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、使用服務器生成的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實現。

 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     /// 將服務器端的資源文件轉換為Javascript代碼,主要為了在服務端和客戶端之間共享資源文件。
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"/>

中文

英文

注:不同的顏色是不同的模板導致的

代碼下載

地址:http://happy.codeplex.com/SourceControl/latest

備注

簡單的多語言容易實現,如果是跨國的企業應用,難度就非常大了,因為同一個系統運行在不同的時區和區域文化中,我還沒有深入想這塊咋處理(沒有需求)。

在博客系統中


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM