Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Lorsque vous travaillez avec des ressources localisées dans des applications .NET, vous devez idéalement empaqueter les ressources pour la culture par défaut ou neutre avec l’assembly principal et créer un assembly satellite distinct pour chaque langue ou culture prise en charge par votre application. Vous pouvez ensuite utiliser la ResourceManager classe comme décrit dans la section suivante pour accéder aux ressources nommées. Si vous choisissez de ne pas incorporer vos ressources dans les assemblys principaux et les assemblys satellites, vous pouvez également accéder directement aux fichiers .resources binaires, comme indiqué dans la section Récupérer des ressources à partir de fichiers .resources plus loin dans cet article.
Récupération de ressources d’assemblys
La ResourceManager classe fournit l’accès aux ressources au moment de l’exécution. Vous utilisez la méthode ResourceManager.GetString pour récupérer des ressources de chaîne et les méthodes ResourceManager.GetObject ou ResourceManager.GetStream pour récupérer des ressources autres que des chaînes. Chaque méthode a deux surcharges :
Surcharge dont le paramètre unique est une chaîne qui contient le nom de la ressource. La méthode tente de récupérer cette ressource pour la culture actuelle. Pour plus d’informations, consultez les méthodes GetString(String), GetObject(String), et GetStream(String).
Surcharge qui a deux paramètres : une chaîne contenant le nom de la ressource et un CultureInfo objet qui représente la culture dont la ressource doit être récupérée. Si une ressource définie pour cette culture est introuvable, le Gestionnaire des ressources utilise des règles de secours pour récupérer une ressource appropriée. Pour plus d’informations, consultez les méthodes GetString(String, CultureInfo), GetObject(String, CultureInfo), et GetStream(String, CultureInfo).
Le gestionnaire de ressources utilise le processus de secours des ressources pour contrôler la façon dont l’application récupère des ressources propres à la culture. Pour plus d’informations, consultez la section « Processus de secours pour les ressources » dans Package et déploiement de ressources. Pour plus d’informations sur l’instanciation d’un ResourceManager objet, consultez la section « Instanciation d’un objet ResourceManager » dans la ResourceManager rubrique de classe.
Exemple de récupération de données de chaîne
L’exemple suivant appelle la méthode GetString(String) pour récupérer les ressources de chaîne de la culture d'interface utilisateur en cours. Il inclut une ressource de chaîne neutre pour la culture Anglais (États-Unis), et les ressources localisées pour les cultures Français (France) et Russe (Russie). La ressource anglaise (États-Unis) suivante se trouve dans un fichier nommé Strings.txt:
TimeHeader=The current time is
La ressource française (France) se trouve dans un fichier nommé Strings.fr-FR.txt:
TimeHeader=L'heure actuelle est
La ressource russe (Russie) se trouve dans un fichier nommé Strings.ru-RU.txt:
TimeHeader=Текущее время —
Le code source de cet exemple, qui se trouve dans un fichier nommé GetString.cs pour la version C# du code et GetString.vb pour la version Visual Basic, définit un tableau de chaînes qui contient le nom de quatre cultures : les trois cultures pour lesquelles les ressources sont disponibles et la culture espagnole (Espagne). Une boucle qui s'exécute cinq fois sélectionne aléatoirement l'une de ces cultures et l'affecte aux propriétés Thread.CurrentCulture et CultureInfo.CurrentUICulture. Il appelle ensuite la GetString(String) méthode pour récupérer la chaîne localisée, qu’elle affiche avec l’heure de la journée.
using System;
using System.Globalization;
using System.Resources;
using System.Threading;
[assembly: NeutralResourcesLanguageAttribute("en-US")]
public class Example
{
public static void Main()
{
string[] cultureNames = { "en-US", "fr-FR", "ru-RU", "es-ES" };
Random rnd = new Random();
ResourceManager rm = new ResourceManager("Strings",
typeof(Example).Assembly);
for (int ctr = 0; ctr <= cultureNames.Length; ctr++) {
string cultureName = cultureNames[rnd.Next(0, cultureNames.Length)];
CultureInfo culture = CultureInfo.CreateSpecificCulture(cultureName);
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
Console.WriteLine($"Current culture: {culture.NativeName}");
string timeString = rm.GetString("TimeHeader");
Console.WriteLine($"{timeString} {DateTime.Now:T}\n");
}
}
}
// The example displays output like the following:
// Current culture: English (United States)
// The current time is 9:34:18 AM
//
// Current culture: Español (España, alfabetización internacional)
// The current time is 9:34:18
//
// Current culture: русский (Россия)
// Текущее время — 9:34:18
//
// Current culture: français (France)
// L'heure actuelle est 09:34:18
//
// Current culture: русский (Россия)
// Текущее время — 9:34:18
Imports System.Globalization
Imports System.Resources
Imports System.Threading
<Assembly: NeutralResourcesLanguageAttribute("en-US")>
Module Example
Public Sub Main()
Dim cultureNames() As String = {"en-US", "fr-FR", "ru-RU", "es-ES"}
Dim rnd As New Random()
Dim rm As New ResourceManager("Strings", GetType(Example).Assembly)
For ctr As Integer = 0 To cultureNames.Length
Dim cultureName As String = cultureNames(rnd.Next(0, cultureNames.Length))
Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture(cultureName)
Thread.CurrentThread.CurrentCulture = culture
Thread.CurrentThread.CurrentUICulture = culture
Console.WriteLine("Current culture: {0}", culture.NativeName)
Dim timeString As String = rm.GetString("TimeHeader")
Console.WriteLine("{0} {1:T}", timeString, Date.Now)
Console.WriteLine()
Next
End Sub
End Module
' The example displays output similar to the following:
' Current culture: English (United States)
' The current time is 9:34:18 AM
'
' Current culture: Español (España, alfabetización internacional)
' The current time is 9:34:18
'
' Current culture: русский (Россия)
' Текущее время — 9:34:18
'
' Current culture: français (France)
' L'heure actuelle est 09:34:18
'
' Current culture: русский (Россия)
' Текущее время — 9:34:18
Le fichier batch (.bat) suivant compile l’exemple et génère des assemblages satellites dans les répertoires appropriés. Les commandes sont fournies pour le langage et le compilateur C#. Pour Visual Basic, passez csc
à vbc
, puis passez GetString.cs
à GetString.vb
.
resgen strings.txt
csc GetString.cs -resource:strings.resources
resgen strings.fr-FR.txt
md fr-FR
al -embed:strings.fr-FR.resources -culture:fr-FR -out:fr-FR\GetString.resources.dll
resgen strings.ru-RU.txt
md ru-RU
al -embed:strings.ru-RU.resources -culture:ru-RU -out:ru-RU\GetString.resources.dll
Lorsque la culture actuelle de l’interface utilisateur est espagnole (Espagne), notez que l’exemple affiche les ressources de langue anglaise, car les ressources de langue espagnole ne sont pas disponibles, et l’anglais est la culture par défaut de l’exemple.
Récupérer des exemples de données d’objet
Vous pouvez utiliser les méthodes GetObject et GetStream pour récupérer des données d'objet. Cela inclut les types de données primitifs, les objets sérialisables et les objets stockés au format binaire (tels que les images).
L’exemple suivant utilise la GetStream(String) méthode pour récupérer une bitmap utilisée dans la fenêtre de démarrage ouvrante d’une application. Le code source suivant dans un fichier nommé CreateResources.cs (pour C#) ou CreateResources.vb (pour Visual Basic) génère un fichier .resx qui contient l’image sérialisée. Dans ce cas, l’image est chargée à partir d’un fichier nommé SplashScreen.jpg; vous pouvez modifier le nom de fichier pour remplacer votre propre image.
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Resources;
public class Example
{
public static void Main()
{
Bitmap bmp = new Bitmap(@".\SplashScreen.jpg");
MemoryStream imageStream = new MemoryStream();
bmp.Save(imageStream, ImageFormat.Jpeg);
ResXResourceWriter writer = new ResXResourceWriter("AppResources.resx");
writer.AddResource("SplashScreen", imageStream);
writer.Generate();
writer.Close();
}
}
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.IO
Imports System.Resources
Module Example
Public Sub Main()
Dim bmp As New Bitmap(".\SplashScreen.jpg")
Dim imageStream As New MemoryStream()
bmp.Save(imageStream, ImageFormat.Jpeg)
Dim writer As New ResXResourceWriter("AppResources.resx")
writer.AddResource("SplashScreen", imageStream)
writer.Generate()
writer.Close()
End Sub
End Module
Le code suivant récupère la ressource et affiche l'image dans le contrôle PictureBox.
using System;
using System.Drawing;
using System.IO;
using System.Resources;
using System.Windows.Forms;
public class Example
{
public static void Main()
{
ResourceManager rm = new ResourceManager("AppResources", typeof(Example).Assembly);
Bitmap screen = (Bitmap) Image.FromStream(rm.GetStream("SplashScreen"));
Form frm = new Form();
frm.Size = new Size(300, 300);
PictureBox pic = new PictureBox();
pic.Bounds = frm.RestoreBounds;
pic.BorderStyle = BorderStyle.Fixed3D;
pic.Image = screen;
pic.SizeMode = PictureBoxSizeMode.StretchImage;
frm.Controls.Add(pic);
pic.Anchor = AnchorStyles.Top | AnchorStyles.Bottom |
AnchorStyles.Left | AnchorStyles.Right;
frm.ShowDialog();
}
}
Imports System.Drawing
Imports System.IO
Imports System.Resources
Imports System.Windows.Forms
Module Example
Public Sub Main()
Dim rm As New ResourceManager("AppResources", GetType(Example).Assembly)
Dim screen As Bitmap = CType(Image.FromStream(rm.GetStream("SplashScreen")), Bitmap)
Dim frm As New Form()
frm.Size = new Size(300, 300)
Dim pic As New PictureBox()
pic.Bounds = frm.RestoreBounds
pic.BorderStyle = BorderStyle.Fixed3D
pic.Image = screen
pic.SizeMode = PictureBoxSizeMode.StretchImage
frm.Controls.Add(pic)
pic.Anchor = AnchorStyles.Top Or AnchorStyles.Bottom Or
AnchorStyles.Left Or AnchorStyles.Right
frm.ShowDialog()
End Sub
End Module
Vous pouvez utiliser le fichier batch suivant pour générer l’exemple C#. Pour Visual Basic, changez csc
en vbc
, et changez l'extension du fichier de code source de .cs
à .vb
.
csc CreateResources.cs
CreateResources
resgen AppResources.resx
csc GetStream.cs -resource:AppResources.resources
L’exemple suivant utilise la ResourceManager.GetObject(String) méthode pour désérialiser un objet personnalisé. L’exemple inclut un fichier de code source nommé UIElements.cs (UIElements.vb pour Visual Basic) qui définit la structure suivante nommée PersonTable
. Cette structure est destinée à être utilisée par une routine d’affichage de table générale qui affiche les noms localisés des colonnes de table. Notez que la PersonTable
structure est marquée avec l’attribut SerializableAttribute .
using System;
[Serializable] public struct PersonTable
{
public readonly int nColumns;
public readonly string column1;
public readonly string column2;
public readonly string column3;
public readonly int width1;
public readonly int width2;
public readonly int width3;
public PersonTable(string column1, string column2, string column3,
int width1, int width2, int width3)
{
this.column1 = column1;
this.column2 = column2;
this.column3 = column3;
this.width1 = width1;
this.width2 = width2;
this.width3 = width3;
this.nColumns = typeof(PersonTable).GetFields().Length / 2;
}
}
<Serializable> Public Structure PersonTable
Public ReadOnly nColumns As Integer
Public Readonly column1 As String
Public ReadOnly column2 As String
Public ReadOnly column3 As String
Public ReadOnly width1 As Integer
Public ReadOnly width2 As Integer
Public ReadOnly width3 As Integer
Public Sub New(column1 As String, column2 As String, column3 As String,
width1 As Integer, width2 As Integer, width3 As Integer)
Me.column1 = column1
Me.column2 = column2
Me.column3 = column3
Me.width1 = width1
Me.width2 = width2
Me.width3 = width3
Me.nColumns = Me.GetType().GetFields().Count \ 2
End Sub
End Structure
Le code suivant d’un fichier nommé CreateResources.cs (CreateResources.vb pour Visual Basic) crée un fichier de ressources XML nommé UIResources.resx qui stocke un titre de table et un PersonTable
objet qui contient des informations pour une application localisée pour la langue anglaise.
using System;
using System.Resources;
public class CreateResource
{
public static void Main()
{
PersonTable table = new PersonTable("Name", "Employee Number",
"Age", 30, 18, 5);
ResXResourceWriter rr = new ResXResourceWriter(@".\UIResources.resx");
rr.AddResource("TableName", "Employees of Acme Corporation");
rr.AddResource("Employees", table);
rr.Generate();
rr.Close();
}
}
Imports System.Resources
Module CreateResource
Public Sub Main()
Dim table As New PersonTable("Name", "Employee Number", "Age", 30, 18, 5)
Dim rr As New ResXResourceWriter(".\UIResources.resx")
rr.AddResource("TableName", "Employees of Acme Corporation")
rr.AddResource("Employees", table)
rr.Generate()
rr.Close()
End Sub
End Module
Le code suivant dans un fichier de code source nommé GetObject.cs (GetObject.vb), récupère ensuite les ressources et les affiche dans la console.
using System;
using System.Resources;
[assembly: NeutralResourcesLanguageAttribute("en")]
public class Example
{
public static void Main()
{
string fmtString = String.Empty;
ResourceManager rm = new ResourceManager("UIResources", typeof(Example).Assembly);
string title = rm.GetString("TableName");
PersonTable tableInfo = (PersonTable) rm.GetObject("Employees");
if (! String.IsNullOrEmpty(title)) {
fmtString = "{0," + ((Console.WindowWidth + title.Length) / 2).ToString() + "}";
Console.WriteLine(fmtString, title);
Console.WriteLine();
}
for (int ctr = 1; ctr <= tableInfo.nColumns; ctr++) {
string columnName = "column" + ctr.ToString();
string widthName = "width" + ctr.ToString();
string value = tableInfo.GetType().GetField(columnName).GetValue(tableInfo).ToString();
int width = (int) tableInfo.GetType().GetField(widthName).GetValue(tableInfo);
fmtString = "{0,-" + width.ToString() + "}";
Console.Write(fmtString, value);
}
Console.WriteLine();
}
}
Imports System.Resources
<Assembly: NeutralResourcesLanguageAttribute("en")>
Module Example
Public Sub Main()
Dim fmtString As String = String.Empty
Dim rm As New ResourceManager("UIResources", GetType(Example).Assembly)
Dim title As String = rm.GetString("TableName")
Dim tableInfo As PersonTable = DirectCast(rm.GetObject("Employees"), PersonTable)
If Not String.IsNullOrEmpty(title) Then
fmtString = "{0," + ((Console.WindowWidth + title.Length) \ 2).ToString() + "}"
Console.WriteLine(fmtString, title)
Console.WriteLine()
End If
For ctr As Integer = 1 To tableInfo.nColumns
Dim columnName As String = "column" + ctr.ToString()
Dim widthName As String = "width" + ctr.ToString()
Dim value As String = CStr(tableInfo.GetType().GetField(columnName).GetValue(tableInfo))
Dim width As Integer = CInt(tableInfo.GetType().GetField(widthName).GetValue(tableInfo))
fmtString = "{0,-" + width.ToString() + "}"
Console.Write(fmtString, value)
Next
Console.WriteLine()
End Sub
End Module
Vous pouvez générer le fichier de ressources et les assemblys nécessaires et exécuter l’application en exécutant le fichier batch suivant. Vous devez utiliser l’option /r
permettant de fournir Resgen.exe avec une référence à UIElements.dll afin qu’elle puisse accéder aux informations sur la PersonTable
structure. Si vous utilisez C#, remplacez le nom vbc
du csc
compilateur par , puis remplacez l’extension .vb
par .cs
.
vbc -t:library UIElements.vb
vbc CreateResources.vb -r:UIElements.dll
CreateResources
resgen UIResources.resx -r:UIElements.dll
vbc GetObject.vb -r:UIElements.dll -resource:UIResources.resources
GetObject.exe
Prise en charge de contrôle de version pour les assemblys satellites
Par défaut, lorsque l’objet ResourceManager récupère les ressources demandées, il recherche les assemblys satellites qui ont des numéros de version qui correspondent au numéro de version de l’assembly principal. Après avoir déployé une application, vous pouvez avoir besoin de mettre à jour l’assembly principal ou des assemblys satellites de ressources spécifiques. Le .NET Framework prend en charge le contrôle de version des assemblys principaux et des assemblys satellites.
L’attribut SatelliteContractVersionAttribute fournit la prise en charge du contrôle de version pour un assembly principal. La spécification de cet attribut sur l’assembly principal d’une application vous permet de mettre à jour et de redéployer un assembly principal sans mettre à jour ses assemblys satellites. Après avoir mis à jour l’assembly principal, incrémentez le numéro de version de l’assembly principal, mais laissez le numéro de version du contrat satellite inchangé. Lorsque le gestionnaire de ressources récupère les ressources demandées, il charge la version d’assembly satellite spécifiée par cet attribut.
Les assemblys de stratégie de serveur de publication prennent en charge le contrôle de version pour les assemblys satellites. Vous pouvez mettre à jour et redéployer un assembly satellite sans mettre à jour l’assembly principal. Après la mise à jour d’un assembly satellite, incrémentez son numéro de version et distribuez-le avec un assembly de stratégie de serveur de publication. Dans l’assembly de stratégie de serveur de publication, spécifiez que votre nouvel assembly satellite offre une compatibilité descendante avec sa version précédente. Le gestionnaire de ressources utilise l’attribut SatelliteContractVersionAttribute pour déterminer la version de l’assembly satellite, mais le chargeur d’assembly est lié à la version d’assembly satellite spécifiée par la stratégie d’éditeur. Pour plus d'informations sur les assemblages de stratégie d'éditeur, reportez-vous à Créer un fichier de stratégie d'éditeur.
Pour garantir une prise en charge totale du contrôle de version des assemblys, nous vous recommandons de déployer les assemblys avec nom fort dans le GAC et de déployer les assemblys sans nom fort dans le répertoire de l’application. Si vous souhaitez déployer des assemblys avec nom fort dans le répertoire d’application, vous ne pourrez pas incrémenter le numéro de version d’un assembly satellite lorsque vous mettez à jour l’assembly. Au lieu de cela, vous devez effectuer une mise à jour sur place où vous remplacez le code existant par le code mis à jour et conservez le même numéro de version. Par exemple, si vous souhaitez mettre à jour la version 1.0.0.0 d’un assembly satellite avec le nom d’assembly entièrement spécifié « myApp.resources, Version=1.0.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a », remplacez-le par le myApp.resources.dll mis à jour qui a été compilé avec le même nom d’assembly entièrement spécifié « myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a ». Notez que l'utilisation de mises à jour directes sur des fichiers d'assemblage satellite complique pour une application la capacité de déterminer avec précision la version d'un assemblage satellite.
Pour plus d’informations sur le contrôle de version d’assembly, consultez Le contrôle de version d’assembly et la façon dont le runtime localise les assemblys.
Récupérer des ressources à partir de fichiers .resources
Si vous choisissez de ne pas déployer de ressources dans des assemblys satellites, vous pouvez toujours utiliser un ResourceManager objet pour accéder directement aux ressources à partir de fichiers .resources. Pour ce faire, vous devez déployer correctement les fichiers .resources. Ensuite, vous utilisez la ResourceManager.CreateFileBasedResourceManager méthode pour instancier un ResourceManager objet et spécifier le répertoire qui contient les fichiers .resources autonomes.
Déployer des fichiers .resources
Lorsque vous incorporez des fichiers .resources dans un assembly d’application et des assemblys satellites, chaque assembly satellite a le même nom de fichier, mais est placé dans un sous-répertoire qui reflète la culture de l’assembly satellite. En revanche, lorsque vous accédez directement aux ressources à partir de fichiers .resources, vous pouvez placer tous les fichiers .resources dans un seul répertoire, généralement un sous-répertoire du répertoire d’application. Le nom du fichier .resources par défaut de l’application se compose d’un nom racine uniquement, sans indication de sa culture (par exemple, strings.resources). Les ressources de chaque culture localisée sont stockées dans un fichier dont le nom se compose du nom racine suivi de la culture (par exemple, strings.ja.resources ou chaînes.de-DE.resources).
L’illustration suivante montre où se trouvent les fichiers de ressources dans la structure de répertoires. Il fournit également les conventions d’affectation de noms pour les fichiers .resource.
Utiliser le gestionnaire de ressources
Une fois que vous avez créé vos ressources et les avez placées dans le répertoire approprié, vous créez un ResourceManager objet pour utiliser les ressources en appelant la CreateFileBasedResourceManager(String, String, Type) méthode. Le premier paramètre spécifie le nom racine du fichier .resources par défaut de l’application (il s’agit de « chaînes » pour l’exemple de la section précédente). Le deuxième paramètre spécifie l’emplacement des ressources (« Ressources » pour l’exemple précédent). Le troisième paramètre spécifie l’implémentation ResourceSet à utiliser. Si le troisième paramètre est null
, le runtime ResourceSet par défaut est utilisé.
Remarque
Ne déployez pas ASP.NET applications à l’aide de fichiers .resources autonomes. Cela peut entraîner des problèmes de verrouillage et rompre le déploiement XCOPY. Nous vous recommandons de déployer des ressources ASP.NET dans des assemblys satellites. Pour plus d’informations, consultez ASP.NET Vue d’ensemble des ressources de page web.
Après avoir instancié l’objet ResourceManager, vous utilisez les méthodes GetString, GetObject et GetStream décrites précédemment pour récupérer les ressources. Toutefois, la récupération des ressources directement à partir de fichiers .resources diffère de la récupération des ressources incorporées à partir d’assemblys. Lorsque vous extrayez des ressources à partir de fichiers .resources, les méthodes GetString(String), GetObject(String) et GetStream(String) récupèrent toujours les ressources de la culture par défaut, quelle que soit la culture actuelle. Pour récupérer les ressources de la culture actuelle de l’application ou d’une culture spécifique, vous devez appeler la méthode GetString(String, CultureInfo), GetObject(String, CultureInfo) ou GetStream(String, CultureInfo) et spécifier la culture dont les ressources doivent être récupérées. Pour récupérer les ressources de la culture actuelle, spécifiez la valeur de la propriété CultureInfo.CurrentCulture comme argument culture
. Si le gestionnaire de ressources ne peut pas récupérer les ressources de culture
, il utilise les règles de secours de ressource standard pour récupérer les ressources appropriées.
Exemple
L’exemple suivant montre comment le gestionnaire de ressources récupère les ressources directement à partir de fichiers .resources. L’exemple se compose de trois fichiers de ressources textuels pour les cultures anglais (États-Unis), français (France) et russe (Russie). L’anglais (États-Unis) est la culture par défaut de l’exemple. Ses ressources sont stockées dans le fichier suivant nommé Strings.txt:
Greeting=Hello
Prompt=What is your name?
Les ressources de la culture française (France) sont stockées dans le fichier suivant, nommé Strings.fr-FR.txt:
Greeting=Bon jour
Prompt=Comment vous appelez-vous?
Les ressources de la culture russe (Russie) sont stockées dans le fichier suivant, nommé Strings.ru-RU.txt:
Greeting=Здравствуйте
Prompt=Как вас зовут?
Voici le code source de l’exemple. L'exemple instancie des CultureInfo objets pour les cultures anglaise (États-Unis), anglaise (Canada), française (France), et russe (Russie), et définit chacune comme culture actuelle. La ResourceManager.GetString(String, CultureInfo) méthode fournit ensuite la valeur de la CultureInfo.CurrentCulture propriété en tant qu’argument culture
pour récupérer les ressources propres à la culture appropriées.
using System;
using System.Globalization;
using System.Resources;
using System.Threading;
[assembly: NeutralResourcesLanguage("en-US")]
public class Example
{
public static void Main()
{
string[] cultureNames = { "en-US", "en-CA", "ru-RU", "fr-FR" };
ResourceManager rm = ResourceManager.CreateFileBasedResourceManager("Strings", "Resources", null);
foreach (var cultureName in cultureNames) {
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureName);
string greeting = rm.GetString("Greeting", CultureInfo.CurrentCulture);
Console.WriteLine($"\n{greeting}!");
Console.Write(rm.GetString("Prompt", CultureInfo.CurrentCulture));
string name = Console.ReadLine();
if (! String.IsNullOrEmpty(name))
Console.WriteLine("{0}, {1}!", greeting, name);
}
Console.WriteLine();
}
}
// The example displays output like the following:
// Hello!
// What is your name? Dakota
// Hello, Dakota!
//
// Hello!
// What is your name? Koani
// Hello, Koani!
//
// Здравствуйте!
// Как вас зовут?Samuel
// Здравствуйте, Samuel!
//
// Bon jour!
// Comment vous appelez-vous?Yiska
// Bon jour, Yiska!
Imports System.Globalization
Imports System.Resources
Imports System.Threading
<Assembly: NeutralResourcesLanguageAttribute("en-US")>
Module Example
Public Sub Main()
Dim cultureNames() As String = {"en-US", "en-CA", "ru-RU", "fr-FR"}
Dim rm As ResourceManager = ResourceManager.CreateFileBasedResourceManager("Strings", "Resources", Nothing)
For Each cultureName In cultureNames
Console.WriteLine()
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureName)
Dim greeting As String = rm.GetString("Greeting", CultureInfo.CurrentCulture)
Console.WriteLine("{0}!", greeting)
Console.Write(rm.GetString("Prompt", CultureInfo.CurrentCulture))
Dim name As String = Console.ReadLine()
If Not String.IsNullOrEmpty(name) Then
Console.WriteLine("{0}, {1}!", greeting, name)
End If
Next
Console.WriteLine()
End Sub
End Module
' The example displays output like the following:
' Hello!
' What is your name? Dakota
' Hello, Dakota!
'
' Hello!
' What is your name? Koani
' Hello, Koani!
'
' Здравствуйте!
' Как вас зовут?Samuel
' Здравствуйте, Samuel!
'
' Bon jour!
' Comment vous appelez-vous?Yiska
' Bon jour, Yiska!
Vous pouvez compiler la version C# de l’exemple en exécutant le fichier batch suivant. Si vous utilisez Visual Basic, remplacez csc
vbc
par , puis remplacez l’extension .cs
par .vb
.
md Resources
resgen Strings.txt Resources\Strings.resources
resgen Strings.fr-FR.txt Resources\Strings.fr-FR.resources
resgen Strings.ru-RU.txt Resources\Strings.ru-RU.resources
csc Example.cs