熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET MVC 多語言解決方案

2013-11-13 10:10:14  來源: .NET編程 

  現在ASPNET MVC 已經出了第四版了現在多了很多特性但是如何在 ASPNET MVC 下方便的實現多語言特性呢?

  就一個網站的多語言特性來說我認為分為兩個方面

  HTML界面上顯示的文字需要多語言

  HTML界面上JS輸出的文字需要多語言

  原來在HTML部分直接寫的文字都不能直接寫要輸出的文字而是要采用標記的方法來替換JS也是同理

  那麼在MVC下怎麼能透明的實現多語言呢?所謂透明的實現是指程序員在開發程序當中不需要過多的考慮多語言的問題直接調用一個方法就能實現多語言而且所要用到的語言文件每個語言一個文件就夠了集中翻譯這個語言就完成了多語言的功能 
   
  例如
  <html>
  
  <head>
  
  </head>
  
  <body>
  
   多語言輸出的文字 //這裡就不能直接寫中文了一個好方法是 直接用 <%= HtmlLang(string) %> 來進行輸出
  
  </body>
  
  </html>
  
  這裡<%= HtmlLang(clickme) %> 是對 HTMLHelper 進行了擴展增加了一個 Lang 的方法參數是需要翻譯的資源字符串的Name
  
   怎麼為 HTMLHelper 進行擴展?下面這個類就是增加了的擴展類
  
  
  
  
  
  Code
  using System;
  using SystemData;
  using SystemConfiguration;
  using SystemLinq;
  using SystemWeb;
  using SystemWebSecurity;
  using SystemWebUI;
  using SystemWebUIHtmlControls;
  using SystemWebUIWebControls;
  using SystemWebUIWebControlsWebParts;
  using SystemXmlLinq;
  using SystemGlobalization;
  
  using SystemWebCompilation;
  using SystemWebMvc;
  using SystemWebRouting;
  
  namespace SystemWebMvc {
   public static class LocalizationHelpers {
   /// <summary>
   /// 在外邊的 Html 中直接使用
   /// </summary>
   /// <param name=htmlhelper></param>
   /// <param name=key></param>
   /// <returns></returns>
   public static string Lang(this HtmlHelper htmlhelper string key) {
   string FilePath = htmlhelperViewContextHttpContextServerMapPath(/) + Resource\\;
   return GetLangString(htmlhelperViewContextHttpContext key FilePath);
   }
   /// <summary>
   /// 在外邊的 Html 中直接使用對 JS 進行輸出字符串
   /// </summary>
   /// <param name=htmlhelper></param>
   /// <param name=key></param>
   /// <returns></returns>
   public static string LangOutJsVar(this HtmlHelper htmlhelper string key) {
   string FilePath = htmlhelperViewContextHttpContextServerMapPath(/) + Resource\\;
   string langstr = GetLangString(htmlhelperViewContextHttpContext key FilePath);
   return stringFormat(var {} = {} keylangstr);
   }
   /// <summary>
   /// 在 C# 中使用
   /// </summary>
   /// <param name=httpContext></param>
   /// <param name=key></param>
   /// <returns></returns>
   public static string InnerLang(HttpContextBase httpContext string key) {
   string FilePath = (/) + Resource\\;
   return GetLangString(httpContext key FilePath);
   }
  
   private static string GetLangString(HttpContextBase httpContext string key string FilePath) {
   LangType langtype = ;
   if ([Lang] != null) {
   langtype = (LangType)[Lang];
   }
   return LangResourceFileProviderGetLangString(key langtype FilePath);
   }
   }
  
   public static class LangResourceFileProvider {
   public static string GetLangString(string Key LangType langtype string FilePath) {
   string filename;
   switch (langtype) {
   case : filename = zhcnresources; break;
   case LangTypeen: filename = enusresources; break;
   default: filename = zhcnresources; break;
   }
  
   SystemResourcesResourceReader reader = new SystemResourcesResourceReader(FilePath + filename);
  
   string resourcetype;
   byte[] resourcedata;
   string result = stringEmpty;
  
   try {
   readerGetResourceData(Key out resourcetype out resourcedata);
   //去掉第一個字節無用
   byte[] arr = new byte[resourcedataLength ];
   for (int i = ; i < arrLength; i++) {
   arr[i] = resourcedata[i + ];
   }
   result = SystemTextEncodingUTFGetString(arr);
  
   }
   catch (Exception ex) {
  
   }
   finally {
   readerClose();
   }
  
   return result;
   }
   }
  
   public enum LangType {
   cn
   en
   }
  }
   這個類叫 LocalizationHelpers 公開了 LangLangOutJsVarInnerLang 三個方法其中 LangLangOutJsVar 可以在 Html 界面中直接調用InnerLang 可以在C#後台使用
  
  這裡使用了 resx 資源文件注意這裡這個文件需要被編譯後才能使用否則找不到已經增加的項編譯這個可以使用NET 自帶的 ResGenexe
  
  上面這個類很簡單就是根據傳入的 Session[Lang] 中的語言類型來做判斷該讀那個資源文件(資源文件必須在 Resource 目錄下)然後讀取所需要的NAME返回對應的字符串VALUEVALUE中就是最後要輸出的文字了
  
  
  
  在前台的 aspx 中就可以直接用 <%= HtmlLang(String) %>來輸出了至於JS的輸出看下面例子
  
   <script language=javascript type=text/javascript>
   <%= HtmlLangOutJsVar(msg)%>
   function show()
   {
   alert(msg);
   }
   </script>
  
  這樣就OK了
  
  如果有的需要在C#中取資源字符串那麼可以使用
  
  ViewData[Message] = LocalizationHelpersInnerLang(thisControllerContextHttpContext Welcome);來輸出
  
  我根據ASPNET MVC 做了個DEMO截圖如下
  
  


From:http://tw.wingwit.com/Article/program/net/201311/12771.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.