{"id":714,"date":"2014-08-31T17:53:38","date_gmt":"2014-08-31T15:53:38","guid":{"rendered":"http:\/\/dev.bratched.fr\/fr\/?p=714"},"modified":"2014-08-31T17:53:38","modified_gmt":"2014-08-31T15:53:38","slug":"migration-vers-8-1-les-fichiers-de-ressources-resw","status":"publish","type":"post","link":"https:\/\/bratched.com\/fr\/2014\/08\/31\/migration-vers-8-1-les-fichiers-de-ressources-resw\/","title":{"rendered":"Migration vers 8.1 : Les fichiers de ressources resw"},"content":{"rendered":"<h1>Introduction<\/h1>\n<p>Premier article d&rsquo;une s\u00e9rie qui revient sur mon retour d&rsquo;exp\u00e9rience sur la migration des application Windows Phone 8.0 (Silverlight) vers Windows Phone 8.1\/Windows 8.1 (Universal App).<\/p>\n<p>Visual Studio 2013 permet de r\u00e9aliser des universal apps, applications \u00e0 la fois compatibles Windows Phone 8.1 et Windows 8.1.<\/p>\n<p>La quasi totalit\u00e9 du\u00a0code peut ainsi \u00eatre partag\u00e9 (jusqu&rsquo;aux interfaces graphiques) permettant un incroyable gain de temps dans la cr\u00e9ation et surtout dans la maintenance de projets sur la mobilit\u00e9.<\/p>\n<h1>Resx &#8211; C&rsquo;\u00e9tait mieux avant ?<\/h1>\n<p>Grand changement et mauvaise surprise lorsque je me suis aper\u00e7u lors de la soumission\u00a0sur le Store que mon paquet ne pouvait \u00eatre accept\u00e9.<\/p>\n<p>La cause : des fichiers resx dans des assemblies (m\u00eames dans les Portable Class Library cens\u00e9es fonctionner\u00a0dans la quasi totalit\u00e9 des projets\u00a0Windows phone 7, 8, 8.1, &#8230;)<\/p>\n<p>Ce qui est assez dr\u00f4le c&rsquo;est que tout fonctionne jusqu&rsquo;au moment du d\u00e9ploiement\u00a0dans le store. L&rsquo;application que j&rsquo;ai tent\u00e9 de d\u00e9ployer fonctionnait parfaitement sur mon t\u00e9l\u00e9phone avec des fichiers resx dans une Portable Class Library (PCL)<\/p>\n<p><!--more--><\/p>\n<h2>Petit rappel (WP7, 8, 8.1 Silverlight)<\/h2>\n<p>Pour localiser une application il \u00e9tait n\u00e9cessaire dans les versions Windows Phone Silverlight (7, 8, 8.1) de d\u00e9finir un fichier ressource avec une extension resx.<\/p>\n<p>Les fichiers devaient se terminer par les identifiants de la langue et du Pays.<\/p>\n<p>Exemple : pour une traduction en fran\u00e7ais, le fichier se terminait par .fr-FR.resx<\/p>\n<p><a href=\"http:\/\/dev.bratched.fr\/fr\/wp-content\/uploads\/sites\/2\/2014\/08\/RessourcesLanguage01.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-715\" src=\"http:\/\/dev.bratched.fr\/fr\/wp-content\/uploads\/sites\/2\/2014\/08\/RessourcesLanguage01.png\" alt=\"RessourcesLanguage01\" width=\"304\" height=\"129\" srcset=\"https:\/\/bratched.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/08\/RessourcesLanguage01.png 304w, https:\/\/bratched.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/08\/RessourcesLanguage01-300x127.png 300w\" sizes=\"(max-width: 304px) 100vw, 304px\" \/><\/a><\/p>\n<p>Une fois ce fichier d\u00e9fini, il fallait l&rsquo;exposer en changeant son mode en \u00ab\u00a0Public\u00a0\u00bb.<\/p>\n<p>Pour utiliser les ressources dans les d\u00e9veloppements, il fallait alors cr\u00e9er un wrapper qui exposait ces ressources (ci-dessous exemple de code)<\/p>\n<pre class=\"lang:default decode:true\">namespace Snowtify.Portable.Language\n{\n    public class LanguageResourcesWrapper\n    {\n        public LanguageResourcesWrapper()\n        {\n        }\n        private static LngRes _lngres = new LngRes();\n        public LngRes LngRes\n        {\n            get { return _lngres; }\n        }\n    }\n}<\/pre>\n<p>Ouf !\u00a0il fallait ensuite d\u00e9finir une ressource permettant d&rsquo;acc\u00e9der dans la XAML \u00e0 ce wrapper<\/p>\n<pre class=\"lang:default decode:true\"> &lt;lang:LanguageResourcesWrapper x:Key=\"Lang\"\/&gt;<\/pre>\n<p>et dans les vues XAML, il fallait ensuit binder les valeurs avec cette cl\u00e9 : (par exemple)<\/p>\n<pre class=\"lang:default decode:true\"> &lt;Button Content=\"{Binding Path=LngRes.Cancel, Source={StaticResource Lang}}\" \/&gt;<\/pre>\n<p>Pas tr\u00e8s Sexy quand m\u00eame.<\/p>\n<p>Pour y acc\u00e9der \u00e0 travers le code C#, c&rsquo;\u00e9tait un peu\u00a0plus simple<\/p>\n<pre class=\"lang:default decode:true\"> string text = LngRes.Cancel;<\/pre>\n<p>Pour que les langues soient prises en compte, il fallait \u00e9galement les d\u00e9finir dans le fichier WMAppManifest, le langage par d\u00e9faut, correspondant eu fichier resx sans l&rsquo;extension de langue et toutes les langues support\u00e9es.<\/p>\n<p><a href=\"http:\/\/dev.bratched.fr\/fr\/wp-content\/uploads\/sites\/2\/2014\/08\/RessourcesLanguage_WMAppManifest.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-716\" src=\"http:\/\/dev.bratched.fr\/fr\/wp-content\/uploads\/sites\/2\/2014\/08\/RessourcesLanguage_WMAppManifest.png\" alt=\"RessourcesLanguage_WMAppManifest\" width=\"703\" height=\"269\" srcset=\"https:\/\/bratched.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/08\/RessourcesLanguage_WMAppManifest.png 703w, https:\/\/bratched.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/08\/RessourcesLanguage_WMAppManifest-300x115.png 300w\" sizes=\"(max-width: 703px) 100vw, 703px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h1>Les nouveaux fichiers ressources resw<\/h1>\n<h2>Organisation des resw dans la solution<\/h2>\n<p>Globalement, l&rsquo;op\u00e9ration de traduction va \u00eatre simplifi\u00e9e.<\/p>\n<p>Pour ajouter un fichier ressource de langue, il suffit d&rsquo;ajouter un fichier .resw.<\/p>\n<p>Ils doivent se placer dans un r\u00e9pertoire portant le code langage de traduction.<\/p>\n<p>Le fichier doit s&rsquo;appeler toujours pareil, par convention, les fichiers de ressources sont dans\u00a0le r\u00e9pertoire \u00ab\u00a0Strings\u00a0\u00bb.<\/p>\n<p>Ce qui donne maintenant\u00a0dans mon projet l&rsquo;organisation suivante :<\/p>\n<p><a href=\"http:\/\/dev.bratched.fr\/fr\/wp-content\/uploads\/sites\/2\/2014\/08\/RessourcesLanguage_resw.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-717\" src=\"http:\/\/dev.bratched.fr\/fr\/wp-content\/uploads\/sites\/2\/2014\/08\/RessourcesLanguage_resw.png\" alt=\"RessourcesLanguage_resw\" width=\"213\" height=\"105\" \/><\/a><\/p>\n<p>Un fichier resw est compl\u00e8tement identique \u00e0 un fichier resx. Vous pouvez r\u00e9cup\u00e9rer rapidement toutes vos traductions renommant\u00a0simplement l&rsquo;extension et en les pla\u00e7ant au bon endroit dans votre projet.<\/p>\n<p>Ce qui est tr\u00e8s\u00a0pratique \u00e9galement, c&rsquo;est que des formidables outils comme <a title=\"ResXManager\" href=\"http:\/\/visualstudiogallery.msdn.microsoft.com\/3b64e04c-e8de-4b97-8358-06c73a97cc68\" target=\"_blank\" rel=\"noopener noreferrer\">ResxManager<\/a> continuent \u00e0 fonctionner avec ce type de fichiers.<\/p>\n<h2>Ressources dans le XAML<\/h2>\n<p>En XAML, il va falloir utiliser\u00a0le tag x:Uid pour signifier qu&rsquo;une traduction va \u00eatre disponible.<\/p>\n<p>Cela\u00a0a pour avantage \u00e9galement\u00a0de permettre \u00e0 des outils de traduction d&rsquo;extraire toutes les cl\u00e9s \u00e0 traduire.<\/p>\n<p>Exemple :<\/p>\n<pre class=\"lang:default decode:true \"> &lt;Button x:Uid=\"Register\" Content=\"Register\" \/&gt;<\/pre>\n<p><strong><span style=\"color: #ff0000\">Attention<\/span><\/strong> cependant : La cl\u00e9 dans votre fichier de ressource ne devra plus s&rsquo;appeler \u00ab\u00a0Register\u00a0\u00bb mais \u00ab\u00a0Register.Content\u00a0\u00bb. (Pour le contenut d&rsquo;un textblock se sera .Text, etc&#8230;)<\/p>\n<p>Ainsi il est possible de surcharger apr\u00e8s les d\u00e9veloppements n&rsquo;importe qu&rsquo;elle propri\u00e9t\u00e9 (largeur, marge,&#8230;)<\/p>\n<p>Le content contient une valeur par d\u00e9faut qui sera automatiquement surcharg\u00e9e si la valeur existe dans le fichier resw.<\/p>\n<p>Le code est quand m\u00eame bien\u00a0plus simple qu&rsquo;auparavant.<\/p>\n<h2>Dans du code C#<\/h2>\n<p>Pour interroger les ressources :<\/p>\n<pre class=\"lang:default decode:true\">ResourceLoader translate = new ResourceLoader();\nstring message = translate.GetString(\"PleaseRateApp\");<\/pre>\n<p>Pour interroger une ressource avec une propri\u00e9t\u00e9 (comme par exemple Register.Content\u00a0\u00bb)<\/p>\n<pre class=\"lang:default decode:true\">ResourceLoader translate = new ResourceLoader();\nstring message = translate.GetString(\"Register\/Content\");<\/pre>\n<h2>D\u00e9ploiement<\/h2>\n<p>C\u00f4t\u00e9 d\u00e9ploiement et fichier Manifest, plus besoin de sp\u00e9cifier les langues support\u00e9es.<\/p>\n<p>Tout est fait de fa\u00e7on automatique en fonction des r\u00e9pertoires langues d\u00e9finis dans votre projet.<\/p>\n<h1>Conclusion<\/h1>\n<p>Voil\u00e0 un rapide aper\u00e7u des nouvelles possibilit\u00e9s de traduction pour Windows Phone 8.1 et Windows 8.<\/p>\n<p>Vive les universal apps !\u00a0et bonnes traductions.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Premier article d&rsquo;une s\u00e9rie qui revient sur mon retour d&rsquo;exp\u00e9rience sur la migration des application Windows Phone 8.0 (Silverlight) vers Windows Phone 8.1\/Windows 8.1 (Universal App). Visual Studio 2013 permet de r\u00e9aliser des universal apps, applications \u00e0 la fois compatibles Windows Phone 8.1 et Windows 8.1. La quasi totalit\u00e9 du\u00a0code peut ainsi \u00eatre partag\u00e9 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[59,62,63],"tags":[98,99,100,53,58],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/posts\/714"}],"collection":[{"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/comments?post=714"}],"version-history":[{"count":0,"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/posts\/714\/revisions"}],"wp:attachment":[{"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/media?parent=714"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/categories?post=714"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bratched.com\/fr\/wp-json\/wp\/v2\/tags?post=714"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}