2016-08-22 2 views
1

Я нашел проблему с локализацией в приложении WinPhone. Я добавил пару ресурсов и реализовал локализацию. Он отлично работает в симуляторе, но сбой на телефоне с исключением. Исключение выбрано: «System.Resources.MissingManifestResourceException» в mscorlib.ni.dllXamarin: 'System.Resources.MissingManifestResourceException' на WinPhone

Любая помощь?

+0

Вы решили этот Джей? –

+0

Нет, он еще не решен. Но я реализовал локализацию по-разному. Я использовал весь файл строковых ресурсов, и в зависимости от локали приложение загружает их из соответствующих строк ресурсов в словаре. У меня не было альтернативы, как я пытался с другими форумами, но не удалось. – Jay

+0

Спасибо за информацию Jay, я нашел решение, которое отлично работает - возможно, стоит проверить! –

ответ

1

Благодаря небольшому количеству поисковых запросов и полезному сообщению в блоге мне удалось решить эту проблему, которая произошла с перерывами с проектами Xamarin.Forms.

Это сообщение в блоге, что привело меня к решению: http://blog.tpcware.com/2016/06/xamarin-forms-localization/

В основном, как вы получить доступ к ресурсам на Android и IOS с Xamarin.Forms и Windows Phone отличается:

Для сделайте это коротко, нам нужно «автоматически» использовать метод ResourceLoader.GetString (...) при работе в приложениях Store, продолжая использовать обычный метод ResourceManager.GetString (...) на всех других платформах. И поскольку в решении Xamarin Forms мы используем файл ресурсов типа RESX, у нас также есть автоматически созданный класс ресурсов. Сложная идея, содержащаяся в приведенном выше сообщении, заключается в том, чтобы «взломать» класс ресурсов, введя производный класс ResourceManager с переопределенным методом GetString (...) в свойство ресурса класса resourceMan (для более подробного объяснения этого взлома , вы можете прочитать сообщение).

Нам нужно создать свою собственную версию ResourceManager как так и поменять его на существующем ResourceManager с помощью отражения:

public class WinRTResourceManager : ResourceManager 
    { 
    readonly ResourceLoader _resourceLoader; 

    private WinRTResourceManager(string baseName, Assembly assembly) : base(baseName, assembly) 
    { 
     _resourceLoader = ResourceLoader.GetForViewIndependentUse(baseName); 
    } 

    public static void InjectIntoResxGeneratedApplicationResourcesClass(Type resxGeneratedApplicationResourcesClass) 
    { 
     resxGeneratedApplicationResourcesClass 
      .GetRuntimeFields() 
      .First(m => m.Name == "resourceMan") 
      .SetValue(null, new WinRTResourceManager(
       resxGeneratedApplicationResourcesClass.FullName, 
       resxGeneratedApplicationResourcesClass.GetTypeInfo().Assembly)); 
    } 

    public override string GetString(string name, CultureInfo culture) 
    { 
     return _resourceLoader.GetString(name); 
    } 
    } 

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

WinRTResourceManager.InjectIntoResxGeneratedApplicationResourcesClass(typeof(AppResources)); 

После внесения этих изменений все должно работать нормально. Конечно, это абсолютно взломать, но я уведомил команду Xamarin.Forms о проблеме, и они смотрят в нее так, надеюсь, она скоро будет решена!

+0

Хм, хорошо мы пробовали это, но это не помогло. Мы проверим его снова и найдем возможности, если таковые имеются. – Jay

+0

Возможно, это может быть один крошечный бит, который вы пропустили. Убедитесь, что этот новый WinRTResourceManager используется с точкой останова, он действительно должен работать, поскольку я проверял несколько различных решений. –

+0

В моем случае у меня был проект «сборка спутников» с ресурсами, называемый «My.Resources». Перешел через [link] (http://www.lhotka.net/weblog/NETCoreUsingExistingResxResourceFile.aspx). После переименования проекта, чтобы не было «.Resources» в названии и назвало его чем-то вроде «My.SharedResources», он исправил мою проблему, вызванную проблемой имен имен пространства имен, как описано в ссылке Rockford Lhotka. – Athadu