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