ASP.NET commutazione multilingue con funzionalità integrate MVC di base

Pagina aggiornata :
Data di creazione della pagina :

Ambiente

Visual Studio
  • Visual Studio 2019
ASP.NET Core
  • 3.0
  • 3.1

In un primo momento

ASP.NET utilizzano le funzionalità di localizzazione MVC di base per passare da un linguaggio all'altro e visualizzarle.

Creare un file di risorse per il testo tradottoCreate a resource file for translated text

Creare una cartella per archiviare i file di risorse (Resx) che gestiscono il testo. La posizione è ovunque, ma lasciarlo direttamente sotto il percorso. Questo percorso influisce anche sulle impostazioni successive.

Fare clic con il pulsante destro del mouse sul progetto e selezionare Aggiungi o Nuova cartella.

image

Lasciare il nome della cartella risorse. È anche possibile impostare questo nome di cartella in modo arbitrario, ma è possibile specificare il nome della cartella nelle impostazioni successive.

image

Creare quindi un file di risorse per immettere testo per ogni lingua.

Fare clic con il pulsante destro del mouse sulla cartella Risorse e selezionare Aggiungi o Nuovo elemento.

image

Selezionare il file di risorse (resx). Il nome del file può essere arbitrario, ma deve corrispondere al nome specificato in un secondo momento. Per ora, diciamo SharedResource.resx.

image

Dopo aver creato il file RESX, fare doppio clic per aprirlo e quindi digitare il nome che identifica il testo e il testo che si desidera visualizzare effettivamente. Il file SharedResource.resx è il file da utilizzare se la lingua non esiste. L'ho inserito in giapponese qui. Se si desidera che altre lingue, ad esempio l'inglese, siano predefinite, immetterle in tale lingua.

Qui inseriamo Ciao e Addio come campioni. Si noti che fa distinzione tra maiuscole e minuscole.

image

Continuare a creare file di risorse per altre lingue. Per identificare la lingua, specificare il nome del file, ad esempio SharedResource.<Culture Code>.resx. È possibile specificare una o entrambe le combinazioni di ISO 639 e ISO 3166 per il codice delle impostazioni cultura. Il codice di supporto è soggetto a modifiche di volta in volta, pertanto la classe CultureInfo nel sito Microsoft Si prega di fare riferimento alla pagina.

Questa volta, en (inglese) ed es (spagnolo) sono preparati. Il giapponese non è disponibile perché è l'impostazione predefinita.

image

Immettere il testo tradotto con le chiavi nello stesso stato per ogni file.

image

image

Successivamente, si dirà un file che definisce solo le classi. Questo viene creato con lo stesso nome del file di risorse appena creato.

In fatti, non mi interessa quale sia il nome del file di codice stesso perché devi solo corrispondere al nome della classe all'interno, ma lasciarlo lo stesso in modo che sia facile da capire. Non importa dove si desidera scrivere il codice.

image

Impostare lo spazio dei nomi come radice del progetto e creare una classe vuota.

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

Correggere ogni programma

Startup.cs

Aggiusta Startup.cs. Descrivere il metodo ConfigureServices come segue:

Servizi. AddMvc(). Se è presente un Metodo AddViewLocalization, il testo tradotto sia dal lato visualizzazione che dal lato del controller è Sono sicuro che posso ottenerlo, ma Come è anche sui servizi ufficiali del sito web. Non vi è alcun problema con la chiamata di AddLocalization metodo insieme.

Opzioni. ResourcesPath specifica il percorso della cartella in cui si trova il file Resx. Se vengono specificati entrambi, i servizi. AddMvc(). Il AddViewLocalization metodo ha la precedenza.

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"; });
}

Modificare quindi il metodo Configure per Startup.cs. Se si desidera solo leggere il file di risorse, non è necessario. Codice necessario per consentire all'utente di specificare una lingua arbitrariamente.

Stiamo usando le funzionalità integrate in ASP.NET Core MVC come standard. Il codice seguente descrive la "stringa di query", "cookie" e "Intestazione HTTP accept-Language" a seconda dell'ambiente dell'utente. È possibile passare da una lingua di visualizzazione all'altra in una di esse. Ci vediamo più tardi come controllare l'operazione effettiva.

La lingua switchable è specificata qui nella matrice (supportedCultures). Ho specificato ja come lingua predefinita, ma non ho creato il file ja questa volta. SharedResource.resx viene utilizzato se viene specificata una lingua diversa da en.

Puoi separare l'interfaccia utente dalle lingue supportate, ma non c'è molto vantaggio nel separarla. Hai la stessa lingua.

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();

  // 省略
}

Controller: HomeController.cs

Controller: HomeController.cs. Per ottenere una lingua localizzata sul lato controller, iStringLocalizer viene ricevuto nel costruttore. SharedResource deve avere lo stesso nome della classe creata in precedenza. Il testo viene passato all'utilità di importazione del localizzatore ricevuto passando la stringa chiave immessa nel file di risorse. possono essere recuperati. La lingua del testo viene determinata in base alle impostazioni cultura richieste.

A proposito, oltre a IStringLocalizer, c'è anche un IHtmlLocalizer che può ottenere HTML così com'è.

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();
  }

  // 省略
}

Views _ViewImports.cshtml

Views:_ViewImports.cshtml. Per utilizzare un localizzatore sul lato visualizzazione, è necessario inserire IHtmlLocalizer. Se lo descrivi come segue per ora, è OK. Inoltre, SharedResource deve avere lo stesso nome del file di risorse e della classe creati in precedenza.

IHtmlLocalizer è nello spazio dei nomi Microsoft.AspNetCore.Mvc.Localization, pertanto lo definirò come utilizzando.

Se si desidera utilizzare il localizzatore solo in un determinato punto, è possibile includere il codice seguente in un file di visualizzazione separato. Se lo si scrive in un file _ViewImports.cshtml, sarà automaticamente possibile utilizzarlo in tutti i file di visualizzazione.

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

Viste, Home, Index.cshtml

File Views,Home,Index.cshtml. Il testo ottenuto sul lato del controller e il testo ottenuto direttamente sul lato di visualizzazione vengono visualizzati rispettivamente. Il localizzatore view-side ottiene anche il testo specificando una stringa chiave per l'indicizzatore.

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

Controllare l'operazione

Stringa di query

È possibile cambiare la lingua di visualizzazione specificando un codice delle impostazioni cultura nella stringa di query dell'URL. Il formato è ?culture<codice delle impostazioni cultura>. Se si desidera separarlo dall'interfaccia utente, sarà ?culture<culture code>&ui-culture<culture>.

Se non si specifica nulla: Se non specificato, viene utilizzato SharedResource.resx.If not specified, SharedResource.resx is used. (In realtà, è stata applicata un'altra sentenza...)

image

Il modello specificato per ?culture-en. La lingua di visualizzazione è l'inglese.

image

Il modello specificato per ?culture.es. La lingua di visualizzazione è lo spagnolo.

image

Il modello specificato per ?culture-ja. In origine, viene utilizzato il file SharedResource.ja.resx. SharedResource.resx viene utilizzato perché non esiste.

image

Provare a specificare una lingua che non esiste. SharedResource.resx viene utilizzato perché non esiste alcun file corrispondente.

image

Biscotti

I cookie possono cambiare la lingua di visualizzazione. Normalmente pubblicato dal lato server, ma questa volta cercherò di registrare i cookie direttamente nella funzione del browser.

Poiché ogni browser Web dispone di uno strumento di sviluppo, è possibile utilizzarlo per registrare i cookie. Nella figura seguente, è possibile premere F12 sull'edge per visualizzare gli strumenti di sviluppo.

Il nome del cookie corrispondente è . AspNetCore.Culture e il valore che specifica la lingua è Immettere nel formato c'<codice delle impostazioni cultura><codice delle impostazioni cultura>. Per i cookie, è necessario inserire anche il codice ui. Una volta registrato il cookie, aggiorna la pagina del browser web per aggiornarlo. Un cookie viene inviato al server in modo che il server recuperi la lingua specificata.

Nella figura seguente, è possibile immettere c'è en .uic-en per visualizzare l'inglese.

image

per c=es|uic=es visualizzare lo spagnolo.

image

Intestazione HTTP Accept-Language

L'intestazione HTTP Accept-Language controlla le informazioni di intestazione richieste dal browser Web al server. È la possibilità di cambiare lingua di conseguenza.

È possibile inviare qualsiasi lingua accettata nelle impostazioni del browser Web, ma per impostazione predefinita è possibile abbinare le impostazioni della lingua del sistema operativo. Accept-Language è ora inviato. (Il fatto che venga effettivamente inviato o meno dipende dal sistema operativo e dal browser Web.) La lingua viene inizializzata nel browser Web per la lingua del sistema operativo, ma potrebbe essere corretta.)

Così, per esempio, come mostrato nella figura seguente, è possibile aprire la pagina nel browser Web del sistema operativo in lingua inglese e inviare informazioni en, in modo da poter automaticamente SharedResource.en.resx è selezionato per visualizzare l'inglese.

image

Se si tenta di specificare una lingua che non esiste nella stringa di query, è necessario utilizzare originariamente SharedResource.resx. Accept-Language visualizza l'inglese perché en esiste.

image

Se ja è specificato nella stringa di query, la stringa di query ha la precedenza e viene visualizzato il giapponese.

image

Riepilogo

Qui ho cercato di implementare la commutazione multilingue nel modo più semplice. Per cambiare lingua in modo che corrisponda all'ambiente dell'utente, utilizzare l'intestazione HTTP Accept-Language come lingua di visualizzazione predefinita. Se l'utente sceglie una lingua, è consigliabile aggiungere cookie o aggiungere (o immettere direttamente) la stringa di query.