Dela via


Localization

Bläddra bland exempel. Bläddra i exemplet

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:

  1. Skapa resursfiler för att lagra strängar. Mer information finns i Skapa resursfiler för att lagra strängar.
  2. Ange appens neutrala språk. Mer information finns i Ange appens neutrala språk.
  3. Utför plattformskonfiguration. Mer information finns i Utföra plattformskonfiguration.
  4. Utför VS Code-konfiguration. Mer information finns i Konfigurera VSCode.
  5. Localize text. Mer information finns i Lokalisera text.
  6. Localize images. Mer information finns i Lokalisera bilder.
  7. Lokalisera appnamnet. Mer information finns i Lokalisera appnamnet.
  8. 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:

Skärmbild av att lägga till en resursfil i Visual Studio.

När filen har lagts till kan rader läggas till för varje textresurs:

Skärmbild av standardsträngarna för appen.

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:

  1. AppResources.en-US.resx
  2. AppResources.en.resx
  3. AppResources.resx (default)

Följande skärmbild visar en spansk översättningsfil med namnet AppResources.es.resx:

Skärmbild av de spanska strängarna för appen.

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:

  1. Högerklicka på ditt .NET MAUI-appprojekt i Solution Explorer och välj Egenskaper.

  2. Välj egenskapssidan Paket > allmänt och välj lämpligt språk och kultur i listrutan Sammansättningsneutralt språk :

    Skärmbild av inställningen av det neutrala språket för sammansättningen.

  3. 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:

Skärmbild av de nationella inställningar som stöds för appen i den allmänna Info.plist-redigeraren.

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:

  1. Öppna filen Package.appxmanifest i en textredigerare och leta upp följande avsnitt:

    <Resources>
        <Resource Language="x-generate"/>
    </Resources>
    
  2. 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>
    
  3. 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 UpdateEmbeddedResource måste återspegla sökvägen till filen resx
  • Egenskapen StronglyTypedNamespace måste återspegla sökvägen för resx filen i lösningen
  • Egenskapen StronglyTypedFileName anger sökvägen till där filen ska genereras. I vårt exempel genereras den i obj mappen

Från delen Compile :

  • Egenskapen Include måste återspegla den genererade sökvägen för filen resx (samma som StronglyTypedFileName)

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:

Skärmbild av den lokaliserade mappstrukturen i Visual Studio för bilder på Android.

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:

Skärmbild av den lokaliserade mappstrukturen i Visual Studio för bilder på iOS.

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:

Skärmbild av den lokaliserade mappstrukturen i Visual Studio för bilder på MacCatalyst.

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:

Skärmbild av den lokaliserade mappstrukturen i Visual Studio för bilder i Windows.

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
  • \n Newline

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ör CFBundleDisplayName.
  • 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
  • \n Newline

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ör CFBundleDisplayName.
  • 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:

  1. Öppna filen Packageappxmanifest i paketmanifestredigeraren i Solution Explorer.

  2. I paketmanifestredigeraren går du till fliken Program och anger fältet Standardspråk till det valda standardspråket:

    Skärmbild av att ange standardspråket för en Windows-app i paketmanifestet.

  3. 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:

  1. I mappen Platforms\Windows i ditt .NET MAUI-appprojekt skapar du en mapp med strängar .

  2. I mappen Strängar skapar du en mapp för varje språk.

  3. 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.

  4. Öppna varje Resources.resw-fil och lägg till en strängresurs som representerar appens namn:

    Skärmbild av filredigeraren i Visual Studio på Windows.

    Note

    Resursidentifierare är skiftlägesokänsliga och måste vara unika per resursfil.

  5. Spara varje Windows-resursfil.

Ett exempel på den nödvändiga mappen och filstrukturen visas på följande skärmbild:

Skärmbild av den lokaliserade mappstrukturen i Visual Studio för strängar i Windows.

Använda det lokaliserade appnamnet

Strängresursen som representerar det lokaliserade appnamnet kan användas med hjälp ms-resource av URI-schemat:

  1. Öppna filen Packageappxmanifest i paketmanifestredigeraren i Solution Explorer.

  2. 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:

    Skärmbild av att ange det lokaliserade appnamnet i paketmanifestet i Windows.

  3. 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:

  • LeftToRight
  • RightToLeft
  • MatchParent

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<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.