Совместное использование строковых ресурсов между рабочим столом Windows и приложением для хранения Windows

Im работает с приложением как для рабочего стола Windows, так и для Windows, потенциально я буду добавлять Windows Phone в будущем. Im имеет большую часть моей логики в библиотеке и создает другой графический интерфейс для разных платформ.

Я хочу локализовать свое приложение и хочу совместно использовать потоковые ресурсы между платформами. Но как мне это сделать?

Для рабочего стола Windows наиболее распространенным подходом, похоже, является использование файлов resx. Вот краткий пример:

http://compositeextensions.codeplex.com/discussions/52910

В Windows Store вместо этого используются файлы resw, вот пример этого:

http://msdn.microsoft.com/en-us/library/windows/apps/hh965326.aspx

Оба этих решения являются специфичными для платформы, которые мне не нравятся:-(. Я действительно хочу иметь всю свою строку в одном файле/языке и быть в состоянии использовать ее на всех платформах. Есть ли какое-либо решение для этого?

Обновление 17 февраля 2014 г.. Насколько я понимаю, файлы resx и resw находятся в одном формате. То, что отсутствует в приложении для хранилища Windows, заключается в том, что для файла resw не создается файл класса. Если бы я мог получить такой файл, мои проблемы были бы решены. Затем я мог бы поместить экземпляр этого класса в мою модель представления и получить доступ ко всему тексту через свойства.

Файл класса, сгенерированный в приложении WPF, почти работает. Проблема заключается в этой строке, которая выглядит примерно так:

global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ResxTest.Properties.StringTest", typeof(StringTest).Assembly);

Чтобы получить это для компиляции, мне нужно изменить его на это:

global::System.Resources.ResourceManager temp = new System.Resources.ResourceManager("ResxTest.Properties.StringTest", typeof(StringTest).GetTypeInfo().Assembly);

Но ресурс ResxTest.Properties.StringTest не может быть загружен в моем приложении Windows Store. По какой-то причине мне нужно переименовать свой ресурс в Resource.resw и загрузить его с именем "Ресурс". Я пробовал все имена, но это единственное, что работает. Использование имени MyApplication.MyResource никогда не работает.

Я не уверен, что Im на правильном пути. Im почти так отчаянно, что я сделаю свое собственное решение: я конвертирую XML файл со всеми строками, которые мне нужны для огромного класса со свойствами, которые я мог бы использовать для получения всей строки без каких-либо файлов ресурсов. Но я думаю, что это уродливо и мошенничать, поэтому я надеюсь, что кто-то может дать мне лучшую идею: -).

Обновление 24 февраля 2014 года: я был неправ! Все отлично работает с портативной библиотекой классов. Если я использую это, я могу поместить экземпляр автоматически сгенерированного класса С# в мою модель представления и получить доступ ко всем строкам от этого объекта.

Но если я использую обычную библиотеку, то это не работает должным образом в приложении Windows Store (WPF в порядке). Я попытался скопировать все файлы в библиотеку классов хранилища Windows из рабочей библиотеки переносных классов. Когда я пытаюсь создать экземпляр автоматически сгенерированного файла, я всегда получаю:

Исключение типа "System.Resources.MissingManifestResourceException" произошло в mscorlib.dll, но не обрабатывалось в коде пользователя

Дополнительная информация: Не удается загрузить ресурсы для файла ресурсов "MetroLib.StringResources" в пакете...

Довольно раздражает, так как я использую экспресс-выпуски Visual Studio, где нет библиотеки портативных классов. Поэтому, вероятно, я разработаю собственное решение для генерации классов из файла ресурсов (что также дает мне некоторые другие преимущества). Но мне все еще любопытно, что я делаю неправильно.

Ответ 1

Я, наконец, решил проблему. Я просто разработал простой инструмент (ResToCode) для преобразования файлов ресурсов в чистые классы С#. Совсем аналогично тому, что делает Visual Studios resgen.exe, но с некоторыми дополнительными функциями. Он работает очень хорошо, поэтому я очень доволен этим:-).

Инструмент доступен для всех в CodeProject:

http://www.codeproject.com/Articles/744528/ResToCode-Localization-tool-for-Windows-Desktop-St

Ответ 2

Вы можете поместить все свои ресурсы в библиотеку классов Portable и использовать эти библиотеки на всех платформах. Возможно, вам придется проверить, какую версию платформы .NET вы используете. Портативные библиотеки недоступны на всех версиях всех платформ.

http://msdn.microsoft.com/en-us/library/vstudio/hh871422(v=vs.110).aspx

http://msdn.microsoft.com/en-us/library/vstudio/gg597391(v=vs.110).aspx#members

Ответ 4

У меня была такая же проблема с MissingManifestResourceException для библиотек портативных классов. Сегодня я создал новую Portable Class Library с другим именем (без строки "Resources" в ней): и это работает как шарм. Не знаю, почему это раньше не работало (возможно, имя ресурса).