2014-11-14 92 views
1

沒有得到的.resx我有以下兩個文件在我的MVC項目:基礎上的CurrentUICulture

enter image description here

我設置的文化在我的Global.asax像這樣:

Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-DE"); 

我可以在Visual Studio的立即窗口中看到Thread.CurrentThread.CurrentUICulture的值在渲染視圖時是「de-DE」。

這讓我想起我的觀點:

@Html.Raw(CurrentUICultureContent.ce_landingPage_welcomeText) 

的問題是,它只是呈現從CurrentUICultureContent.resx的文本,而不是文本從CurrentUICultureContent.de.resx即使是的CurrentUICulture設置爲「德DE」。

注:我也試圖改變文件名CurrentUiCultureContent.de-DE.resx但這似乎並沒有任何工作。

編輯:我在我的視圖頁中放置了一個斷點,並在立即窗口中檢查了CurrentUICulture的值;但它仍然沒有擺脫「去DE.resx」文件中的文本:

System.Threading.Thread.CurrentThread.CurrentUICulture {de-DE} 
    Calendar: {System.Globalization.GregorianCalendar} 
    CompareInfo: {CompareInfo - de-DE} 
    CultureTypes: SpecificCultures | InstalledWin32Cultures | FrameworkCultures 
    DateTimeFormat: {System.Globalization.DateTimeFormatInfo} 
    DisplayName: "German (Germany)" 
    EnglishName: "German (Germany)" 
    IetfLanguageTag: "de-DE" 
    IsNeutralCulture: false 
    IsReadOnly: false 
    KeyboardLayoutId: 1031 
    LCID: 1031 
    Name: "de-DE" 
    NativeName: "Deutsch (Deutschland)" 
    NumberFormat: {System.Globalization.NumberFormatInfo} 
    OptionalCalendars: {System.Globalization.Calendar[1]} 
    Parent: {de} 
    TextInfo: {TextInfo - de-DE} 
    ThreeLetterISOLanguageName: "deu" 
    ThreeLetterWindowsLanguageName: "DEU" 
    TwoLetterISOLanguageName: "de" 
    UseUserOverride: true 

爲什麼返回,而不是預期的德國資源文件(英文版)?

有什麼額外的,我必須做得到這個工作?

回答

1

對不起,這個問題 - 現在的問題只是,我們是手動加載組件(影子複製它們)和現有的邏輯並沒有把resource.DLL在正確的夾。 .NET期望將resource.DLL放置在相應的文化文件夾中;即:

  • /Shadow_copy_folder
    • /EN
      • /resource.dll

一旦我更新創建卷影副本文件夾的文化邏輯; .NET挑選出正確的資源文件。

此外,我指定文化的方式有問題。顯然,它必須做這樣的:

Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("de-DE"); 
1

在MVC中應用多語言資源文件支持的一種方法是將資源文件標記爲嵌入式資源。這樣你可以使用資源文件作爲簡單的類。

爲了紀念你的資源文件嵌入的資源,你可以做下面的下面的圖片,如圖所示:

  1. 更改資源文件的訪問修飾符Public

Public Modifier

  • 接着改變它的資源文件的下列屬性,如下所示。您可以自由選擇自定義工具命名空間按你的心願:
  • Change Properties

  • 現在使用自定義工具命名空間的視圖來獲取當前區域性特定的文本。
  • Using on the view

    請注意,這是一個古老的代碼,並仍然可以工作,我沒有做任何事情完全不同。希望這有點回答你的查詢。

    編輯: 正如以下在我的評論中提到的是全球行動過濾器。讓我知道這是否適合你的目的。

    public class PersonalizeAttribute:ActionFilterAttribute 
    { 
        public override void OnActionExecuting(ActionExecutingContext filterContext) 
        { 
         string language = (string)(filterContext.RouteData.Values["language"] ?? "en"); 
         string culture = (string)(filterContext.RouteData.Values["culture"] ?? "US"); 
    
         CultureInfo ci = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture)); 
    
         Thread.CurrentThread.CurrentCulture = ci; 
         Thread.CurrentThread.CurrentUICulture = ci; 
        } 
    } 
    
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
        { 
         filters.Add(new HandleErrorAttribute()); 
         filters.Add(new PersonalizeAttribute()); 
        } 
    

    ,是的,我讀了URL區域性信息(你也可以使用服務器變量來吸引用戶的首選區域性的保留)。

    routes.MapRoute(
          name: "", 
          url: "{language}-{culture}/{controller}/{action}/{id}", 
          defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, language = "en", culture = "US" } 
         ); 
    
    +0

    我把一個獨立的示範項目,以及爲什麼它不能在我現有的項目工作,一切完美...不知道。這可能是由於我們正在進行大量的依賴注入和陰影複製程序集...仍在研究它。謝謝你的幫助。 – user1477388 2014-11-15 14:00:34

    +1

    雖然我不是很確定,但我認爲DI不應該影響當前的文化。不過,我在演示項目中所做的是,我創建了一個用於設置當前文化信息的全局動作過濾器。這樣就可以確保(在某種程度上)在我的操作在控制器中執行之前,我正在設定文化。 – 2014-11-15 14:12:10

    1

    覆蓋一個控制器的executeCore(),並設置兩個

    Thread.CurrentThread.CurrentCulture and Thread.CurrentThread.CurrentUICulture 
    

    的構建之後確保你在你的MVC項目的bin文件夾中相應的資源文件,並確保你有一個安裝程序腳本來獲取這些文件,以便在測試環境中不會有任何問題。

    好運...