2010-09-03 38 views
14

我有一個以10種不同語言國際化的ASP.NET3.5(C#)ASPX頁面。如何根據某些參數加載不同的RESX文件

該頁面的結構非常複雜,有數十個由狀態機模式驅動的嵌套視圖。

編輯:我在每個asp控件中使用meta:resourcekey語法,它允許使用隱式資源表達式的聲明語法。

我被要求根據某些查詢字符串參數「品牌」頁面。品牌化將意味着不僅加載不同的CSS文件,而且還有不同的文本模糊(在所有語言中)。

有沒有一種簡單的方法來「交換」resx文件,而不必手動爲我在這個頁面上的數百個文字和圖像中的每一個獲取資源?

換句話說,假設我有以下RESX文件:

brand1_myPage.aspx.en-US.resx 
brand1_myPage.aspx.de-DE.resx 
brand1_myPage.aspx.fr-FR.resx 

brand2_myPage.aspx.en-US.resx 
brand2_myPage.aspx.de-DE.resx 
brand2_myPage.aspx.fr-FR.resx 

myPage.aspx將尋找一個名爲myPage.xx-XX.resx RESX文件。

有沒有一種方法,而不是加載要麼brand1xxx.resx文件或基於一些價值brand2xxx.resx

在此先感謝。

回答

11

您可以使用custom cultures來實現此效果。

首先,創建並註冊自定義的文化系統,例如:

CultureAndRegionInfoBuilder builder = new CultureAndRegionInfoBuilder("en-US-brand1", CultureAndRegionModifiers.None); 
CultureInfo parentCI = new CultureInfo("en-US"); 
RegionInfo parentRI = new RegionInfo("en-US"); 
builder.LoadDataFromCultureInfo(parentCI); 
builder.LoadDataFromRegionInfo(parentRI); 
builder.Parent = parentCI; 
// set other properties of the custom culture (CultureEnglishName, CultureNativeName, possibly other ones) 
// ... 
builder.Register(); 

請注意,你可能想建立一個簡單的工具來自動完成這個,因爲這些文化需要將每個系統中安裝您的應用程序將被編譯或執行。行政權力需要能夠註冊文化。

一旦你安裝了文化,像通常一樣創建resx文件,但使用自定義文化名稱(myPage.aspx.en-US-brand1.resx等)。

現在剩下要做的就是根據某些參數設置System.Threading.Thread.CurrentThread.CurrentUICulture(越早越好,BeginRequest是一個好地方;或者Page_PreInit,如果你只想爲某些頁面使用):

CultureInfo ci = new CultureInfo(Request.QueryString["paramname"]); 
Thread.CurrentThread.CurrentCulture = ci; 
Thread.CurrentThread.CurrentUICulture = ci; 

(設置的CurrentCulture是不是真的有必要,因爲在的CurrentUICulture方面資源的工作,但同時設置允許您進一步自定義頁面的各個品牌,如用於每個定製文化/品牌不同的日期/時間格式設置)

一些注意事項:

  • 該解決方案爲您提供了很大的靈活性,因爲正常培養後備生效 - 如果一個條目中找不到爲EN -US-brandX,運行時將回退到en-US等;如果品牌大部分相似,這可以大大減少重複的resx條目,因爲您可以在父(en-US)resx文件
  • 中添加一些條目,您可以創建更多級別的繼承文化,例如en-US-brandX -variantY,
  • 所有方法訪問的資源按預期方式工作,
  • 改變工作線程的文化,如果你設的文化,你會得到本地化的異常消息,比方說,去-DE-brandX和你去-DE本地化安裝在操作系統中,
  • 由於上述原因,您可能希望將當前(UI)區域重置爲Application_Error中的CultureInfo.InvariantCulture,或者更好的是一旦捕獲到您知道的異常導致Application_Error;這將阻止標準的黃頁死亡和至少部分異常堆棧的本地化,您可能會考慮構建一個服務工具來註冊/取消註冊/更新文化,尤其是如果您預計頻繁更改,
  • 如果您使用基於客戶端的文化檢測,此解決方案可能會有問題。
0

如果您在代碼中引用資源,例如:Resources.brand1_myPage.WelcomeMessage,那麼可能會很困難。

但是,您也可以通過編程方式檢索資源:GetGlobalResourceObject ("brand1_myPage", "WelcomeMessage")。在這裏你有一些操作資源文件名的空間。

+0

我既不使用GetGlobalResourceObject也不使用GetLocalResourceObject。每個ASP控件都有一個內置的'meta:resource'屬性,可以從關聯的RESX文件自動加載。 作爲一個例子,如果我有以下ASP標籤: '的' ,然後在我的10個不同的RESX文件我定義了'someLitResource.Text',當前語言的內容已經自動加載。 – 2010-09-03 12:27:35

相關問題