Смена места, где ресурс тянется во время выполнения? - PullRequest
5 голосов
/ 08 июня 2010

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

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

Допустим, у меня есть файл ресурсов с именем Resources.resx, в котором содержится 300 ресурсов. Он имеет ресурс под названием Continue. Английское значение - «Продолжить», французское - «Продолжить».

Теперь один клиент, по какой-либо причине, хочет, чтобы он сказал «Next» и «Après», а другие хотят, чтобы он оставался прежним. Каков наилучший способ удовлетворить такой запрос? (Это простой пример).

Единственное, о чем я могу думать, это

  • Создайте другой файл Resources.resx, специфичный для клиента, и замените файл DLL во время сборки. Так как я полностью заменю dll, новый файл ресурсов должен будет содержать все 300 строк. Очевидная проблема заключается в том, что теперь у меня есть 2 файла ресурсов, каждый из которых содержит 300 строк для поддержки.
  • Создайте пользовательский элемент управления / страницу и измените его для использования пользовательского файла ресурсов. например SignIn.ascx будет заменен во время сборки и будет извлекать ресурсы из ClientName.resx вместо Resources.resx.

Могу ли я попробовать еще что-нибудь? Есть ли способ изменить его так, чтобы приложение всегда проверяло переопределенные значения в файле ClientResources.resx, прежде чем на самом деле проверять указанный файл ресурсов?

Ответы [ 2 ]

1 голос
/ 08 июня 2010

Возможно, вы могли бы использовать следующий шаблон:

#if ClientName1 
Continue="Next";
#elif ClientName2
    Continue="Apres";
#else 
Continue="Continue" 
#endif

Это позволяет вам указать все возможные значения в одном файле (и одну и ту же переменную в том же регионе), и вы можете легко определить символ«ClientName1» из командной строки во время сборки.

0 голосов
/ 08 июня 2010

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

Используя ResXResourceWriter / ResXResourceReader, вы открываете существующие файлы ресурсов для целевой культуры и просматриваете теги, которые хотите изменить. Это, очевидно, имеет смысл, только если есть несколько незначительных изменений для конкретного клиента. Это также предполагает, что файлы ресурсов не встроены в сборку.

Создание пользовательских действий для установщика Windows действительно просто, если вы можете выполнить их после завершения установки.

Альтернативой может быть замена стандартного ComponentResourceManager собственной версией, которая выборочно изменяет значения тегов. Это также может быть ужасно быстро.

Последнее, что я могу придумать, это поместить все переводы по умолчанию в файл базовых ресурсов. Пользовательский файл ресурсов должен только изменить интересующие его теги. Любой оставленный пустой тег получит исходное значение. Я не уверен, насколько это реалистично, поскольку культура по умолчанию, скорее всего, английская ...

Редактировать: Это может быть менее хакерским (все же взломанным!) Решением. Вы можете создать другой файл ресурсов в той же культуре, как бельгийский французский. Файл ресурсов бельгийского французского языка по существу наследуется от файла ресурсов французского языка. Это позволит вам изменить только несколько текстовых ресурсов. Затем в вашем приложении измените текущую культуру на «fr-BE» вместо «fr». Клиент, вероятно, никогда не узнает.

...