Я хочу переопределить строку от a System.ComponentModel.DataAnnotations
для проекта ASP.NET. Сделайте я должен сделать сборку-сателлит, смешивающую со сделанными на заказ задачами, al.exe
и т.д.? Даже если да, я не мог бы найти, как преобразовать .resx
кому: .resources
подавать его к al.exe
. И если не, куда поместить .resx.
и как назвать его?
UPD: прояснить: Я хотел использовать пользовательскую строку ресурса вместо одной от ресурса по умолчанию от блока. Я не хотел вносить изменения в каждом месте, которое использует ту строку. В конце концов, ресурсы существуют только для переопределения их.
Хотя это странно, особенно для людей, знакомых с технологиями локализации с открытым исходным кодом, невозможно создать вспомогательную сборку для какой-либо системной сборки или даже сторонней подписанной one:
Возможно ли то же самое автоматически, но без спутниковой сборки, неизвестно, хотя я в этом сомневаюсь.
Предполагая, что вы хотите переопределить строки сообщений об ошибках по умолчанию в атрибутах проверки, вы можете сделать это, установив ErrorMessageResourceName
и ErrorMessageResourceType
следующие свойства:
[Required(ErrorMessageResourceName = "Required_Username", ErrorMessageResourceType = typeof(MyResourceFile)]
public string Username { get; set; }
Вы можете создать файл ресурсов с именем MyResourceFile.resx, который содержит Required_Username
с нужным сообщением об ошибке.
Надеюсь, это поможет.
У Фила Хаака есть отличная статья Локализация проверки ASP.Net MVC , в которой подробно рассказывается, как переопределить ваши строки. Эта статья больше относится к DataAnnotations
, чем к ASP.net MVC
. Таким образом, это поможет, однако вы используете DataAnnotattions .
Ниже я перечислил простейшие шаги по добавлению локализованных ресурсов в Visual Studio.
Свойства проекта
. Ресурсы
. Properties
.
Модификатор доступа
на Открытый
. Чтобы добавить дополнительные файлы ресурсов для определенных культур , вам потребуется.
проект
в
обозревателе решений
. Resources.en-us.resx
.
(замените 'en-us' соответствующим
кодом) Свойства
. Модификатор доступа
на Открытый
. Во время сборки VS преобразует файлы .resx в .файлы ресурсов и создайте классы-оболочки для вас. Затем вы можете получить доступ через пространство имен 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)]
Чтобы включить автоматическое определение культуры клиента, добавьте раздел globalization в файл web.config .
<configuration>
<system.web>
<globalization enableClientBasedCulture="true" culture="auto:en-us" uiCulture="auto:en-us"/>
</system.web>
<configuration>
Здесь я включил культуру на основе клиента и установил культуру и uiculture на « авто » со значением по умолчанию « en- us ".
Создание отдельных вспомогательных сборок:
Статья MSDN Создание вспомогательных сборок также поможет. Если вы новичок в вспомогательных сборках, обязательно прочтите Упаковка и развертывание Ресурсы .
Раньше при создании вспомогательных сборок я счел полезным использовать события сборки VS. Вот какие шаги я бы предпринял.
Библиотеки классов
. .resx
файлы в этот проект. событие после сборки
в диалоговое окно Свойства проекта
.(Как показано ниже) Пример сценария VS Post-Build:
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, если вы подписываете свои сборки, ваши ключи должны соответствовать .