Phil Haack 有一篇出色的文章 Localizing ASP.Net MVC Validation,它专门指导您覆盖字符串。这篇文章更适用于 DataAnnotations,而不是 ASP.net MVC。因此,这将有助于您使用 DataAnnotattions。
下面我列出了在 Visual Studio 中添加本地化资源的最简单步骤。
- 打开
Project Properties 对话框。
- 选择
Resources标签。
- 点击创建一个新的默认
资源文件。
- 这将在您的
Properties 文件夹中创建两个文件。
- Resources.resx
-
Resources.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)]
要启用自动客户端文化检测,请将 globalizationsection 添加到 web.config 文件中。
<configuration>
<system.web>
<globalization enableClientBasedCulture="true" culture="auto:en-us" uiCulture="auto:en-us"/>
</system.web>
<configuration>
这里我启用了基于客户端的文化并将 culture 和 uiculture 设置为“auto”,默认为“zh-cn”。
创建单独的附属程序集:
MSDN Creating Satellite Assemblies 文章也会有所帮助。
如果您不熟悉附属程序集,请务必阅读 Packaging and Deploying Resources。
在过去创建附属程序集时,我发现使用 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 提醒我们的那样,如果您正在签署您的程序集,您的密钥 must match。