Генерация файлов Resx для MVC

#c# #model-view-controller #globalization #embedded-resource #resx

#c# #модель-представление-контроллер #глобализация #встроенный ресурс #resx

Вопрос:

Мы используем файлы resx для глобализации, а также для поиска в базе данных вещей, которые могут быть настроены (например, названия вкладок, которые могут отличаться в зависимости от продукта) нашими сотрудниками CS и, следовательно, неизвестны во время разработки.

Я создал пользовательский инструмент, который считывает файлы resx и разумно сбрасывает пары ключ / значение в реляционную базу данных (сопоставляя значения, чтобы у нас не было дубликатов).

Это очень помогло нашему бизнесу — нам не нужно отправлять каждый resx на перевод (и платить за дублирование переводов общих слов), и у нас есть «золотой стандарт» для всех наших переводов (в базе данных).

Созданный мной инструмент также считывает базу данных, выбирая пары ключ / значение и переводы каждого значения, и создает текстовые файлы для каждого файла resx (и перевода текстового файла на каждый язык) и автоматизирует запуск resgen.exe , инструмент командной строки, который поставляется вместе с Visual Studio, для компиляциифайлы resx из сгенерированных текстовых файлов.

У меня нет никакой интеграции с системой управления версиями, поэтому нам приходится вручную проверять файлы resx и вручную возвращать сгенерированные файлы при использовании инструмента, но это не было большой проблемой.

Моя проблема в том, что этот метод не работает для наших новых проектов MVC: проекты MVC требуют, чтобы файлы resx были встроенными ресурсами с модификатором доступа «public».

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

Есть ли способ получить resgen.exe для создания встроенных и общедоступных файлов ресурсов? Если нет, есть ли другой способ создать файлы resx, которые будут это делать?

Обновление, дополнительный вопрос: файлы resx, которые мы генерируем с помощью этого метода, также выдают предупреждение:

 A custom tool 'PublicResXFileCodeGenerator' is associated with file '(resxname)',
but the output of the custom tool was not found in the project.
You may try re-running the custom tool by right-clicking on the file in the
Solution Explorer and choosing Run Custom Tool. 
  

Упомянутый инструмент — это инструмент, который мы изначально используем для создания файлов resx. Есть ли способ предотвратить это предупреждение?

Ответ №1:

Во-первых, вы можете создавать ресурсы как общедоступные, используя опцию /publicClass командной строки. Также смотрите: Resgen.exe — Генератор файлов ресурсов @ msdn

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

Например: при добавлении нового ресурса «Resource1» с помощью мастера в файл проекта будет добавлена новая группа элементов:

 <ItemGroup>
  <EmbeddedResource Include="Resource1.resx">
    <Generator>ResXFileCodeGenerator</Generator>
    <LastGenOutput>Resource1.Designer.cs</LastGenOutput>
  </EmbeddedResource>
</ItemGroup>
  

Возможно, существуют библиотеки для программного изменения файлов проекта, но я об этом не знаю.

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

Редактировать:

Это также добавит другую группу элементов:

 <ItemGroup>
  <Compile Include="Resource1.Designer.cs">
    <AutoGen>True</AutoGen>
    <DependentUpon>Resource1.resx</DependentUpon>
    <DesignTime>True</DesignTime>
  </Compile>
</ItemGroup>
  

Итак, если у вас нет хорошей сторонней программы для сериализации, редактирования, десериализации файла проекта. Вероятно, лучше позволить мастеру сделать это.

Ответ №2:

Я боролся с этим раньше, но ресурсы работают хорошо. Это может помочь, хотя я не уверен. Всегда стоит изучить основы, так как иногда это что-то очень простое, а ресурсы .NET могут быть непогрешимыми.

Я объясню, как я использую ресурсы, и, надеюсь, вы сможете применить его к своему сценарию (я не могу понять, в чем именно заключается проблема, исходя из вашего вопроса.)

Шаги по настройке ресурсов 1. Добавьте ASP.NET Папка для вашего веб-решения щелкните правой кнопкой мыши на решении и выберите Добавить> Добавить ASP.NET Папка > App_GlobalResources

  1. Добавьте файл ресурсов в папку, назовите его MyResourceFile.resx

  2. Откройте свойства файла и выберите

    • Действие сборки: встроенный ресурс
    • Пользовательский инструмент: PublicResXFileCodeGenerator
  3. Затем добавьте свои разные файлы ресурсов для разных языков и т. Д. (Укажите одинаковые свойства для всех действий сборки файлов ресурсов и т. Д. И пользовательского инструмента)

    • MyResourceFile.ru-GB.resx
    • MyResourceFile.fr-FR.resx
    • MyResourceFile.ja-JP.resx

Это должно автоматически сгенерировать ваш менеджер ресурсов, доступ к которому можно получить через вызов

 MyResourceFile.MyResourceText
  

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

Etc MyResourceFile.en-JP.resx не будет работать (если вы не создадите эту пользовательскую культуру) и вызовет всевозможные другие проблемы. Этот язык будет сопоставлен с CultureInfo в приложении, чтобы определить, какой файл ресурсов использовать, поэтому он должен быть действительным CultureInfo.

Комментарии:

1. [предупреждение о шутке:] Что? «Английский, на котором говорят в Японии» не является допустимым именем CultureInfo? О чем думала Microsoft?

2. Первая шутка, которую я видел на stakoverflow, ботаники относятся к себе серьезно, серьезно!

Ответ №3:

В итоге мы нашли решение этой проблемы.

Для проектов MVC мы изменили инструмент, чтобы использовать класс ResXResourceWriter для обновления файлов resx, сопоставляя существующие ключи и добавляя новые по мере необходимости.

Это сохраняет статус «встроенного ресурса», а также все другие необходимые детали.

Нам все еще нужно правильно настроить файл при его первом создании, но это гораздо более управляемая проблема.