292 votes

Comment utiliser la localisation en C#

Je n'arrive pas à faire fonctionner la localisation.

J'ai une bibliothèque de classes. Maintenant je veux créer resx et renvoie des valeurs basées sur la culture du fil.

Comment puis-je faire ça ?

0 votes

P.S. : assurez-vous d'avoir installé l'extension gratuite Microsoft MAT (Multilingual App Toolkit) pour visual studio ;-)

0 votes

624voto

Fredrik Mörk Points 85694
  • Ajoutez un fichier de ressources à votre projet (vous pouvez l'appeler "strings.resx") en procédant comme suit :
    Cliquez à droite sur Propriétés dans le projet, sélectionnez Ajouter -> Nouvel élément... dans le menu contextuel, puis dans la liste de Éléments de Visual C# choisir "Fichier de ressources" et le nommer strings.resx .
  • Ajoutez une ressource de type chaîne dans le fichier resx et donnez-lui un bon nom (exemple : nommez-la "Hello" avec et donnez-lui la valeur "Hello")
  • Sauvegarder le fichier de ressources ( note : ce sera le par défaut puisqu'il ne dispose pas d'un code de langue à deux lettres)
  • Ajoutez des références à votre programme : System.Threading y System.Globalization

Exécutez ce code :

Console.WriteLine(Properties.strings.Hello);

Il devrait imprimer "Hello".

Maintenant, ajoutez un nouveau fichier de ressources, nommé "strings.fr.resx" (notez la partie "fr" ; celui-ci contiendra des ressources en français). Ajoutez une ressource string avec le même nom que dans strings.resx, mais avec la valeur en français (Name="Hello", Value="Salut"). Maintenant, si vous exécutez le code suivant, il devrait imprimer Salut :

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(Properties.strings.Hello);

Ce qui se passe, c'est que le système va chercher une ressource pour "fr-FR". Il n'en trouvera pas (puisque nous avons spécifié "fr" dans votre fichier"). Il se rabat alors sur la recherche de "fr", qu'il trouve (et utilise).

Le code suivant, imprimera "Hello" :

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
Console.WriteLine(Properties.strings.Hello);

C'est parce qu'il ne trouve pas de ressource "en-US", ni de ressource "en", et qu'il se rabat donc sur la ressource par défaut, qui est celle que nous avons ajoutée dès le départ.

Vous pouvez créer des fichiers avec des ressources plus spécifiques si nécessaire (par exemple strings.fr-FR.resx et strings.fr-CA.resx pour le français en France et au Canada respectivement). Dans chacun de ces fichiers, vous devrez ajouter les ressources pour les chaînes de caractères qui diffèrent de la ressource vers laquelle elles se replient. Ainsi, si un texte est identique en France et au Canada, vous pouvez le placer dans strings.fr.resx, tandis que les chaînes de caractères qui sont différentes en français canadien pourraient aller dans strings.fr-CA.resx.

28 votes

La réponse pourrait faire référence à la plomberie "en coulisse" effectuée par Visual Studio : le fichier resx.designer.cs, qui permet à l'intellisense de fonctionner ; les assemblages satellites compilés avec la bibliothèque de classes, qui doivent être déployés avec l'assemblage compilé et tous les projets ultérieurs qui l'utilisent, etc. La réponse est belle et simple, mais elle ne permet pas d'expliquer où les choses peuvent mal tourner, par exemple si vous n'utilisez pas Visual Studio.

13 votes

+1 poste ! Plutôt que de créer des fichiers manuellement, essayez Zeta Resource Editor ( zeta-resource-editor.com/index.html ). Il est gratuit et vous aide à faire ce genre de traductions BEAUCOUP plus rapidement qu'avec VS.

1 votes

Est-ce que .net détecte la langue du système d'exploitation et définit automatiquement les informations de culture pour vous ? ... ou devons-nous définir la CurrentUICulture dans le code pour une langue différente ?

47voto

OregonGhost Points 16615

C'est assez simple, en fait. Créez un nouveau fichier de ressources, par exemple Strings.resx . Set Access Modifier a Public . Utilisez le modèle de fichier apprioriate, afin que Visual Studio génère automatiquement une classe accesseur (le nom sera Strings dans ce cas). Il s'agit de votre langue par défaut.

Maintenant, lorsque vous voulez ajouter, disons, la localisation allemande, ajoutez un fichier resx localisé. Ce sera typiquement Strings.de.resx dans ce cas. Si vous souhaitez ajouter une localisation supplémentaire pour, par exemple, l'Autriche, vous créerez en plus un fichier Strings.de-AT.resx .

Maintenant, allez créer une chaîne - disons une chaîne avec le nom HelloWorld . Dans votre Strings.resx ajoutez cette chaîne avec la valeur "Hello, world !". Dans Strings.de.resx ajoutez "Hallo, Welt !". Et dans Strings.de-AT.resx ajoutez "Servus, Welt !". C'est tout pour l'instant.

Maintenant vous avez ceci de généré Strings et elle possède une propriété avec un getter HelloWorld . L'obtention de cette propriété chargera "Servus, Welt !" lorsque votre locale est de-AT, "Hallo, Welt !" lorsque votre locale est toute autre locale (y compris de-DE et de-CH), et "Hello, World !" lorsque votre locale est toute autre. Si une chaîne est manquante dans la version localisée, le gestionnaire de ressources remontera automatiquement la chaîne, de la ressource la plus spécialisée à la ressource invariante.

Vous pouvez utiliser le ResourceManager pour un meilleur contrôle de la façon dont vous chargez les choses. La classe générée Strings l'utilise également.

0 votes

Comment définir la locale ?

2 votes

@MatheusSimon : Vous n'en avez pas besoin. Par défaut, la locale actuelle de l'utilisateur est utilisée. Si vous voulez forcer une certaine locale (par exemple, pour permettre aux utilisateurs de changer la langue manuellement), vous devez définir System.Threading.Thread.CurrentCulture et CurrentUICulture. dans chaque fil Il s'agit d'une mise à jour de l'application, probablement avant que les ressources ne soient chargées pour la première fois. Il est plus facile de redémarrer une application dans ce cas que de la mettre à jour au moment de l'exécution.

19voto

noelicus Points 3788

En plus de l'excellente réponse de @Fredrik Mörk sur les cordes, j'ajouterai ceci localisation vers un formulaire faites ce qui suit :

  • Définissez le formulaire Propriété de l'entreprise "Localizable" a true
  • Modifiez les paramètres du formulaire Language de la langue souhaitée (à partir d'un joli menu déroulant qui les contient toutes)
  • Traduisez les contrôles dans ce formulaire et déplacez-les si nécessaire (écrasez ces longues phrases françaises complètes !).

Edit : This Article de MSDN sur la localisation de Windows Forms n'est pas l'original que j'ai lié ... mais pourrait apporter plus de lumière si nécessaire. (l'ancienne a été retirée)

0 votes

L'article msdn n'est plus disponible, un remplacement est-il possible ?

0 votes

Je n'en suis pas sûr - j'ai mis en lien le meilleur que j'ai pu voir, mais je ne me souviens pas de l'article d'il y a 7 ans ;)

14voto

Eric Bole-Feysot Points 558

Excellente réponse de F.Mörk. Mais si vous voulez mettre à jour la traduction, ou ajouter de nouvelles langues une fois l'application publiée, vous êtes coincé, car vous devez toujours la recompiler pour générer le fichier resources.dll.

Voici une solution pour compiler manuellement une dll de ressource. Elle utilise les outils resgen.exe et al.exe (installés avec le sdk).

Disons que vous avez un fichier de ressources Strings.fr.resx, vous pouvez compiler une dll de ressources avec le lot suivant :

resgen.exe /compile Strings.fr.resx,WpfRibbonApplication1.Strings.fr.resources 
Al.exe /t:lib /embed:WpfRibbonApplication1.Strings.fr.resources /culture:"fr" /out:"WpfRibbonApplication1.resources.dll"
del WpfRibbonApplication1.Strings.fr.resources
pause

Veillez à conserver l'espace de nom original dans les noms de fichiers (ici "WpfRibbonApplication1").

2 votes

Merci pour le commentaire sur la préservation de l'espace de nom (y), qui - s'il est manqué - ne générera pas d'erreur, mais reviendra simplement à la ressource de repli.

1voto

Steven Points 5514

Cela pourrait aider si vous décriviez ce qui ne fonctionne pas.

Avez-vous essayé de chercher des tutoriels ? Ce fil de discussion devrait vous aider : http://forums.asp.net/t/1278099.aspx

Vous pouvez également consulter le site : http://www.java2s.com/Tutorial/CSharp/0460__GUI-Windows-Forms/CreateaResxresourcefile.htm

https://media.sdn.sap.com/html/submitted_docs/PDK_for_dotNET_10/Tutorials/Localizing%20Portal%20Component.htm

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X