Je n'arrive pas à faire fonctionner la localisation.
J'ai une bibliothèque de classe. Maintenant, je veux créer des fichiers resx là-dedans et retourner des valeurs basées sur la culture du thread.
Comment puis je faire ça?
Je n'arrive pas à faire fonctionner la localisation.
J'ai une bibliothèque de classe. Maintenant, je veux créer des fichiers resx là-dedans et retourner des valeurs basées sur la culture du thread.
Comment puis je faire ça?
Réponses:
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 Les éléments Visual C # choisissent "Fichier de ressources" et le nomment
strings.resx
.System.Threading
etSystem.Globalization
Exécutez ce code:
Il devrait afficher "Bonjour".
Maintenant, ajoutez un nouveau fichier de ressources, nommé "strings.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 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:
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 reviendra alors à la recherche de" fr ", qu'il trouve (et utilise).
Le code suivant affichera "Bonjour":
C'est parce qu'il ne trouve aucune ressource "en-US", et également aucune ressource "en", donc il reviendra à la valeur par défaut, qui est celle que nous avons ajoutée depuis le début.
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 qui diffèrent de la ressource à laquelle il se replierait. Donc, si un texte est le même en France et au Canada, vous pouvez le mettre dans strings.fr.resx, tandis que des chaînes qui sont différentes en français canadien pourraient aller dans strings.fr-CA.resx.
la source
Access Modifier
doit être définiPublic
pour la classe de ressources à générer. La classe n'est pas nécessairement dans l'espace de noms Properties, c'est là que vous placez le fichier .resx.C'est assez simple, en fait. Créez un nouveau fichier de ressources, par exemple
Strings.resx
. RéglezAccess Modifier
surPublic
. Utilisez le modèle de fichier approprié, afin que Visual Studio génère automatiquement une classe d'accesseur (le nom seraStrings
, dans ce cas). Ceci est votre langue par défaut.Maintenant, lorsque vous voulez ajouter, disons, la localisation allemande, ajoutez un fichier resx localisé. Ce sera généralement
Strings.de.resx
dans ce cas. Si vous souhaitez ajouter une localisation supplémentaire pour, disons, l'Autriche, vous devez également créer un fichierStrings.de-AT.resx
.Maintenant, allez créer une chaîne - disons une chaîne avec le nom
HelloWorld
. Dans votreStrings.resx
, ajoutez cette chaîne avec la valeur "Hello, world!". DansStrings.de.resx
, ajoutez "Bonjour, Welt!". Et dansStrings.de-AT.resx
, ajoutez "Servus, Welt!". C'est tout pour l'instant.Vous avez maintenant cette
Strings
classe générée , et elle a une propriété avec un getterHelloWorld
. Obtenir cette propriété chargera "Servus, Welt!" lorsque votre locale est de-AT, "Bonjour, Welt! lorsque votre locale est toute autre de locale (y compris de-DE et de-CH), et" Bonjour, monde! "lorsque votre locale est autre chose. Si une chaîne est manquant 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 la
ResourceManager
classe pour plus de contrôle sur la façon exacte dont vous chargez les choses. LaStrings
classe générée l' utilise également.la source
En plus de l'excellente réponse de @Fredrik Mörk sur les chaînes, pour ajouter la localisation à un formulaire, procédez comme suit:
"Localizable"
surtrue
Language
propriété du formulaire dans la langue de votre choix (à partir d'une liste déroulante sympa avec tous)Modifier: cet article MSDN sur la localisation des formulaires Windows n'est pas l'original que j'ai lié ... mais pourrait apporter plus de lumière si nécessaire. (l'ancien a été enlevé)
la source
Excellente réponse de F.Mörk. Mais si vous souhaitez mettre à jour la traduction ou ajouter de nouvelles langues une fois l'application publiée, vous êtes bloqué, car vous devez toujours le recompiler pour générer le resources.dll.
Voici une solution pour compiler manuellement une DLL de ressource. Il utilise les outils resgen.exe et al.exe (installés avec le sdk).
Supposons que vous ayez un fichier de ressources Strings.fr.resx, vous pouvez compiler une DLL de ressources avec le lot suivant:
Assurez-vous de conserver l'espace de noms d'origine dans les noms de fichiers (ici "WpfRibbonApplication1")
la source
Correction et élaboration de la réponse de @Fredrik Mörk .
strings.resx
fichier de ressources à votre projet (ou un nom de fichier différent)Access Modifier
surPublic
(dans l'strings.resx
onglet fichier ouvert )Hello
, valeurHello
)Visual Studio génère automatiquement une
strings
classe respective , qui est réellement placée dansstrings.Designer.cs
. La classe se trouve dans le même espace de noms que celui auquel vous vous attendez à ce qu'un nouveau.cs
fichier soit placé.Ce code s'imprime toujours
Hello
, car il s'agit de la ressource par défaut et aucune ressource spécifique à la langue n'est disponible:Ajoutez maintenant une nouvelle ressource spécifique à la langue:
strings.fr.resx
(pour le français)Hello
, valeurSalut
)Le code suivant s'imprime
Salut
: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. Apprenez-en plus ici .Vous pouvez ajouter des ressources spécifiques au pays comme
strings.fr-FR.resx
oustrings.fr-CA.resx
.La chaîne à utiliser est déterminée dans cet ordre de priorité:
strings.fr-CA.resx
strings.fr.resx
strings.resx
Notez que les ressources spécifiques au langage génèrent des assemblys satellites .
Découvrez également comment
CurrentCulture
diffère d'CurrentUICulture
ici .la source
Dans mon cas
dans AssemblyInfo.cs a empêché les choses de fonctionner comme d'habitude.
la source
En plus de la réponse @Eric Bole-Feysot :
Grâce aux assemblys satellites, la localisation peut être créée à partir des fichiers .dll / .exe . Par ici:
Il existe un outil peu connu appelé LSACreator (gratuit pour une utilisation non commerciale ou une 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 compile un assemblage de la même manière que @Eric Bole-Feysot décrit.
la source
ResourceManager et .resx sont un peu désordonnés.
Vous pouvez utiliser Lexical.Localization ¹ qui permet d'incorporer des valeurs par défaut et des valeurs spécifiques à la culture dans le code, et d'être étendu dans des fichiers de localisation externes pour d'autres cultures (comme .json ou .resx).
¹ (je suis le mainteneur de cette bibliothèque)
la source
En général, vous mettez vos traductions dans des fichiers de ressources, par exemple resources.resx.
Chaque culture spécifique a un nom différent, par exemple resources.nl.resx, resources.fr.resx, resources.de.resx,…
Maintenant, la partie la plus importante d'une solution est de maintenir vos traductions. Dans Visual Studio, installez l'outil Microsoft MAT: Multilingual App Toolkit (MAT). Fonctionne avec winforms, wpf, asp.net (core), uwp,…
En général, par exemple pour une solution WPF, dans le projet WPF
[assembly: System.Resources.NeutralResourcesLanguage("en")]
Ce que vous verrez, c'est qu'un nouveau dossier sera créé, appelé "MultilingualResources" contenant un
....nl.xlf
fichier.La seule chose que vous devez faire maintenant est:
(les fichiers .xlf devraient s'ouvrir avec "l'éditeur multilingue", si ce n'est pas le cas, faites un clic droit sur le fichier .xlf, sélectionnez "Ouvrir avec…" et sélectionnez "éditeur multilingue".
S'amuser! maintenant, vous pouvez également voir ce qui n'a pas été traduit, exporter les traductions dans xlf vers des sociétés de traduction externes, les réimporter, recycler les traductions d'autres projets, etc.
Plus d'informations:
la source