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?
ssortingngs.resx
. 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 :
"Localizable"
sur true
Language
du formulaire dans la langue de votre choix (à partir d’une liste déroulante contenant tous les éléments) 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 .
Ssortingngs.resx
à votre projet (ou un nom de fichier différent) Access Modifier
sur Public
(dans l’onglet du fichier Ssortingngs.resx
ouvert) Hello
, valeur Hello
) 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:
Ssortingngs.fr.resx
(pour le français) 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é:
Ssortingngs.fr-CA.resx
Ssortingngs.fr.resx
comme Ssortingngs.fr.resx
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:
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.