Rozwiązywanie problemów z lokalizacją ASP.NET Core
Autor: Hisham Bin Ateya
Ten artykuł zawiera instrukcje dotyczące diagnozowania problemów z lokalizacją aplikacji ASP.NET Core.
Problemy z konfiguracją lokalizacji
Kolejność oprogramowania pośredniczącego lokalizacji
Aplikacja może nie lokalizować, ponieważ oprogramowanie pośredniczące lokalizacji nie jest uporządkowane zgodnie z oczekiwaniami.
Aby rozwiązać ten problem, upewnij się, że oprogramowanie pośredniczące lokalizacji zostało zarejestrowane przed oprogramowaniem pośredniczącym MVC. W przeciwnym razie oprogramowanie pośredniczące lokalizacji nie jest stosowane.
public void ConfigureServices(IServiceCollection services)
{
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddMvc();
}
Nie można odnaleźć ścieżki zasobów lokalizacji
Obsługiwane kultury w obiekcie RequestCultureProvider nie są zgodne z zarejestrowanymi raz
Problemy z nazewnictwem plików zasobów
ASP.NET Core ma wstępnie zdefiniowane reguły i wytyczne dotyczące nazewnictwa plików zasobów lokalizacji, które opisano w temacie Globalizacja i lokalizacja w ASP.NET Core.
Brakujące zasoby
Typowe przyczyny nieznajdowania zasobów to:
- Nazwy zasobów są błędniepelowane w pliku zasobów XML platformy .NET (
.resx
) lub żądaniu lokalizatora. - Brak zasobu w pliku zasobów dla niektórych języków, ale istnieje w innych.
- Jeśli nadal występują problemy, sprawdź komunikaty dziennika lokalizacji (zarejestrowane na
Debug
poziomie dziennika), aby uzyskać więcej informacji na temat brakujących zasobów.
Napiwek
W przypadku używania CookieRequestCultureProviderfunkcji sprawdź, czy pojedyncze cudzysłowy nie są używane z kulturami wewnątrz wartości lokalizacji cookie . Na przykład c='en-UK'|uic='en-US'
jest nieprawidłową cookie wartością, chociaż c=en-UK|uic=en-US
jest prawidłowa.
Problemy z zasobami i bibliotekami klas
ASP.NET Core domyślnie umożliwia bibliotekom klas znajdowanie plików zasobów za pomocą polecenia ResourceLocationAttribute.
Typowe problemy z bibliotekami klas obejmują:
- Brak elementu ResourceLocationAttribute w bibliotece klas uniemożliwia ResourceManagerStringLocalizerFactory odnajdywanie zasobów.
- Nazewnictwo plików zasobów. Aby uzyskać więcej informacji, zobacz sekcję Problemy z nazewnictwem plików zasobów.
- Zmiana głównej przestrzeni nazw biblioteki klas. Aby uzyskać więcej informacji, zobacz sekcję Główne problemy z przestrzenią nazw.
CustomRequestCultureProvider
nie działa zgodnie z oczekiwaniami
Klasa RequestLocalizationOptions ma trzech domyślnych dostawców:
- QueryStringRequestCultureProvider
- CookieRequestCultureProvider
- AcceptLanguageHeaderRequestCultureProvider
Umożliwia CustomRequestCultureProvider dostosowanie sposobu zapewniania kultury lokalizacji. Element CustomRequestCultureProvider jest używany, gdy domyślni dostawcy nie spełniają Twoich wymagań.
Typowym powodem nieprawidłowego działania dostawcy niestandardowego jest to, że nie jest to pierwszy dostawca na RequestCultureProviders liście. Aby rozwiązać ten problem:
Wstaw dostawcę niestandardowego na pozycji zero na RequestCultureProviders liście:
options.AddInitialRequestCultureProvider( new CustomRequestCultureProvider(async context => { // My custom request culture logic return new ProviderCultureResult("en"); }));
Wstaw dostawcę niestandardowego na pozycji zero na RequestCultureProviders liście:
options.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(async context => { // My custom request culture logic return new ProviderCultureResult("en"); }));
- AddInitialRequestCultureProvider Użyj metody rozszerzenia, aby ustawić dostawcę niestandardowego jako dostawcę początkowego.
Problemy z przestrzeń nazw katalogu głównego
Gdy główna przestrzeń nazw zestawu różni się od nazwy zestawu, lokalizacja nie działa domyślnie. Aby uniknąć tego problemu, użyj atrybutu opisanego RootNamespace
w temacie Globalizacja i lokalizacja w ASP.NET Core.
Ostrzeżenie
Główny problem z przestrzenią nazw może wystąpić, gdy nazwa projektu nie jest prawidłowym identyfikatorem platformy .NET. Na przykład my-project-name.csproj
używa głównej przestrzeni nazw my_project_name
i nazwy my-project-name
zestawu , co powoduje wystąpienie tego błędu.
Zasoby i akcja kompilacji
Jeśli używasz plików zasobów do lokalizacji, ważne jest, aby miały one odpowiednią akcję kompilacji. Użyj zasobu osadzonego. W przeciwnym razie ResourceStringLocalizer
nie można odnaleźć tych zasobów.
Zastępowanie lokalizacji przy użyciu okienka "Czujniki" w narzędziach deweloperskich
W przypadku używania przesłonięć lokalizacji przy użyciu okienka Czujniki w narzędziach deweloperskich Google Chrome lub Microsoft Edge język rezerwowy jest resetowany po wstępnieenderingu. Unikaj ustawiania języka przy użyciu okienka Czujniki podczas testowania. Ustaw język przy użyciu ustawień języka przeglądarki.
Aby uzyskać więcej informacji, zobacz Blazor Lokalizacja nie działa z InteractiveServer (dotnet/aspnetcore
#53707).