Problembehandlung bei der ASP.NET Core-LokalisierungTroubleshoot ASP.NET Core Localization
Von Hisham Bin AteyaBy Hisham Bin Ateya
Dieser Artikel enthält Anweisungen für die Diagnose von Problemen mit der Lokalisierung von ASP.NET Core-Apps.This article provides instructions on how to diagnose ASP.NET Core app localization issues.
Probleme bei der LokalisierungskonfigurationLocalization configuration issues
Reihenfolge der LokalisierungsmiddlewareLocalization middleware order
Die App kann möglicherweise nicht lokalisiert werden, da die Lokalisierungsmiddleware nicht in der erwarteten Reihenfolge angeordnet ist.The app may not localize because the localization middleware isn't ordered as expected.
Um dieses Problem zu beheben, stellen Sie sicher, dass die Lokalisierungsmiddleware vor der MVC-Middleware registriert wurde.To resolve this issue, ensure that localization middleware is registered before MVC middleware. Andernfalls wird die Lokalisierungsmiddleware nicht angewendet.Otherwise, the localization middleware isn't applied.
public void ConfigureServices(IServiceCollection services)
{
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddMvc();
}
Pfad der Lokalisierungsmiddleware nicht gefundenLocalization resources path not found
Unterstützte Kulturen im RequestCultureProvider entsprechen nicht der einmaligen RegistrierungSupported Cultures in RequestCultureProvider don't match with registered once
Probleme mit dem RessourcendateinamenResource file naming issues
ASP.NET Core verfügt über vordefinierte Regeln und Richtlinien für die Benennung von Lokalisierungsressourcendateien, die hier im Detail beschrieben werden.ASP.NET Core has predefined rules and guidelines for localization resources file naming, which are described in detail here.
Fehlende RessourcenMissing resources
Häufige Ursachen, warum Ressourcen nicht gefundenen werden, sind:Common causes of resources not being found include:
- Ressourcennamen sind entweder in der
resx
-Datei oder der Lokalisierungsanforderung falsch geschrieben.Resource names are misspelled in either theresx
file or the localizer request. - Die Ressource fehlt für einige Sprachen in
resx
, ist für andere aber vorhanden.The resource is missing from theresx
for some languages, but exists in others. - Wenn weiterhin Probleme auftreten, überprüfen Sie die Protokollmeldungen der Lokalisierung (auf der
Debug
-Protokollebene) auf weitere Informationen zu den fehlenden Ressourcen.If you're still having trouble, check the localization log messages (which are atDebug
log level) for more details about the missing resources.
Hinweis: Bei Verwendung von CookieRequestCultureProvider
vergewissern Sie sich, dass mit den Kulturen im Lokalisierungscookiewert keine einfachen Anführungszeichen verwendet werden. c='en-UK'|uic='en-US'
ist beispielsweise ein ungültiger cookiewert, während c=en-UK|uic=en-US
gültig ist.Hint: When using CookieRequestCultureProvider
, verify single quotes are not used with the cultures inside the localization cookie value. For example, c='en-UK'|uic='en-US'
is an invalid cookie value, while c=en-UK|uic=en-US
is a valid.
Probleme mit Ressourcen und KlassenbibliothekenResources & Class Libraries issues
ASP.NET Core stellt standardmäßig eine Methode zur Verfügung, Klassenbibliotheken zu ermöglichen, ihre Ressourcendateien über ResourceLocationAttribute zu finden.ASP.NET Core by default provides a way to allow the class libraries to find their resource files via ResourceLocationAttribute.
Folgende Probleme mit Klassenbibliotheken treten häufig auf:Common issues with class libraries include:
- Das Fehlen von
ResourceLocationAttribute
in einer Klassenbibliothek verhindert, dassResourceManagerStringLocalizerFactory
die Ressourcen ermitteln kann.Missing theResourceLocationAttribute
in a class library will preventResourceManagerStringLocalizerFactory
from discovering the resources. - Ressourcendateinamen.Resource file naming. Weitere Informationen finden Sie unter Probleme mit dem Ressourcendateinamen.For more information, see Resource file naming issues section.
- Ändern des Stammnamespace der Klassenbibliothek.Changing the root namespace of the class library. Weitere Informationen finden Sie unter Probleme mit dem Stammnamespace Abschnitt.For more information, see Root Namespace issues section.
CustomRequestCultureProvider funktioniert nicht wie erwartetCustomRequestCultureProvider doesn't work as expected
Die RequestLocalizationOptions
-Klasse verfügt über drei Standardanbieter:The RequestLocalizationOptions
class has three default providers:
QueryStringRequestCultureProvider
CookieRequestCultureProvider
AcceptLanguageHeaderRequestCultureProvider
Mit CustomRequestCultureProvider können Sie anpassen, wie die Lokalisierungskultur in Ihrer App bereitgestellt wird.The CustomRequestCultureProvider allows you to customize how the localization culture is provided in your app. CustomRequestCultureProvider
wird verwendet, wenn die Standardanbieter Ihren Anforderungen nicht entsprechen.The CustomRequestCultureProvider
is used when the default providers don't meet your requirements.
Ein häufiger Grund dafür, dass ein benutzerdefinierter Anbieter nicht ordnungsgemäß funktioniert, besteht darin, dass er nicht der erste Anbieter in der
RequestCultureProviders
-Liste ist.A common reason custom provider don't work properly is that it isn't the first provider in theRequestCultureProviders
list. So beheben Sie dieses Problem:To resolve this issue:Fügen Sie den benutzerdefinierten Anbieter wie folgt an der Position 0 in die
RequestCultureProviders
Liste ein:Insert the custom provider at the position 0 in theRequestCultureProviders
list as the following:
options.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(async context =>
{
// My custom request culture logic
return new ProviderCultureResult("en");
}));
options.AddInitialRequestCultureProvider(new CustomRequestCultureProvider(async context =>
{
// My custom request culture logic
return new ProviderCultureResult("en");
}));
- Verwenden Sie die
AddInitialRequestCultureProvider
-Erweiterungsmethode, um den benutzerdefinierten Anbieter als ersten Anbieter festzulegen.UseAddInitialRequestCultureProvider
extension method to set the custom provider as initial provider.
Probleme mit dem StammnamespaceRoot Namespace issues
Wenn der Stammnamespace einer Assembly sich vom Assemblynamen unterscheidet, funktioniert die Lokalisierung standardmäßig nicht.When the root namespace of an assembly is different than the assembly name, localization doesn't work by default. Um dieses Problem zu vermeiden, verwenden Sie RootNamespace, das hier im Detail beschrieben wird.To avoid this issue use RootNamespace, which is described in detail here
Warnung
Dies kann vorkommen, wenn der Name eines Projekts kein gültiger .NET-Bezeichner ist.This can occur when a project's name is not a valid .NET identifier. Beispielsweise verwendet my-project-name.csproj
den Stammnamespace my_project_name
und den Assemblynamen my-project-name
, der zu diesem Fehler führt.For instance my-project-name.csproj
will use the root namespace my_project_name
and the assembly name my-project-name
leading to this error.
Ressourcen und BuildaktionResources & Build Action
Wenn Sie Ressourcendateien für die Lokalisierung verwenden, ist es wichtig, dass sie über eine geeignete Buildaktion verfügen.If you use resource files for localization, it's important that they have an appropriate build action. Sie sollten eine eingebettete Ressource sein, andernfalls kann ResourceStringLocalizer
diese Ressourcen nicht finden.They should be Embedded Resource, otherwise the ResourceStringLocalizer
is not able to find these resources.