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:
strings.resx
.System.Threading
etSystem.Globalization
Exécutez ce code:
Console.WriteLine(Properties.strings.Hello);
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:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(Properties.strings.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 reviendra alors à la recherche de" fr ", qu'il trouve (et utilise).
Le code suivant affichera "Bonjour":
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
Console.WriteLine(Properties.strings.Hello);
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.
Access Modifier
doit être défini Public
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églez Access Modifier
sur Public
. Utilisez le modèle de fichier approprié, afin que Visual Studio génère automatiquement une classe d'accesseur (le nom sera Strings
, 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 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 "Bonjour, Welt!". Et dans Strings.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 getter HelloWorld
. 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. La Strings
classe générée l' utilise également.
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é)
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:
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
Assurez-vous de conserver l'espace de noms d'origine dans les noms de fichiers (ici "WpfRibbonApplication1")
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
sur Public
(dans l' strings.resx
onglet fichier ouvert )Hello
, valeur Hello
)Visual Studio génère automatiquement une strings
classe respective , qui est réellement placée dans strings.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:
Console.WriteLine(strings.Hello);
Ajoutez maintenant une nouvelle ressource spécifique à la langue:
strings.fr.resx
(pour le français)Hello
, valeur Salut
)Le code suivant s'imprime Salut
:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(strings.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. Apprenez-en plus ici .
Vous pouvez ajouter des ressources spécifiques au pays comme strings.fr-FR.resx
ou strings.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 .
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.
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).
public class MyClass
{
/// <summary>
/// Localization root for this class.
/// </summary>
static ILine localization = LineRoot.Global.Type<MyClass>();
/// <summary>
/// Localization key "Ok" with a default string, and couple of inlined strings for two cultures.
/// </summary>
static ILine ok = localization.Key("Success")
.Text("Success")
.fi("Onnistui")
.sv("Det funkar");
/// <summary>
/// Localization key "Error" with a default string, and couple of inlined ones for two cultures.
/// </summary>
static ILine error = localization.Key("Error")
.Format("Error (Code=0x{0:X8})")
.fi("Virhe (Koodi=0x{0:X8})")
.sv("Sönder (Kod=0x{0:X8})");
public void DoOk()
{
Console.WriteLine( ok );
}
public void DoError()
{
Console.WriteLine( error.Value(0x100) );
}
}
¹ (je suis le mainteneur de cette bibliothèque)
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: