Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Lokalisering är en process för att anpassa en app för att uppfylla de specifika språk- eller kulturella kraven på en målmarknad. För att lokalisera en app kan dess text och bilder behöva översättas till flera språk. En lokaliserad app visar automatiskt översatt text baserat på enhetens kulturinställningar.
.NET innehåller en mekanism för att lokalisera appar med hjälp av resursfiler. En resursfil lagrar text och annat innehåll som namn/värde-par som gör att appen kan hämta innehåll för en angivet nyckel. Med resursfiler kan lokaliserat innehåll separeras från appkod. Förutom att lagra text kan resursfiler även lagra bilder och binära data. Enheter har dock en mängd olika skärmstorlekar och tätheter och varje plattform har funktioner för att visa densitetsberoende bilder. Därför bör plattformsfunktioner användas för att lokalisera avbildningar i stället för att lagra dem i resursfiler.
Om du vill lokalisera en .NET Multi-Platform App UI-app (.NET MAUI) bör du:
- Skapa resursfiler för att lagra strängar. Mer information finns i Skapa resursfiler för att lagra strängar.
- Ange appens neutrala språk. Mer information finns i Ange appens neutrala språk.
- Utför plattformskonfiguration. Mer information finns i Utföra plattformskonfiguration.
- Utför VS Code-konfiguration. Mer information finns i Konfigurera VSCode.
- Localize text. Mer information finns i Lokalisera text.
- Localize images. Mer information finns i Lokalisera bilder.
- Lokalisera appnamnet. Mer information finns i Lokalisera appnamnet.
- Test localization. Mer information finns i Testa lokalisering.
Dessutom kan layoutriktningen för en app anges. Mer information finns i lokalisering från höger till vänster.
Skapa resursfiler för att lagra strängar
.NET-resursfiler är XML-filer med ett .resx-tillägg som kompileras till binära resursfiler (.resources) under byggprocessen. En lokaliserad app innehåller vanligtvis en standardresursfil med alla strängar som används i appen och resursfiler för varje språk som stöds.
Resursfiler innehåller följande information för varje objekt:
- Namnet anger den nyckel som används för att komma åt texten i koden.
- Värdet anger den översatta texten.
- Kommentar är ett valfritt fält som innehåller ytterligare information.
Du kan lägga till en resursfil i dialogrutan Lägg till nytt objekt i Visual Studio:
När filen har lagts till kan rader läggas till för varje textresurs:
Listrutan Åtkomstmodifierare avgör hur Visual Studio genererar klassen som används för att komma åt resurser. Om du ställer in åtkomstmodifieraren på Offentlig eller Intern resulterar det i en genererad klass med den angivna hjälpmedelsnivån. Om du anger Åtkomstmodifieraren till Ingen kodgenerering genereras inte en klassfil. Standardresursfilen ska konfigureras för att generera en klassfil, vilket resulterar i en fil med . Designer.cs tillägg som läggs till i projektet.
När standardresursfilen har skapats kan ytterligare filer skapas för varje språk som appen stöder. Varje ytterligare resursfil bör ha samma rotfilnamn som standardresursfilen, men bör även innehålla språket och den valfria kulturen i filnamnet. Om du till exempel lägger till en resursfil med namnet AppResources.resx kan du också skapa resursfiler med namnet AppResources.en-US.resx och AppResources.fr-FR.resx för att lagra lokaliserade resurser för kulturerna engelska (USA) respektive franska (Frankrike). Dessutom bör du ange åtkomstmodifieraren för varje ytterligare resursfil till Ingen kodgenerering.
Vid körningen försöker appen lösa en resursbegäran i ordning efter specificitet. Om enhetskulturen till exempel är en-US söker programmet efter resursfiler i den här ordningen:
- AppResources.en-US.resx
- AppResources.en.resx
- AppResources.resx (default)
Följande skärmbild visar en spansk översättningsfil med namnet AppResources.es.resx:
Den lokaliserade resursfilen använder samma namnvärden som anges i standardfilen men innehåller spanska språksträngar i kolumnen Värde . Dessutom är åtkomstmodifieraren inställd på Ingen kodgenerering.
Ange appens neutrala språk
För att .NET-resursfiler ska fungera korrekt måste appen ha ett neutralt språk angivet. Det här är det språk vars resurser används om det inte går att hitta resurser för ett språk. Så här anger du det neutrala språket:
Högerklicka på ditt .NET MAUI-appprojekt i Solution Explorer och välj Egenskaper.
Välj egenskapssidan Paket > allmänt och välj lämpligt språk och kultur i listrutan Sammansättningsneutralt språk :
Spara ändringarna.
Du kan också lägga till elementet <NeutralLanguage> i den första <PropertyGroup> i projektfilen och ange det valda språket som dess värde:
<NeutralLanguage>en-US</NeutralLanguage>
Warning
Om du inte anger ett neutralt språk ResourceManager returnerar null klassen värden för alla språk utan en resursfil. När ett neutralt språk anges ResourceManager returnerar klassen resultat från resursfilen för neutralt språk för språk som inte stöds. Därför rekommenderar vi att du alltid anger ett neutralt språk så att text visas för språk som inte stöds.
Utföra plattformskonfiguration
Ytterligare installation krävs på iOS, Mac Catalyst och Windows, så att alla .NET MAUI-kontroller lokaliseras.
iOS och Mac Catalyst
På iOS och Mac Catalyst måste du deklarera alla språk som stöds i plattformens Info.plist-fil i ditt .NET MAUI-appprojekt. Det gör du genom att öppna filen Info.plist för din valda plattform i en XML-redigerare och skapa en matris för CFBundleLocalizations nyckeln. Ange sedan matrisvärden som motsvarar resursfilerna. Se dessutom till att du anger ett förväntat språk via CFBundleDevelopmentRegion nyckeln:
<key>CFBundleLocalizations</key>
<array>
<string>de</string>
<string>es</string>
<string>fr</string>
<string>ja</string>
<string>pt</string> <!-- Brazil -->
<string>pt-PT</string> <!-- Portugal -->
<string>ru</string>
<string>zh-Hans</string>
<string>zh-Hant</string>
</array>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
I Solution Explorer i Visual Studio kan du också öppna filen Info.plist för din valda plattform i Redigeraren för allmän PList. Skapa sedan en matris för CFBundleLocalizations nyckeln och ange matrisvärden som motsvarar resursfilerna. Se dessutom till att du anger ett förväntat språk via CFBundleDevelopmentRegion nyckeln:
Mer information om filen Info.plist finns i Informationsegenskapslista.
Windows
Om du vill ha stöd för flera språk i en .NET MAUI-app i Windows måste du deklarera varje språk som stöds i filen Platforms\Windows\Package.appxmanifest i ditt .NET MAUI-appprojekt:
Öppna filen Package.appxmanifest i en textredigerare och leta upp följande avsnitt:
<Resources> <Resource Language="x-generate"/> </Resources>Ersätt
<Resource Language="x-generate">med<Resource />element för vart och ett av de språk som stöds:<Resources> <Resource Language="en-US"/> <Resource Language="de-DE"/> <Resource Language="es-ES"/> <Resource Language="fr-FR"/> <Resource Language="ja-JP"/> <Resource Language="pt-BR"/> <Resource Language="pt-PT"/> <Resource Language="ru-RU"/> <Resource Language="zh-CN"/> <Resource Language="zh-TW"/> </Resources>Spara ändringarna.
Konfiguration av VS-kod
AppResource-filen genereras i DesignTimeBuild Visual Studio. VS Code kör inte det jobbet, så för att generera AppResource-filerna kan du lägga till följande instruktioner i .csproj
<ItemGroup>
<EmbeddedResource Update="Resources\Localization\AppResources.resx">
<Generator>MSBuild:Compile</Generator>
<StronglyTypedLanguage>CSharp</StronglyTypedLanguage>
<StronglyTypedNamespace>MauiApp.Resources.Localization</StronglyTypedNamespace>
<StronglyTypedFileName>$(IntermediateOutputPath)\Resource.Designer.cs</StronglyTypedFileName>
<StronglyTypedClassName>AppResources</StronglyTypedClassName>
</EmbeddedResource>
<Compile Include="$(IntermediateOutputPath)\Resource.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>false</DesignTime>
<DependentUpon>Resources\Localization\AppResources.resx</DependentUpon>
</Compile>
</ItemGroup>
Det finns två delar i detta. Den första ansvarar för att generera en C#-fil för (EmbeddedResource) och den andra ansvarar för resx att lägga till den genererade filen i kompilering (Compile), så att projektet kan använda den.
Från delen EmbeddedResource :
- Egenskapen
UpdatepåEmbeddedResourcemåste återspegla sökvägen till filenresx - Egenskapen
StronglyTypedNamespacemåste återspegla sökvägen förresxfilen i lösningen - Egenskapen
StronglyTypedFileNameanger sökvägen till där filen ska genereras. I vårt exempel genereras den iobjmappen
Från delen Compile :
- Egenskapen
Includemåste återspegla den genererade sökvägen för filenresx(samma somStronglyTypedFileName)
Localize text
Text lokaliseras med hjälp av en klass som genereras från din standardresursfil. Klassen namnges baserat på standardresursfilens namn. Med ett standardresursfilnamn för AppResources.resx genererar Visual Studio en matchande klass med namnet AppResources som innehåller statiska egenskaper för varje post i resursfilen.
I XAML kan lokaliserad text hämtas med hjälp av markeringstillägget x:Static för att få åtkomst till de genererade statiska egenskaperna:
<ContentPage ...
xmlns:strings="clr-namespace:LocalizationDemo.Resources.Strings">
<VerticalStackLayout>
<Label Text="{x:Static strings:AppResources.NotesLabel}" />
<Entry Placeholder="{x:Static strings:AppResources.NotesPlaceholder}" />
<Button Text="{x:Static strings:AppResources.AddButton}" />
</VerticalStackLayout>
</ContentPage>
Mer information om markeringstillägget finns i x:Staticx:Static Markup extension (X:Static Markup Extension).
Lokaliserad text kan också hämtas i kod:
Label notesLabel = new Label();
notesLabel.Text = AppResources.NotesLabel,
Entry notesEntry = new Entry();
notesEntry.Placeholder = AppResources.NotesPlaceholder,
Button addButton = new Button();
addButton.Text = AppResources.AddButton,
Egenskaperna i AppResources klassen använder egenskapsvärdet CurrentUICulture för att avgöra vilken resursfil som värden ska hämtas från.
Localize images
Förutom att lagra text kan resursfiler även lagra bilder och binära data. Enheter har dock en mängd olika skärmstorlekar och tätheter och varje plattform har funktioner för att visa densitetsberoende bilder. Därför bör plattformsfunktioner användas för att lokalisera avbildningar i stället för att lagra dem i resursfiler.
Android
På Android lagras lokaliserade bilder, så kallade ritabara filer, med hjälp av en mappbaserad namngivningskonvention i mappen Plattformar\Android\Resources . Mappar bör namnges ritabara med ett suffix för språket och kulturen. Till exempel heter mappen spanish-language drawable-es. Mappnamnet som kan ritas ska innehålla bilderna för ditt standardspråk och din kultur. Byggåtgärden för varje avbildning ska anges till AndroidResource.
Note
I stället för att ange enskilda filer till AndroidResource-byggåtgärden kan innehållet i en specifik mapp anges till den här byggåtgärden genom att lägga till följande XML i appens projektfil (.csproj):
<ItemGroup Condition="$(TargetFramework.Contains('-android'))">
<AndroidResource Include="Platforms\Android\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>
I det här exemplet anges allt innehåll i mappen Platforms\Android\Resources , inklusive innehåll i undermappar, till AndroidResource-byggåtgärden . Den anger också utdatasökvägen för varje fil med den här byggåtgärden.
Endast två tecken krävs i mappnamnet när du anger ett toppnivåspråk, till exempel es. Men när du anger ett fullständigt språk kräver mappnamnsformatet ett bindestreck och gemener r för att skilja språket från kulturen. Mappen Mexico locale (es-MX) bör till exempel ha namnet drawable-es-rMX. Avbildningsfilnamnen i varje språkmapp bör vara identiska:
iOS
I iOS lagras lokaliserade bilder med hjälp av en mappbaserad namngivningskonvention i mappen Plattformar\iOS\Resurser . Mappar bör namnges med språket och valfri kultur följt av .lproj. Till exempel heter mappen spanish-language es.lproj. Byggåtgärden för varje avbildning ska anges till BundleResource.
Note
I stället för att ange enskilda filer till bundleresource-byggåtgärden kan innehållet i en specifik mapp anges till den här byggåtgärden genom att lägga till följande XML i appens projektfil (.csproj):
<ItemGroup Condition="$(TargetFramework.Contains('-ios'))">
<BundleResource Include="Platforms\iOS\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>
I det här exemplet anges allt innehåll i mappen Platforms\iOS\Resources , inklusive innehåll i undermappar, till åtgärden BundleResource build. Den anger också utdatasökvägen för varje fil med den här byggåtgärden.
Endast två tecken krävs i mappnamnet när du anger ett toppnivåspråk, till exempel es. När du anger ett fullständigt språk kräver dock mappnamnsformatet ett bindestreck för att skilja språket från kulturen. Mappen Mexico locale (es-MX) bör till exempel ha namnet es-MX.lproj. Avbildningsfilnamnen i varje språkmapp bör vara identiska:
Om en avbildning inte finns för ett visst språk återgår iOS till standardmappen för inbyggt språk och läser in avbildningen därifrån.
Mac Catalyst
På Mac Catalyst lagras lokaliserade bilder med hjälp av en mappbaserad namngivningskonvention i mappen Platforms\MacCatalyst\Resources . Mappar bör namnges med språket och valfri kultur följt av .lproj. Till exempel heter mappen spanish-language es.lproj. Byggåtgärden för varje avbildning ska anges till BundleResource.
Note
I stället för att ange enskilda filer till bundleresource-byggåtgärden kan innehållet i en specifik mapp anges till den här byggåtgärden genom att lägga till följande XML i appens projektfil (.csproj):
<ItemGroup Condition="$(TargetFramework.Contains('-maccatalyst'))">
<BundleResource Include="Platforms\MacCatalyst\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>
I det här exemplet anges allt innehåll i mappen Platforms\MacCatalyst\Resources , inklusive innehåll i undermappar, till åtgärden BundleResource build. Den anger också utdatasökvägen för varje fil med den här byggåtgärden.
Endast två tecken krävs i mappnamnet när du anger ett toppnivåspråk, till exempel es. När du anger ett fullständigt språk kräver dock mappnamnsformatet ett bindestreck för att skilja språket från kulturen. Mappen Mexico locale (es-MX) bör till exempel ha namnet es-MX.lproj. Avbildningsfilnamnen i varje språkmapp bör vara identiska:
Om en avbildning inte finns för ett visst språk återgår Mac Catalyst till standardmappen för inbyggt språk och läser in avbildningen därifrån.
Windows
I Windows lagras lokaliserade avbildningar med hjälp av en mappbaserad namngivningskonvention i mappen Platforms\Windows\Assets\Images . Mappar ska namnges med språket och valfri kultur. Den spanskspråkiga mappen heter till exempel es och mappen Mexico locale ska ha namnet es-MX. Byggåtgärden för varje avbildning ska vara inställd på Innehåll.
Note
I stället för att ange enskilda filer till åtgärden Innehållsskapande kan innehållet i en specifik mapp anges till den här byggåtgärden genom att lägga till följande XML i appens projektfil (.csproj):
<ItemGroup Condition="$(TargetFramework.Contains('-windows'))">
<Content Include="Platforms\Windows\Assets\Images\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>
I det här exemplet anges allt innehåll i mappen Platforms\Windows\Assets\Images , inklusive innehåll i undermappar, till åtgärden Skapa innehåll . Den anger också utdatasökvägen för varje fil med den här byggåtgärden.
Endast två tecken krävs i mappnamnet när du anger ett toppnivåspråk, till exempel es. När du anger ett fullständigt språk kräver dock mappnamnsformatet ett bindestreck för att skilja språket från kulturen. Mappen Mexico locale (es-MX) bör till exempel ha namnet es-MX. Avbildningsfilnamnen i varje språkmapp bör vara identiska:
Använda lokaliserade avbildningar
På Android, iOS, Mac Catalyst och Windows kan lokaliserade avbildningar användas genom att ange Source egenskapen för en Image till bildfilnamnet:
<Image Source="flag.png" />
För att detta ska fungera i Windows är det dock nödvändigt att ändra appens projektfil om du har lagt till ett <Content /> MSBuild-objekt för varje lokaliserad avbildning. Detta kan du göra genom att ändra .csproj-filen för att ta bort <Content /> MSBuild-objektet för varje bild. Lägg sedan till följande MSBuild-objekt:
<ItemGroup Condition="$(TargetFramework.Contains('-windows'))">
<Content Include="Platforms\Windows\Assets\Images\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>
Detta säkerställer att alla bilder i undermapparna i mappen Platforms\Windows\Assets\Images kopieras till roten i apppaketet.
Lokalisera appnamnet
Plattformsfunktioner krävs för att lokalisera appens namn.
Android
På Android kan det lokaliserade appnamnet lagras med hjälp av en mappbaserad namngivningskonvention i mappen Plattformar\Android\Resources . Mappar bör namnges med ett suffix för språket och kulturen. Till exempel heter mappen spanish-language values-es. Lägg till en Strings.xml fil med en byggåtgärd av AndroidResource till varje mapp som anger en sträng till det lokaliserade appnamnet.
Note
I stället för att ange enskilda filer till AndroidResource-byggåtgärden kan innehållet i en specifik mapp anges till den här byggåtgärden genom att lägga till följande XML i appens projektfil (.csproj):
<ItemGroup Condition="$(TargetFramework.Contains('-android'))">
<AndroidResource Include="Platforms\Android\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>
I det här exemplet anges allt innehåll i mappen Platforms\Android\Resources , inklusive innehåll i undermappar, till AndroidResource-byggåtgärden . Den anger också utdatasökvägen för varje fil med den här byggåtgärden.
Endast två tecken krävs i mappnamnet när du anger ett toppnivåspråk, till exempel es. Men när du anger ett fullständigt språk kräver mappnamnsformatet ett bindestreck och gemener r för att skilja språket från kulturen. Mappen Mexico locale (es-MX) bör till exempel ha namnet values-es-rMX.
Varje översättningsbar sträng är ett XML-element med resurs-ID som anges som name attribut och den översatta strängen som värde. Du måste fly från strängen name enligt vanliga XML-regler och måste vara ett giltigt Android-resurs-ID (inga blanksteg eller bindestreck).
För att lokalisera appnamnet skapar du därför en Strings.xml fil och lägger till ett <string> element som underordnat till ett <resources> element. Ange sedan dess name attribut till ett lämpligt ID med den översatta strängen som värde:
<resources>
<!-- French -->
<string name="app_name">Maison</string>
</resources>
Om du sedan vill använda det lokaliserade appnamnet i appen lägger du sedan till LabelActivity egenskapen i klassen i din app MainActivity och anger dess värde till @string/id:
[Activity(Label = "@string/app_name", Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
public class MainActivity : MauiAppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
}
}
iOS
I iOS lagras det lokaliserade appnamnet med hjälp av en mappbaserad namngivningskonvention i mappen Plattformar\iOS\Resurser . Mappar bör namnges med språket och valfri kultur följt av .lproj. Till exempel heter mappen spanish-language es.lproj. Lägg till en InfoPlist.strings-fil med en byggåtgärd av BundleResource till varje mapp som anger CFBundleDisplayName nyckeln och värdet.
Note
I stället för att ange enskilda filer till bundleresource-byggåtgärden kan innehållet i en specifik mapp anges till den här byggåtgärden genom att lägga till följande XML i appens projektfil (.csproj):
<ItemGroup Condition="$(TargetFramework.Contains('-ios'))">
<BundleResource Include="Platforms\iOS\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>
I det här exemplet anges allt innehåll i mappen Platforms\iOS\Resources , inklusive innehåll i undermappar, till åtgärden BundleResource build. Den anger också utdatasökvägen för varje fil med den här byggåtgärden.
Syntaxen för lokaliserade strängvärden är:
/* comment */
"key"="localized-value";
Du bör undvika följande tecken i strängar:
-
\"citera -
\\omvänt snedstreck -
\nNewline
För att lokalisera appnamnet skapar du därför en InfoPlist.strings-fil och lägger till ett värde för CFBundleDisplayName nyckeln i filen:
/* French */
CFBundleDisplayName="Maisons";
Andra nycklar som du kan använda för att lokalisera appspecifika strängar är:
-
CFBundleName– anger det korta namnet på apppaketet, som kan visas för användare i situationer som avsaknad av ett värde förCFBundleDisplayName. -
CFBundleShortVersionString– anger versionsnumret för apppaketet. -
NSHumanReadableCopyright– upphovsrättsmeddelandet för apppaketet.
Mac Catalyst
På Mac Catalyst lagras det lokaliserade appnamnet med hjälp av en mappbaserad namngivningskonvention i mappen Platforms\MacCatalyst\Resources . Mappar bör namnges med språket och valfri kultur följt av .lproj. Till exempel heter mappen spanish-language es.lproj. Lägg till en InfoPlist.strings-fil med en byggåtgärd av BundleResource till varje mapp som anger CFBundleDisplayName nyckeln och värdet.
Note
I stället för att ange enskilda filer till bundleresource-byggåtgärden kan innehållet i en specifik mapp anges till den här byggåtgärden genom att lägga till följande XML i appens projektfil (.csproj):
<ItemGroup Condition="$(TargetFramework.Contains('-maccatalyst'))">
<BundleResource Include="Platforms\MacCatalyst\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>
I det här exemplet anges allt innehåll i mappen Platforms\MacCatalyst\Resources , inklusive innehåll i undermappar, till åtgärden BundleResource build. Den anger också utdatasökvägen för varje fil med den här byggåtgärden.
Syntaxen för lokaliserade strängvärden är:
/* comment */
"key"="localized-value";
Du bör undvika följande tecken i strängar:
-
\"citera -
\\omvänt snedstreck -
\nNewline
För att lokalisera appnamnet skapar du därför en InfoPlist.strings-fil och lägger till ett värde för CFBundleDisplayName nyckeln i filen:
/* French */
CFBundleDisplayName="Maisons";
Andra nycklar som du kan använda för att lokalisera appspecifika strängar är:
-
CFBundleName– anger det korta namnet på apppaketet, som kan visas för användare i situationer som frånvaro av ett värde förCFBundleDisplayName. -
CFBundleShortVersionString– anger versionsnumret för apppaketet. -
NSHumanReadableCopyright– upphovsrättsmeddelandet för apppaketet.
Windows
I Windows definieras appnamnet i apppaketmanifestet. När du lokaliserar appnamnet måste du först ange standardspråket för appen och sedan skapa en strängresursfil för varje språk som du tänker stödja. Strängresursen som representerar det lokaliserade appnamnet kan sedan användas i apppaketmanifestet med hjälp ms-resource av URI-schemat.
Mer information om hur du lokaliserar strängar i apppaketmanifestet finns i Lokalisera strängar i gränssnittet och apppaketmanifestet.
Ange standardspråket
Om du vill lokalisera ett appnamn måste windowsappen först ha ett angivet standardspråk. Det här är det språk vars resurser används om det inte finns några lokaliserade resurser för ett visst språk. Så här anger du standardspråket:
Öppna filen Packageappxmanifest i paketmanifestredigeraren i Solution Explorer.
I paketmanifestredigeraren går du till fliken Program och anger fältet Standardspråk till det valda standardspråket:
Spara ändringarna.
Du måste minst ange en strängresurs för appnamnet för standardspråket. Det här är den resurs som läses in om det inte går att hitta någon bättre matchning för användarens önskade språk- eller visningsspråkinställningar.
Skapa Windows-resursfiler
I Windows ska det lokaliserade appnamnet lagras i en Windows-resursfil för varje språk. En Windows-resursfil är en XML-fil med ett .resw-tillägg som kompileras till ett binärt format och lagras i en .pri-fil . .resw-filen för varje språk bör ha namnet Resources.resw och lagras med hjälp av en mappbaserad namngivningskonvention i mappen Platforms\Windows\Strings. Mappar ska namnges med språket och valfri kultur. Den spanskspråkiga mappen heter till exempel es och mappen Mexico locale ska ha namnet es-MX.
Det finns för närvarande ingen Visual Studio-objektmall för att skapa en Windows-resursfil i en .NET MAUI-app. För att skapa en Windows-resursfil för varje språkvariant:
I mappen Platforms\Windows i ditt .NET MAUI-appprojekt skapar du en mapp med strängar .
I mappen Strängar skapar du en mapp för varje språk.
Skapa en fil med namnet Resources.resw som innehåller följande XML i mappen för varje språkvariant:
<?xml version="1.0" encoding="utf-8"?> <root> <!-- Microsoft ResX Schema Version 2.0 The primary goals of this format is to allow a simple XML format that is mostly human readable. The generation and parsing of the various data types are done through the TypeConverter classes associated with the data types. Example: ... ado.net/XML headers & schema ... <resheader name="resmimetype">text/microsoft-resx</resheader> <resheader name="version">2.0</resheader> <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> <value>[base64 mime encoded serialized .NET Framework object]</value> </data> <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> <comment>This is a comment</comment> </data> There are any number of "resheader" rows that contain simple name/value pairs. Each data row contains a name, and value. The row also contains a type or mimetype. Type corresponds to a .NET class that support text/value conversion through the TypeConverter architecture. Classes that don't support this are serialized and stored with the mimetype set. The mimetype is used for serialized objects, and tells the ResXResourceReader how to depersist the object. This is currently not extensible. For a given mimetype the value must be set accordingly: Note - application/x-microsoft.net.object.binary.base64 is the format that the ResXResourceWriter will generate, however the reader can read any of the formats listed below. mimetype: application/x-microsoft.net.object.binary.base64 value : The object must be serialized with : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.soap.base64 value : The object must be serialized with : System.Runtime.Serialization.Formatters.Soap.SoapFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.bytearray.base64 value : The object must be serialized into a byte array : using a System.ComponentModel.TypeConverter : and then encoded with base64 encoding. --> <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> <xsd:element name="root" msdata:IsDataSet="true"> <xsd:complexType> <xsd:choice maxOccurs="unbounded"> <xsd:element name="metadata"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" /> </xsd:sequence> <xsd:attribute name="name" use="required" type="xsd:string" /> <xsd:attribute name="type" type="xsd:string" /> <xsd:attribute name="mimetype" type="xsd:string" /> <xsd:attribute ref="xml:space" /> </xsd:complexType> </xsd:element> <xsd:element name="assembly"> <xsd:complexType> <xsd:attribute name="alias" type="xsd:string" /> <xsd:attribute name="name" type="xsd:string" /> </xsd:complexType> </xsd:element> <xsd:element name="data"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> <xsd:attribute ref="xml:space" /> </xsd:complexType> </xsd:element> <xsd:element name="resheader"> <xsd:complexType> <xsd:sequence> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> </xsd:sequence> <xsd:attribute name="name" type="xsd:string" use="required" /> </xsd:complexType> </xsd:element> </xsd:choice> </xsd:complexType> </xsd:element> </xsd:schema> <resheader name="resmimetype"> <value>text/microsoft-resx</value> </resheader> <resheader name="version"> <value>2.0</value> </resheader> <resheader name="reader"> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <resheader name="writer"> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> </root>Note
Windows-resursfiler använder en byggåtgärd av
PRIResource. Den här byggåtgärden behöver inte ställas in på varje .resw-fil i en .NET MAUI-app, eftersom den tillämpas implicit.Öppna varje Resources.resw-fil och lägg till en strängresurs som representerar appens namn:
Note
Resursidentifierare är skiftlägesokänsliga och måste vara unika per resursfil.
Spara varje Windows-resursfil.
Ett exempel på den nödvändiga mappen och filstrukturen visas på följande skärmbild:
Använda det lokaliserade appnamnet
Strängresursen som representerar det lokaliserade appnamnet kan användas med hjälp ms-resource av URI-schemat:
Öppna filen Packageappxmanifest i paketmanifestredigeraren i Solution Explorer.
I paketmanifestredigeraren går du till fliken Program och anger fältet Visningsnamn till
ms-resource:följt av namnet på strängresursen som identifierar appnamnet:
Spara ändringarna.
Important
Om dina .resw-filer lagras i en annan sammansättning än ditt .NET MAUI-appprojekt måste du ange en fullständigt kvalificerad sökväg till resursnamnet. Detta använder formatet ms-resource:Assembly/ResourceFilename/Resource.
Right-to-left localization
Flödesriktning, eller layoutriktning, är den riktning i vilken användargränssnittselementen på sidan genomsöks av ögat. Vissa språk, till exempel arabiska och hebreiska, kräver att gränssnittselement anges i flödesriktning från höger till vänster. .NET MAUI-appar respekterar automatiskt enhetens flödesriktning baserat på det valda språket och regionen. Information om hur du hämtar enhetens flödesriktning, baserat på dess nationella inställningar, finns i Hämta layoutriktningen.
Om du vill åsidosätta flödesriktningen för en app anger du egenskapen Window.FlowDirection . Du kan också ange egenskapen VisualElement.FlowDirection per element. Dessa egenskaper får eller anger i vilken riktning gränssnittselement flödar inom ett överordnat element som styr layouten och ska anges till något av FlowDirection uppräkningsvärdena:
LeftToRightRightToLeftMatchParent
Om du ställer in egenskapen FlowDirectionRightToLeft på på ett element anges justeringen till höger, läsordningen till höger till vänster och layouten för kontrollen som ska flöda från höger till vänster.
Warning
Om du FlowDirection ändrar egenskapen vid körningen blir det en dyr layoutprocess som påverkar prestandan.
FlowDirection Standardegenskapsvärdet för ett element är MatchParent. Därför ärver ett element egenskapsvärdet FlowDirection från dess överordnade i det visuella trädet, och alla element kan åsidosätta det värde det får från dess överordnade.
Tip
Om du behöver ändra flödesriktningen anger du FlowDirection egenskapen i ett fönster, en sida eller en rotlayout. Detta gör att alla element i appen, sidan eller rotlayouten svarar korrekt på flödesriktningen.
Platform setup
Specifik plattformskonfiguration krävs för att aktivera nationella inställningar från höger till vänster.
Android
Appar som skapats med hjälp av .NET MAUI-appprojektmallen innehåller automatiskt stöd för nationella inställningar från höger till vänster. Det här stödet aktiveras av attributet android:supportsRtl som anges till true på <application> noden i appens AndroidManifest.xml-fil :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application ... android:supportsRtl="true" />
...
</manifest>
Lokalisering från höger till vänster kan sedan testas genom att ändra enheten eller emulatorn så att den använder språket från höger till vänster. Om du har aktiverat utvecklaralternativ i appen Inställningar kan du också aktivera Tvinga RTL-layoutriktning i Inställningar > – utvecklingsalternativ. Information om hur du konfigurerar utvecklingsalternativ finns i Konfigurera utvecklaralternativ på enheten på developer.android.com.
iOS och Mac Catalyst
Det språk som krävs från höger till vänster ska läggas till som ett språk som stöds i matrisobjekten CFBundleLocalizations för nyckeln i Info.plist. I följande exempel visas arabiska som har lagts till i matrisen CFBundleLocalizations för nyckeln:
<key>CFBundleLocalizations</key>
<array>
<string>en</string>
<string>ar</string>
</array>
Lokalisering från höger till vänster kan sedan testas genom att ändra språket och regionen på enheten eller simulatorn till ett språk från höger till vänster som angavs i Info.plist.
Windows
De språkresurser som krävs ska anges i noden i <Resources> filen Package.appxmanifest . Ersätt <Resource Language="x-generate"> med <Resource /> element för vart och ett av de språk som stöds. Följande markering anger till exempel att "en" och "ar" lokaliserade resurser är tillgängliga:
<Resources>
<Resource Language="en" />
<Resource Language="ar" />
</Resources>
Lokalisering från höger till vänster kan sedan testas genom att ändra språket och regionen på enheten till rätt nationella inställningar från höger till vänster.
Test localization
Vid körning läser appen in lämpliga lokaliserade resurser per tråd baserat på den kultur som anges av CurrentUICulture egenskapen.
Testning av lokalisering utförs bäst genom att ändra enhetsspråket i appen Inställningar på varje enhet.
Warning
Även om det är möjligt att ange värdet CurrentUICulture för i kod är det resulterande beteendet inkonsekvent mellan plattformar, så detta rekommenderas inte för testning.
Bläddra i exemplet