ASP.NET bertukar pelbagai bahasa dengan ciri teras MVC terbina dalam

Laman dikemaskini :
Tarikh penciptaan halaman :

Persekitaran

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

Pada mulanya

ASP.NET menggunakan teras MVC Penyetempatan ciri untuk beralih antara pelbagai bahasa untuk memaparkannya.

Cipta fail sumber untuk teks terjemahan

Cipta folder untuk menyimpan fail sumber (Resx) yang menguruskan teks. Lokasi di mana sahaja, tetapi meninggalkannya secara langsung di bawah laluan. Laluan ini juga menjejaskan tetapan kemudian.

Klik kanan projek dan pilih Tambah atau folder baru.

image

Biarkan sumber nama folder. Anda juga boleh Setkan nama folder ini sewenang-wenangnya, tetapi anda boleh menentukan nama folder ini dalam tetapan kemudian.

image

Kemudian, cipta fail sumber untuk memasukkan teks untuk setiap bahasa.

Klik kanan folder sumber dan pilih Tambah atau item baru.

image

Pilih fail sumber (. resx). Nama fail boleh sewenang-wenangnya, tetapi ia mesti sepadan dengan nama yang anda tentukan kemudian. Buat masa ini, katakan SharedResource. resx.

image

Selepas anda mencipta fail. resx, klik dua kali untuk membukanya, dan kemudian taipkan nama yang mengenal pasti teks dan teks yang anda ingin sebenarnya dipaparkan. Fail SharedResource. resx adalah fail yang akan digunakan jika Bahasa tidak wujud. Saya masukkannya dalam Bahasa Jepun di sini. Jika anda mahu bahasa lain, seperti Bahasa Inggeris, untuk menjadi lalai, masukkan mereka dalam bahasa tersebut.

Di sini kita masukkan Halo dan selamat tinggal sebagai sampel. Perhatikan bahawa kes sensitif.

image

Teruskan untuk mencipta fail sumber untuk bahasa lain. Untuk mengenal pasti bahasa, tentukan nama fail, seperti Sharedresource. ≪ kod budaya >. resx. Anda boleh menentukan satu atau kedua-dua kombinasi ISO 639 dan ISO 3166 untuk kod budaya. Kod sokongan adalah tertakluk kepada perubahan dari semasa ke semasa, jadi kelas Cultureinfo pada tapak Microsoft Sila rujuk halaman.

Kali ini, en (Inggeris) dan es (Sepanyol) disediakan. Bahasa Jepun tidak tersedia kerana ia adalah lalai.

image

Masukkan teks yang diterjemahkan dengan kekunci dalam keadaan yang sama untuk setiap fail.

image

image

Seterusnya, anda akan mempunyai fail yang mentakrifkan hanya kelas. Anda cipta ini dengan nama yang sama dengan fail sumber yang baru anda cipta.

Malah, saya tidak peduli apa nama fail kod itu sendiri adalah kerana anda hanya perlu sepadan dengan nama kelas di dalam, tetapi biarkan ia sama supaya ia mudah difahami. Tidak kira di mana anda mahu menulis kod.

image

Jadikan ruang nama akar projek dan cipta kelas kosong.

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

Baiki setiap atur cara

Startup.cs

Betulkan startup.CS. Huraikan kaedah ConfigureServices seperti berikut:

Perkhidmatan. AddMvc (). Jika terdapat kaedah Addviewpenyetempatan, teks yang diterjemahkan oleh kedua-dua bahagian paparan dan bahagian pengawal Saya pasti saya boleh mendapatkannya, tetapi Seperti juga pada perkhidmatan laman web rasmi. Tidak ada masalah dengan memanggil kaedah Addpenyetempatan bersama-sama.

Pilihan. Sumber Cespath menentukan laluan folder di mana fail Resx terletak. Jika kedua-duanya ditentukan, Perkhidmatan. AddMvc (). Kaedah Addviewpenyetempatan mengambil keutamaan.

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

Kemudian ubah suai kaedah konfigurasi untuk startup.CS. Jika anda hanya mahu membaca fail sumber, anda tidak memerlukannya. Kod yang diperlukan untuk membenarkan pengguna menentukan suatu Timbang Tara Bahasa.

Kami menggunakan ciri yang dibina di ASP.NET Core MVC sebagai standard. Kod berikut menerangkan "rentetan pertanyaan", "kuki" dan "Pengepala HTTP terima Bahasa" bergantung kepada persekitaran pengguna. Anda boleh bertukar antara bahasa paparan dalam salah satu daripadanya. Kami akan melihat anda kemudian bagaimana untuk menyemak operasi sebenar.

Bahasa boleh suis ditentukan di sini dalam array (supportedCultures). Saya tentukan JA sebagai Bahasa lalai, tetapi saya belum mencipta fail JA masa ini. SharedResource. resx digunakan jika bahasa selain daripada en, es ditentukan.

Anda boleh memisahkan UI daripada bahasa yang anda sokong, tetapi tidak banyak manfaat untuk memisahkan. Anda mempunyai bahasa yang sama.

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

Fail Controllers\HomeController.CS . Untuk mendapatkan Bahasa setempat pada sisi pengawal, iStringLocalizer diterima dalam pengeluar. SharedResource mesti mempunyai nama yang sama seperti kelas yang anda cipta lebih awal. Teks dihantar kepada pengimport Localizer yang diterima dengan menghantar rentetan kunci yang dimasukkan dalam fail sumber. boleh didapatkan semula. Bahasa teks ditentukan berdasarkan budaya yang diminta.

Dengan cara ini, di samping IStringLocalizer, Terdapat juga IHtmlLocalizer yang boleh mendapatkan HTML kerana ia adalah.

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

  // 省略
}

Pandangan \ _ViewImports. cshtml

Views \ _ViewImports. cshtml fail. Untuk menggunakan Localizer pada sisi pandangan, anda mesti menyuntik IHtmlLocalizer. Jika anda gambarkan seperti berikut untuk sekarang, ia adalah OK. Juga, SharedResource mesti mempunyai nama yang sama dengan fail sumber dan kelas yang anda buat lebih awal.

IHtmlLocalizer dalam Microsoft. di ruang bawah "AspNetCore. MVC., jadi saya akan menentukan ini sebagai menggunakan.

Jika anda hanya mahu menggunakan Localizer pada titik tertentu, anda boleh memasukkan kod berikut dalam fail pandangan berasingan. Jika anda menulis dalam _ViewImports. cshtml fail, anda akan secara automatik akan dapat menggunakannya dalam semua fail pandangan.

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

Views\Home\Index.cshtml

Fail Views\Home\Index.cshtml . Teks yang diperolehi pada sisi pengawal dan teks diperolehi secara langsung pada sisi pandangan dipaparkan. Localizer lihat-Side juga mendapat teks dengan menentukan rentetan kekunci untuk indexer.

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

Semak operasi

Rentetan pertanyaan

Anda boleh menukar bahasa paparan dengan menentukan kod budaya dalam rentetan pertanyaan URL. Format adalah ? budaya = < kod budaya >. Jika anda mahu untuk memisahkan dari UI, ia akan menjadi ? budaya = < kod budaya > & UI-budaya = < kod budaya >.

Jika anda tidak menentukan apa-apa: Jika tidak ditentukan, SharedResource. resx digunakan. (Sebenarnya, satu lagi penghakiman telah digunakan...)

image

Corak yang ditetapkan untuk ? budaya = En. Bahasa paparan adalah Bahasa Inggeris.

image

Corak yang ditetapkan untuk ? budaya = es. Bahasa paparan ialah Bahasa Sepanyol.

image

Corak yang ditentukan ? budaya = JA. Asalnya, fail SharedResource. JA. resx digunakan. SharedResource. resx digunakan kerana ia tidak wujud.

image

Cuba untuk menentukan bahasa yang tidak wujud. SharedResource. resx digunakan kerana tidak ada fail yang sepadan di sini.

image

Cookies

Kuki boleh menukar bahasa paparan. Biasanya diterbitkan dari sisi pelayan, tetapi kali ini saya akan cuba untuk mendaftar cookies secara langsung dalam fungsi pelayar.

Kerana setiap pelayar web mempunyai alat pembangun, anda menggunakannya untuk mendaftarkan kuki. Dalam Rajah di bawah, anda boleh menekan F12 di tepi untuk memaparkan alat pemaju.

Nama cookie yang sepadan . AspNetCore. budaya, dan nilai yang menentukan bahasa adalah Masukkan dalam bentuk c = kod budaya < > | UIC = < kod budaya >. Untuk kuki, anda juga perlu memasukkan kod UI. Sebaik sahaja anda telah mendaftar cookie anda, Muat semula laman pelayar web anda untuk refresh. Cookie dihantar ke pelayan supaya pelayan akan mengambil bahasa yang ditentukan.

Dalam Rajah di bawah, anda boleh memasukkan c = en | UIC = en untuk memaparkan Bahasa Inggeris.

image

Type c = es | UIC = es untuk memaparkan Bahasa Sepanyol.

image

Pengepala HTTP terima-Bahasa

Pengepala HTTP menerima Bahasa menyemak maklumat pengepala yang diminta daripada pelayar web kepada pelayan. Ia adalah keupayaan untuk menukar bahasa dengan sewajarnya.

Anda boleh menghantar sebarang Bahasa terima dalam tetapan pelayar web anda, tetapi secara lalai anda boleh memadankan seting Bahasa OS. Terima Bahasa kini dihantar. (Sama ada atau tidak ia sebenarnya dihantar bergantung pada OS dan pelayar web.) Bahasa itu dimulakan dalam pelayar web untuk bahasa OS, tetapi ia mungkin betul.)

Jadi, sebagai contoh, seperti yang ditunjukkan dalam Rajah di bawah, anda boleh membuka halaman dalam pelayar web OS Bahasa Inggeris dan menghantar maklumat en, supaya anda boleh secara automatik SharedResource. En. resx dipilih untuk memaparkan Bahasa Inggeris.

image

Jika anda cuba menentukan bahasa yang tidak wujud dalam rentetan pertanyaan, anda sepatutnya menggunakan SharedResource. resx. Terima Bahasa memaparkan Bahasa Inggeris kerana en wujud.

image

Jika JA ditentukan dalam rentetan pertanyaan, rentetan pertanyaan mengambil keutamaan dan Bahasa Jepun dipaparkan.

image

Ringkasan

Di sini saya cuba untuk melaksanakan penukaran pelbagai bahasa dengan cara yang paling mudah. Untuk menukar bahasa agar sepadan dengan persekitaran pengguna, gunakan Pengepala HTTP yang menerima Bahasa sebagai bahasa paparan lalai. Jika pengguna memilih mana-mana bahasa, ia adalah idea yang baik untuk menambah cookies atau menambah (atau masuk secara langsung) rentetan pertanyaan.