Utiliser des *.resx externes (avec Spring.net)

On a parfois besoin de livrer une application .Net avec les fichiers de ressources, afin qu’un traducteur, voir même un intégrateur, puisse faire les traductions au dernier moment.

Si cette personne doit recompiler l’application pour voir le fruit de son travail, ce n’est pas très pratique voir impossible: allez lui expliquer que VisualStudio n’est pas nécessaire et qu’il est possible de créer des ressources avec ResGen.exe (et al.exe pour faire des assembly satellites). Très franchement, les traducteurs ne veulent pas de quelque chose d’aussi et vont vous fuir comme la peste si vous leur demander d’être des développeurs.

La solution est donc d’utiliser simplement des fichier *.resx sans les compiler, et elle a plusieurs avantages:

  • le traducteur n’a pas à savoir comment compiler des ressources (ce n’est pas un développeur)
  • les fichiers *.resx sont sous la forme XML, et donc (très?) lisible (la structure propose même un champ « commentaire »)
  • il existe bien sûr des éditeurs de fichiers *.resx pour ceux qui ne veulent même pas savoir ce que XML veut dire: Resourcer for .net

Vous pouvez retrouver ces explication sur le blog suivant.
Et Oh joie! Ce blog explique comment réaliser un ResourceManager personnalisé capable de charger des fichiers .resx! C’est donc tous ce qu’il nous faut, nul besoin de réinventer un autre mécanisme de traduction maison.

Pour pousser la réflexion plus loin, je voulais utiliser Spring.net pour obtenir la traduction. Cette solution à pour avantage de ne passer que par le contexte pour obtenir cette dernière, peut importe dans quel fichier elle se trouve. Il suffit alors de paramétrer dans le fichier App.Config le chemin de chaque fichier *.resx.

Pour ce faire, rien de plus facile: Spring.net fournit une classe qui recense un certain nombre de ResourceManager. En référençant donc notre ResxResourceManager qui pointe sur notre fichier *.resx, le contexte Spring sera alors capable de fournir les bonnes traductions si on l’interroge. Pour obtenir une traduction dans la culture courante, il suffira alors d’écrire ceci:

ContextRegistry.GetContext().GetMessage("MaClef");

Le XML de configuration ressemble à ça:

<object name="messageSource" type="Spring.Context.Support.ResourceSetMessageSource, Spring.Core">
  <property name="ResourceManagers">
    <list>
      <!-- ResourceManager qui pointe sur notre fichier Resx\MyResource.resx -->
      <object id="MyResource" type="TestWinformsRessources.ResxResourceManager">
        <constructor-arg name="baseName" value="MyResource"/>
        <constructor-arg name="resourceDir" value="Resx"/>
      </object>
    </list>
  </property>
</object>

Vous pouvez voire concrètement ce que ça donne avec un petit exemple.

kick it on DotNetKicks.com

4 réflexions sur “Utiliser des *.resx externes (avec Spring.net)

  1. C’est une bonne chose à savoir, je trouve ça utile.

    Ce qui est moins cool, c’est le fait de devoir utiliser la réflexion pour casser l’encapsulation au niveau du ResourceManager. Ca n’aurait pas coûté grand chose à Microsoft de fournir un constructeur public…

  2. lol oui c’est le commentaire sur le blog http://blechie.com 🙂
    Je trouve ça aussi affligeant que ça n’y soit pas de base.
    On peut aussi se poser la question « pourquoi ResXResourceSet se trouve dans System.Windows.Forms? ».
    Un autre truc dommage: Pourquoi n’y a-t-il pas de TxtResourceSet ? (avec un txt clef=valeur pour les allergiques du XML)

  3. Bonjour,

    Si vous êtes intéressés de traduire logiciels pour Internet, pour PC, pour mobiles ou tout autre type de logiciels, je vous recommandons chaleureusement le nouvel instrument numérique ”l10n” que mon équipe a récemment créé – et qui a toutes les chances de rendre vos activités de bureau bien plus faciles et rapides.

    http://poeditor.com/

    POEditor est intuitif, basé sur travail en collaboration. Il comprend de nombreuses fonctions qui puissent vous soutenir lors du processus de gestion de traductions, que vous pourriez découvrir sur notre page Internet.Vous pouvez importer depuis multiples types de fichiers de localisation (pot, po, xls, xlsx, strings, xml, resx, properties) ou se servir directement de notre REST API.

    N’hésitez pas de l’essayer et/ou le proposer aux développeurs ou, en général, a ceux qui en seraient intéressés.

Laisser un commentaire