Cet article fait suite au précédent article concernant la migration de la partie « traduction » d’une application Windows Phone (7, 8 et Silverlight 8.1) en 8.1 XAML (Universal Apps)
Universal apps et traduction
Nous avons pu voir précédemment que le portage pouvait être parfois un peu lourd.
Dans le cas où vous avez déjà de nombreuses ressources traduites dans les fichiers resx volumineux (et dans plusieurs langues), la suite peut vous intéresser.
Les identifiants de ressources
Nous avons vu dans le précédent article qu’il suffisait de
- renommer les fichiers .resx en .resw
- les mettre dans des répertoires normés avec un identifiant les ressources (ex : en-US, fr-FR,..)
- modifier le XAML pour remplacer le « {Binding… » par un x:Uid
- modifier tous les identifiants de ressources pour ajouter la propriété du contrôle qui sera traduite.
Pour éviter ce dernier cas parfois très lourd, il existe un solution qui peux vous faire gagner un peu de temps.
Les ressources XAML « CustomResource »
La première chose à faire est de surcharger la classe CustomXamlResourceLoader. Cette classe permet de définir ses propres ressources XAML « Custom »
public class TranslationResourceProvider : CustomXamlResourceLoader { readonly ResourceLoader _resourceLoader = new ResourceLoader(); protected override object GetResource(string resourceId, string objectType, string propertyName, string propertyType) { return _resourceLoader.GetString(resourceId); } }
Créer une nouvelle classe « TranslationResourceProvider.cs » et copiez le code ci-dessus directement dans la classe.
Il faut ensuite initialiser ce nouvel objet par exemple dans la App.xaml.cs
public App() { this.InitializeComponent(); CustomXamlResourceLoader.Current = new TranslationResourceProvider(); ...
Une fois initialisé, vous pouvez utiliser directement dans le XAML la syntaxe {CustomResource key} ou key représente l’identifiant donné à la ressource à traduire.
Exemple : vous pourrez utiliser cette syntaxe :
<Button Content="{CustomResource BtnStop}" />
Ce qui reste assez simple à porter car il suffit juste de remplacer le « {Binding,… » par {CustomResource… ». Vous n’aurez pas besoin de revenir sur le fichier .resw.
Vous pouvez même mixer cette syntaxe avec la méthode précédente, l’un n’empêche pas l’autre :
<Button x:Uid="BtnStart" Content="" />
Ci dessous, un exemple de fichier de ressources resw avec
- en première ligne, la syntaxe standard que vous devrez avoir pour un projet classique (Windows 8/8.1 et WP8.1 XAML)
- en deuxième ligne, vous pouvez conserver votre ancienne syntaxe qui reste compatible avec les anciens projets Windows phone 7.x, 8.0 et Silverlight 8.1.
BtnStart.Content | Start |
BtnStop | Stop |
Bonnes traductions et bonne migration !