Comment utiliser la localisation en C #

Je n’arrive pas à faire fonctionner la localisation.

J’ai une bibliothèque de classe. Maintenant, je veux créer des fichiers resx là-bas et renvoyer des valeurs en fonction de la culture du thread.

Comment puis je faire ça?

  • Ajoutez un fichier de ressources à votre projet (vous pouvez l’appeler “ssortingngs.resx”) en procédant comme suit:
    Cliquez avec le bouton droit sur Propriétés dans le projet, sélectionnez Ajouter -> Nouvel élément … dans le menu contextuel, puis dans la liste des éléments Visual C #, sélectionnez “Fichier de ressources” et nommez-le ssortingngs.resx .
  • Ajoutez une chaîne de caractères dans le fichier resx et donnez-lui un bon nom (exemple: nommez-le “Hello” avec et donnez-lui la valeur “Hello”)
  • Enregistrez le fichier de ressources ( note: ce sera le fichier de ressources par défaut , car il ne comporte pas de code de langue à deux lettres)
  • Ajoutez des références à votre programme: System.Threading et System.Globalization

Exécutez ce code:

 Console.WriteLine(Properties.ssortingngs.Hello); 

Il devrait imprimer “Bonjour”.

Maintenant, ajoutez un nouveau fichier de ressources, nommé “ssortingngs.fr.resx” (notez la partie “fr”, celle-ci contiendra des ressources en français). Ajoutez une ressource de chaîne portant le même nom que dans ssortingngs.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.ssortingngs.Hello); 

Ce qui se passe, c’est que le système recherchera une ressource pour “fr-FR”. Il n’en trouvera pas (puisque nous avons spécifié “fr” dans votre fichier “). Il faudra alors vérifier” fr “, qu’il trouve (et utilise).

Le code suivant affichera “Hello”:

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

C’est parce qu’il ne trouve aucune ressource “en-US”, et également aucune ressource “en”, donc il va revenir à la valeur par défaut, qui est celle que nous avons ajoutée dès le début.

Si nécessaire, vous pouvez créer des fichiers avec des ressources plus spécifiques (par exemple ssortingngs.fr-FR.resx et ssortingngs.fr-CA.resx pour le français en France et au Canada respectivement). Dans chacun de ces fichiers, vous devrez append les ressources pour les chaînes qui diffèrent de la ressource vers laquelle elles reposeraient. Donc, si un texte est le même en France et au Canada, vous pouvez le mettre dans ssortingngs.fr.resx, alors que les chaînes différentes en français canadien pourraient être placées dans ssortingngs.fr-CA.resx.

C’est assez simple, en fait. Créez un nouveau fichier de ressources, par exemple Ssortingngs.resx . Définissez le Access Modifier sur Public . Utilisez le modèle de fichier approprié pour que Visual Studio génère automatiquement une classe d’accesseur (dans ce cas, le nom sera Ssortingngs ). Ceci est votre langue par défaut.

Maintenant, lorsque vous souhaitez append, par exemple, une localisation allemande, ajoutez un fichier resx localisé. Ce sera typiquement Ssortingngs.de.resx dans ce cas. Si vous souhaitez append une localisation supplémentaire pour, par exemple, l’Ausortingche, vous allez également créer un Ssortingngs.de-AT.resx .

Maintenant, allez créer une chaîne – disons une chaîne avec le nom HelloWorld . Dans votre Ssortingngs.resx , ajoutez cette chaîne avec la valeur “Hello, world!”. Dans Ssortingngs.de.resx , ajoutez “Hallo, Welt!”. Et dans Ssortingngs.de-AT.resx , ajoutez “Servus, Welt!”. C’est tout.

Maintenant, vous avez cette classe de Ssortingngs générée et elle possède une propriété avec un getter HelloWorld . Obtenir cette propriété va charger “Servus, Welt!” lorsque vos parameters régionaux sont de-AT, “Hallo, Welt! lorsque votre environnement local est un autre paramètre de locale (y compris de-DE et de-CH), et” Hello, World! ” manquant dans la version localisée, le gestionnaire de ressources ira automatiquement dans la chaîne, de la plus spécialisée à la ressource invariante.

Vous pouvez utiliser la classe ResourceManager pour mieux contrôler le chargement exact des objects. La classe de Ssortingngs générée l’utilise également.

Bonne réponse de F.Mörk. Mais si vous souhaitez mettre à jour la traduction ou append de nouvelles langues une fois l’application publiée, vous êtes bloqué, car vous devez toujours le recomstackr pour générer le fichier resources.dll.

Voici une solution pour comstackr manuellement une DLL de ressource. Il utilise les outils resgen.exe et al.exe (installés avec le SDK).

Disons que vous avez un fichier de ressources Ssortingngs.fr.resx, vous pouvez comstackr une DLL de ressources avec le lot suivant:

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

Veillez à conserver l’espace de nommage d’origine dans les noms de fichiers (ici “WpfRibbonApplication1”)

En outre, la réponse de @Fredrik Mörk sur les chaînes de caractères permet d’append la localisation à un formulaire :

  • Définissez la propriété du formulaire "Localizable" sur true
  • Modifiez la propriété Language du formulaire dans la langue de votre choix (à partir d’une liste déroulante contenant tous les éléments)
  • Traduisez les commandes dans cette forme et déplacez-les si besoin est (écrasez ces longues phrases en français!)

Cet article MSDN sur la localisation de Windows Forms donne plus d’informations à ce sujet.

Un correctif et une élaboration de la réponse de @Fredrik Mörk .

  • Ajouter un fichier de ressources Ssortingngs.resx à votre projet (ou un nom de fichier différent)
  • Définissez le Access Modifier sur Public (dans l’onglet du fichier Ssortingngs.resx ouvert)
  • Ajoutez une chaîne de caractères dans le fichier resx: (exemple: nom Hello , valeur Hello )
  • Enregistrez le fichier de ressource

Visual Studio génère automatiquement une classe de Ssortingngs respective, qui est en fait placée dans Ssortingngs.Designer.cs . La classe se trouve dans le même espace de nom que vous attendez d’un fichier .cs nouvellement créé.

Ce code affiche toujours Hello , car il s’agit de la ressource par défaut et aucune ressource spécifique à la langue n’est disponible:

 Console.WriteLine(Ssortingngs.Hello); 

Ajoutez maintenant une nouvelle ressource spécifique à la langue:

  • Ajouter Ssortingngs.fr.resx (pour le français)
  • Ajouter une chaîne avec le même nom que précédemment, mais une valeur différente: (nom Hello , valeur Salut )

Le code suivant imprime Salut :

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

La ressource utilisée dépend de Thread.CurrentThread.CurrentUICulture . Il est défini en fonction du paramètre de langue de l’interface utilisateur Windows ou peut être défini manuellement, comme dans cet exemple. En savoir plus à ce sujet ici .

Vous pouvez append des ressources spécifiques à un pays, telles que Ssortingngs.fr-FR.resx ou Ssortingngs.fr-CA.resx .

La chaîne à utiliser est déterminée dans cet ordre de priorité:

  • De la ressource spécifique à un pays comme Ssortingngs.fr-CA.resx
  • À partir d’une ressource spécifique à une Ssortingngs.fr.resx comme Ssortingngs.fr.resx
  • De par défaut Ssortingngs.resx

Notez que les ressources spécifiques à la langue génèrent des assemblys satellites .

Découvrez également comment CurrentCulture diffère de CurrentUICulture ici .

En plus de @Eric Bole-Feysot, répondez:

Grâce aux assemblages de satellites, la localisation peut être créée à partir de fichiers .dll / .exe . Par ici:

  • le code source (projet VS) peut être séparé du projet de langue,
  • l’ajout d’une nouvelle langue ne nécessite pas de recomstackr le projet,
  • la traduction pourrait être faite même par l’utilisateur final.

Il existe un outil peu connu appelé LSACreator (gratuit pour une utilisation non commerciale ou option d’achat) qui vous permet de créer une localisation basée sur des fichiers .dll / .exe. En fait, en interne (dans le répertoire du projet de langage), il crée / gère des versions localisées de fichiers resx et comstack un assemblage de la même manière que @Eric Bole-Feysot décrit.

Dans mon cas

 [assembly: System.Resources.NeutralResourcesLanguage("ru-RU")] 

dans AssemblyInfo.cs, les choses ne fonctionnaient pas normalement.