Compartilhar via


Construtores System.Resources.ResourceManager

Este artigo fornece observações complementares à documentação de referência para essa API.

Construtor ResourceManager(Type)

Esta seção refere-se à sobrecarga do ResourceManager(Type) construtor.

Aplicativos da área de trabalho

Em aplicativos da área de trabalho, o gerenciador de recursos usa o resourceSource parâmetro para carregar um arquivo de recurso específico da seguinte maneira:

  • Se o atributo não for usado para indicar que os recursos da cultura padrão residem em um assembly satélite, o gerenciador de recursos assumirá que o arquivo de recurso para a cultura padrão é encontrado no mesmo assembly que o NeutralResourcesLanguageAttribute tipo especificado pelo resourceSource parâmetro.
  • O gerenciador de recursos pressupõe que o arquivo de recurso padrão tem o mesmo nome base que o tipo especificado pelo resourceSource parâmetro.
  • O gerenciador de recursos usa a classe padrão ResourceSet para manipular o arquivo de recurso.

Por exemplo, dado um tipo chamado , o gerenciador de recursos procura um arquivo .resources chamado MyCompany.MyProduct.MyTypeMyCompany.MyProduct.MyType.resources no assembly que define MyType.

No Visual Studio, o Designer de Recursos gera automaticamente código que define uma internal classe (em C#) ou Friend (no Visual Basic) cujo nome é o mesmo que o nome base do arquivo .resources para a cultura padrão. Isso torna possível instanciar um objeto e acoplá-lo a um conjunto específico de recursos obtendo um ResourceManager objeto de tipo cujo nome corresponde ao nome do recurso, porque enquanto a classe estiver visível para o compilador, os recursos também devem ser. Por exemplo, se um arquivo .resources for chamado Resource1, a instrução a seguir instanciará um ResourceManagerobjeto para gerenciar o arquivo .resources chamado Resource1:

ResourceManager rm = new ResourceManager(typeof(Resource1));

Se você não estiver usando o Visual Studio, poderá criar uma classe sem membros cujo namespace e nome sejam os mesmos do arquivo .resources padrão. O exemplo fornece uma ilustração.

Aplicativos do Windows 8.x

Importante

Embora a classe tenha suporte em aplicativos do ResourceManager Windows 8.x, não recomendamos seu uso. Use essa classe somente quando você desenvolver projetos de biblioteca de classes portátil que podem ser usados com aplicativos do Windows 8.x. Para recuperar recursos de aplicativos do Windows 8.x, use a classe Windows.ApplicationModel.Resources.ResourceLoader .

Em aplicativos do Windows 8.x, ResourceManager usa o parâmetro para inferir o assembly, o nome base e o namespace onde os itens de recurso podem estar localizados no arquivo PRI (índice de recursos de pacote) do resourceSource aplicativo. Por exemplo, dado um tipo chamado MyCompany.MyProduct.MyType que é definido no MyAssembly, o gerenciador de recursos procura um identificador de conjunto de recursos nomeado MyAssembly e procura um escopo MyCompany.MyProduct.MyType dentro desse conjunto de recursos. O gerenciador de recursos procura itens de recurso no contexto padrão (cultura atual, configuração atual de alto contraste e assim por diante) dentro desse escopo.

Exemplo

O exemplo a seguir usa o ResourceManager(Type) construtor para instanciar um ResourceManager objeto. Consiste em recursos compilados a partir de arquivos .txt para as culturas inglesa (en), francesa (França) (fr-FR) e russa (Rússia) (ru-RU). O exemplo altera a cultura atual e a cultura atual da interface do usuário para inglês (Estados Unidos), francês (França), russo (Rússia) e sueco (Suécia). Em seguida, ele chama o GetString(String) método para recuperar a cadeia de caracteres localizada, que exibe uma saudação que depende da hora do dia.

O exemplo requer três arquivos de recursos baseados em texto, conforme listado na tabela a seguir. Cada arquivo inclui recursos de cadeia de caracteres chamados Morning, Afternoone Evening.

Cultura Nome do arquivo Nome do recurso Valor do recurso
en-US GreetingResources.txt Morning Bom Dia
en-US GreetingResources.txt Afternoon Boa tarde
en-US GreetingResources.txt Evening Boa noite
fr-FR GreetingResources.fr-FR.txt Morning Bonjour
fr-FR GreetingResources.fr-FR.txt Afternoon Bonjour
fr-FR GreetingResources.fr-FR.txt Evening Bonsoir
ru-RU GreetingResources.ru-RU.txt Morning Доброе утро
ru-RU GreetingResources.ru-RU.txt Afternoon Добрый день
ru-RU GreetingResources.ru-RU.txt Evening Добрый вечер

Você pode usar o seguinte arquivo em lotes para compilar o exemplo do Visual Basic e criar um executável chamado Greet.exe. Para compilar com C#, altere o nome do compilador de para e a extensão do arquivo de vbc.vb para csc.cs.

resgen GreetingResources.txt
vbc Greet.vb /resource: GreetingResources.resources

md fr-FR
resgen GreetingResources.fr-FR.txt
al /out:fr-FR\Greet.resources.dll /culture:fr-FR /embed: GreetingResources.fr-FR.resources

md ru-RU
resgen GreetingResources.ru-RU.txt
al /out:ru-RU\Greet.resources.dll /culture:ru-RU /embed: GreetingResources.ru-RU.resources

Aqui está o código-fonte para o exemplo (ShowDate.vb para a versão do Visual Basic ou ShowDate.cs para a versão C# do código).

using System;
using System.Resources;
using System.Globalization;
using System.Threading;

[assembly: NeutralResourcesLanguage("en")]

public class Example2
{
    public static void Main()
    {
        string[] cultureNames = [ "en-US", "fr-FR", "ru-RU", "sv-SE" ];
        DateTime noon = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
                                     DateTime.Now.Day, 12, 0, 0);
        DateTime evening = new DateTime(DateTime.Now.Year, DateTime.Now.Month,
                                        DateTime.Now.Day, 18, 0, 0);

        ResourceManager rm = new ResourceManager(typeof(GreetingResources));

        foreach (var cultureName in cultureNames)
        {
            Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName);
            Console.WriteLine("The current UI culture is {0}",
                              CultureInfo.CurrentUICulture.Name);
            if (DateTime.Now < noon)
                Console.WriteLine("{0}!", rm.GetString("Morning"));
            else if (DateTime.Now < evening)
                Console.WriteLine("{0}!", rm.GetString("Afternoon"));
            else
                Console.WriteLine("{0}!", rm.GetString("Evening"));
            Console.WriteLine();
        }
    }

    internal class GreetingResources
    {
    }
}
// The example displays output like the following:
//       The current UI culture is en-US
//       Good afternoon!
//
//       The current UI culture is fr-FR
//       Bonjour!
//
//       The current UI culture is ru-RU
//       Добрый день!
//
//       The current UI culture is sv-SE
//       Good afternoon!
Imports System.Resources
Imports System.Globalization
Imports System.Threading

<Assembly:NeutralResourcesLanguage("en")>

Module Example
   Public Sub Main()
      Dim cultureNames() As String = {"en-US", "fr-FR", "ru-RU", "sv-SE" }
      Dim noon As New Date(Date.Now.Year, Date.Now.Month, 
                           Date.Now.Day, 12,0,0)
      Dim evening As New Date(Date.Now.Year, Date.Now.Month,
                              Date.Now.Day, 18, 0, 0)                          
      
      Dim rm As New ResourceManager(GetType(GreetingResources))
      
      For Each cultureName In cultureNames
         Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName)
         Console.WriteLine("The current UI culture is {0}", 
                           CultureInfo.CurrentUICulture.Name)
         If Date.Now < noon Then
            Console.WriteLine("{0}!", rm.GetString("Morning"))
         ElseIf Date.Now < evening Then
            Console.WriteLine("{0}!", rm.GetString("Afternoon"))
         Else
            Console.WriteLine("{0}!", rm.GetString("Evening"))
         End If 
         Console.WriteLine()
      Next
   End Sub
End Module

Friend Class GreetingResources
End Class
' The example displays output like the following:
'       The current UI culture is en-US
'       Good afternoon!
'       
'       The current UI culture is fr-FR
'       Bonjour!
'       
'       The current UI culture is ru-RU
'       Добрый день!
'       
'       The current UI culture is sv-SE
'       Good afternoon!

Além de definir uma classe de aplicativo chamada Example, o código-fonte define uma classe interna cujo nome, , GreetingResourcesé o mesmo que o nome base dos arquivos de recurso. Isso torna possível instanciar com êxito um ResourceManager objeto chamando o ResourceManager(Type) construtor.

Observe que a saída exibe a cadeia de caracteres localizada apropriada, exceto quando a cultura atual da interface do usuário é sueca (Suécia), caso em que ela usa recursos do idioma inglês. Como os recursos do idioma sueco não estão disponíveis, o aplicativo usa os NeutralResourcesLanguageAttribute recursos da cultura padrão, conforme definido pelo atributo.

Construtor ResourceManager(String, Assembly)

Esta seção refere-se à sobrecarga do ResourceManager(String, Assembly) construtor.

Aplicativos da área de trabalho

Em aplicativos de área de trabalho, os arquivos de recurso específicos da cultura individual devem estar contidos em assemblies satélite, e o arquivo de recurso da cultura padrão deve estar contido no assembly principal. Presume-se que um assembly satélite contenha recursos para uma única cultura especificada no manifesto desse assembly e é carregado conforme necessário.

Observação

Para recuperar recursos de arquivos .resources diretamente em vez de recuperá-los de assemblies, você deve chamar o CreateFileBasedResourceManager método para instanciar um ResourceManager objeto.

Se o arquivo de recurso identificado por baseName não puder ser encontrado no assembly, o método instanciará um objeto, mas a tentativa de recuperar um ResourceManager recurso específico lançará uma exceção, normalmente MissingManifestResourceException. Para obter informações sobre como diagnosticar a causa da exceção, consulte a seção "Manipulando a exceção MissingManifestResourceException" do ResourceManager tópico de classe.

Aplicativos do Windows 8.x

Importante

Embora a classe tenha suporte em aplicativos do ResourceManager Windows 8.x, não recomendamos seu uso. Use essa classe somente quando você desenvolver projetos de biblioteca de classes portátil que podem ser usados com aplicativos do Windows 8.x. Para recuperar recursos de aplicativos do Windows 8.x, use a classe Windows.ApplicationModel.Resources.ResourceLoader .

Em aplicativos do Windows 8.x, o gerenciador de recursos usa o assembly nome simples do parâmetro para procurar um conjunto de recursos correspondente no arquivo PRI (índice de recursos de pacote) do aplicativo. O baseName parâmetro é usado para procurar um item de recurso dentro do conjunto de recursos. Por exemplo, o nome raiz para PortableLibrary1.Resource1.de-DE.resources é PortableLibrary1.Resource1.

Exemplo

O exemplo a seguir usa um aplicativo "Hello World" simples e não localizado para ilustrar o ResourceManager(String, Assembly) construtor. O conteúdo de um arquivo de texto chamado ExampleResources.txt é Greeting=Hello. Quando o aplicativo é compilado, o recurso é incorporado no assembly do aplicativo principal.

O arquivo de texto pode ser convertido em um arquivo de recurso binário usando o gerador de arquivo de recurso (ResGen.exe) no prompt de comando da seguinte maneira:

resgen ExampleResources.txt

O exemplo a seguir fornece o código executável que instancia um objeto, solicita que o usuário insira um ResourceManager nome e exibe uma saudação.

using System;
using System.Reflection;
using System.Resources;

public class Example1
{
    public static void Main()
    {
        // Retrieve the resource.
        ResourceManager rm = new ResourceManager("ExampleResources",
                                 typeof(Example).Assembly);
        string greeting = rm.GetString("Greeting");

        Console.Write("Enter your name: ");
        string name = Console.ReadLine();
        Console.WriteLine("{0} {1}!", greeting, name);
    }
}
// The example produces output similar to the following:
//       Enter your name: John
//       Hello John!
Imports System.Globalization
Imports System.Reflection
Imports System.Resources

Module Example1
    Public Sub Main()
        ' Retrieve the resource.
        Dim rm As New ResourceManager("ExampleResources",
                                      GetType(Example).Assembly)
        Dim greeting As String = rm.GetString("Greeting")

        Console.Write("Enter your name: ")
        Dim name As String = Console.ReadLine()
        Console.WriteLine("{0} {1}!", greeting, name)
    End Sub
End Module
' The example produces output similar to the following:
'       Enter your name: John
'       Hello John!

Ele pode ser compilado usando o seguinte comando em C#:

csc Example.cs /resource:ExampleResources.resources

O exemplo recupera uma referência ao assembly que contém o arquivo de recurso passando um tipo definido nesse assembly para a função (em C#) ou a typeofGetType função (no Visual Basic) e recuperando o valor de sua Type.Assembly propriedade.