2009-10-30 1 views
1

Я хотел бы сохранить файлы ресурсов (содержащие тексты для меток и т. Д.) Для моего веб-приложения в базе данных, чтобы иметь возможность редактировать и создавать их динамически позже (возможно, в пользовательском интерфейсе). Моя идея состояла в том, чтобы хранить весь файл resx в столбце xml и просто загружать его по требованию - в зависимости от языка и некоторых других атрибутов текущего пользователя, когда он входит в приложение или переключает контекст. Важно то, что ресурсы зависят не только от информации о культуре пользователя, но и от некоторой контекстной информации, которая может быть переключена пользователем без выключения и повтора (в нашем случае называется «группа», не имея ничего общего с группой пользователей).Как динамически загружать и переключать файл ресурсов в веб-приложении (ASP.NET) без перекомпиляции?

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

+0

У вас есть решение для этого? Я также сталкиваюсь с такой же ситуацией. Благодаря! – Vijay

+0

Я также ищу ответ на этот вопрос. – kst

ответ

3

Pretty поздно, но пока нет ответа.

System.Resources.ResourceReader resourceReader 
    = new System.Resources.ResourceReader("PathToResourceFile"); 

Это в значительной степени. Теперь вы можете создавать файлы ресурсов, такие как en.resx или de.resx, и загружать их в зависимости от языка пользователя. Что-то вроде

System.Resources.ResourceReader resourceReader 
    = new System.Resources.ResourceReader(HttpContext.Current.Request.UserLanguages[0] 
    + ".resource"); 

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

Edit:

Взгляните на эту link.

+0

Просто, чтобы прояснить это, обрабатываются только файлы скомпилированных ресурсов, например .resouce, в отличие от файлов XML, например .resx, справа? –

0

Уверенный, что вы можете сделать это легко, и он работает для файлов с прямым XML. Вам не нужно использовать файл resx.

/// <summary> 
/// Sets or replaces the ResourceDictionary by dynamically loading 
/// a Localization ResourceDictionary from the file path passed in. 
/// </summary> 
/// <param name="resourceDictionaryFile">The resource dictionary to use to set/replace 
/// the ResourceDictionary.</param> 
private void SetCultureResourceDictionary(String resourceDictionaryFile) 
{ 
    // Scan all resource dictionaries and remove, if it is string resource distionary 
    for (int index= 0; index < Resources.MergedDictionaries.Count; ++index) 
    { 
     // Look for an indicator in the resource file that indicates the resource is 
     // swappable. For instance in our files the header contains this: 
     // <sys:String x:Key="ResourceDictionaryName">Resources-en-CA</sys:String> 
     if (Resources.MergedDictionaries[index].Contains("ResourceDictionaryName")) 
     { 
      if (File.Exists(resourceDictionaryFile)) 
      { 
       Resources.MergedDictionaries.Remove(Resources.MergedDictionaries[index]); 
      } 
     } 
    } 

    // read required resource file to resource dictionary and add to MergedDictionaries collection 
    ResourceDictionary newResourceDictionary = new ResourceDictionary(); 
    newResourceDictionary.Source = new Uri(resourceDictionaryFile); 
    Resources.MergedDictionaries.Add(newResourceDictionary); 
} 
2

Вопрос 6 лет, но я все еще хочет ответить на него :)

Для чтения .resx файлов, вам нужно использовать System.Resources.ResXResourceReader класс от System.Windows.Forms. dll

Это хорошо объяснено here. Просто быстрый образец для полноты:

using (ResXResourceReader resxReader = new ResXResourceReader(@".\CarResources.resx")) 
{ 
    foreach (DictionaryEntry entry in resxReader) { 
     // ... 
    } 
}