Использование локализованных файлов ресурсов с Mono / MonoDevelop / Linux - PullRequest
0 голосов
/ 05 июня 2019

Мне трудно заставить мою (настольную) программу распознавать ресурсы, по-видимому, при правильном создании менеджера ресурсов. Я прочитал вопрос 6567964 , который дал некоторое представление, но не решил эту проблему.

Я использую MonoDevelop 7.8.2, Mono 5.18.1.3, в Debian 9. .NET Core не установлен. Я не думаю, что это должно иметь значение?

Я создал несколько ресурсов текстовых файлов, some-filename.en-US.txt и some-filename.es-ES.txt, как описано на этой странице MSDN:

https://docs.microsoft.com/en-us/dotnet/framework/resources/creating-resource-files-for-desktop-apps#TextFiles

Основываясь на том, что я читал здесь и в других местах MSDN, я добавил их в свой проект и установил их свойства «Встроенный ресурс». Их ResourceID автоматически устанавливается на «some-filename.txt»

Я добавил "[assembly: NeutralResourcesLanguageAttribute (" en ")]" в AssemblyInfo.cs.

Когда я собираю проект, он генерирует «my-namespace.resource.DLL» в папках Satellite, которые в моем случае находятся в ../myapp/bin/Debug. Разрешения DLL позволяют читать и выполнять их любому. Я ожидал "app-name.resource.dll". Является ли "my-namespace" правильным?

Так как это в Linux, я не использовал компоновщик сборки, упомянутый MS, или какие-либо инструменты, кроме MonoDevelop. Мне не нужно ничего устанавливать в Global Assembly Cache, поэтому, по-видимому, мне не нужно заботиться о подписании. Это правильно?

В моей программе код скопирован на 99% из примеров в MSDN:

CultureInfo newCulture = new CultureInfo("es-ES");
Thread.CurrentThread.CurrentCulture = newCulture;
ResourceManager rm = new ResourceManager("resource-id but without the extension", typeof("main-assembly-class-name").Assembly);

string str = String.Format("The current culture is {0}.\n{1}", 
                            Thread.CurrentThread.CurrentCulture.Name,
                            rm.GetString("one-of-the-names-in-the-original-text-file"));
Console.Write(str);                                                   

Когда я запускаю программу и пытаюсь получить доступ к этим ресурсам, она выдает:

"Не удалось найти ресурсы, подходящие для указанной культуры или нейтральной культуры. Убедитесь, что blahblah.resources \" правильно встроен или связан с сборкой \ "namespace-of-main-class \" во время компиляции, или что все необходимые спутниковые сборки являются загружаемыми и полностью подписаны. "

Я также попытался создать ResourceManager, используя только базовое имя и внутренний класс с тем же именем, что и ресурс, как описано здесь:

https://docs.microsoft.com/en-us/dotnet/api/system.resources.resourcemanager?view=netframework-4.8

Я попытался создать ResourceManager, используя только NameSpace, как описано здесь:

https://docs.microsoft.com/en-us/dotnet/api/system.resources.resourcemanager?view=netframework-4.8#instantiating

Я использовал пример программы, приведенной на этой странице, в качестве независимой программы, еще более упрощенной благодаря использованию только файлов en-US и es-ES и выбору es-ES явно, а не случайно.

Все эти варианты вызывают одно и то же исключение. Обратите внимание, что это не исключение "Культура не найдена".

Отладчик показывает, что создается ResourceManager и что устанавливается Thread.CurrentThread.CurrentCulture. Похоже, проблема заключается в создании ResourceManager, который может правильно ссылаться на ресурсы.

Чего мне не хватает?

...