ASP.NET conmutación multilingüe con características principales integradas de MVC

Actualización de la página :
Fecha de creación de la página :

Ambiente

Visual Studio
  • Visual Studio 2019
Núcleo ASP.NET
  • 3.0
  • 3.1

Al principio

ASP.NET usar las características principales de localización de MVC para cambiar entre varios idiomas para mostrarlos.

Crear un archivo de recursos para el texto traducido

Cree una carpeta para almacenar los archivos de recursos (Resx) que administran el texto. La ubicación está en cualquier lugar, pero déjelo directamente debajo de la ruta. Esta ruta también afecta a la configuración posterior.

Haga clic con el botón derecho en el proyecto y seleccione Agregar o Nueva carpeta.

image

Deje los recursos de nombre de carpeta. También puede establecer este nombre de carpeta arbitrariamente, pero puede especificar este nombre de carpeta en la configuración posterior.

image

A continuación, cree un archivo de recursos para escribir texto para cada idioma.

Haga clic con el botón derecho en la carpeta Recursos y seleccione Agregar o Nuevo elemento.

image

Seleccione el archivo de recursos (.resx). El nombre de archivo puede ser arbitrario, pero debe coincidir con el nombre que especifique más adelante. Por ahora, digamos SharedResource.resx.

image

Después de crear el archivo .resx, haga doble clic para abrirlo y, a continuación, escriba el nombre que identifica el texto y el texto que desea mostrar realmente. El archivo SharedResource.resx es el archivo que se usará si el idioma no existe. Lo entré en japonés aquí. Si desea que otros idiomas, como el inglés, sean el valor predeterminado, introdúzcalos en ese idioma.

Aquí ingresamos Hello y Goodbye como muestras. Tenga en cuenta que distingue mayúsculas de minúsculas.

image

Continúe creando archivos de recursos para otros idiomas. Para identificar el idioma, especifique el nombre del archivo, como SharedResource.<Culture Code>.resx. Puede especificar una o ambas combinaciones de ISO 639 e ISO 3166 para el código de referencia cultural. El código de soporte técnico está sujeto a cambios de vez en cuando, por lo que la clase CultureInfo en el sitio de Microsoft Consulte la página.

Esta vez, se preparan en (inglés) y es (español). Japonés no está disponible porque es el valor predeterminado.

image

Introduzca el texto traducido con las claves en el mismo estado para cada archivo.

image

image

A continuación, tendrá un archivo que define solo las clases. Esto se crea con el mismo nombre que el archivo de recursos que acaba de crear.

De hecho, no me importa cuál sea el nombre del archivo de código en sí porque sólo tienes que coincidir con el nombre de la clase dentro, pero dejarlo igual para que sea fácil de entender. No importa dónde quieras escribir el código.

image

Haga que el espacio de nombres sea la raíz del proyecto y cree una clase vacía.

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

Arreglar cada programa

Startup.cs

Arregla Startup.cs. Describir el método ConfigureServices de la siguiente manera:

Servicios. AddMvc(). Si hay un método AddViewLocalization, el texto traducido por el lado de la vista y el lado del controlador es Estoy seguro de que puedo conseguirlo, pero Como también está en los servicios oficiales del sitio web. No hay ningún problema con llamar al método AddLocalization juntos.

Opciones. ResourcesPath especifica la ruta de acceso de la carpeta donde se encuentra el archivo Resx. Si se especifican ambos, los servicios. AddMvc(). El AddViewLocalization método tiene prioridad.

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

A continuación, modifique el método Configure para Startup.cs. Si solo desea leer el archivo de recursos, no lo necesita. Código necesario para permitir al usuario especificar un idioma arbitrariamente.

Estamos usando las características integradas en ASP.NET Core MVC como estándar. El código siguiente describe la "cadena de consulta", "cookie" y "Aceptar encabezado HTTP de idioma" dependiendo del entorno del usuario. Puede cambiar entre los idiomas de visualización en uno de ellos. Más adelante te veremos cómo comprobar la operación real.

El lenguaje conmutable se especifica aquí en la matriz (supportedCultures). He especificado ja como el idioma predeterminado, pero no he creado el archivo ja esta vez. SharedResource.resx se utiliza si se especifica un idioma distinto de en, es.

Puede separar la interfaz de usuario de los idiomas que admite, pero no hay mucha ventaja en separarla. Tienes el mismo idioma.

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

  // 省略
}

Controllers-HomeController.cs

Controllers-HomeController.cs archivo. Para obtener un idioma localizado en el lado del controlador, iStringLocalizer se recibe en el constructor. SharedResource debe tener el mismo nombre que la clase que creó anteriormente. El texto se pasa al importador del localizador recibido pasando la cadena de clave introducida en el archivo de recursos. se puede recuperar. El idioma del texto se determina en función de la referencia cultural solicitada.

Por cierto, además de IStringLocalizer, también hay un IHtmlLocalizer que puede obtener HTML tal como 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();
  }

  // 省略
}

Views-_ViewImports.cshtml

Views-_ViewImports.cshtml archivo. Para usar un localizador en el lado de la vista, debe insertar IHtmlLocalizer. Si lo describe de la siguiente manera por ahora, está bien. Además, SharedResource debe tener el mismo nombre que el archivo de recursos y la clase que creó anteriormente.

IHtmlLocalizer está en el espacio de nombres Microsoft.AspNetCore.Mvc.Localization, por lo que definiré esto como using.

Si solo desea utilizar el localizador en un punto determinado, puede incluir el código siguiente en un archivo de vista independiente. Si lo escribe en un archivo _ViewImports.cshtml, podrá usarlo automáticamente en todos los archivos de vista.

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

Vistas-Home-Index.cshtml

Views-Home-Index.cshtml archivo. El texto obtenido en el lado del controlador y el texto obtenido directamente en el lado de la vista se muestran respectivamente. El localizador del lado de la vista también obtiene el texto especificando una cadena de clave para el indizador.

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

Comprobar operación

Cadena de consulta

Puede cambiar el idioma de presentación especificando un código de referencia cultural en la cadena de consulta de la dirección URL. El formato es ?culture-<culture code>. Si desea separarlo de la interfaz de usuario, será ?culture-<código de referencia>&ui-culture-<código de referencia>.

Si no especifica nada: Si no se especifica, se utiliza SharedResource.resx. (De hecho, se ha aplicado otra sentencia...)

image

El patrón especificado para ?culture.en. El idioma de visualización es el inglés.

image

El patrón especificado para ?culture.es. El idioma de visualización es el español.

image

El patrón especificado para ?culture-ja. Originalmente, se utiliza el archivo SharedResource.ja.resx. SharedResource.resx se utiliza porque no existe.

image

Intente especificar un idioma que no existe. SharedResource.resx se utiliza porque no hay ningún archivo correspondiente aquí.

image

Galletas

Las cookies pueden cambiar el idioma de visualización. Normalmente publicado desde el lado del servidor, pero esta vez voy a tratar de registrar las cookies directamente en la función del navegador.

Debido a que cada navegador web tiene una herramienta de desarrollo, la utiliza para registrar cookies. En la figura siguiente, puede presionar F12 en Edge para mostrar las herramientas de desarrollo.

El nombre de la cookie correspondiente es . AspNetCore.Culturey, y el valor que especifica el idioma es Ingrese en la forma de c-<código de referencia cultural>-uic-<código de referencia cultural>. En el caso de las cookies, también debe introducir el código ui. Una vez que haya registrado su cookie, actualice la página de su navegador web para actualizarla. Se envía una cookie al servidor para que el servidor recupere el idioma especificado.

En la figura siguiente, puede introducir c-en-uic-en para mostrar el inglés.

image

tipo c-es-uic-es para mostrar el español.

image

Encabezado HTTP Accept-Language

El encabezado HTTP Accept-Language comprueba la información de encabezado solicitada desde el explorador web al servidor. Es la capacidad de cambiar de idioma en consecuencia.

Puede enviar cualquier idioma aceptado en la configuración del explorador web, pero de forma predeterminada puede coincidir con la configuración del idioma del sistema operativo. Aceptar-Idioma ahora se envía. (Si realmente se envía depende del sistema operativo y el navegador web.) El idioma se inicializa en el explorador web para el idioma del sistema operativo, pero puede ser correcto.)

Así, por ejemplo, como se muestra en la figura siguiente, puede abrir la página en el navegador web del sistema operativo en inglés y enviar información en, para que pueda automáticamente SharedResource.en.resx está seleccionado para mostrar inglés.

image

Si intenta especificar un idioma que no existe en la cadena de consulta, debe usar originalmente SharedResource.resx. Accept-Language muestra el inglés porque existe en.

image

Si se especifica ja en la cadena de consulta, la cadena de consulta tiene prioridad y se muestra japonés.

image

Resumen

Aquí traté de implementar la conmutación en varios idiomas de la manera más fácil. Para cambiar de idioma para que coincida con el entorno del usuario, utilice el encabezado HTTP Accept-Language como idioma de visualización predeterminado. Si el usuario elige cualquier idioma, es una buena idea agregar cookies o agregar (o escribir directamente) de la cadena de consulta.