10

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

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

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

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

Для хранения приложений файлов RESW Windows, вместо этого используются, вот пример того, что:

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

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

Update 17 Feb 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 никогда не работает.

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

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

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

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

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

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

ответ

3

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

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

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

1

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

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

+0

Спасибо. Я уже использую переносимую библиотеку классов, я вложил всю свою логику. Но у меня нет ресурсов для правильной работы. Я могу добавить файл resx и использовать его в Windows Desktop, но у меня нет этого для работы в Windows Store. Или я просто не знаю, как правильно писать синтаксис :-). Есть идеи? Будет ли это работать и с несколькими языками? – PEK

+0

вы выставляете методы для возврата ресурсов в портативную библиотеку. Просто вызовите эти методы портативной библиотеки из своего приложения для магазина Windows. Здесь приведен пример для локализованных ресурсов. http://msdn.microsoft.com/en-us/library/vstudio/hh871422(v=vs.110).aspx – Praggie

+1

Это все хорошо, если я просто хочу получить строки в коде. Но могу ли я использовать это в xaml-файлах? В настольном приложении я мог бы написать что-то вроде , но как насчет приложения Windows Store? – PEK

1

Вы смотрели на Multilingual App Toolkit? Он поддерживает переводы в промышленном стандарте XLIFF format и может генерировать файлы ресурсов для Windows и Windows Phone.

+0

Спасибо, это выглядело довольно многообещающим. Но потом я узнал, что настольные приложения не поддерживаются :-( Но я надеюсь, что они продолжат его развивать. Мне нравится эта идея. В настоящее время я думаю, что с этим сложнее справиться, чем должно быть :-(. – PEK

0

Я была такая же проблема с MissingManifestResourceException для портативных библиотек классов тоже. Сегодня я создал новую портативную библиотеку классов с другим именем (без строки «Ресурсы» в ней): и это работает как шарм. Не знаю, почему это раньше не работало (возможно, имя ресурса).

Смежные вопросы