2009-09-22 159 views
4

我在Session [「lang」]中有我的目標語言,它是「en」或「it」。我已經加入這個了的Site.Master:asp.net MVC:本地化

<script runat="server"> 
    void Page_Load(object sender, EventArgs e) { 
    string lang = Session["lang"].ToString(); 
    System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(lang); 
    System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.CreateSpecificCulture(lang); 
    } 
</script> 

那麼我想引用這樣的資源字符串:

<asp:Label ID="Label1" runat="server" Text="<%$ Resources:Global, test %>"></asp:Label> 

我有兩個文件在App_GlobalResources文件,命名爲Global.resx和Global.en.resx。

的問題是,無論是什麼LANG變量,我總是從主Global.resx得到的結果,我從來沒有從Global.en.resx

拿到英文版

我這樣做完全錯誤?

我試着在Global.asax.cs中的Application_PreRequestHandlerExecute方法中放置System.Threading ...部分,但結果是一樣的。

感謝

PS:我問一個途徑,以一種簡單的方式這項工作。如果我要使用複雜的方式,我會與此:http://helios.ca/2009/05/27/aspnet-mvc-and-localization/

回答

4

我在我的asp.net mvc應用程序中有相同的困境(如何實現本地化)。

我按照發布的指示here,它就像一個魅力。

所以我創建了一個名爲Localization的文件夾,然後爲每個我想翻譯的語言創建Resources resx文件。請記住,resx文件名有一個約定。即

Resources.resx是所有內容的默認回退。

Resources.en-GB.resx是英語GB

Resources.en-US.resx是美國英語

只要確保你跟隨貼中的說明鏈接嵌入,並在所有地方可用的資源,您的應用程序(視圖,控制器等)

編輯:

我想補充一點,我OMM因爲我想從我的應用程序手動設置本地,所以從web.config中提出這一行。

<globalization uiCulture="auto" culture="auto"/> 

相反,我已經創建了下面的類:

public class SmartController : Controller 
{ 
    public SmartController() 
    { 
     System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US"); 
     System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US"); 
    } 
} 

的所有控制器從該類繼承。

由於這是區域的行政設置,我必須從我的應用程序設置來設置它。你可以從Cookies中讀取它並設置它,否則。這是迄今爲止我遇到的最簡單的本地化解決方案。

一旦實施,你可以參考一下您的代碼下面簡單的線條,不需要額外的代碼添加任何字符串。

<%= Resources.Strings.TranslatedTerm %> 
+0

沒有幫助任何一個鏈接,抱歉:所有這說的是,「如果你需要設置文化根據用戶的偏好設置或URL參數,最好的辦法是編寫一個自定義HTTP模塊或操作過濾器「。 也許那麼有沒有辦法這樣做? – Palantir 2009-09-22 12:51:14

+0

當然有一種方法來設置文化..如果它是您的網站的用戶偏好,然後你將它存儲在一個cookie中,你創建一個控制器,當實例化(構造函數)你讀取cookie並設置CultureUI/Culture。然後,所有的控制器都應該從該控制器中無處不在。 – Konstantinos 2009-09-22 12:55:02

+0

當你讀到您的語言環境,並要設置它,你那樣做的時候: System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(「EN-US」); System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(「en-US」); – Konstantinos 2009-09-22 12:55:59

3

我敢打賭,這是一個重複。
無論如何 - 所有你需要的是here(假設你正在使用webforms viewengine(可能與其他人一起工作,沒有調查過))。

哦...在這裏不用我的「摘要」:

助手只是一個部分。您還需要使用默認視圖引擎進行一些修改。在createview/createpartialview上,它應該返回一個localizationwebformview,它向viewdata添加一個路徑關鍵字,這個關鍵字被htmlhelper用來查找resourceexpressionsfields並將它們傳遞給檢索期望值的本地化類。

一點獎金=>

這可能是方便的,如果你不想重新創建資源文件夾視圖子
(如果你修改viewengine.view/partialviewlocationformats):

private static string ReformatVirtualPath(string virtualPath) 
     { 
      //This allows NOT to duplicate App_localResources directory 
      // ~/Views/Shared/Partial/Some/BulltihS/_View.ascx 
      // turns into => 
      // ~/Views/Shared/_View.ascx 
      var start = @"(~(/?\w*/?){2})"; 
      var end = @"(\w*.as(c|p)x)"; 

      start = Regex.Match(virtualPath, start).Value; 
      end = Regex.Match(virtualPath, end).Value; 

      return start + end; 
     } 

用法:

internal static ResourceExpressionFields GetResourceFields 
      (string expression, string virtualPath) 
     { 
      virtualPath = ReformatVirtualPath(virtualPath); 

      var context = new ExpressionBuilderContext(virtualPath); 
      var builder = new ResourceExpressionBuilder(); 
      return (ResourceExpressionFields) 
        builder.ParseExpression(expression, typeof(string), context); 
     } 

編輯:
但它可能是股份公司建議避免App_GlobalResources和App_LocalResources爲K. Scott Allen建議(勾選Kon​​stantinos答案)。

+0

如果您在網站上包含了該信息的摘要,我會對此表示贊成。 – tvanfosson 2009-09-22 12:40:59

+0

試過,它已經連接到任何地方,但它並沒有講述整個故事。它只是提供助手從資源文件中解脫出來。我的設置中存在一個錯誤,因此這種方法無論如何不會起作用(請查看前兩段,無論如何調用都應該起作用,然後本文將討論遠離該語法以使MVC更具風格)。 – Palantir 2009-09-22 12:45:06

+0

這是源代碼,壓縮您應該調查=> http://www.eworldui.net/files/LocalizationHelpers.zip – 2009-09-22 13:05:33