Переопределите ресурс от стандартного блока в ASP.NET

Я хочу переопределить строку от a System.ComponentModel.DataAnnotations для проекта ASP.NET. Сделайте я должен сделать сборку-сателлит, смешивающую со сделанными на заказ задачами, al.exe и т.д.? Даже если да, я не мог бы найти, как преобразовать .resx кому: .resources подавать его к al.exe. И если не, куда поместить .resx. и как назвать его?

UPD: прояснить: Я хотел использовать пользовательскую строку ресурса вместо одной от ресурса по умолчанию от блока. Я не хотел вносить изменения в каждом месте, которое использует ту строку. В конце концов, ресурсы существуют только для переопределения их.

7
задан wRAR 7 April 2010 в 05:49
поделиться

3 ответа

Хотя это странно, особенно для людей, знакомых с технологиями локализации с открытым исходным кодом, невозможно создать вспомогательную сборку для какой-либо системной сборки или даже сторонней подписанной one:

Если в вашей основной сборке используется строгое именование , вспомогательные сборки должны быть подписаны тем же закрытым ключом, что и основная сборка. Если пара открытого и закрытого ключей не совпадает между основной и вспомогательной сборками, ваши ресурсы не будут загружены .

Возможно ли то же самое автоматически, но без спутниковой сборки, неизвестно, хотя я в этом сомневаюсь.

2
ответ дан 7 December 2019 в 05:20
поделиться

Предполагая, что вы хотите переопределить строки сообщений об ошибках по умолчанию в атрибутах проверки, вы можете сделать это, установив ErrorMessageResourceName и ErrorMessageResourceType следующие свойства:

[Required(ErrorMessageResourceName = "Required_Username", ErrorMessageResourceType = typeof(MyResourceFile)]
public string Username { get; set; }

Вы можете создать файл ресурсов с именем MyResourceFile.resx, который содержит Required_Username с нужным сообщением об ошибке.

Надеюсь, это поможет.

1
ответ дан 7 December 2019 в 05:20
поделиться

У Фила Хаака есть отличная статья Локализация проверки ASP.Net MVC , в которой подробно рассказывается, как переопределить ваши строки. Эта статья больше относится к DataAnnotations , чем к ASP.net MVC . Таким образом, это поможет, однако вы используете DataAnnotattions .

Ниже я перечислил простейшие шаги по добавлению локализованных ресурсов в Visual Studio.

  1. Откройте диалоговое окно Свойства проекта .
  2. Выберите вкладку Ресурсы .
  3. Щелкните, чтобы создать новый файл ресурсов по умолчанию .
  4. Это создаст два файла в папке Properties .
    • Resources.resx
    • Resources.Designer.cs
  5. Когда В Resources.resx открыт , измените его Модификатор доступа на Открытый .
  6. Добавьте свои строки.

Чтобы добавить дополнительные файлы ресурсов для определенных культур , вам потребуется.

  1. Щелкните правой кнопкой мыши свой проект в обозревателе решений .
  2. Выберите Добавить -> Новый элемент -> Файл ресурса .
  3. Назовите его Resources.en-us.resx . (замените 'en-us' соответствующим кодом)
  4. Нажмите «Добавить»
  5. Перетащите его в папку Свойства .
  6. Откройте Resources.en-us.resx и измените его Модификатор доступа на Открытый .
  7. Добавьте свои строки.
  8. Повторите эти действия для каждой культуры, которую необходимо поддерживать.

Во время сборки 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. Вот какие шаги я бы предпринял.

  1. Создать в моем решении отдельный проект Библиотеки классов .
  2. Создать или добавить мои .resx файлы в этот проект.
  3. Добавьте событие после сборки в диалоговое окно Свойства проекта .(Как показано ниже)

Пример сценария 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, если вы подписываете свои сборки, ваши ключи должны соответствовать .

4
ответ дан 7 December 2019 в 05:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: