Řešení ASP.NET Core lokalizace

Od Hisham Bin Ateya

Tento článek obsahuje pokyny k diagnostice problémů s ASP.NET Core lokalizací aplikací.

Problémy s konfigurací lokalizace

Pořadí middlewaru lokalizace
Aplikace se nemusí lokalizovat, protože middleware lokalizace není seřazený podle očekávání.

Pokud chcete tento problém vyřešit, ujistěte se, že je před middlewarem MVC zaregistrovaný middleware pro lokalizaci. V opačném případě se middleware lokalizace použít nebude.

public void ConfigureServices(IServiceCollection services)
{
    services.AddLocalization(options => options.ResourcesPath = "Resources");

    services.AddMvc();
}

Cesta k prostředkům lokalizace se nenašla

Podporované jazykové verze v zprostředkovateli RequestCultureProvider se neshodují s jednou zaregistrovanou

Problémy s pojmenováním souborů prostředků

ASP.NET Core předdefinovaná pravidla a pokyny pro pojmenování souborů prostředků lokalizace, které jsou podrobně popsané tady.

Chybějící prostředky

Mezi běžné příčiny, kdy se prostředky nenašly, patří:

  • Názvy prostředků jsou v souboru nebo v resx požadavku lokátoru chybně napsané.
  • Prostředek v pro některé jazyky chybí, ale resx existuje v jiných.
  • Pokud stále máte potíže, zkontrolujte zprávy protokolu lokalizace (které jsou na úrovni protokolu), kde najdete další podrobnosti o Debug chybějících zdrojích.

Nápověda: Pokud používáte CookieRequestCultureProvider , ověřte, že se jednoduché uvozovky nepoužíly s jazykovou verzí uvnitř hodnoty cookie lokalizace. Například je c='en-UK'|uic='en-US' neplatná cookie hodnota, zatímco je c=en-UK|uic=en-US platná.

Problémy & s knihovnami tříd prostředků

ASP.NET Core výchozím nastavení poskytuje způsob, jak knihovnám tříd umožnit vyhledání souborů prostředků prostřednictvím atributu ResourceLocationAttribute.

Mezi běžné problémy s knihovnami tříd patří:

  • Chybějící v ResourceLocationAttribute knihovně tříd zabrání ResourceManagerStringLocalizerFactory ve zjišťování prostředků.
  • Pojmenování souborů prostředků. Další informace najdete v části Problémy s pojmenováním souborů prostředků.
  • Změna kořenového oboru názvů knihovny tříd Další informace najdete v části Problémy s kořenovým oborem názvů.

CustomRequestCultureProvider nefunguje podle očekávání

Třída RequestLocalizationOptions má tři výchozí zprostředkovatele:

  1. QueryStringRequestCultureProvider
  2. CookieRequestCultureProvider
  3. AcceptLanguageHeaderRequestCultureProvider

CustomRequestCultureProvider umožňuje přizpůsobit, jak se jazyková verze lokalizace poskytuje ve vaší aplikaci. Se CustomRequestCultureProvider používá, když výchozí poskytovatelé nesplňuje vaše požadavky.

  • Běžným důvodem, proč vlastní zprostředkovatel nefunguje správně, je to, že není prvním poskytovatelem v RequestCultureProviders seznamu. Řešení tohoto problému:

  • Vložte vlastního zprostředkovatele na pozici 0 RequestCultureProviders v seznamu následujícím způsobem:

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");
    }));
  • K AddInitialRequestCultureProvider nastavení vlastního zprostředkovatele jako počátečního zprostředkovatele použijte metodu rozšíření.

Problémy s kořenovým oborem názvů

Pokud se kořenový obor názvů sestavení liší od názvu sestavení, lokalizace ve výchozím nastavení nefunguje. Pokud se chcete tomuto problému vyhnout, použijte rootNamespace,který je podrobně popsaný tady.

Upozornění

K tomu může dojít v případě, že název projektu není platný identifikátor rozhraní .NET. Například bude používat kořenový obor názvů a my-project-name.csproj název sestavení vedoucí k této my_project_name my-project-name chybě.

Akce & sestavení

Pokud pro lokalizaci používáte soubory prostředků, je důležité, aby měly příslušnou akci sestavení. Měly by být vloženým zdrojem, jinak tyto prostředky ResourceStringLocalizer nemůže najít.