C #, локализация, ресурсы и MonoDevelop - PullRequest
10 голосов
/ 04 июля 2011

Моя проблема заключается в следующем : Использование MonoDevelop (которая является предпочтительной средой для ряда проектов, над которыми я работаю) Я пытаюсь выяснить, как использовать файлы ресурсов для локализованных сообщений и какчтобы правильно включить их в проект как встроенный ресурс.

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

Messages.resources

Hello.World = Hello World
Goodbye.Cruel.World = Goodbye, Cruel World

Messages.de.resources

Hello.World = Hallo Welt
Goodbye.Cruel.World = Auf Wiedersehen, grausame Welt

У меня возникла пара проблем.

Сначала , в чем разница (если есть) между файлом .resources MonoDevelop и концепцией ресурсов Visual Studio.Насколько я понимаю, MonoDevelop (и SharpDevelop) позволяют создавать файлы .resources, тогда как Visual Studio использует файлы .resx и компилирует их в файлы .resources (двоичный тип файла) с помощью утилиты resgen.При использовании ресурсов в MonoDevelop нужно ли мне компилировать свои ресурсы (например, Messages.resources), используя resgen?Когда я пытаюсь использовать только прямые файлы .resources, которые MonoDevelop позволяет мне создавать с помощью их мастера, я получаю следующую ошибку:

«Поток не является допустимым файлом ресурсов».

Второй , как только у меня будет правильно сгенерированный файл ресурсов, я могу встраивать их в свой проект, который, если я правильно понимаю, делает ресурсы частью сборки.Однако, если у меня есть два файла, Messages.resources и Messages.de.resources, MonoDevelop (как минимум) назначает им одинаковое значение идентификатора при их внедрении.Нужно ли включать в проект мою локализацию по умолчанию, а затем отдельный проект для каждой поддерживаемой локали?В связи с этим, как C # различает мои файлы Messages.resources и Messages.de.resources (или какими бы они ни были файлы)?

В настоящее время я пытаюсь разрешить ресурсы сообщений с помощью следующего кода:

...
public string Translate(string messageKey, CultureInfo cultureInfo) {
    ResourceManager resourceManager = new ResourceManager("My.Project.Messages", Assembly.GetExecutingAssembly());
    string message = resourceManager.GetString(messageKey, cultureInfo);
    return message;
}
...

Мне кажется, что мне не хватает некоторых фундаментальных моментов в усилиях по интернационализации / локализации / глобализации и т. Д. С C #.Я работал над интернационализированными проектами в Java раньше, но по какой-то причине я не могу полностью обдумать это в C #.

Кроме того, в качестве отступления - какова «предпочтительная» структура каталогов для ресурсовв интернационализированном проекте?

Ответы [ 2 ]

3 голосов
/ 05 июля 2011

Я не знаком с локализацией .NET (я использую gettext), но, насколько я понимаю, файлы .resources представляют собой двоичный формат , который фактически встроен в вашу DLL. Вы можете скомпилировать resx (XML) или текстовые ресурсы в двоичный формат, используя resgen. Текстовые файлы более читабельны, но могут использоваться только для строковых ресурсов. XML более многословен, но может представлять все, что могут двоичные ресурсы.

Обычная вещь - хранить ваши ресурсы в виде .resx в проекте, и MonoDevelop автоматически скомпилирует их в файлы .resources при сборке вашего проекта (вам придется скомпилировать файлы .txt вручную). К сожалению, MD не имеет специальных инструментов для редактирования файлов resx, поэтому вам придется редактировать XML напрямую.

MD имеет хорошие инструменты локализации для gettext, но в настоящее время они не поддерживаются в Windows.

0 голосов
/ 05 июля 2011

есть ли причина не использовать Gettext?

(Например, вы хотите быть совместимым с VS? Если нет, у меня это сработало: http://monodevelop.com/Documentation/Localizing_Applications)

...