Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Quando você trabalha com recursos localizados em aplicativos .NET, o ideal é empacotar os recursos para a cultura padrão ou neutra com o assembly principal e criar um assembly satélite separado para cada idioma ou cultura compatível com seu aplicativo. Em seguida, você pode usar a ResourceManager classe conforme descrito na próxima seção para acessar recursos nomeados. Se optar por não inserir os recursos no assembly principal e nos assemblies satélites, você também pode acessar os arquivos binários .resources diretamente, conforme discutido na seção Recuperar recursos de arquivos .resources, mais adiante neste artigo.
Recuperar recursos de assemblies
A ResourceManager classe fornece acesso aos recursos em runtime. Você usa o ResourceManager.GetString método para recuperar recursos de cadeia de caracteres e o ResourceManager.GetObject método ou ResourceManager.GetStream para recuperar recursos que não são de cadeia de caracteres. Cada método tem duas sobrecargas:
Uma sobrecarga cujo único parâmetro é uma cadeia de caracteres que contém o nome do recurso. O método tenta recuperar esse recurso para a cultura atual. Para obter mais informações, consulte os métodos GetString(String), GetObject(String) e GetStream(String).
Uma sobrecarga que tem dois parâmetros: uma cadeia de caracteres que contém o nome do recurso e um CultureInfo objeto que representa a cultura cujo recurso deve ser recuperado. Se um conjunto de recursos dessa cultura não puder ser encontrado, o gerenciador de recursos usará regras de fallback para recuperar um recurso apropriado. Para obter mais informações, consulte os métodos GetString(String, CultureInfo), GetObject(String, CultureInfo) e GetStream(String, CultureInfo).
O gerenciador de recursos usa o processo de fallback de recurso para controlar como o aplicativo recupera os recursos específicos de cultura. Para obter mais informações, confira a seção "Processo de Fallback de Recurso" em Empacotar e implantar recursos. Para obter informações sobre a instanciação de um ResourceManager objeto, consulte a seção "Instanciando um objeto ResourceManager" no tópico de ResourceManager classe.
Recuperar exemplo de dados de cadeia de caracteres
O exemplo a seguir chama o método GetString(String) para recuperar os recursos de cadeia de caracteres da cultura da interface do usuário atual. Ele inclui um recurso de cadeia de caracteres neutro para a cultura do inglês (Estados Unidos) e recursos localizados para as culturas de francês (França) e russo (Rússia). O seguinte recurso em inglês (Estados Unidos) está em um arquivo chamado Strings.txt:
TimeHeader=The current time is
O recurso francês (França) está em um arquivo chamado Strings.fr-FR.txt:
TimeHeader=L'heure actuelle est
O recurso russo (Rússia) está em um arquivo chamado Strings.ru-RU.txt:
TimeHeader=Текущее время —
O código-fonte deste exemplo, que está em um arquivo chamado GetString.cs para a versão C# do código e GetString.vb para a versão do Visual Basic, define uma matriz de cadeia de caracteres que contém o nome de quatro culturas: as três culturas para as quais os recursos estão disponíveis e a cultura espanhola (Espanha). Um loop que é executado cinco vezes seleciona aleatoriamente uma dessas culturas e a atribui às propriedades Thread.CurrentCulture e CultureInfo.CurrentUICulture. Em seguida, ele chama o método GetString(String) para recuperar a string localizada, que é exibida junto com a hora do dia.
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
O arquivo de lote (.bat) seguinte compila o exemplo e gera assemblies satélite nos diretórios apropriados. Os comandos são fornecidos para o compilador e a linguagem C#. Para o Visual Basic, altere csc para vbc, e altere GetString.cs para 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
Quando a cultura atual da interface do usuário for espanhol (Espanha), observe que o exemplo exibe recursos de idioma inglês, pois os recursos de idioma espanhol não estão disponíveis e o inglês é a cultura padrão do exemplo.
Recuperar exemplos de dados de objeto
Você pode usar os métodos GetObject e GetStream para recuperar dados de objeto. Isso inclui tipos de dados primitivos, objetos serializáveis e objetos armazenados em formato binário (como imagens).
O exemplo a seguir usa o GetStream(String) método para recuperar um bitmap usado na janela inicial de inicialização de um aplicativo. O código-fonte a seguir em um arquivo chamado CreateResources.cs (para C#) ou CreateResources.vb (para Visual Basic) gera um arquivo .resx que contém a imagem serializada. Nesse caso, a imagem é carregada de um arquivo chamado SplashScreen.jpg; você pode modificar o nome do arquivo para substituir sua própria imagem.
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
O código a seguir recupera o recurso e exibe a imagem em um PictureBox controle.
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
Você pode usar o arquivo em lote a seguir para criar o exemplo de C#. Para o Visual Basic, altere csc para vbc, e altere a extensão do arquivo de código-fonte de .cs para .vb.
csc CreateResources.cs
CreateResources
resgen AppResources.resx
csc GetStream.cs -resource:AppResources.resources
O exemplo a seguir usa o ResourceManager.GetObject(String) método para desserializar um objeto personalizado. O exemplo inclui um arquivo de código-fonte chamado UIElements.cs (UIElements.vb para Visual Basic) que define a seguinte estrutura chamada PersonTable. Essa estrutura destina-se a ser usada por uma rotina geral de exibição de tabela que exibe os nomes localizados das colunas da tabela. Observe que a PersonTable estrutura está marcada com o SerializableAttribute atributo.
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
O código a seguir de um arquivo chamado CreateResources.cs (CreateResources.vb para Visual Basic) cria um arquivo de recurso XML chamado UIResources.resx que armazena um título de tabela e um PersonTable objeto que contém informações para um aplicativo localizado para o idioma inglês.
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
O código a seguir em um arquivo de código-fonte chamado GetObject.cs (GetObject.vb) recupera os recursos e os exibe no 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
Você pode criar o arquivo de recurso e os assemblies necessários e executar o aplicativo executando o arquivo em lote a seguir. Você deve usar a opção /r para fornecer Resgen.exe com uma referência a UIElements.dll para que ele possa acessar informações sobre a PersonTable estrutura. Se você estiver usando C#, substitua o nome do compilador vbc por csc, e substitua a extensão .vb por .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
Suporte ao controle de versão dos assemblies satélites
Por padrão, quando o objeto ResourceManager recupera os recursos solicitados, ele procura por assemblies satélite que tenham números de versão que correspondam ao número de versão do assembly principal. Depois de ter implantado um aplicativo, convém atualizar o assembly principal ou assemblies de satélite de recursos específicos. O .NET Framework fornece suporte para controle de versão do assembly principal e dos assemblies satélites.
O SatelliteContractVersionAttribute atributo fornece suporte de controle de versão para um assembly principal. Especificar esse atributo no assembly principal de um aplicativo permite que você atualize e reimplante um assembly principal sem atualizar seus assemblies satélites. Depois de atualizar o assembly principal, incremente o número de versão do assembly principal mas deixe o número de versão do contrato do satélite inalterado. Quando o gerenciador de recursos recupera os recursos solicitados, ele carrega a versão do assembly satélite especificada por esse atributo.
Os assemblies de política do publicador oferecem suporte para controle de versão de assemblies satélites. Você pode atualizar e reimplantar um assembly satélite sem atualizar o assembly principal. Depois de atualizar um assembly satélite, aumente o número da versão e envie-o com um assembly de política do publicador. No assembly de política do publicador, especifique que seu novo assembly satélite é compatível com a versão anterior. O gerenciador de recursos usará o atributo SatelliteContractVersionAttribute para determinar a versão do assembly satélite, mas o carregador de assembly será associado à versão do assembly satélite especificada pela política do publicador. Para obter mais informações sobre assemblies de política do editor, consulte Criar um arquivo de política do publicador.
Para habilitar o suporte de controle de versão completo do assembly, é recomendável você implantar assemblies de nome forte no cache de assembly global e implantar assemblies que não tenham nomes fortes no diretório do aplicativo. Se você desejar implantar assemblies de nome forte no diretório do aplicativo, você não poderá incrementar o número da versão de um assembly satélite quando você atualiza o assembly. Em vez disso, você deve realizar uma atualização no local em que substitua o código existente pelo código atualizado e mantenha o mesmo número de versão. Por exemplo, se você quiser atualizar a versão 1.0.0.0 de uma montagem satélite com o nome da montagem totalmente especificado "myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a", substitua-a pela montagem myApp.resources.dll atualizada, que foi compilada com o mesmo nome de montagem totalmente especificado "myApp.resources, Version=1.0.0.0, Culture=de, PublicKeyToken=b03f5f11d50a3a". Observe que usar atualizações locais nos arquivos de assembly satélite torna difícil para um aplicativo determinar com precisão a versão de um assembly satélite.
Para obter mais informações sobre o controle de versão do assembly, consulte o controle de versão do Assembly e como o Runtime localiza assemblies.
Recuperar recursos dos arquivos .resources
Se você optar por não implantar recursos em assemblies satélites, ainda poderá usar um objeto ResourceManager para acessar recursos de arquivos .resources diretamente. Para fazer isso, você deve implantar os arquivos .resources corretamente. Em seguida, use o método ResourceManager.CreateFileBasedResourceManager para criar uma instância de um objeto ResourceManager e especificar o diretório que contém os arquivos .resources independentes.
Implantar arquivos .resources
Quando você incorporar arquivos .resources em um assembly de aplicativo e assemblies satélites, cada assembly satélite possui o mesmo nome de arquivo, mas é colocado em um subdiretório que reflete a cultura do assembly satélite. Por outro lado, quando você acessa recursos de arquivos .resources diretamente, pode colocar todos os arquivos .resources em um único diretório, geralmente um subdiretório do diretório do aplicativo. O nome do arquivo .resources padrão do aplicativo consiste apenas em um nome raiz, sem nenhuma indicação de sua cultura (por exemplo, strings.resources). Os recursos para cada cultura localizada são armazenados em um arquivo cujo nome consiste no nome raiz seguido pela cultura (por exemplo, strings.ja.resources ou strings.de-DE.resources).
A ilustração a seguir mostra onde os arquivos de recurso devem estar localizados na estrutura do diretório. Ele também fornece as convenções de nomenclatura para arquivos .resource.
Usar o gerenciador de recursos
Depois de criar seus recursos e colocá-los no diretório apropriado, você cria um ResourceManager objeto para usar os recursos chamando o CreateFileBasedResourceManager(String, String, Type) método. O primeiro parâmetro especifica o nome raiz do arquivo .resources padrão do aplicativo (isso seria "cadeias de caracteres" para o exemplo na seção anterior). O segundo parâmetro especifica o local dos recursos ("Recursos" para o exemplo anterior). O terceiro parâmetro especifica a ResourceSet implementação a ser usada. Se o terceiro parâmetro for null, o runtime ResourceSet padrão será usado.
Observação
Não implante aplicativos ASP.NET usando arquivos .resources autônomos. Isso pode causar problemas de bloqueio e interromper a implantação do XCOPY. Recomendamos que você implante recursos ASP.NET em assemblies satélites. Para obter mais informações, consulte ASP.NET Visão geral dos recursos da página da Web.
Depois de instanciar o objeto ResourceManager, use os métodos GetString, GetObject e GetStream, conforme discutido anteriormente, para recuperar os recursos. No entanto, a recuperação de recursos diretamente de arquivos .resources é diferente da recuperação de recursos incorporados em assemblies. Quando você recupera recursos de arquivos .resources, os métodos GetString(String), GetObject(String) e GetStream(String) sempre recuperam os recursos da cultura padrão, independentemente da cultura atual. Para recuperar os recursos da cultura atual do aplicativo ou de uma cultura específica, você deve chamar o GetString(String, CultureInfo), GetObject(String, CultureInfo) ou GetStream(String, CultureInfo) e especificar a cultura cujos recursos devem ser recuperados. Para recuperar os recursos da cultura atual, especifique o valor da propriedade CultureInfo.CurrentCulture como o argumento culture. Se o gerenciador de recursos não puder recuperar os recursos de culture, ele usará as regras padrão de substituição de recursos para recuperar os recursos apropriados.
Um exemplo
O exemplo a seguir ilustra como o gerenciador de recursos recupera recursos diretamente de arquivos .resources. O exemplo consiste em três arquivos de recursos baseados em texto para as culturas em inglês (Estados Unidos), francês (França) e russo (Rússia). Inglês (Estados Unidos) é a cultura padrão do exemplo. Seus recursos são armazenados no seguinte arquivo chamado Strings.txt:
Greeting=Hello
Prompt=What is your name?
Os recursos para a cultura francesa (França) são armazenados no arquivo a seguir, que é denominado Strings.fr-FR.txt:
Greeting=Bon jour
Prompt=Comment vous appelez-vous?
Os recursos para a cultura russa (Rússia) são armazenados no arquivo a seguir, que é denominado Strings.ru-RU.txt:
Greeting=Здравствуйте
Prompt=Как вас зовут?
Veja a seguir o código-fonte do exemplo. O exemplo instancia objetos CultureInfo para as culturas inglesa (Estados Unidos), inglesa (Canadá), francesa (França) e russa (Rússia), definindo cada uma como a cultura atual. O método ResourceManager.GetString(String, CultureInfo), em seguida, fornece o valor da propriedade CultureInfo.CurrentCulture como o argumento culture para recuperar os recursos específicos à cultura apropriados.
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!
Você pode compilar a versão C# do exemplo executando o arquivo em lote a seguir. Se você estiver usando o Visual Basic, substitua csc por vbc e substitua a extensão .cs por .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