С#, Локализация, Ресурсы и MonoDevelop

Моя проблема заключается в этом: использование 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

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

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

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

Второй, как только у меня есть файл с соответствующим образом созданным ресурсом, я могу встроить его в свой проект, который, если я его правильно пойму, делает ресурсы частью сборки. Если у меня есть два файла, однако, Messages.resources и Messages.de.resources, MonoDevelop (по крайней мере) присваивает им одно и то же значение ID, когда я их внедряю. Нужно ли включать локализацию по умолчанию в проект, а затем отдельный проект для каждой поддерживаемой локали? Следуя этому, как С# различает мои файлы 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;
}
...

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

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

Ответ 1

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

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

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