2016-08-22 1 views
1

J'ai trouvé un problème avec la localisation dans l'application WinPhone. J'ai ajouté quelques ressources et implémenté la localisation. Il fonctionne bien dans le simulateur, mais plante sur le téléphone avec exception Exception levée: 'System.Resources.MissingManifestResourceException' dans mscorlib.ni.dllXamarin: 'System.Resources.MissingManifestResourceException' sur WinPhone

Une aide?

+0

Avez-vous résolu ce Jay? –

+0

Non, ce n'est pas encore résolu. Mais j'ai implémenté la localisation différemment. J'ai utilisé tous les fichiers de ressources de chaîne et, selon les paramètres régionaux, l'application les charge à partir des chaînes de ressources respectives dans un dictionnaire. Je n'ai eu aucune alternative car j'ai essayé avec d'autres forum mais n'ai pas réussi. – Jay

+0

Merci pour l'info Jay, j'ai trouvé une solution qui fonctionne parfaitement - peut-être la peine de vérifier! –

Répondre

1

Grâce à un peu de googling et un blog utile, j'ai réussi à résoudre ce problème qui s'est produit par intermittence avec les projets Xamarin.Forms.

C'est le billet de blog qui m'a conduit à la solution: http://blog.tpcware.com/2016/06/xamarin-forms-localization/

Fondamentalement, la façon dont vous accéder à des ressources sur Android et iOS avec Xamarin.Forms et Windows Phone est différent:

Pour Pour faire court, nous devons utiliser "automagiquement" la méthode ResourceLoader.GetString (...) lors de l'exécution sur les applications Store, tout en continuant à utiliser la méthode habituelle ResourceManager.GetString (...) sur toutes les autres plateformes. Et parce que dans la solution Xamarin Forms nous utilisons un fichier de ressources de type RESX, nous avons aussi la classe de ressource générée automatiquement. L'idée super intelligente contenue dans le post lié ci-dessus consiste à "pirater" la classe de ressources en injectant une classe dérivée de ResourceManager avec une méthode GetString (...) surchargée dans la classe resourceMan "resourceMan" (pour une explication plus détaillée de ce hack , vous pouvez lire le post).

Nous devons créer notre propre version de ResourceManager comme tant et échanger pour le ResourceManager existant en utilisant la réflexion:

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); 
    } 
    } 

Tout ce qui est alors reste à faire est d'appeler quand l'application démarre pour la première temps:

WinRTResourceManager.InjectIntoResxGeneratedApplicationResourcesClass(typeof(AppResources)); 

Après avoir fait ces changements, tout devrait bien fonctionner maintenant. Bien sûr, c'est absolument un hack mais j'ai informé l'équipe de Xamarin.Forms de la question et ils sont en train de l'examiner, donc j'espère que cela sera bientôt résolu!

+0

Hmm, eh bien on a essayé, mais ça n'a pas aidé. Nous allons vérifier à nouveau et trouver des opportunités, le cas échéant. – Jay

+0

Il est possible qu'il y ait un petit peu que vous avez manqué. Vérifiez pour vous assurer que ce nouveau WinRTResourceManager est utilisé avec un point d'arrêt, cela devrait fonctionner comme j'ai vérifié avec quelques solutions différentes. –

+0

Dans mon cas, le projet 'assembly satellite' avait les ressources, nommées 'My.Resources'. Entré en travers [lien] (http://www.lhotka.net/weblog/NETCoreUsingExistingResxResourceFile.aspx). Après avoir renommé le projet pour ne pas avoir les '.Resources' dans le nom et l'avoir nommé quelque chose comme 'My.SharedResources', il a résolu mon problème causé par le problème de nommage de l'espace de noms décrit dans le lien de Rockford Lhotka. – Athadu