Как загрузить разные файлы RESX на основе какого-либо параметра - PullRequest
14 голосов
/ 03 сентября 2010

У меня есть ASPX-страница ASP.NET3.5 (C #), которая интернационализирована на 10 различных языках.

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

РЕДАКТИРОВАТЬ: я использую синтаксис meta:resourcekey в каждом элементе управления asp, который позволяет использовать декларативный синтаксис для выражений неявного ресурса.

Меня попросили "brand "страница основана на некотором параметре строки запроса.Брендинг будет означать не только загрузку разных CSS-файлов, но и наличие разного текста (на всех языках).

Существует ли простой способ «поменять» файлы resx без необходимости вручную получать ресурсы для каждой из сотенлитералов и изображений, которые есть на этой странице?

Другими словами, допустим, у меня есть следующие файлы RESX:

brand1_myPage.aspx.en-US.resx
brand1_myPage.aspx.de-DE.resx
brand1_myPage.aspx.fr-FR.resx

brand2_myPage.aspx.en-US.resx
brand2_myPage.aspx.de-DE.resx
brand2_myPage.aspx.fr-FR.resx

myPage.aspx будет искать файлы resx с именем myPage.xx-XX.resx .

Есть ли способ загрузки вместо файлов brand1xxx.resx или на основе brand2xxx.resx на какое-то значение?

Заранее спасибо.

Ответы [ 2 ]

11 голосов
/ 22 марта 2011

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

Сначала создайте и зарегистрируйте пользовательские культуры в системе, например:

CultureAndRegionInfoBuilder builder = new CultureAndRegionInfoBuilder("en-US-brand1", CultureAndRegionModifiers.None);
CultureInfo parentCI = new CultureInfo("en-US");
RegionInfo parentRI = new RegionInfo("en-US");
builder.LoadDataFromCultureInfo(parentCI);
builder.LoadDataFromRegionInfo(parentRI);
builder.Parent = parentCI;
// set other properties of the custom culture (CultureEnglishName, CultureNativeName, possibly other ones)
// ...
builder.Register();

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

После установки культур создайте файлы resx, как обычно, но используйте имена пользовательских культур (myPage.aspx.en-US-brand1.resx и т. д.).

Теперь все, что осталось сделать, - это установить System.Threading.Thread.CurrentThread.CurrentUICulture на основе какого-либо параметра (чем скорее, тем лучше, BeginRequest будет хорошим местом; или Page_PreInit, если хотите).это только для некоторых страниц):

CultureInfo ci = new CultureInfo(Request.QueryString["paramname"]);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;

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

Некоторые примечания:

  • это решение дает вам большую гибкость, поскольку действует обычный запасной вариант культуры - если запись не найденадля en-US-brandX время выполнения откатится на en-US и т. д .;это может значительно уменьшить дублирование записей Resx, если бренды в основном похожи, так как вы можете поместить некоторые записи только в родительский (en-US) файл Resx,
  • , вы можете создать больше уровней унаследованных культур, например,US-brandX-variableY,
  • все методы доступа к ресурсам работают должным образом,
  • изменение культуры рабочего потока означает, что вы получите локализованные сообщения об исключениях, если вы установите, скажем, культуруde-DE-brandX и у вас установлена ​​де-DE локализация в ОС,
  • , по вышеуказанной причине вы можете сбросить текущую (UI) -культуру в CultureInfo.InvariantCulture в Application_Error или даже лучшекак только вы поймаете исключение, которое, как вы знаете, приведет к Application_Error;это предотвратит локализацию стандартной желтой страницы смерти и, по крайней мере, части стека исключений,
  • вы можете подумать о создании сервисного инструмента, который будет регистрировать / отменять регистрацию / обновлять культуры, особенно если вы ожидаете частые изменения,
  • это решение может быть проблематичным, если вы используете обнаружение культуры на основе клиента.
0 голосов
/ 03 сентября 2010

Если вы ссылаетесь на ресурсы в своем коде следующим образом: Resources.brand1_myPage.WelcomeMessage, тогда это может быть сложно.

Но вы также можете получить ресурсы программно: GetGlobalResourceObject ("brand1_myPage", "WelcomeMessage").Здесь у вас есть место для манипуляции с именем файла ресурса.

...