2012-12-05 45 views
5

我正在將項目轉換爲使用衛星組件。 我創建了一個新的類庫(名爲「Resources」)。所有的默認資源位於根級*.resx。 然後每個文化都有一個文件夾。衛星組件,ASP.NET語言不變

「EN /」 與*.en.resx

EN-GB/ 與*.en-GB.resx

我改變了.resx文件Access Modifier 「公開」,並改變這些設置。

BuildAction: EmbeddedResource 
CopyToOutputDirectory: CopyAlways 

我確定.resx設計師*.Designer.cs使用 「資源」 的命名空間。

我將類庫添加到ASP.NET MVC應用程序,並在global.asax.cs我有根據需要設置的文化。

System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-GB"); 
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB"); 

我嘗試添加了al.exeResgen.exe命令,在資源類庫生成後事件。

「C:\ Program Files文件\微軟的SDK \的Windows \ V7.1 \ BIN \ Resgen.exe」 EN-GB/MyResourceFile.en-GB.resx「C:\ Program Files文件\微軟的SDK \ Windows \ v7.1 \ Bin \ al.exe「/ t:lib /eed:en-GB/MyResourceFile.en-GB.resources/culture:en-gb /out:Resources.resources.dll

展望MVC應用程式內爲bin/每種語言文件夾下有文件夾有3個文件:

MyResources.en-GB.Designer.cs,MyResources.en-GB.resx, Resources.resources.dll

根級別只有Resources.dllResources.resources.dll但默認語言工作正常。第二個*.resources.dll是由於生成後事件。

當我更改CurrentUICulture時,它不會更改UI語言。在將資源從App_GlobalResources/移出到外部組件之前,它可以正常工作(Razor示例)。

@Resources.MyResources.StringIdentifier 

使用.NET Reflector查看資源.dlls這些是不同之處。

編輯:

設置的CurrentCulture和的UICulture在global.asax.cs後,我測試了手動檢索ResourceManager其實際工作和預期語言檢索到的字符串。

  System.Resources.ResourceManager gStrings = 
       new System.Resources.ResourceManager("Resources.MyResources", System.Reflection.Assembly.Load("Resources")); // Resources=Project Name 
      string test = gStrings.GetString("TestString"); // WORKS IN GLOBAL.ASAX.CS!!! 

我在MVC控制器中嘗試了相同的測試,但它不起作用。所以ResourceManager可以被檢索的唯一地方是Global.asax.cs。

奇怪的是,在剃刀中的UI級別進行相同的測試只會返回默認文化文本! cultureInfo是正確的,但ResourceManager只返回ASP.NET MVC Razor UI中的默認語言。 (這是嚴格的測試)

@{ 
     System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentUICulture; 
     System.Resources.ResourceManager gStrings = 
      new System.Resources.ResourceManager("Resources.MyResource", System.Reflection.Assembly.Load("Resources")); 
     string s = gStrings.GetString("Test"); // DOESN'T WORK IN UI 
    } 

TLDR版本:

從資源(的.resx)從App_GlobalResources文件轉換爲附屬程序集。

問題在眼前。

我可以使用global.asax中的CurrentUICulture語言爲衛星程序集手動調用ResourceManager,它按預期方式工作,但是相同的測試從​​UI端失敗並在MVC控制器中失敗。

默認語言工作正常,所以爲什麼不切換語言?

回答

1

如果最近已經建立了一個項目,其中的內部化工作或多或少像您所描述的那樣正確工作。

using Perpetuality.Data; 
using System; 
using System.Collections.Generic; 
using System.Globalization; 
using System.Linq; 
using System.Security.Principal; 
using System.Threading; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Routing; 


namespace Perpetuality.Controllers 
{ 
    public partial class BaseController : Controller 
    { 
     private CultureInfo GetCultureInfo(AuthorizationContext filterContext) 
     { 
      switch ((string)filterContext.RouteData.Values["language"]) 
      { 
       case "nl": 
        return CultureInfo.CreateSpecificCulture("nl-NL"); 
       case "en": 
        return CultureInfo.CreateSpecificCulture("en-US"); 
       case "pt": 
        return CultureInfo.CreateSpecificCulture("pt-PT"); 
       case "de": 
        return CultureInfo.CreateSpecificCulture("de-DE"); 
       case "es": 
        return CultureInfo.CreateSpecificCulture("es-ES"); 
       case "fr": 
        return CultureInfo.CreateSpecificCulture("fr-FR"); 
       case "it": 
        return CultureInfo.CreateSpecificCulture("it-IT"); 
       case "jp": 
        return CultureInfo.CreateSpecificCulture("ja-JP"); 
       default: 
        return CultureInfo.CreateSpecificCulture("en-US"); 
      } 
     } 

     protected override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      Thread.CurrentThread.CurrentCulture = GetCultureInfo(filterContext); 
      Thread.CurrentThread.CurrentUICulture = GetCultureInfo(filterContext); 

      base.OnAuthorization(filterContext); 
     } 
    } 
} 

在我的項目的RESX文件是不是在你指定的不同:

BuildAction: EmbeddedResource 
CopyToOutputDirectory: DoNotCopy 

https://github.com/Jacco/Perpetuality

我切換每個HTTP請求的語言OnAuthorize控制器我作爲基地使用

在我的看法我訪問這樣的字符串:

@Resources.Home.Index.FacebookButtonCaption 

我沒有設置任何帖子或預編譯。

在我的項目中,語言始終在url上。如果最初沒有選擇合適的語言,用戶可以切換語言。

+0

+1分享。我使用cookies作爲語言,因此文化只能設置爲登錄時。在我有機會詳細調查您的應用程序之前(以及它是否實際適用於衛星資源)還需要一段時間,謝謝發佈。它們有點棘手,在多個項目中使用時需要非常繁瑣的細節。 :) – lko

+0

我認爲你需要爲每一個請求進入文化設置。從餅乾中獲取它沒有問題。我的資源也在一個單獨的圖書館(我認爲這是你的意思是衛星?) – Jacco