Asp.net

覆蓋 ASP.NET 中標準程序集的資源

  • August 9, 2019

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 中添加本地化資源的最簡單步驟​​。

  1. 打開*Project Properties*對話框。
  2. 選擇*Resources*選項卡。
  3. 點擊以創建新的預設資源文件
  4. 這將在您的文件夾中創建兩個文件Properties
  • 資源.resx
  • 資源.Designer.cs
  1. Resources.resx打開後,將其更改*Access Modifier* 為*Public*.
  2. 添加你的字元串。

要為特定文化添加額外的資源文件,您需要這樣做。

  1. 右鍵點擊您*ProjectSolution Explorer*.
  2. 選擇添加->新項目->資源 文件。
  3. 命名它*Resources.en-us.resx*。(用適當的程式碼替換“en-us”)
  4. 點擊添加
  5. 將其拖到Properties文件夾中。
  6. 打開Resources.en-us.resx並將其更改*Access Modifier* 為*Public*.
  7. 添加你的字元串。
  8. 對您需要支持的每種文化重複此操作。

在建構過程中,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 建構事件很有用。這些是我將採取的步驟。

  1. *Class Library*在我的解決方案中創建一個單獨的項目。
  2. 創建或添加我的*.resx*文件到這個項目。
  3. *Post-Build EventProject 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 提醒我們的那樣,如果您正在簽署您的程序集,您的密鑰必須匹配

引用自:https://stackoverflow.com/questions/2537958