C #, локализация, ресурсы и 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

У меня пара проблем.

Во-первых, в чем разница (если есть) между файлом .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 #.

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


person Sean Quinn    schedule 04.07.2011    source источник


Ответы (2)


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

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

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

person Mikayla Hutchinson    schedule 05.07.2011
comment
Итак, похоже, что если бы я не хотел использовать gettext (что, честно говоря, звучит как самое простое и прямое решение этой проблемы), я мог бы использовать файлы .resx, аналогично тому, как их использует Visual Studio, и MonoDevelop позаботится об этом. компиляция их в файлы .resources. - person Sean Quinn; 05.07.2011
comment
Можете ли вы вообще рассказать о взаимосвязи между файлами .resources, которые MonoDevelop позволяет вам создавать с помощью параметра Новый файл ›Разное› Пустой файл ресурсов и либо .txt, .resx или .resources (двоичный) относятся к типу файла Visual Studio с аналогичным названием? Я предполагаю, что пустой файл ресурсов MonoDevelop ближе к файлу .txt, чем к .resx (все же, в конечном счете, это просто текстовый файл, я знаю) или двоичному файлу .resources. Спасибо за любое понимание, которое вы можете дать по этому поводу, это действительно вызвало у меня много путаницы. - person Sean Quinn; 05.07.2011
comment
Пустой файл .resources выглядит так, как будто он унаследован от SharpDevelop, у которого был редактор двоичных ресурсов. Если он открывается в текстовом редакторе, вероятно, это ошибка. - person Mikayla Hutchinson; 06.07.2011
comment
Похоже, что это может быть ошибка, открытие файла .resources в текстовом редакторе MonoDevelop. Приятно знать, что SharpDevelop поддерживает двоичные файлы .resources, и это, вероятно, возврат к коду SharpDevelop, от которого наследуется MonoDevelop. По крайней мере, это немного проясняет путаницу, спасибо! - person Sean Quinn; 06.07.2011

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

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

person Nicolas    schedule 04.07.2011
comment
Как я понял, Gettext имел некоторые ограничения в среде Windows по собственному признанию MonoDevelop. Или, по крайней мере, инструменты для редактирования переводов и их обновления были доступны только из Linux. Существуют ли еще эти ограничения и насколько они реальны? Gettext кажется достаточным для того, что мне нужно после прочтения, но мне нужно копнуть немного глубже. - person Sean Quinn; 05.07.2011
comment
Да, инструменты msgmerge и msgformat обычно не встречаются в Windows, поэтому MD не включает надстройку Gettext в Windows. Однако версии этих инструментов для Windows существуют, поэтому, если вы поместите их в свой PATH и скопируете надстройку, она должна работать. - person Mikayla Hutchinson; 05.07.2011
comment
@mhutch Я использую MonoDevelop 2.6 beta 3, и похоже, что проект перевода доступен мне в моей среде Windows. Похоже, что в версии 2.2 он не поддерживался, а в версии 2.6 теперь поддерживается? - person Sean Quinn; 05.07.2011
comment
@mhutch ... также, правильно ли я предполагаю, что резервный текст в реализации Gettext для локализации также действует как идентификатор в файлах .po, находящихся в исходном коде? Разве этот подход не связывает фактический текст с исходным кодом? В проекте Java, над которым я работал, у нас есть очень простые текстовые файлы пар ключ-значение, которые связаны с приложением только посредством их ключевых идентификаторов, весь текст и переводы находятся в этих текстовых файлах (никогда в фактическом источнике); позволяя переводчикам держаться подальше от источника. Не похоже, что Gettext обычно работает таким образом. - person Sean Quinn; 05.07.2011
comment
Я не думаю, что он официально поддерживается, но, возможно, он был включен случайно. Возможно, вам придется откуда-то получить двоичные файлы msgfmt и msgmerge. - person Mikayla Hutchinson; 06.07.2011
comment
Да, строка в тексте - это строка, которая будет использоваться в локали по умолчанию. Это намного удобнее для программистов, и это не имеет значения для переводчиков, поскольку им не нужно смотреть на исходный код, они смотрят только на po-файлы. - person Mikayla Hutchinson; 06.07.2011
comment
Здесь объясняются некоторые основы: monodevelop.com/Documentation/Localizing_Applications - person Mikayla Hutchinson; 06.07.2011
comment
И вы, и Николас очень помогли мне понять некоторые тонкости локализации с помощью MonoDevelop. Я собираюсь отметить ваш предыдущий ответ как принятый, поскольку он наиболее ясен. Еще раз спасибо! - person Sean Quinn; 06.07.2011