ASP.NET comutação multilíngue com recursos incorporados do núcleo MVC

Página atualizada :
Data de criação de página :

Ambiente

Estúdio Visual
  • Visual Studio 2019
núcleo ASP.NET
  • 3.0
  • 3.1

No começo

ASP.NET usar os recursos de localização mvc principais para alternar entre vários idiomas para exibi-los.

Crie um arquivo de recursos para texto traduzido

Crie uma pasta para armazenar os arquivos de recursos (Resx) que gerenciam o texto. A localização está em qualquer lugar, mas deixe-a diretamente abaixo da rota. Esse caminho também afeta as configurações posteriores.

Clique com o botão direito do mouse no projeto e selecione Adicionar ou Nova pasta.

image

Deixe os recursos do nome da pasta. Você também pode definir o nome desta pasta arbitrariamente, mas você pode especificar esse nome da pasta em configurações posteriores.

image

Em seguida, crie um arquivo de recurso para inserir texto para cada idioma.

Clique com o botão direito do mouse na pasta Recursos e selecione Adicionar ou Novo Item.

image

Selecione o arquivo de recursos (.resx). O nome do arquivo pode ser arbitrário, mas deve corresponder ao nome que você especificar mais tarde. Por enquanto, digamos SharedResource.resx.

image

Depois de criar o arquivo .resx, clique duas vezes para abri-lo e digite o nome que identifica o texto e o texto que você deseja exibir. O arquivo SharedResource.resx é o arquivo a ser usado se o idioma não existir. Eu entrei em japonês aqui. Se você quiser que outros idiomas, como o inglês, sejam o padrão, insira-os nesse idioma.

Aqui entramos Olá e Adeus como amostras. Note que é sensível ao caso.

image

Continue a criar arquivos de recursos para outros idiomas. Para identificar o idioma, especifique o nome do arquivo, como SharedResource.<Culture Code>.resx. Você pode especificar uma ou ambas as combinações de ISO 639 e ISO 3166 para o código de cultura. O código de suporte está sujeito a alterações de tempos em tempos, de modo que a classe CultureInfo no site da Microsoft Por favor, consulte a página.

Desta vez, en (inglês) e es (espanhol) estão preparados. O japonês não está disponível porque é o padrão.

image

Digite o texto traduzido com as teclas no mesmo estado para cada arquivo.

image

image

Em seguida, você terá um arquivo que define apenas as classes. Você cria isso com o mesmo nome do arquivo de recursos que acabou de criar.

Na verdade, eu não me importo qual é o nome do arquivo de código em si porque você só tem que combinar o nome da classe dentro, mas deixá-lo o mesmo para que seja fácil de entender. Não importa onde você quer escrever o código.

image

Faça do namespace a raiz do projeto e crie uma classe vazia.

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

Corrigir cada programa

Startup.cs

Conserte Startup.cs. Descreva o método ConfigureServices da seguinte forma:

Serviços. AddMvc(). Se houver um método AddViewLocalization, o texto traduzido pelo lado da exibição e do lado do controlador é Tenho certeza que posso conseguir, mas. Como também está nos serviços oficiais do site. Não há problema em chamar o método addlocalization em conjunto.

Opções. ResourcesPath especifica o caminho da pasta onde o arquivo Resx está localizado. Se ambos forem especificados, serviços. AddMvc(). O método AddViewLocalization tem precedência.

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

Em seguida, modifique o método Configurar para Startup.cs. Se você só quer ler o arquivo de recursos, você não precisa dele. Código que é necessário para permitir que o usuário especifique um idioma arbitrariamente.

Estamos usando os recursos incorporados em ASP.NET MVC Core como padrão. O código a seguir descreve a "seqüência de consultas", "cookie" e "Cabeçalho HTTP do Idioma de aceitação", dependendo do ambiente do usuário. Você pode alternar entre idiomas de exibição em um deles. Nos vemos mais tarde como verificar a operação real.

O idioma comutável é especificado aqui na matriz (Cults suportados). Eu especifiquei ja como o idioma padrão, mas eu não criei o arquivo ja desta vez. SharedResource.resx é usado se um idioma diferente de en,es for especificado.

Você pode separar a ui das línguas que você suporta, mas não há muito benefício em separá-la. Você tem a mesma língua.

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

  // 省略
}

Controladores\HomeController.cs

Controladores\Arquivo HomeController.cs. Para obter uma linguagem localizada no lado do controlador, o iStringLocalizer é recebido no construtor. O Recurso Compartilhado deve ter o mesmo nome da classe que você criou anteriormente. O texto é passado para o importador do localizador recebido, passando a string de tecla inserida no arquivo de recursos. pode ser recuperado. A linguagem do texto é determinada com base na cultura que está sendo solicitada.

A propósito, além do IStringLocalizer, há também um IHtmlLocalizer que pode obter HTML como ele é.

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 file. Para usar um localizador no lado da vista, você deve injetar IHtmlLocalizer. Se você descrevê-lo como segue por enquanto, está ok. Além disso, o SharedResource deve ter o mesmo nome do arquivo de recursos e classe que você criou anteriormente.

IHtmlLocalizer está no espaço de nome Microsoft.AspNetCore.Mvc.Localização, então vou definir isso como usando.

Se você quiser usar o localizador em um determinado ponto, você pode incluir o seguinte código em um arquivo de exibição separado. Se você gravá-lo em um arquivo _ViewImports.cshtml, você poderá usá-lo automaticamente em todos os arquivos de exibição.

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

Views\Home\Index.cshtml

Visualizações\Home\Index.cshtml file. O texto obtido no lado do controlador e o texto obtido diretamente no lado da exibição são exibidos, respectivamente. O localizador do lado da exibição também obtém o texto especificando uma seqüência de tecla para o indexador.

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

Operação de verificação

Cadeia de consulta

Você pode alternar o idioma de exibição especificando um código de cultura na seqüência de consulta da URL. O formato é ?culture=<culture code>. Se você quiser separá-la da ui, será ?culture=<culture code>&ui-culture=<culture code>.

Se você não especificar nada: Se não for especificado, SharedResource.resx é usado. (Na verdade, outro acórdão foi aplicado...)

image

O padrão especificado para ?culture=en. O idioma de exibição é inglês.

image

O padrão especificado para ?culture=es. A língua de exibição é espanhol.

image

O padrão especificado para ?culture=ja. Originalmente, o arquivo SharedResource.ja.resx é usado. SharedResource.resx é usado porque ele não existe.

image

Tente especificar uma linguagem que não existe. SharedResource.resx é usado porque não há nenhum arquivo correspondente aqui.

image

Cookies

Os cookies podem mudar o idioma de exibição. Normalmente publicado do lado do servidor, mas desta vez vou tentar registrar cookies diretamente na função do navegador.

Como cada navegador da Web tem uma ferramenta de desenvolvedor, você a usa para registrar cookies. Na figura abaixo, você pode pressionar F12 no Edge para exibir as ferramentas do desenvolvedor.

O nome do cookie correspondente é . AspNetCore.Culture, e o valor que especifica o idioma é Digite na forma de c=<culture code>|uic=<culture code>. Para cookies, você também deve inserir o código de ii. Depois de registrar seu cookie, atualize sua página do navegador da Web para atualizá-lo. Um cookie é enviado para o servidor para que o servidor recupere o idioma especificado.

Na figura abaixo, você pode inserir c=en|uic=en para exibir inglês.

image

tipo c=es|uic=es para exibir espanhol.

image

Cabeçalho HTTP do idioma de aceitação

O cabeçalho HTTP do Idioma aceito verifica as informações de cabeçalho solicitadas do navegador da Web para o servidor. É a capacidade de mudar as línguas de acordo.

Você pode enviar qualquer Idioma de Aceitação nas configurações do navegador da Web, mas por padrão você pode corresponder às configurações do idioma do sistema operacional. A linguagem de aceitação agora é enviada. (Se ele é realmente enviado depende do sistema operacional e do navegador da Web.) O idioma é inicializado no navegador da Web para o idioma do SO, mas pode estar correto.)

Assim, por exemplo, como mostrado na figura abaixo, você pode abrir a página no navegador da Web do sistema operacional em inglês e enviar informações en, para que você possa automaticamente SharedResource.en.resx é selecionado para exibir inglês.

image

Se você tentar especificar um idioma que não existe na seqüência de consultas, você deve usar originalmente SharedResource.resx. O Accept-Language exibe inglês porque en existe.

image

Se ja for especificado na seqüência de consulta, a seqüência de consultas prevalecerá e o japonês será exibido.

image

Resumo

Aqui eu tentei implementar a comutação multilíndrico da maneira mais fácil. Para alternar idiomas para corresponder ao ambiente do usuário, use o cabeçalho HTTP do Idioma aceito como o idioma de exibição padrão. Se o usuário escolher qualquer idioma, é uma boa ideia adicionar cookies ou adicionar (ou inserir diretamente) a seqüência de consultas.