У Phil Haack есть отличная статья Локализация ASP.Net MVC Validation , которая специально поможет вам переопределить ваши строки.Эта статья относится к DataAnnotations
больше, чем ASP.net MVC
.Таким образом, это поможет, однако, вы используете DataAnnotattions .
Ниже я перечислил самые простые шаги для добавления локализованных ресурсов в Visual Studio.
- Откройте
Project Properties
диалоговое окно. - Выберите вкладку
Resources
. - Нажмите, чтобы создать новый файл ресурсов по умолчанию .
- Это создаст два файла в вашей папке
Properties
. - Resources.resx
- Resources.Designer.cs
- Когда Ресурсы.Resx открылся, измените его
Access Modifier
на Public
. - Добавьте свои строки.
Чтобы добавить дополнительные файлы ресурсов для определенных культур , вам потребуется.
- Щелкните правой кнопкой мыши на
Project
в Solution Explorer
. - Выберите Добавить -> Новый элемент -> Ресурс Файл.
- Назовите его
Resources.en-us.resx
.(замените 'en-us' соответствующим кодом) - Нажмите кнопку Добавить
- Перетащите его в папку
Properties
. - Откройте Resources.en-us.resx и измените его
Access Modifier
на Public
. - Добавьте свои строки.
- Повторите для каждой культуры, которая вам нужнаsupport.
Во время сборки 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 " со значением по умолчанию:" ru-ru ".
Создание отдельных спутниковых сборок:
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
.Вам по-прежнему нужно будет использовать Сборочный компоновщик .
Редактировать: как wRAR напомнил нам, если вы подписываете свои сборки, ваши ключи должны совпадать с .