2

希望這不是一個問題太愚蠢。在MVC中,視圖中似乎有很多本地化支持。但是,一旦我到達控制器,就會變得模糊不清。如何在使用基於SQL的本地化提供程序時本地化/國際化MVC控制器?

  • 使用元:獲取ResourceKey = 「嗒嗒」出來了,同樣用 <%$資源:PageTitle.Text%>
  • ASP.NET MVC - Localization Helpers - 對於Html幫助程序類的建議擴展,如Resource(this Controller controller, string expression, params object[] args)。同樣,Localize your MVC with ease建議有一個稍微不同的擴展名,如Localize(this System.Web.UI.UserControl control, string resourceKey, params object[] args)

這些方法在控制器中都不起作用。我把下面的函數放在一起,我使用控制器完整的類名作爲我的VirtualPath。但我是MVC的新手,並假設有更好的方法。

public static string Localize (System.Type theType, string resourceKey, params object[] args) { 
     string resource = (HttpContext.GetLocalResourceObject(theType.FullName, resourceKey) ?? string.Empty).ToString(); 
     return mergeTokens(resource, args); 
    } 

想法?註釋?

+0

我認爲,本土化是一個方面,不應該使控制器的組成部分邏輯。由於這是一個演示特定的方面,我認爲無論您選擇什麼方法,都應該讓您的視圖負責解決此問題。我知道這並不能回答你的問題,但至少是你作出決定的暗示。 – uvita 2010-03-17 00:22:40

+0

@uvita請參閱我對@LukLed的回覆。我還想補充說,使本地化成爲視圖的一個問題是一個合理的架構決定,儘管這種類型的策略迫使我收集我的控制器或驗證服務層中的密鑰/令牌列表,以便它們可以在我的視圖中傳遞通過ViewData。另外,就我所見,這意味着我的視圖必須填充ModelState錯誤或放棄Html.ValidationMessage()基礎結構。這不會比服務層中的本地化對視圖的責任更具破壞性嗎? – EBarr 2010-03-17 13:13:07

回答

3

我有相同的question。這篇博文展示了不同的方法來解決這個問題:http://carrarini.blogspot.com/2010/08/localize-aspnet-mvc-2-dataannotations.html

最後我用T4模板生成資源類。我也有一個的HtmlHelper方法來訪問我的資源:

public static string TextFor(this HtmlHelper html, string resourceName, string globalResourceName, params object [] args) 
{ 
    object text = HttpContext.GetGlobalResourceObject(globalResourceName, resourceName); 
    return text != null ? string.Format(text.ToString(), args) : resourceName; 
} 

另一個版本生成從控制器和本地化版本查看:

public static string LocalTextFor(this HtmlHelper html, string resourceName, params object [] args) 
{ 
    string localResourceName = string.Format("{0}.{1}", html.ViewContext.RouteData.Values["controller"], 
               html.ViewContext.RouteData.Values["action"]); 
    object text = HttpContext.GetGlobalResourceObject(localResourceName, resourceName); 
    return text != null ? string.Format(text.ToString(), args) : langName; 
} 
+0

這與我最後實施的(去年!)類似。但你得到了第一個寫出來的答案票:-) – EBarr 2011-04-07 19:08:15

0

我使用PublicResXFileCodeGenerator作爲自定義工具(在.resx文件的屬性中選擇)使用強類型資源。如果我擁有「AreYouSure」名稱和「你確定嗎?」的資源值,可以通過在控制器和視圖中調用ResourceClass.AreYouSure來訪問它。它工作得很好。

+0

我很高興聽到其他的聲音,但這需要將資源文件嵌入程序集(它會自動生成您所依賴的類)。我的資源存儲在數據庫中,因此此解決方案無法工作。例如,驗證消息爲 – EBarr 2010-03-16 23:09:42

0

你想在你的控制器本地化什麼?通常只有對用戶顯示的內容應該進行本地化。向用戶顯示的內容應該放在視圖中,以便回到助手。

+0

。也許不在控制器中,但在服務層。 – LukLed 2010-03-17 09:31:31

+0

具體來說,我正在查看MVC Starter Kit和由MVC 2創建的默認項目。在控制器中都有一系列用戶名/密碼驗證聲明和錯誤消息硬編碼。我正在尋找一種合適的方式來對這些類型的語句進行本地化。 我同意(使用@LukLed和@uvita)在較大的項目中,服務層是更合適的驗證位置。但是,我不想讓我的問題的描述複雜化。儘管如此,答案同樣適用於控制器和服務層。 – EBarr 2010-03-17 13:08:49

+0

是的,樣本MS項目不認爲非英語人士是用戶:)無論如何,爲什麼不設置一個消息,你不只是設置一個代碼,以便以後用來查找正確的消息? – uvita 2010-03-18 00:38:23