Как динамически загружать и переключать файл ресурсов в веб-приложении (ASP.NET) без перекомпиляции? - PullRequest
1 голос
/ 30 октября 2009

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

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

Ответы [ 3 ]

3 голосов
/ 14 июля 2010

Довольно поздно, но ответа пока нет.

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:

Взгляните на эту ссылку .

2 голосов
/ 27 апреля 2016

Вопросу 6 лет, но я все равно собираюсь на него ответить :)

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

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

using (ResXResourceReader resxReader = new ResXResourceReader(@".\CarResources.resx"))
{
    foreach (DictionaryEntry entry in resxReader) {
        // ...
    } 
}
0 голосов
/ 01 ноября 2012

Конечно, вы можете сделать это легко, и это работает для простых файлов 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...