Локализация с SharpDevelop

Я работаю над локализованным приложением, которое разрабатываю в SharpDevelop. Основываясь на руководстве, я столкнулся с ошибкой:

Не удалось найти ресурсы, соответствующие указанной культуре (или нейтральной культуре) на диске. имя_базы:

Я создал файл ресурсов, используя Project | Добавить | Новый элемент, соответствующий «Пустой файл ресурсов» (я не смог найти «Файл ресурсов сборки»). Кроме того, я установил «Действие сборки» на «EmbeddedResource».

В программе у меня есть класс, который делает следующее

// load the resource file once
resourceManager = ResourceManager.CreateFileBasedResourceManager(file, filePath, null);

// depending on user selection, I set the CultureInfo in the code behind the form, i.e.
Thread.CurrentThread.CurrentUICulture = locales[0];   // which contains "en"

// and that's the method of the same class used to lookup the values
public string getValue ( string key )
{
    return resourceManager.GetString(key);
}

SharpDevelop 3.0.0.3437 .NET Версия 2.0.50727.3053

Даже после тщательного просмотра комментариев и долгого поиска в Google я не смог найти ни примера, ни решения. Отсюда вопросы:

  • Как я могу добавить культуру в сам файл ресурсов?
  • Можете привести пример или ссылку?

Большое спасибо!


person MrG    schedule 20.11.2008    source источник


Ответы (2)


CreateFileBasedResourceManager будет работать только с двоичными файлами .resources (не с файлами .resx).

Если вы настаиваете на загрузке ресурсов из внешнего файла, а не на внедрении ресурсов в сборку, вам потребуется запустить утилиту командной строки resgen для создания файла .resources. Поэтому, если вы этого не сделали, создайте по одному для каждой поддерживаемой культуры.

В остальном выглядит нормально.

Но если вы предпочитаете встраивать ресурсы в сборку, в окне свойств установите для параметра Build Action значение Embedded Resource.

Если вы также хотите, чтобы сгенерированный строго типизированный класс позаботился обо всей грязной работе, установите для пользовательского инструмента только базовый файл (инвариантный) значение ResXFileCodeGenerator или PublicResXFileCodeGenerator, если вам это нужно (хорошо при создании вспомогательных сборок).

Тогда вам не нужно заботиться о загрузке локализованных ресурсов самостоятельно. Сгенерированный класс делает все это за вас.

Для каждого ключа в ресурсе в сгенерированном классе создается статическое свойство, и вы просто вызываете это свойство, это очень чистый и, безусловно, самый простой способ.

Если нет особых причин для загрузки ресурсов из файлов .resources, я всегда рекомендую встраивать их в сборку.

person baretta    schedule 20.11.2008

Я не уверен, какую версию .NET вы используете, но эта статья MSDN на то, как среда выполнения находит сборки, может быть вам полезна.

person Glenn    schedule 20.11.2008