ASP.NET commutation multilingue avec des fonctionnalités intégrées MVC de base

Page mise à jour :
Date de création de la page :

Environnement

Studio visuel
  • Studio visuel 2019
ASP.NET cœur
  • 3.0
  • 3.1

Dans un premier temps

ASP.NET utiliser les fonctionnalités de localisation MVC de base pour passer d’une langue à plusieurs pour les afficher.

Créer un fichier de ressources pour le texte traduit

Créez un dossier pour stocker les fichiers de ressources (Resx) qui gèrent le texte. L’emplacement est n’importe où, mais laissez-le directement en dessous de l’itinéraire. Ce chemin affecte également les paramètres ultérieurs.

Cliquez à droite sur le projet et sélectionnez Ajouter ou Nouveau dossier.

image

Laissez les ressources de nom de dossier. Vous pouvez également définir ce nom de dossier arbitrairement, mais vous pouvez spécifier ce nom de dossier dans les paramètres ultérieurs.

image

Ensuite, créez un fichier de ressources pour entrer du texte pour chaque langue.

Cliquez à droite sur le dossier Ressources et sélectionnez Ajouter ou Nouvel article.

image

Sélectionnez le fichier de ressources (.resx). Le nom du fichier peut être arbitraire, mais il doit correspondre au nom que vous spécifiez plus tard. Pour l’instant, disons SharedResource.resx.

image

Après avoir créé le fichier .resx, double-cliquez pour l’ouvrir, puis tapez le nom qui identifie le texte et le texte que vous souhaitez réellement afficher. Le fichier SharedResource.resx est le fichier à utiliser si la langue n’existe pas. Je l’ai entré en japonais ici. Si vous voulez que d’autres langues, comme l’anglais, soient par défaut, entrez-les dans cette langue.

Ici, nous entrons Bonjour et au revoir comme des échantillons. Notez qu’il est sensible aux cas.

image

Continuez à créer des fichiers de ressources pour d’autres langues. Pour identifier la langue, spécifiez le nom du fichier, tel que SharedResource. Vous pouvez spécifier une ou les deux combinaisons d’ISO 639 et ISO 3166 pour le code culturel. Le code de support est sujet à changer de temps en temps, de sorte que la classe CultureInfo sur le site Microsoft Veuillez consulter la page.

Cette fois, en (anglais) et es (espagnol) sont préparés. Le japonais n’est pas disponible parce que c’est la valeur par défaut.

image

Entrez le texte traduit avec les clés dans le même état pour chaque fichier.

image

image

Ensuite, vous aurez un fichier qui ne définit que les classes. Vous créez ceci avec le même nom que le fichier de ressources que vous venez de créer.

En fait, je ne me soucie pas de ce que le nom du fichier de code lui-même est parce que vous n’avez qu’à correspondre au nom de la classe à l’intérieur, mais laissez-le la même sorte qu’il est facile à comprendre. Peu importe où vous voulez écrire le code.

image

Faites de l’espace nom la racine du projet et créez une classe vide.

namespace LocalizationText
{
  // クラス名は作成した .resx のファイル名と同じにする必要がある
  public class SharedResource { }
}

Fixer chaque programme

Startup.cs

Répare Startup.cs. Décrivez la méthode ConfigureServices comme suit :

Services. AddMvc (). S’il existe une méthode AddViewLocalization, le texte traduit par le côté de la vue et le côté contrôleur est Je suis sûr que je peux l’obtenir, mais Comme c’est également le fait sur les services officiels du site Web. Il n’y a aucun problème à appeler la méthode AddLocalization ensemble.

Options. ResourcesPath spécifie le chemin du dossier où se trouve le fichier Resx. Si les deux sont spécifiés, les services. AddMvc (). La méthode AddViewLocalization prime.

public void ConfigureServices(IServiceCollection services)
{
  services.AddControllersWithViews();

  // Resx ファイルのあるフォルダを指定する。
  // コントローラー側でしか使用しないならこちらでもよい。AddViewLocalization を使用するならこちらはなくても動作する。
  //services.AddLocalization(options => options.ResourcesPath = "Resources");

  services.AddMvc()
    // ローカライズに必要。Resx ファイルのフォルダパスを指定
    .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix, opts => { opts.ResourcesPath = "Resources"; });
}

Modifiez ensuite la méthode Configure pour Startup.cs. Si vous voulez simplement lire le fichier de ressources, vous n’en avez pas besoin. Code qui est nécessaire pour permettre à l’utilisateur de spécifier une langue arbitrairement.

Nous utilisons les fonctionnalités intégrées dans ASP.NET Core MVC en standard. Le code suivant décrit la « chaîne de requête », le « cookie » et « l’en-tête http://Accept-Language » selon l’environnement de l’utilisateur. Vous pouvez basculer entre les langues d’affichage dans l’une d’elles. Nous vous verrons plus tard comment vérifier l’opération proprement dite.

La langue commutable est spécifiée ici dans le tableau (supportCultures). J’ai spécifié ja comme la langue par défaut, mais je n’ai pas créé le fichier ja cette fois. SharedResource.resx est utilisé si une langue autre que fr, es est spécifiée.

Vous pouvez séparer l’interface utilisateur des langues que vous soutenez, mais il n’y a pas beaucoup d’avantages à la séparer. Vous avez la même langue.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
  if (env.IsDevelopment())
  {
    // 省略
  }

  // 標準の機能で切り替えたい言語を定義します。
  var supportedCultures = new[]
  {
    new CultureInfo("ja"),
    new CultureInfo("en"),
    new CultureInfo("es"),
  };

  // 標準の言語切り替え機能を有効にします。対応しているのは「クエリ文字列」「Cookie」「Accept-Language HTTP ヘッダー」です。
  app.UseRequestLocalization(new RequestLocalizationOptions
  {
    DefaultRequestCulture = new RequestCulture("ja"),
    SupportedCultures = supportedCultures,
    SupportedUICultures = supportedCultures
  });

  app.UseHttpsRedirection();
  app.UseStaticFiles();

  // 省略
}

Contrôleurs-HomeController.cs

Fichier Controllers-HomeController.cs. Pour obtenir une langue localisée du côté du contrôleur, iStringLocalizer est reçu dans le constructeur. SharedResource doit avoir le même nom que la classe que vous avez créée plus tôt. Le texte est transmis à l’importateur du localisateur reçu en passant la chaîne clé inscrite dans le fichier des ressources. peuvent être récupérés. La langue du texte est déterminée en fonction de la culture demandée.

Soit dit en passant, en plus de IStringLocalizer, il ya aussi un IHtmlLocalizer qui peut obtenir HTML tel qu’il est.

public class HomeController : Controller
{
  private readonly ILogger<HomeController> _logger;
  private readonly IStringLocalizer<SharedResource> _localizer;

  // DI でローカライザーを取得します。
  public HomeController(ILogger<HomeController> logger, IStringLocalizer<SharedResource> localizer)
  {
    _logger = logger;
    _localizer = localizer;
  }

  public IActionResult Index()
  {
    // ローカライザーを使用して設定されている言語のリソースファイルからテキストを取得します。
    ViewData["Message"] = _localizer["Goodbye"];

    return View();
  }

  // 省略
}

Vues _ViewImports.cshtml

Fichier Vues _ViewImports.cshtml. Pour utiliser un localisateur sur le côté de vue, vous devez injecter IHtmlLocalizer. Si vous le décrivez comme suit pour l’instant, il est OK. En outre, SharedResource doit avoir le même nom que le fichier de ressources et la classe que vous avez créé plus tôt.

IHtmlLocalizer est dans le Microsoft.AspNetCore.Mvc.Localization namespace, donc je vais définir cela comme l’utilisation.

Si vous souhaitez seulement utiliser le localisateur à un certain point, vous pouvez inclure le code suivant dans un fichier de vue séparé. Si vous l’écrivez dans un fichier _ViewImports.cshtml, vous serez automatiquement en mesure de l’utiliser dans tous les fichiers de vue.

@using LocalizationText
@using LocalizationText.Models
@using Microsoft.AspNetCore.Mvc.Localization
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@* ビュー側でローカライザーを使用できるように定義します *@
@inject IHtmlLocalizer<SharedResource> Localizer

Vues-Home-Index.cshtml

Fichier Vues-Home-Index.cshtml. Le texte obtenu du côté du contrôleur et le texte obtenu directement sur le côté de la vue sont affichés respectivement. Le localisateur côté vue obtient également le texte en spécifiant une chaîne de clé pour l’indexeur.

@{
    ViewData["Title"] = "Home Page";
}

<div class="text-center">
  <h1 class="display-4">Welcome</h1>
  <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

@* ローカライザーから取得したテキストを表示します。 *@
<p>@Localizer["Hello"]</p>
<p>@ViewData["Message"]</p>

Vérifier l’opération

Chaîne de requête

Vous pouvez changer la langue d’affichage en spécifiant un code de culture dans la chaîne de requête de l’URL. Le format est ?culture-lt;culture code -gt;. Si vous voulez le séparer de l’interface utilisateur, il sera?culture et code de culture 'gt;'amp; ui-culture 'lt;culture’gt;.

Si vous ne spécifiez rien : S’il n’est pas spécifié, SharedResource.resx est utilisé. (En fait, un autre jugement a été appliqué...)

image

Le modèle spécifié pour ?culture-en. La langue d’affichage est l’anglais.

image

Le modèle spécifié pour ?culture’es. La langue d’affichage est l’espagnol.

image

Le modèle spécifié pour ?culture-ja. À l’origine, le fichier SharedResource.ja.resx est utilisé. SharedResource.resx est utilisé parce qu’il n’existe pas.

image

Essayez de spécifier une langue qui n’existe pas. SharedResource.resx est utilisé parce qu’il n’y a pas de fichier correspondant ici.

image

Cookies

Les cookies peuvent changer la langue d’affichage. Normalement publié du côté serveur, mais cette fois je vais essayer d’enregistrer des cookies directement dans la fonction du navigateur.

Parce que chaque navigateur Web dispose d’un outil de développeur, vous l’utilisez pour enregistrer les cookies. Dans la figure ci-dessous, vous pouvez appuyer sur F12 sur Edge pour afficher les outils du développeur.

Le nom du cookie correspondant est . AspNetCore.Culture, et la valeur qui spécifie la langue est Entrez sous la forme de code de culture c’lt;gt;uic’lt;culture code’gt;. Pour les cookies, vous devez également entrer le code ui. Une fois que vous avez enregistré votre cookie, actualisez votre page de navigateur Web pour le rafraîchir. Un cookie est envoyé au serveur afin que le serveur récupère la langue spécifiée.

Dans la figure ci-dessous, vous pouvez entrer c’en’uic’en pour afficher l’anglais.

image

tapez c’es-uic’es pour afficher l’espagnol.

image

En-tête http://Accept-Language

L’en-tête Accept-Language HTTP vérifie les informations d’en-tête demandées sur le navigateur Web au serveur. C’est la capacité de changer de langue en conséquence.

Vous pouvez envoyer n’importe quel Accept-Language dans les paramètres de votre navigateur Web, mais par défaut, vous pouvez correspondre aux paramètres de la langue os. Accept-Language est maintenant envoyé. (Qu’il soit effectivement envoyé ou non dépend du système d’exploitation et du navigateur Web.) La langue est parasociée dans le navigateur Web pour la langue de l’OS, mais elle peut être correcte.)

Ainsi, par exemple, comme indiqué dans la figure ci-dessous, vous pouvez ouvrir la page dans le navigateur Web du système d’exploitation de langue anglaise et envoyer des informations, de sorte que vous pouvez automatiquement SharedResource.fr.resx est sélectionné pour afficher l’anglais.

image

Si vous essayez de spécifier une langue qui n’existe pas dans la chaîne de requête, vous devez à l’origine utiliser SharedResource.resx. Accept-Language affiche l’anglais parce qu’il existe.

image

Si ja est spécifié dans la chaîne de requête, la corde de requête a préséance et le japonais est affiché.

image

Résumé

Ici, j’ai essayé d’implémenter la commutation multilingue de la manière la plus facile. Pour changer de langue pour correspondre à l’environnement de l’utilisateur, utilisez l’en-tête Http Accept-Language comme langue d’affichage par défaut. Si l’utilisateur choisit une langue, il est bon d’ajouter des cookies ou d’ajouter (ou d’entrer directement) de la chaîne de requête.