Как загрузить разные файлы RESX на основе какого-либо параметра
У меня есть ASPX-страница ASP.NET3.5 (C#), которая переведена на 10 разных языков.
Страница очень сложна по своей структуре с десятками вложенных представлений, управляемых шаблоном конечного автомата.
РЕДАКТИРОВАТЬ: я использую meta:resourcekey
синтаксис в каждом элементе управления asp, который позволяет использовать декларативный синтаксис для выражений неявного ресурса.
Меня попросили "маркировать" страницу на основе какого-либо параметра строки запроса. Брендинг будет означать не только загрузку разных 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 ответа
Вы можете использовать собственные культуры для достижения этого эффекта.
Сначала создайте и зарегистрируйте пользовательские культуры в системе, например:
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-варианта Y,
- все методы для доступа к ресурсам работают как положено,
- изменение культуры рабочего потока означает, что вы получите локализованные сообщения об исключениях, если вы установите для культуры, скажем, de-DE-brandX и если в ОС установлена локализация de-DE,
- по вышеуказанной причине вы можете сбросить текущую (UI) -культуру на CultureInfo.InvariantCulture в Application_Error или даже лучше, как только вы поймете исключение, которое, как вы знаете, приведет к Application_Error; это предотвратит локализацию стандартной желтой страницы смерти и, по крайней мере, части стека исключений,
- Вы можете подумать о создании сервисного инструмента, который будет регистрировать / отменять регистрацию / обновлять культуру, особенно если вы ожидаете частых изменений,
- Это решение может быть проблематичным, если вы используете обнаружение культуры на основе клиента.
Если вы ссылаетесь на ресурсы в своем коде так: Resources.brand1_myPage.WelcomeMessage
тогда это может быть сложно.
Но вы также можете получить ресурсы программно: GetGlobalResourceObject ("brand1_myPage", "WelcomeMessage")
, Здесь у вас есть место для манипуляции с именем файла ресурса.