Localisation

Browse sample. Parcourir l’exemple

La localisation est le processus d’adaptation d’une application pour répondre aux exigences linguistiques ou culturelles spécifiques d’un marché cible. Pour localiser une application, son texte et ses images doivent peut-être être traduits en plusieurs langues. Une application localisée affiche automatiquement le texte traduit en fonction des paramètres de culture de l’appareil.

.NET inclut un mécanisme permettant de localiser des applications à l’aide de fichiers de ressources. Un fichier de ressources stocke du texte et d’autres contenus sous forme de paires nom/valeur qui permettent à l’application de récupérer du contenu pour une clé fournie. Les fichiers de ressources permettent de séparer le contenu localisé du code de l’application. Outre le stockage du texte, les fichiers de ressources peuvent également stocker des images et des données binaires. Toutefois, les appareils ont une plage de tailles d’écran et de densités, et chaque plateforme dispose de fonctionnalités permettant d’afficher des images dépendantes de la densité. Par conséquent, les fonctionnalités de plateforme doivent être utilisées pour localiser des images au lieu de les stocker dans des fichiers de ressources.

Pour localiser une application d’interface utilisateur d’application multiplateforme .NET (.NET MAUI), vous devez :

  1. Créez des fichiers de ressources pour stocker des chaînes. Pour plus d’informations, consultez Créer des fichiers de ressources pour stocker des chaînes.
  2. Spécifiez la langue neutre de l’application. Pour plus d’informations, consultez Spécifier la langue neutre de l’application.
  3. Effectuez la configuration de la plateforme. Pour plus d’informations, consultez Effectuer la configuration de la plateforme.
  4. Localiser le texte. Pour plus d’informations, consultez Localiser le texte.
  5. Localiser des images. Pour plus d’informations, consultez Localiser les images.
  6. Localisez le nom de l’application. Pour plus d’informations, consultez Localiser le nom de l’application.
  7. Testez la localisation. Pour plus d’informations, consultez Localisation des tests.

En outre, la direction de disposition d’une application peut être spécifiée. Pour plus d’informations, consultez Localisation de droite à gauche.

Créer des fichiers de ressources pour stocker des chaînes

Les fichiers de ressources .NET sont des fichiers XML avec une extension .resx compilée en fichiers de ressources binaires (.resources) pendant le processus de génération. Une application localisée contient généralement un fichier de ressources par défaut avec toutes les chaînes utilisées dans l’application et les fichiers de ressources pour chaque langue prise en charge.

Les fichiers de ressources contiennent les informations suivantes pour chaque élément :

  • Le nom spécifie la clé utilisée pour accéder au texte dans le code.
  • La valeur spécifie le texte traduit.
  • Le commentaire est un champ facultatif contenant des informations supplémentaires.

Vous pouvez ajouter un fichier de ressources avec la boîte de dialogue Ajouter un nouvel élément dans Visual Studio :

Screenshot of adding a resource file in Visual Studio.

Une fois le fichier ajouté, les lignes peuvent être ajoutées pour chaque ressource texte :

Screenshot of the default strings for the app.

La liste déroulante Modificateur d’accès détermine la façon dont Visual Studio génère la classe utilisée pour accéder aux ressources. La définition du modificateur d’accès en résultats publics ou internes dans une classe générée avec le niveau d’accessibilité spécifié. La définition du modificateur d’accès sur Aucune génération de code ne génère pas de fichier de classe. Le fichier de ressources par défaut doit être configuré pour générer un fichier de classe, ce qui génère un fichier avec le fichier . Extension Designer.cs ajoutée au projet.

Une fois le fichier de ressources par défaut créé, des fichiers supplémentaires peuvent être créés pour chaque paramètre régional pris en charge par l’application. Chaque fichier de ressources supplémentaire doit avoir le même nom de fichier racine que le fichier de ressources par défaut, mais doit également inclure la langue et la culture facultative dans le nom de fichier. Par exemple, si vous ajoutez un fichier de ressources nommé AppResources.resx, vous pouvez également créer des fichiers de ressources nommés AppResources.en-US.resx et AppResources.fr-FR.resx pour contenir des ressources localisées pour les cultures anglaises (États-Unis) et Français (France), respectivement. En outre, vous devez définir le modificateur d’accès pour chaque fichier de ressources supplémentaire sur Aucune génération de code.

Au moment de l’exécution, votre application tente de résoudre une demande de ressource dans l’ordre de spécificité. Par exemple, si la culture de l’appareil est en-US , l’application recherche des fichiers de ressources dans cet ordre :

  1. AppResources.en-US.resx
  2. AppResources.en.resx
  3. AppResources.resx (par défaut)

La capture d’écran suivante montre un fichier de traduction espagnol nommé AppResources.es.resx :

Screenshot of the Spanish strings for the app.

Le fichier de ressources localisé utilise les mêmes valeurs Name spécifiées dans le fichier par défaut, mais contient des chaînes de langue espagnole dans la colonne Valeur . En outre, le modificateur d’accès est défini sur Aucune génération de code.

Spécifier la langue neutre de l’application

Pour que les fichiers de ressources .NET fonctionnent correctement, l’application doit avoir un langage neutre spécifié. Il s’agit du langage dont les ressources sont utilisées si des ressources pour des paramètres régionaux ne sont pas disponibles. Pour spécifier la langue neutre :

  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur votre projet d’application .NET MAUI, puis sélectionnez Propriétés.

  2. Sélectionnez la page de propriétés Général du package > et sélectionnez la langue et la culture appropriées dans la liste déroulante de langue neutre de l’assembly :

    Screenshot of setting the neutral language for the assembly.

  3. Enregistrez vos modifications.

Vous pouvez également ajouter l’élément <NeutralLanguage> au premier <PropertyGroup> dans votre fichier projet et spécifier les paramètres régionaux choisis comme valeur :

<NeutralLanguage>en-US</NeutralLanguage>

Avertissement

Si vous ne spécifiez pas une langue neutre, la ResourceManager classe retourne null des valeurs pour toutes les langues sans fichier de ressources. Lorsqu’une langue neutre est spécifiée, la ResourceManager classe retourne les résultats du fichier de ressources de langue neutre pour les langues non prises en charge. Par conséquent, il est recommandé de toujours spécifier une langue neutre afin que le texte soit affiché pour les langues non prises en charge.

Effectuer la configuration de la plateforme

Une configuration supplémentaire est requise sur iOS, Mac Catalyst et Windows, afin que tous les contrôles .NET MAUI soient localisés.

iOS et Mac Catalyst

Sur iOS et Mac Catalyst, vous devez déclarer toutes les langues prises en charge dans le fichier Info.plist de la plateforme dans votre projet d’application MAUI .NET. Pour ce faire, ouvrez le fichier Info.plist de votre plateforme choisie dans un éditeur XML et créez un tableau pour la CFBundleLocalizations clé. Fournissez ensuite des valeurs de tableau qui correspondent aux fichiers de ressources. En outre, veillez à définir une langue attendue via la CFBundleDevelopmentRegion clé :

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

Sinon, dans Explorateur de solutions dans Visual Studio, ouvrez le fichier Info.plist de votre plateforme choisie dans l’éditeur PList générique. Ensuite, créez un tableau pour la CFBundleLocalizations clé et fournissez des valeurs de tableau qui correspondent aux fichiers de ressources. En outre, veillez à définir une langue attendue via la CFBundleDevelopmentRegion clé :

Screenshot of the supported locales for the app in the generic Info.plist editor.

Pour plus d’informations sur le fichier Info.plist , consultez la liste des propriétés Information.

Windows

Pour prendre en charge plusieurs langues dans une application .NET MAUI sur Windows, vous devez déclarer chaque langue prise en charge dans le fichier Platforms\Windows\Package.appxmanifest de votre projet d’application .NET MAUI :

  1. Ouvrez le fichier Package.appxmanifest dans un éditeur de texte et recherchez la section suivante :

    <Resources>
        <Resource Language="x-generate"/>
    </Resources>
    
  2. Remplacez par <Resource Language="x-generate"><Resource /> des éléments pour chacune de vos langues prises en charge :

    <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. Enregistrez vos modifications.

Localiser le texte

Le texte est localisé à l’aide d’une classe générée à partir de votre fichier de ressources par défaut. La classe est nommée en fonction du nom de fichier de ressource par défaut. Étant donné un nom de fichier de ressource par défaut d’AppResources.resx, Visual Studio génère une classe correspondante nommée AppResources contenant des propriétés statiques pour chaque entrée dans le fichier de ressources.

En XAML, le texte localisé peut être récupéré à l’aide de l’extension de x:Static balisage pour accéder aux propriétés statiques générées :

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

Pour plus d’informations sur l’extension de x:Static balisage, consultez l’extension de balisage x :Static.

Le texte localisé peut également être récupéré dans le code :

Label notesLabel = new Label();
notesLabel.Text = AppResources.NotesLabel,

Entry notesEntry = new Entry();
notesEntry.Placeholder = AppResources.NotesPlaceholder,

Button addButton = new Button();
addButton.Text = AppResources.AddButton,

Les propriétés de la AppResources classe utilisent la CurrentUICulture valeur de propriété pour déterminer le fichier de ressources à partir duquel récupérer des valeurs.

Localiser des images

Outre le stockage du texte, les fichiers de ressources peuvent également stocker des images et des données binaires. Toutefois, les appareils ont une plage de tailles d’écran et de densités, et chaque plateforme dispose de fonctionnalités permettant d’afficher des images dépendantes de la densité. Par conséquent, les fonctionnalités de plateforme doivent être utilisées pour localiser des images au lieu de les stocker dans des fichiers de ressources.

Android

Sur Android, les images localisées, appelées dessinables, sont stockées à l’aide d’une convention d’affectation de noms basée sur un dossier dans le dossier Plateformes\Android\Resources . Les dossiers doivent être nommés dessinables avec un suffixe pour la langue et la culture. Par exemple, le dossier espagnol est nommé drawable-es. Le nom du dossier pouvant être dessiné doit contenir les images de votre langue et culture par défaut. L’action de génération de chaque image doit être définie sur AndroidResource.

Remarque

Au lieu de définir des fichiers individuels sur l’action de génération AndroidResource , le contenu d’un dossier spécifique peut être défini sur cette action de génération en ajoutant le code XML suivant au fichier projet (.csproj) de votre application :

<ItemGroup Condition="$(TargetFramework.Contains('-android'))">
  <AndroidResource Include="Platforms\Android\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

Cet exemple montre comment définir tout contenu dans le dossier Plateformes\Android\Resources , y compris le contenu dans les sous-dossiers, sur l’action de génération AndroidResource . Il définit également le chemin de sortie de chaque fichier avec cette action de génération.

Seuls deux caractères sont requis dans le nom du dossier lors de la spécification d’une langue de niveau supérieur, comme les es. Toutefois, lors de la spécification d’un paramètre régional complet, le format de nom de dossier nécessite un tiret et une r minuscule pour séparer la langue de la culture. Par exemple, le dossier des paramètres régionaux du Mexique (es-MX) doit être nommé drawable-es-rMX. Les noms de fichiers image dans chaque dossier de paramètres régionaux doivent être identiques :

Screenshot of the localized folder structure in Visual Studio for images on Android.

iOS

Sur iOS, les images localisées sont stockées à l’aide d’une convention d’affectation de noms basée sur un dossier dans le dossier Plateformes\iOS\Resources . Les dossiers doivent être nommés avec la langue et la culture facultative, suivis de .lproj. Par exemple, le dossier espagnol est nommé es.lproj. L’action de génération de chaque image doit être définie sur BundleResource.

Remarque

Au lieu de définir des fichiers individuels sur l’action de génération BundleResource , le contenu d’un dossier spécifique peut être défini sur cette action de génération en ajoutant le code XML suivant au fichier projet (.csproj) de votre application :

<ItemGroup Condition="$(TargetFramework.Contains('-ios'))">
  <BundleResource Include="Platforms\iOS\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

Cet exemple montre comment définir tout contenu dans le dossier Plateformes\iOS\Resources , y compris le contenu dans les sous-dossiers, sur l’action de génération BundleResource . Il définit également le chemin de sortie de chaque fichier avec cette action de génération.

Seuls deux caractères sont requis dans le nom du dossier lors de la spécification d’une langue de niveau supérieur, comme les es. Toutefois, lorsque vous spécifiez des paramètres régionaux complets, le format du nom du dossier nécessite un tiret pour séparer la langue de la culture. Par exemple, le dossier des paramètres régionaux du Mexique (es-MX) doit être nommé es-MX.lproj. Les noms de fichiers image dans chaque dossier de paramètres régionaux doivent être identiques :

Screenshot of the localized folder structure in Visual Studio for images on iOS.

En outre, dans votre fichier projet, vous devez définir la IPhoneResourcePrefix propriété de build sur le dossier qui contient les dossiers d’images localisés :

<PropertyGroup Condition="$(TargetFramework.Contains('-ios'))">
  <IPhoneResourcePrefix>Platforms/iOS/Resources</IPhoneResourcePrefix>
</PropertyGroup>

Si une image n’est pas présente pour une langue particulière, iOS revient au dossier de langue native par défaut et charge l’image à partir de là.

Mac Catalyst

Sur Mac Catalyst, les images localisées sont stockées à l’aide d’une convention d’affectation de noms basée sur des dossiers dans le dossier Platforms\MacCatalyst\Resources . Les dossiers doivent être nommés avec la langue et la culture facultative, suivis de .lproj. Par exemple, le dossier espagnol est nommé es.lproj. L’action de génération de chaque image doit être définie sur BundleResource.

Remarque

Au lieu de définir des fichiers individuels sur l’action de génération BundleResource , le contenu d’un dossier spécifique peut être défini sur cette action de génération en ajoutant le code XML suivant au fichier projet (.csproj) de votre application :

<ItemGroup Condition="$(TargetFramework.Contains('-maccatalyst'))">
  <BundleResource Include="Platforms\MacCatalyst\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

Cet exemple montre comment définir tout contenu dans le dossier Plateformes\MacCatalyst\Resources , y compris le contenu dans les sous-dossiers, à l’action de génération BundleResource . Il définit également le chemin de sortie de chaque fichier avec cette action de génération.

Seuls deux caractères sont requis dans le nom du dossier lors de la spécification d’une langue de niveau supérieur, comme les es. Toutefois, lorsque vous spécifiez des paramètres régionaux complets, le format du nom du dossier nécessite un tiret pour séparer la langue de la culture. Par exemple, le dossier des paramètres régionaux du Mexique (es-MX) doit être nommé es-MX.lproj. Les noms de fichiers image dans chaque dossier de paramètres régionaux doivent être identiques :

Screenshot of the localized folder structure in Visual Studio for images on MacCatalyst.

En outre, dans votre fichier projet, vous devez définir la IPhoneResourcePrefix propriété de build sur le dossier qui contient les dossiers d’images localisés :

<PropertyGroup Condition="$(TargetFramework.Contains('-maccatalyst'))">
  <IPhoneResourcePrefix>Platforms/MacCatalyst/Resources</IPhoneResourcePrefix>
</PropertyGroup>

Si une image n’est pas présente pour une langue particulière, Mac Catalyst revient au dossier de langue native par défaut et charge l’image à partir de là.

Windows

Sur Windows, les images localisées sont stockées à l’aide d’une convention d’affectation de noms basée sur des dossiers dans le dossier Plateformes\Windows\Assets\Images . Les dossiers doivent être nommés avec la langue et la culture facultative. Par exemple, le dossier de langue espagnole est nommé es et le dossier des paramètres régionaux du Mexique doit être nommé es-MX. L’action de génération de chaque image doit être définie sur Contenu.

Remarque

Au lieu de définir des fichiers individuels sur l’action de génération de contenu, le contenu d’un dossier spécifique peut être défini sur cette action de génération en ajoutant le code XML suivant au fichier projet de votre application (.csproj) :

<ItemGroup Condition="$(TargetFramework.Contains('-windows'))">
  <Content Include="Platforms\Windows\Assets\Images\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

Cet exemple montre comment définir tout contenu dans le dossier Plateformes\Windows\Assets\Images , y compris le contenu dans les sous-dossiers, à l’action de génération de contenu . Il définit également le chemin de sortie de chaque fichier avec cette action de génération.

Seuls deux caractères sont requis dans le nom du dossier lors de la spécification d’une langue de niveau supérieur, comme les es. Toutefois, lorsque vous spécifiez des paramètres régionaux complets, le format du nom du dossier nécessite un tiret pour séparer la langue de la culture. Par exemple, le dossier des paramètres régionaux du Mexique (es-MX) doit être nommé es-MX. Les noms de fichiers image dans chaque dossier de paramètres régionaux doivent être identiques :

Screenshot of the localized folder structure in Visual Studio for images on Windows.

Consommer des images localisées

Sur Android, iOS, Mac Catalyst et Windows, les images localisées peuvent être consommées en définissant la Source propriété d’un Image nom de fichier d’image :

<Image Source="flag.png" />

Toutefois, pour que cela fonctionne sur Windows, il est nécessaire de modifier le fichier projet de votre application si vous avez ajouté un <Content /> élément MSBuild pour chaque image localisée. Pour ce faire, modifiez votre fichier .csproj pour supprimer l’élément <Content /> MSBuild pour chaque image. Ensuite, ajoutez l’élément MSBuild suivant :

<ItemGroup Condition="$(TargetFramework.Contains('-windows'))">
  <Content Include="Platforms\Windows\Assets\Images\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

Cela garantit que toutes les images dans les sous-dossiers du dossier Plateformes\Windows\Assets\Images sont copiées à la racine de votre package d’application.

Localiser le nom de l’application

La fonctionnalité de plateforme est requise pour localiser le nom de l’application.

Android

Sur Android, le nom de l’application localisée peut être stocké à l’aide d’une convention d’affectation de noms basée sur des dossiers dans le dossier Platforms\Android\Resources . Les dossiers doivent être nommés avec un suffixe pour la langue et la culture. Par exemple, le dossier espagnol est nommé values-es. Ajoutez un fichier Strings.xml avec une action de génération d’AndroidResource à chaque dossier qui définit une chaîne au nom de l’application localisée.

Remarque

Au lieu de définir des fichiers individuels sur l’action de génération AndroidResource , le contenu d’un dossier spécifique peut être défini sur cette action de génération en ajoutant le code XML suivant au fichier projet (.csproj) de votre application :

<ItemGroup Condition="$(TargetFramework.Contains('-android'))">
  <AndroidResource Include="Platforms\Android\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

Cet exemple montre comment définir tout contenu dans le dossier Plateformes\Android\Resources , y compris le contenu dans les sous-dossiers, sur l’action de génération AndroidResource . Il définit également le chemin de sortie de chaque fichier avec cette action de génération.

Seuls deux caractères sont requis dans le nom du dossier lors de la spécification d’une langue de niveau supérieur, comme les es. Toutefois, lors de la spécification d’un paramètre régional complet, le format de nom de dossier nécessite un tiret et une r minuscule pour séparer la langue de la culture. Par exemple, le dossier des paramètres régionaux du Mexique (es-MX) doit être nommé values-es-rMX.

Chaque chaîne traduit est un élément XML avec l’ID de ressource spécifié comme name attribut et la chaîne traduite comme valeur. Vous devez échapper à votre chaîne en fonction de règles XML normales, et il name doit s’agir d’un ID de ressource Android valide (aucun espace ou tiret).

Par conséquent, pour localiser le nom de l’application, créez un fichier Strings.xml et ajoutez un <string> élément en tant qu’enfant d’un <resources> élément. Ensuite, définissez son name attribut sur un ID approprié avec la chaîne traduite comme valeur :

<resources>
    <!-- French -->
    <string name="app_name">Maison</string>
</resources>

Ensuite, pour utiliser le nom de l’application localisée dans votre application, ajoutez la Label propriété à la Activity classe de MainActivity votre application et définissez sa valeur sur @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

Sur iOS, le nom de l’application localisée est stocké à l’aide d’une convention d’affectation de noms basée sur un dossier dans le dossier Platforms\iOS\Resources . Les dossiers doivent être nommés avec la langue et la culture facultative, suivis de .lproj. Par exemple, le dossier espagnol est nommé es.lproj. Ajoutez un fichier InfoPlist.strings avec une action de build de BundleResource à chaque dossier qui définit la clé et la CFBundleDisplayName valeur.

Remarque

Au lieu de définir des fichiers individuels sur l’action de génération BundleResource , le contenu d’un dossier spécifique peut être défini sur cette action de génération en ajoutant le code XML suivant au fichier projet (.csproj) de votre application :

<ItemGroup Condition="$(TargetFramework.Contains('-ios'))">
  <BundleResource Include="Platforms\iOS\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

Cet exemple montre comment définir tout contenu dans le dossier Plateformes\iOS\Resources , y compris le contenu dans les sous-dossiers, sur l’action de génération BundleResource . Il définit également le chemin de sortie de chaque fichier avec cette action de génération.

La syntaxe des valeurs de chaîne localisées est la suivante :

/* comment */
"key"="localized-value";

Vous devez échapper aux caractères suivants dans les chaînes :

  • \" citation
  • \\ Backslash
  • \n Newline

Par conséquent, pour localiser le nom de l’application, créez un fichier InfoPlist.strings et ajoutez une valeur pour la CFBundleDisplayName clé au fichier :

/* French */
CFBundleDisplayName="Maisons";

Les autres clés que vous pouvez utiliser pour localiser des chaînes spécifiques à l’application sont les suivantes :

  • CFBundleName - spécifie le nom court de l’ensemble d’applications, qui peut être affiché aux utilisateurs dans des situations telles que l’absence d’une valeur pour CFBundleDisplayName.
  • CFBundleShortVersionString - spécifie le numéro de version de publication de l’ensemble d’applications.
  • NSHumanReadableCopyright - avis de copyright pour l’offre groupée d’applications.

En outre, dans votre fichier projet, vous devez définir la IPhoneResourcePrefix propriété de build sur le dossier qui contient les dossiers localisés :

<PropertyGroup Condition="$(TargetFramework.Contains('-ios'))">
  <IPhoneResourcePrefix>Platforms/iOS/Resources</IPhoneResourcePrefix>
</PropertyGroup>

Mac Catalyst

Sur Mac Catalyst, le nom de l’application localisée est stocké à l’aide d’une convention d’affectation de noms basée sur un dossier dans le dossier Platforms\MacCatalyst\Resources . Les dossiers doivent être nommés avec la langue et la culture facultative, suivis de .lproj. Par exemple, le dossier espagnol est nommé es.lproj. Ajoutez un fichier InfoPlist.strings avec une action de build de BundleResource à chaque dossier qui définit la clé et la CFBundleDisplayName valeur.

Remarque

Au lieu de définir des fichiers individuels sur l’action de génération BundleResource , le contenu d’un dossier spécifique peut être défini sur cette action de génération en ajoutant le code XML suivant au fichier projet (.csproj) de votre application :

<ItemGroup Condition="$(TargetFramework.Contains('-maccatalyst'))">
  <BundleResource Include="Platforms\MacCatalyst\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

Cet exemple montre comment définir tout contenu dans le dossier Plateformes\MacCatalyst\Resources , y compris le contenu dans les sous-dossiers, à l’action de génération BundleResource . Il définit également le chemin de sortie de chaque fichier avec cette action de génération.

La syntaxe des valeurs de chaîne localisées est la suivante :

/* comment */
"key"="localized-value";

Vous devez échapper aux caractères suivants dans les chaînes :

  • \" citation
  • \\ Backslash
  • \n Newline

Par conséquent, pour localiser le nom de l’application, créez un fichier InfoPlist.strings et ajoutez une valeur pour la CFBundleDisplayName clé au fichier :

/* French */
CFBundleDisplayName="Maisons";

Les autres clés que vous pouvez utiliser pour localiser des chaînes spécifiques à l’application sont les suivantes :

  • CFBundleName - spécifie le nom court de l’ensemble d’applications, qui peut être affiché aux utilisateurs dans des situations telles que l’absence d’une valeur pour CFBundleDisplayName.
  • CFBundleShortVersionString - spécifie le numéro de version de publication de l’ensemble d’applications.
  • NSHumanReadableCopyright - avis de copyright pour l’offre groupée d’applications.

En outre, dans votre fichier projet, vous devez définir la IPhoneResourcePrefix propriété de build sur le dossier qui contient les dossiers localisés :

<PropertyGroup Condition="$(TargetFramework.Contains('-maccatalyst'))">
  <IPhoneResourcePrefix>Platforms/MacCatalyst/Resources</IPhoneResourcePrefix>
</PropertyGroup>

Windows

Sur Windows, le nom de l’application est défini dans le manifeste de votre package d’application. La localisation du nom de l’application vous oblige à spécifier d’abord la langue par défaut de l’application, puis à créer un fichier de ressources de chaîne pour chaque paramètre régional que vous envisagez de prendre en charge. La ressource de chaîne qui représente le nom de l’application localisée peut ensuite être consommée dans le manifeste de votre package d’application à l’aide du ms-resource schéma d’URI.

Pour plus d’informations sur la localisation des chaînes dans le manifeste de package d’application, consultez Localiser les chaînes dans votre interface utilisateur et le manifeste du package d’application.

Spécifier la langue par défaut

Pour localiser un nom d’application, votre application Windows doit d’abord avoir une langue par défaut spécifiée. Il s’agit de la langue dont les ressources sont utilisées si aucune ressource localisée pour une langue particulière n’est disponible. Pour spécifier la langue par défaut :

  1. Dans Explorateur de solutions, ouvrez le fichier Packageappxmanifest dans l’éditeur de manifeste de package.

  2. Dans l’éditeur de manifeste de package, sous l’onglet Application , définissez le champ de langue par défaut sur votre langue par défaut choisie :

    Screenshot of setting the default language of a Windows app in the package manifest.

  3. Enregistrez vos modifications.

Au minimum, vous devez fournir une ressource de chaîne pour le nom de l’application pour la langue par défaut. Il s’agit de la ressource chargée si aucune meilleure correspondance n’est disponible pour la langue préférée de l’utilisateur ou les paramètres de langue d’affichage.

Créer des fichiers de ressources Windows

Sur Windows, le nom de l’application localisée doit être stocké dans un fichier de ressources Windows pour chaque paramètre régional. Un fichier de ressources Windows est un fichier XML avec une extension .resw compilée dans un format binaire et stockée dans un fichier .pri . Le fichier .resw pour chaque paramètre régional doit être nommé Resources.resw et stocké à l’aide d’une convention d’affectation de noms basée sur un dossier dans le dossier Platforms\Windows\Strings . Les dossiers doivent être nommés avec la langue et la culture facultative. Par exemple, le dossier de langue espagnole est nommé es et le dossier des paramètres régionaux du Mexique doit être nommé es-MX.

Il n’existe actuellement aucun modèle d’élément Visual Studio pour la création d’un fichier de ressources Windows dans une application MAUI .NET. Par conséquent, pour créer un fichier de ressources Windows pour chaque paramètre régional :

  1. Dans le dossier Platforms\Windows de votre projet d’application .NET MAUI, créez un dossier Strings .

  2. Dans le dossier Strings , créez un dossier pour chaque paramètre régional.

  3. Dans le dossier de chaque paramètre régional, créez un fichier nommé Resources.resw qui contient le code XML suivant :

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

    Remarque

    Les fichiers de ressources Windows utilisent une action de génération de PRIResource. Cette action de génération n’a pas besoin de définir sur chaque fichier .resw dans une application .NET MAUI, car elle est implicitement appliquée.

  4. Ouvrez chaque fichier Resources.resw et ajoutez une ressource de chaîne qui représente le nom de l’application :

    Screenshot of the resw file editor in Visual Studio on Windows.

    Remarque

    Les identificateurs de ressource ne respectent pas la casse et doivent être uniques par fichier de ressources.

  5. Enregistrez chaque fichier de ressources Windows.

Un exemple de la structure de dossiers et de fichiers requise est illustré dans la capture d’écran suivante :

Screenshot of the localized folder structure in Visual Studio for strings on Windows.

Utiliser le nom de l’application localisée

La ressource de chaîne qui représente le nom de l’application localisée peut être consommée à l’aide du ms-resource schéma d’URI :

  1. Dans Explorateur de solutions, ouvrez le fichier Packageappxmanifest dans l’éditeur de manifeste de package.

  2. Dans l’éditeur de manifeste de package, sous l’onglet Application , définissez le champ Nom d’affichage à ms-resource: suivre par le nom de la ressource de chaîne qui identifie le nom de votre application :

    Screenshot of setting the localized app name in the package manifest on Windows.

  3. Enregistrez vos modifications.

Important

Si vos fichiers .resw sont stockés dans un assembly différent de votre projet d’application .NET MAUI, vous devez spécifier un chemin complet de votre nom de ressource. Cela utilise le format ms-resource:Assembly/ResourceFilename/Resource.

Localisation de droite à gauche

La direction du flux ou la direction de la disposition est la direction dans laquelle les éléments de l’interface utilisateur de la page sont analysés par l’œil. Dans certaines langues, par exemple l’arabe et l’hébreu, les éléments d’IU doivent être disposés de droite à gauche. Les applications .NET MAUI respectent automatiquement la direction du flux de l’appareil en fonction de la langue et de la région sélectionnées. Pour plus d’informations sur la façon de récupérer la direction du flux de l’appareil, en fonction de ses paramètres régionaux, consultez Obtenir la direction de la disposition.

Pour remplacer la direction du flux d’une application, définissez la Window.FlowDirection propriété. Vous pouvez également définir la VisualElement.FlowDirection propriété par élément. Ces propriétés obtiennent ou définissent la direction dans laquelle les éléments d’interface utilisateur circulent dans n’importe quel élément parent qui contrôle leur disposition et doivent être définies sur l’une des valeurs d’énumération FlowDirection :

  • LeftToRight
  • RightToLeft
  • MatchParent

La définition de la FlowDirection propriété RightToLeft sur un élément définit l’alignement à droite, l’ordre de lecture à gauche et la disposition du contrôle à passer de droite à gauche.

Avertissement

La modification de la propriété au moment de l’exécution FlowDirection entraîne un processus de disposition coûteux qui affectera les performances.

La valeur de propriété par défaut FlowDirection d’un élément est MatchParent. Un élément hérite donc de la valeur de propriété FlowDirection de son parent dans l’arborescence d’éléments visuels, et un élément peut remplacer la valeur qu’il obtient de son parent.

Conseil

Si vous devez modifier la direction du flux, définissez la FlowDirection propriété sur une fenêtre, une page ou une mise en page racine. Ainsi, tous les éléments contenus dans l’application, la page ou la mise en page racine répondent de manière appropriée au sens du flux.

Configuration de la plateforme

Une configuration de plateforme spécifique est obligatoire pour permettre l’activation des paramètres régionaux de droite à gauche.

Android

Les applications créées à l’aide du modèle de projet d’application .NET MAUI incluent automatiquement la prise en charge des paramètres régionaux de droite à gauche. Cette prise en charge est activée par l’attribut android:supportsRtl défini true sur le nœud dans le <application> fichier AndroidManifest.xml de l’application :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application ... android:supportsRtl="true" />
    ...
</manifest>

La localisation de droite à gauche peut ensuite être testée en modifiant l’appareil ou l’émulateur pour utiliser la langue de droite à gauche. Sinon, si vous avez activé des options de développeur dans l’application Paramètres, vous pouvez activer la direction de disposition Force RTL dans Paramètres > Options du développeur. Pour plus d’informations sur la configuration des options de développeur, consultez Configurer les options de développeur sur l’appareil sur developer.android.com.

iOS et Mac Catalyst

Les paramètres régionaux de droite à gauche nécessaires doivent être ajoutés aux éléments de tableau de la clé CFBundleLocalizations dans Info.plist en tant que langue prise en charge. L’exemple suivant montre que l’arabe a été ajouté au tableau pour la clé CFBundleLocalizations :

<key>CFBundleLocalizations</key>
<array>
    <string>en</string>
    <string>ar</string>
</array>

La localisation de droite à gauche peut ensuite être testée en modifiant la langue et la région sur l’appareil ou le simulateur en paramètres régionaux de droite à gauche spécifiés dans Info.plist.

Windows

Vous devez spécifier les ressources linguistiques nécessaires dans le nœud <Resources> du fichier Package.appxmanifest. Remplacez par <Resource Language="x-generate"><Resource /> des éléments pour chacune de vos langues prises en charge. Par exemple, le balisage suivant spécifie que les ressources localisées « en » et « ar » sont disponibles :

<Resources>
    <Resource Language="en" />
    <Resource Language="ar" />
</Resources>

Vous pouvez ensuite tester la localisation de droite à gauche en remplaçant la langue et la région de l’appareil/du simulateur par les paramètres régionaux de droite à gauche appropriés.

Localisation des tests

Au moment de l’exécution, votre application charge les ressources localisées appropriées en fonction de la culture spécifiée par la CurrentUICulture propriété.

Le test de localisation est le mieux effectué en modifiant la langue de votre appareil dans l’application Paramètres sur chaque appareil.

Avertissement

Bien qu’il soit possible de définir la valeur du CurrentUICulture code, le comportement résultant est incohérent entre les plateformes. Cela n’est donc pas recommandé pour les tests.