Dela via


Tillhandahålla lokaliserade resurser för språk och kulturer i en ASP.NET Core-app

Anmärkning

Det här är inte den senaste versionen av den här artikeln. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Varning

Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i supportpolicyn för .NET och .NET Core. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Viktigt!

Den här informationen gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.

För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Av Rick Anderson, Damien Bowden, Bart Calixto, Nadeem Afana och Hisham Bin Ateya

En uppgift för att lokalisera en app är att tillhandahålla lokaliserade strängar i resursfiler. Den här artikeln handlar om att arbeta med resursfiler.

SupportedCultures och SupportedUICultures

ASP.NET Core har två samlingar med kulturvärden och SupportedCulturesSupportedUICultures. Objektet CultureInfo för SupportedCultures avgör resultatet av kulturberoende funktioner, till exempel datum, tid, tal och valutaformatering. SupportedCultures bestämmer också sorteringsordningen för text, höljekonventioner och strängjämförelser. Se StringComparer.CurrentCulture för mer information om hur servern hämtar kulturen. Det SupportedUICultures avgör vilka översatta strängar (från .resx-filer) som letas upp av ResourceManager. Den ResourceManager söker helt enkelt upp kulturspecifika strängar som bestäms av CurrentUICulture. Varje tråd i .NET har CurrentCulture och CurrentUICulture objekt. ASP.NET Core inspekterar dessa värden när kulturberoende funktioner återges. Om den aktuella trådens kultur till exempel är inställd på "en-US" (engelska, USA), DateTime.Now.ToLongDateString() visas "Torsdag, 18 februari 2016", men om CurrentCulture är inställt på "es-ES" (spanska, Spanien) kommer utdata att vara "jueves, 18 de febrero de 2016".

Resursfiler

OBS!ResX Viewer och Editor tillhandahåller en alternativ mekanism för att arbeta med resursfiler med hjälp av Visual Studio Code.

En resursfil är en användbar mekanism för att skilja lokala strängar från kod. Översatta strängar för det icke-standardspråket är isolerade i .resx-resursfiler . Du kanske till exempel vill skapa en spansk resursfil med namnet Welcome.es.resx som innehåller översatta strängar. "es" är språkkoden för spanska. Så här skapar du den här resursfilen i Visual Studio:

  1. Högerklicka på mappen som ska innehålla resursfilen i Solution Explorer och välj sedan Lägg till>nytt objekt.

    Kapslad snabbmeny: I Solution Explorer är en snabbmeny öppen för Resurser. En andra snabbmeny är öppen för Lägg till som visar kommandot Nytt objekt markerat.

  2. I rutan Sök installerade mallar anger du "resurs" och namnger filen.

    Dialogrutan Lägg till nytt objekt

  3. Ange nyckelvärdet (ursprunglig sträng) i kolumnen Namn och den översatta strängen i kolumnen Värde .

    Welcome.es.resx-fil (välkomstresursfilen för spanska) med ordet Hello i kolumnen Namn och ordet Hola (Hello på spanska) i kolumnen Värde

    Visual Studio visar filen Welcome.es.resx .

    Solution Explorer som visar resursfilen Welcome Spanish (es)

Namn på resursfil

Resurser namnges efter klassens fullständiga typnamn minus sammansättningsnamnet. Till exempel skulle en fransk resurs i ett projekt vars huvudsammansättning är LocalizationWebsite.Web.dll för klassen LocalizationWebsite.Web.Startup ha namnet Startup.fr.resx. En resurs för klassen LocalizationWebsite.Web.Controllers.HomeController skulle ha namnet Controllers.HomeController.fr.resx. Om målklassens namnområde inte är samma som sammansättningsnamnet behöver du det fullständiga typnamnet. I exempelprojektet skulle till exempel en resurs för typen ExtraNamespace.Tools ha namnet ExtraNamespace.Tools.fr.resx.

I exempelprojektet sätter ConfigureServices metoden ResourcesPath till "Resurser", så den projektrelativa sökvägen för home controllerns franska resursfil är Resources/Controllers.HomeController.fr.resx. Du kan också använda mappar för att ordna resursfiler. För hemstyrenheten skulle sökvägen vara Resurser/Styrenheter/HomeController.fr.resx. Om du inte använder ResourcesPath alternativet går .resx-filen i projektbaskatalogen. Resursfilen för HomeController skulle ha namnet Controllers.HomeController.fr.resx. Valet mellan att använda punkt- eller sökvägsnamngivningskonvention beror på hur du vill organisera dina resursfiler.

Resursnamn Namngivning av punkt eller sökväg
Resources/Controllers.HomeController.fr.resx Punkt
Resurser/styrenheter/HomeController.fr.resx Väg

Resursfiler som använder @inject IViewLocalizer i Razor vyer följer ett liknande mönster. Resursfilen för en vy kan namnges med antingen punktnamngivning eller sökvägsnamngivning. Razor visa resursfiler som motsvarar sökvägen för deras associerade vyfil. Förutsatt att vi anger ResourcesPath till "Resurser" kan den franska resursfilen som är associerad med Views/Home/About.cshtml vyn vara något av följande:

  • Resurser/vyer/Home/About.fr.resx

  • Resurser/vyer.Home. About.fr.resx

Om du inte använder ResourcesPath alternativet finns .resx-filen för en vy i samma mapp som vyn.

RootNamespaceAttribute

Attributet RootNamespaceAttribute tillhandahåller rotnamnområdet för en sammansättning när rotnamnområdet för en sammansättning skiljer sig från sammansättningsnamnet.

Varning

Detta kan inträffa när ett projekts namn inte är en giltig .NET-identifierare. Till exempel my-project-name.csproj använder rotnamnområdet my_project_name och sammansättningsnamnet my-project-name som leder till det här felet.

Om rotnamnområdet för en sammansättning skiljer sig från sammansättningsnamnet:

  • Lokalisering fungerar inte som standard.
  • Lokaliseringen fungerar inte på grund av hur resurser söks inom mjukvarupaketet. RootNamespace är ett byggtidsvärde som inte är tillgängligt för den körande processen.

Om RootNamespace skiljer sig från AssemblyName inkluderar du följande i AssemblyInfo.cs (med parametervärden ersatta med de faktiska värdena):

using System.Reflection;
using Microsoft.Extensions.Localization;

[assembly: ResourceLocation("Resource Folder Name")]
[assembly: RootNamespace("App Root Namespace")]

Föregående kod möjliggör en lyckad lösning av resx-filer.

Kulturåterställningsbeteende

När du söker efter en resurs ägnar sig lokaliseringen åt "kulturåterställning". Från den begärda kulturen, om den inte hittas, återgår den till dess överordnade kultur. Som en sidenote representerar egenskapen CultureInfo.Parent den överordnade kulturen. Detta innebär vanligtvis (men inte alltid) att ta bort det nationella kännetecknet ur språk- och kulturkoden. Till exempel är dialekten av spanska som talas i Mexiko "es-MX". Det har det överordnade "es"—spanska, inte specifik för något land.

Anta att din webbplats får en begäran om en "Välkommen"-resurs med hjälp av kulturfr-CA. Lokaliseringssystemet söker efter följande resurser i ordning och väljer den första matchningen:

  • Välkommen.fr-CA.resx
  • Welcome.fr.resx
  • Welcome.resx (om NeutralResourcesLanguage är "fr-CA")

Om du till exempel tar bort kulturdesignatorn ".fr" och har kulturen inställd på franska, läss standardresursfilen och strängar lokaliseras. Resurshanteraren anger en standard- eller återställningsresurs för när ingenting uppfyller den begärda kulturen. Om du bara vill returnera nyckeln när du saknar en resurs för den begärda kulturen får du inte ha någon standardresursfil.

Generera resursfiler med Visual Studio

Om du skapar en resursfil i Visual Studio utan kultur i filnamnet (till exempel Welcome.resx) skapar Visual Studio en C#-klass med en egenskap för varje sträng. Det är vanligtvis inte vad du vill ha med ASP.NET Core. Du har vanligtvis ingen .resx-standardresursfil (en .resx-fil utan kulturnamnet). Vi föreslår att du skapar .resx-filen med ett kulturnamn (till exempel Welcome.fr.resx). När du skapar en .resx-fil med ett kulturnamn genererar Inte Visual Studio klassfilen.

Lägga till andra kulturer

Varje språk- och kulturkombination (förutom standardspråket) kräver en unik resursfil. Du skapar resursfiler för olika kulturer och nationella inställningar genom att skapa nya resursfiler där språkkoderna ingår i filnamnet (till exempel en-us, fr-caoch en-gb). Dessa koder placeras mellan filnamnet och filtillägget .resx , som i Välkommen.es-MX.resx (spanska/Mexiko).

Nästa steg

När du lokaliserar en app ingår även följande uppgifter:

Ytterligare resurser

Av Rick Anderson, Damien Bowden, Bart Calixto, Nadeem Afana och Hisham Bin Ateya

En uppgift för att lokalisera en app är att tillhandahålla lokaliserade strängar i resursfiler. Den här artikeln handlar om att arbeta med resursfiler.

SupportedCultures och SupportedUICultures

ASP.NET Core har två samlingar med kulturvärden och SupportedCulturesSupportedUICultures. Objektet CultureInfo för SupportedCultures avgör resultatet av kulturberoende funktioner, till exempel datum, tid, tal och valutaformatering. SupportedCultures bestämmer också sorteringsordningen för text, höljekonventioner och strängjämförelser. Se StringComparer.CurrentCulture för mer information om hur servern hämtar kulturen. Det SupportedUICultures avgör vilka översatta strängar (från .resx-filer) som letas upp av ResourceManager. Den ResourceManager söker helt enkelt upp kulturspecifika strängar som bestäms av CurrentUICulture. Varje tråd i .NET har CurrentCulture och CurrentUICulture objekt. ASP.NET Core inspekterar dessa värden när kulturberoende funktioner återges. Om den aktuella trådens kultur till exempel är inställd på "en-US" (engelska, USA), DateTime.Now.ToLongDateString() visas "Torsdag, 18 februari 2016", men om CurrentCulture är inställt på "es-ES" (spanska, Spanien) kommer utdata att vara "jueves, 18 de febrero de 2016".

Resursfiler

En resursfil är en användbar mekanism för att skilja lokala strängar från kod. Översatta strängar för det icke-standardspråket är isolerade i .resx-resursfiler . Du kanske till exempel vill skapa en spansk resursfil med namnet Welcome.es.resx som innehåller översatta strängar. "es" är språkkoden för spanska. Så här skapar du den här resursfilen i Visual Studio:

  1. Högerklicka på mappen som ska innehålla resursfilen i Solution Explorer och välj sedan Lägg till>nytt objekt.

    Kapslad snabbmeny: I Solution Explorer är en snabbmeny öppen för Resurser. En andra snabbmeny är öppen för Lägg till som visar kommandot Nytt objekt markerat.

  2. I rutan Sök installerade mallar anger du "resurs" och namnger filen.

    Dialogrutan Lägg till nytt objekt

  3. Ange nyckelvärdet (ursprunglig sträng) i kolumnen Namn och den översatta strängen i kolumnen Värde .

    Welcome.es.resx-fil (välkomstresursfilen för spanska) med ordet Hello i kolumnen Namn och ordet Hola (Hello på spanska) i kolumnen Värde

    Visual Studio visar filen Welcome.es.resx .

    Solution Explorer som visar resursfilen Welcome Spanish (es)

Namn på resursfil

Resurser namnges efter klassens fullständiga typnamn minus sammansättningsnamnet. Till exempel skulle en fransk resurs i ett projekt vars huvudsammansättning är LocalizationWebsite.Web.dll för klassen LocalizationWebsite.Web.Startup ha namnet Startup.fr.resx. En resurs för klassen LocalizationWebsite.Web.Controllers.HomeController skulle ha namnet Controllers.HomeController.fr.resx. Om målklassens namnområde inte är samma som sammansättningsnamnet behöver du det fullständiga typnamnet. I exempelprojektet skulle till exempel en resurs för typen ExtraNamespace.Tools ha namnet ExtraNamespace.Tools.fr.resx.

I exempelprojektet sätter ConfigureServices metoden ResourcesPath till "Resurser", så den projektrelativa sökvägen för home controllerns franska resursfil är Resources/Controllers.HomeController.fr.resx. Du kan också använda mappar för att ordna resursfiler. För hemstyrenheten skulle sökvägen vara Resurser/Styrenheter/HomeController.fr.resx. Om du inte använder ResourcesPath alternativet går .resx-filen i projektbaskatalogen. Resursfilen för HomeController skulle ha namnet Controllers.HomeController.fr.resx. Valet mellan att använda punkt- eller sökvägsnamngivningskonvention beror på hur du vill organisera dina resursfiler.

Resursnamn Namngivning av punkt eller sökväg
Resources/Controllers.HomeController.fr.resx Punkt
Resurser/styrenheter/HomeController.fr.resx Väg

Resursfiler som använder @inject IViewLocalizer i Razor vyer följer ett liknande mönster. Resursfilen för en vy kan namnges med antingen punktnamngivning eller sökvägsnamngivning. Razor visa resursfiler som motsvarar sökvägen för deras associerade vyfil. Förutsatt att vi anger ResourcesPath till "Resurser" kan den franska resursfilen som är associerad med Views/Home/About.cshtml vyn vara något av följande:

  • Resurser/vyer/Home/About.fr.resx

  • Resurser/vyer.Home. About.fr.resx

Om du inte använder ResourcesPath alternativet finns .resx-filen för en vy i samma mapp som vyn.

RootNamespaceAttribute

Attributet RootNamespaceAttribute tillhandahåller rotnamnområdet för en sammansättning när rotnamnområdet för en sammansättning skiljer sig från sammansättningsnamnet.

Varning

Detta kan inträffa när ett projekts namn inte är en giltig .NET-identifierare. Till exempel my-project-name.csproj använder rotnamnområdet my_project_name och sammansättningsnamnet my-project-name som leder till det här felet.

Om rotnamnområdet för en sammansättning skiljer sig från sammansättningsnamnet:

  • Lokalisering fungerar inte som standard.
  • Lokaliseringen fungerar inte på grund av hur resurser söks inom mjukvarupaketet. RootNamespace är ett byggtidsvärde som inte är tillgängligt för den körande processen.

Om RootNamespace skiljer sig från AssemblyName inkluderar du följande i AssemblyInfo.cs (med parametervärden ersatta med de faktiska värdena):

using System.Reflection;
using Microsoft.Extensions.Localization;

[assembly: ResourceLocation("Resource Folder Name")]
[assembly: RootNamespace("App Root Namespace")]

Föregående kod möjliggör en lyckad lösning av resx-filer.

Kulturåterställningsbeteende

När du söker efter en resurs ägnar sig lokaliseringen åt "kulturåterställning". Från den begärda kulturen, om den inte hittas, återgår den till dess överordnade kultur. Som en sidenote representerar egenskapen CultureInfo.Parent den överordnade kulturen. Detta innebär vanligtvis (men inte alltid) att ta bort det nationella kännetecknet ur språk- och kulturkoden. Till exempel är dialekten av spanska som talas i Mexiko "es-MX". Det har det överordnade "es"—spanska, inte specifik för något land.

Anta att din webbplats får en begäran om en "Välkommen"-resurs med hjälp av kulturfr-CA. Lokaliseringssystemet söker efter följande resurser i ordning och väljer den första matchningen:

  • Välkommen.fr-CA.resx
  • Welcome.fr.resx
  • Welcome.resx (om NeutralResourcesLanguage är "fr-CA")

Om du till exempel tar bort kulturdesignatorn ".fr" och har kulturen inställd på franska, läss standardresursfilen och strängar lokaliseras. Resurshanteraren anger en standard- eller återställningsresurs för när ingenting uppfyller den begärda kulturen. Om du bara vill returnera nyckeln när du saknar en resurs för den begärda kulturen får du inte ha någon standardresursfil.

Generera resursfiler med Visual Studio

Om du skapar en resursfil i Visual Studio utan kultur i filnamnet (till exempel Welcome.resx) skapar Visual Studio en C#-klass med en egenskap för varje sträng. Det är vanligtvis inte vad du vill ha med ASP.NET Core. Du har vanligtvis ingen .resx-standardresursfil (en .resx-fil utan kulturnamnet). Vi föreslår att du skapar .resx-filen med ett kulturnamn (till exempel Welcome.fr.resx). När du skapar en .resx-fil med ett kulturnamn genererar Inte Visual Studio klassfilen.

Lägga till andra kulturer

Varje språk- och kulturkombination (förutom standardspråket) kräver en unik resursfil. Du skapar resursfiler för olika kulturer och nationella inställningar genom att skapa nya resursfiler där språkkoderna ingår i filnamnet (till exempel en-us, fr-caoch en-gb). Dessa koder placeras mellan filnamnet och filtillägget .resx , som i Välkommen.es-MX.resx (spanska/Mexiko).

Nästa steg

När du lokaliserar en app ingår även följande uppgifter:

Ytterligare resurser