覆蓋 ASP.NET 中標準程序集的資源
System.ComponentModel.DataAnnotations我想為一個 ASP.NET 項目覆蓋一個字元串。我是否需要進行衛星組裝、搞亂自定義建構任務al.exe等?即使是,我也找不到如何轉換.resx為. 如果沒有,在哪裡放置以及如何命名?.resources``al.exe``.resx.UPD:為了清楚起見:我想使用自定義資源字元串而不是來自程序集的預設資源的字元串。我不想在每個使用該字元串的地方進行更改。畢竟,資源的存在只是為了覆蓋它們。
雖然這很奇怪,特別是對於熟悉開源本地化技術的人來說,不能為任何系統組件建構衛星組件,甚至不能由第 3 方簽署:
如果您的主程序集使用強命名,則必須使用與主程序集相同的私鑰對附屬程序集進行簽名。如果主程序集和附屬程序集之間的公鑰/私鑰對不匹配,則不會載入您的資源。
儘管我對此表示懷疑,但是否可以自動進行相同的操作,但沒有衛星組件,這是未知的。
Phil Haack 有一篇很棒的文章*Localizing ASP.Net MVC Validation,它專門指導您覆蓋字元串。
DataAnnotations這篇文章比它更適用ASP.net MVC。因此,這將有助於您使用DataAnnotattions*。下面我列出了在 Visual Studio 中添加本地化資源的最簡單步驟。
- 打開*
Project Properties*對話框。- 選擇*
Resources*選項卡。- 點擊以創建新的預設資源文件。
- 這將在您的文件夾中創建兩個文件
Properties。
- 資源.resx
- 資源.Designer.cs
- Resources.resx打開後,將其更改*
Access Modifier* 為*Public*.- 添加你的字元串。
要為特定文化添加額外的資源文件,您需要這樣做。
- 右鍵點擊您*
Project的Solution Explorer*.- 選擇添加->新項目->資源 文件。
- 命名它*
Resources.en-us.resx*。(用適當的程式碼替換“en-us”)- 點擊添加
- 將其拖到
Properties文件夾中。- 打開Resources.en-us.resx並將其更改*
Access Modifier* 為*Public*.- 添加你的字元串。
- 對您需要支持的每種文化重複此操作。
在建構過程中,VS 會將*.resx文件轉換為.resource文件並為您建構包裝類。然後您可以通過命名空間訪問
YourAssembly.Properties.Resources*。有了這個 using 語句。
using YourAssembly.Properties;您可以使用如下屬性進行裝飾:
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "MyStringName")]注意:為了保持一致性,我使用了Properties文件夾。要使用 App_GlobalResources 將您的*.resx*文件移到那裡並更改您的 using 語句以匹配目錄名稱。像這樣:
using YourAssembly.App_GlobalResources;編輯:最接近強類型資源名稱的方法是執行以下操作:
public class ResourceNames { public const string EmailRequired = "EmailRequired"; }然後,您可以使用這樣的屬性進行裝飾。
[Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = ResourceNames.EmailRequired)]要啟用自動客戶端區域性檢測,請將*全球化部分添加到web.config*文件中。
<configuration> <system.web> <globalization enableClientBasedCulture="true" culture="auto:en-us" uiCulture="auto:en-us"/> </system.web> <configuration>在這裡,我啟用了基於客戶端的文化,並將文化和uiculture設置為“ auto ”,預設為“ en-us ”。
創建單獨的衛星程序集:
MSDN*創建附屬程序集文章也會有所幫助。如果您不熟悉附屬程序集,請確保您閱讀了打包和部署資源*。
在過去創建附屬程序集時,我發現使用 VS 建構事件很有用。這些是我將採取的步驟。
- *
Class Library*在我的解決方案中創建一個單獨的項目。- 創建或添加我的*
.resx*文件到這個項目。- *
Post-Build Event在Project Properties*對話框中添加一個。(比如下面那張)範例 VS 建構後腳本:
set RESGEN="C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\resgen.exe" set LINKER="C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\al.exe" set ASSEMBLY=$(TargetName) set SOURCEDIR=$(ProjectDir) Set OUTDIR=$(TargetDir) REM Build Default Culture Resources (en) %RESGEN% %SOURCEDIR%en\%ASSEMBLY%.en.resx %SOURCEDIR%en\%ASSEMBLY%.resources REM Embed Default Culture %LINKER% /t:lib /embed:%SOURCEDIR%en\%ASSEMBLY%.resources /culture:en /out:%OUTDIR%%ASSEMBLY%.resources.dll REM Embed English Culture IF NOT EXIST %OUTDIR%en\ MKDIR $%OUTDIR%en\ %LINKER% /t:lib /embed:%SOURCEDIR%en\%ASSEMBLY%.resources /culture:en /out:%OUTDIR%en\%ASSEMBLY%.resources.dll REM These are just a byproduct of using the project build event to run the resource build script IF EXIST %OUTDIR%%ASSEMBLY%.dll DEL %OUTDIR%%ASSEMBLY%.dll IF EXIST %OUTDIR%%ASSEMBLY%.pdb DEL %OUTDIR%%ASSEMBLY%.pdb如果你不想使用*ResGen.exe來轉換你的
.resx*文件,你可以這樣做。using System; using System.Collections; using System.IO; using System.Resources; namespace ResXConverter { public class ResxToResource { public void Convert(string resxPath, string resourcePath) { using (ResXResourceReader resxReader = new ResXResourceReader(resxPath)) using (IResourceWriter resWriter = new ResourceWriter( new FileStream(resourcePath, FileMode.Create, FileAccess.Write))) { foreach (DictionaryEntry entry in resxReader) { resWriter.AddResource(entry.Key.ToString(), entry.Value); } resWriter.Generate(); resWriter.Close(); } } } }以這種方式進行轉換的潛在缺點之一是需要引用
System.Windows.Forms.dll. 您仍然需要使用*Assembly Linker*。編輯:正如 wRAR 提醒我們的那樣,如果您正在簽署您的程序集,您的密鑰必須匹配。