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, где нет библиотеки портативных классов. Поэтому, вероятно, я разработаю собственное решение для генерации классов из файла ресурсов (что также дает мне некоторые другие преимущества). Но мне все еще любопытно, что я делаю неправильно.