Ответ 1
Вы можете использовать пользовательские культуры для достижения этого эффекта.
Сначала создайте и зарегистрируйте пользовательские культуры в системе, например:
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 файл,
- вы можете создать больше уровней унаследованных культур, например en-US-brandX-variantY,
- все методы доступа к ресурсам работают как ожидалось,
- изменение культуры рабочего потока означает, что вы получите локализованные сообщения об исключениях, если вы настроите культуру, скажем, de-DE-brandX, и у вас установлена локализация de-DE, установленная в ОС,
- по вышеуказанной причине вы можете захотеть reset текущей культуры (UI) в CultureInfo.InvariantCulture в Application_Error или даже лучше, как только вы поймаете исключение, которое, как вы знаете, приведет к Application_Error; это предотвратит локализацию стандартной желтой страницы смерти и, по крайней мере, части стека исключений,
- вы можете подумать о создании сервисного инструмента, который будет регистрировать/отменять регистрацию/обновлять культуры, особенно если вы ожидаете частых изменений,
- Это решение может быть проблематичным, если вы используете обнаружение культуры на основе клиента.