Вы можете использовать пользовательские культуры для достижения этого эффекта.
Сначала создайте и зарегистрируйте пользовательские культуры в системе, например:
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;это предотвратит локализацию стандартной желтой страницы смерти и, по крайней мере, части стека исключений,
- вы можете подумать о создании сервисного инструмента, который будет регистрировать / отменять регистрацию / обновлять культуры, особенно если вы ожидаете частые изменения,
- это решение может быть проблематичным, если вы используете обнаружение культуры на основе клиента.