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!
Avez-vous résolu ce Jay? –
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
Merci pour l'info Jay, j'ai trouvé une solution qui fonctionne parfaitement - peut-être la peine de vérifier! –