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 ?
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 ?
strings.resx
.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.
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.
+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.
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 ?
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.
@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.
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 :
"Localizable"
a true
Language
de la langue souhaitée (à partir d'un joli menu déroulant qui les contient toutes)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)
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").
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
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.
0 votes
P.S. : assurez-vous d'avoir installé l'extension gratuite Microsoft MAT (Multilingual App Toolkit) pour visual studio ;-)
0 votes
stackoverflow.com/a/51300997/187650