Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Notitie
In dit artikel vindt u aanvullende opmerkingen in de referentiedocumentatie voor deze API.
ResourceManager(Type) bouwer
Deze sectie heeft betrekking op de overbelasting van de ResourceManager(Type) constructor.
Bureaublad-apps
In desktop-apps gebruikt Resource Manager de resourceSource parameter om een bepaald resourcebestand als volgt te laden:
- Als het NeutralResourcesLanguageAttribute kenmerk niet wordt gebruikt om aan te geven dat de resources van de standaardcultuur zich in een satellietassembly bevinden, wordt ervan uitgegaan dat het resourcebestand voor de standaardcultuur wordt gevonden in dezelfde assembly als het type dat is opgegeven door de
resourceSourceparameter. - De resourcemanager gaat ervan uit dat het standaardresourcebestand dezelfde basisnaam heeft als het type dat is opgegeven door de
resourceSourceparameter. - Resource Manager gebruikt de standaardklasse ResourceSet om het resourcebestand te bewerken.
Als er bijvoorbeeld een type genaamd MyCompany.MyProduct.MyType is, zoekt de resourcemanager naar een .resources-bestand met de naam MyCompany.MyProduct.MyType.resources in de assembly die MyType definieert.
In Visual Studio genereert Resource Designer automatisch code die een internal klasse (in C#) of Friend (in Visual Basic) definieert waarvan de naam gelijk is aan de basisnaam van het .resources-bestand voor de standaardcultuur. Dit maakt het mogelijk om een ResourceManager object te instantiëren en te koppelen aan een bepaalde set resources door een typeobject op te halen waarvan de naam overeenkomt met de naam van de resource, omdat zolang de klasse zichtbaar is voor de compiler, de resources ook moeten zijn. Als bijvoorbeeld een .resources-bestand de naam Resource1 heeft, wordt met de volgende instructie een ResourceManager object geïnstitueert voor het beheren van het .resources-bestand met de naam Resource1:
ResourceManager rm = new ResourceManager(typeof(Resource1));
Als u Visual Studio niet gebruikt, kunt u een klasse maken zonder leden waarvan de naamruimte en naam hetzelfde zijn als die van het standaard .resources-bestand . In het voorbeeld ziet u een afbeelding.
Windows 8.x-apps
Belangrijk
Hoewel de ResourceManager-klasse wordt ondersteund in Windows 8.x-apps, raden we het gebruik ervan niet aan. Gebruik deze klasse alleen wanneer u Portable Class Library-projecten ontwikkelt die kunnen worden gebruikt met Windows 8.x-apps. Als u resources wilt ophalen uit Windows 8.x-apps, gebruikt u in plaats daarvan de klasse Windows.ApplicationModel.Resources.Resource Loader.
In Windows 8.x-apps, gebruikt ResourceManager de resourceSource-parameter om de assembly, de basisnaam en de naamruimte af te leiden waarin de resourceitems zich in het PRI-bestand (Package Resource Index) van de app kunnen bevinden. Als er bijvoorbeeld een type genaamd MyCompany.MyProduct.MyType is gedefinieerd in MyAssembly, zoekt de resourcemanager naar een resourceset-id met de naam MyAssembly en kijkt deze naar een bereik MyCompany.MyProduct.MyType binnen die resourceset. De resourcemanager zoekt naar resource-items onder de standaardcontext (huidige cultuur, huidige instelling voor hoog contrast, enzovoort) binnen dit bereik.
Voorbeeld
In het volgende voorbeeld wordt de ResourceManager(Type) constructor gebruikt om een ResourceManager object te instantiëren. Het bestaat uit bronnen die zijn samengesteld uit .txt bestanden voor de Engelse (en), Frans (Frankrijk) (fr-FR) en Russisch (Rusland) (ru-RU) culturen. In het voorbeeld wordt de huidige cultuur en de huidige UI-cultuur gewijzigd in Engels (Verenigde Staten), Frans (Frankrijk), Russisch (Rusland) en Zweeds (Zweden). Vervolgens wordt de GetString(String) methode aangeroepen om de gelokaliseerde tekenreeks op te halen, die een begroeting weergeeft die afhankelijk is van het tijdstip van de dag.
Voor het voorbeeld zijn drie bronbestanden op basis van tekst vereist, zoals wordt vermeld in de volgende tabel. Elk bestand bevat tekenreeksbronnen met de naam Morning, Afternoonen Evening.
| Cultuur | Bestandsnaam | Resourcenaam | Bronwaarde |
|---|---|---|---|
| en-US | GreetingResources.txt | Morning |
Goedemorgen |
| en-US | GreetingResources.txt | Afternoon |
Goedemiddag |
| en-US | GreetingResources.txt | Evening |
Goedenavond |
| 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 |
Добрый вечер |
U kunt het volgende batchbestand gebruiken om het Visual Basic-voorbeeld te compileren en een uitvoerbaar bestand met de naam Greet.exete maken. Als u wilt compileren met C#, wijzigt u de naam van de compiler in vbccsc en de bestandsextensie van .vb in .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
Hier volgt de broncode voor het voorbeeld (ShowDate.vb voor de Visual Basic-versie of ShowDate.cs voor de C#-versie van de code).
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 {CultureInfo.CurrentUICulture.Name}");
if (DateTime.Now < noon)
Console.WriteLine($"{rm.GetString("Morning")}!");
else if (DateTime.Now < evening)
Console.WriteLine($"{rm.GetString("Afternoon")}!");
else
Console.WriteLine($"{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!
Naast het definiëren van een app-klasse met de naam Example, definieert de broncode een interne klasse waarvan de naam GreetingResources, hetzelfde is als de basisnaam van de resourcebestanden. Dit maakt het mogelijk om een ResourceManager object te instantiëren door de ResourceManager(Type) constructor aan te roepen.
Merk op dat in de uitvoer de juiste gelokaliseerde tekenreeks wordt weergegeven, behalve wanneer de huidige UI-cultuur Zweeds (Zweden) is; dan worden Engelse taalbronnen gebruikt. Omdat Zweedse taalbronnen niet beschikbaar zijn, gebruikt de app in plaats daarvan de resources van de standaardcultuur, zoals gedefinieerd door het NeutralResourcesLanguageAttribute kenmerk.
ResourceManager(String, Assembly) bouwer
Deze sectie heeft betrekking op de overbelasting van de ResourceManager(String, Assembly) constructor.
Bureaublad-apps
In bureaublad-apps moeten de afzonderlijke cultuurspecifieke bronbestanden worden opgenomen in satellietassembly's en moet het bronbestand van de standaardcultuur zich in de hoofdassembly bevinden. Er wordt uitgegaan van een satellietassembly die resources bevat voor een specifieke cultuur zoals opgegeven in het manifest van die assembly en indien nodig wordt geladen.
Notitie
Als u resources rechtstreeks uit .resources-bestanden wilt ophalen in plaats van ze op te halen uit assembly's, moet u in plaats daarvan de CreateFileBasedResourceManager methode aanroepen om een ResourceManager object te instantiëren.
Als het resourcebestand dat is geïdentificeerd door baseName niet kan worden gevonden in assembly, instantieert de methode een ResourceManager-object, maar de poging om een specifieke resource op te halen genereert meestal een MissingManifestResourceException-uitzondering. Zie de sectie "Handling the MissingManifestResourceException Exception" in het ResourceManager klasse-onderwerp voor meer informatie over het diagnosticeren van de oorzaak van de uitzondering.
Windows 8.x-apps
Belangrijk
Hoewel de ResourceManager-klasse wordt ondersteund in Windows 8.x-apps, raden we het gebruik ervan niet aan. Gebruik deze klasse alleen wanneer u Portable Class Library-projecten ontwikkelt die kunnen worden gebruikt met Windows 8.x-apps. Als u resources wilt ophalen uit Windows 8.x-apps, gebruikt u in plaats daarvan de klasse Windows.ApplicationModel.Resources.Resource Loader.
In Windows 8.x-apps gebruikt Resource Manager de eenvoudige naam van de assembly parameter om een overeenkomende resource op te zoeken die is ingesteld in het PRI-bestand (Package Resource Index) van de app. De baseName parameter wordt gebruikt om een resource-item in de resourceset op te zoeken. Bijvoorbeeld, de hoofdnaam voor PortableLibrary1.Resource1.de-DE.resources is PortableLibrary1.Resource1.
Voorbeeld
In het volgende voorbeeld wordt een eenvoudige niet-gelokaliseerde 'Hallo wereld'-app gebruikt om de ResourceManager(String, Assembly) constructor te illustreren. De inhoud van een tekstbestand ExampleResources.txt is Greeting=Hello. Wanneer de app is gecompileerd, wordt de resource ingesloten in de hoofd-app-assembly.
Het tekstbestand kan als volgt worden geconverteerd naar een binair resourcebestand met behulp van de resourcebestandgenerator (ResGen.exe) bij de opdrachtprompt:
resgen ExampleResources.txt
Het volgende voorbeeld bevat de uitvoerbare code waarmee een ResourceManager object wordt geïnstitueert, de gebruiker wordt gevraagd een naam in te voeren en een begroeting weergeeft.
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($"{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!
Deze kan worden gecompileerd met behulp van de volgende opdracht in C#:
csc Example.cs /resource:ExampleResources.resources
In het voorbeeld wordt een verwijzing opgehaald naar de assembly die het resourcebestand bevat, door een type dat in die assembly is gedefinieerd door te geven aan de typeof functie (in C#) of de GetType functie (in Visual Basic) en vervolgens de waarde van de Type.Assembly eigenschap op te halen.