Моя проблема в следующем: с помощью 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 #.
Кроме того, в качестве отступления - какова «предпочтительная» структура каталогов для ресурсов в интернационализированном проекте?