ASP.NET bertukar pelbagai bahasa dengan ciri teras MVC terbina dalam
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.
Biarkan sumber nama folder. Anda juga boleh Setkan nama folder ini sewenang-wenangnya, tetapi anda boleh menentukan nama folder ini dalam tetapan kemudian.
Kemudian, cipta fail sumber untuk memasukkan teks untuk setiap bahasa.
Klik kanan folder sumber dan pilih Tambah atau item baru.
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.
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.
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.
Masukkan teks yang diterjemahkan dengan kekunci dalam keadaan yang sama untuk setiap fail.
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.
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
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
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...)
Corak yang ditetapkan untuk ? budaya = En. Bahasa paparan adalah Bahasa Inggeris.
Corak yang ditetapkan untuk ? budaya = es. Bahasa paparan ialah Bahasa Sepanyol.
Corak yang ditentukan ? budaya = JA. Asalnya, fail SharedResource. JA. resx digunakan. SharedResource. resx digunakan kerana ia tidak wujud.
Cuba untuk menentukan bahasa yang tidak wujud. SharedResource. resx digunakan kerana tidak ada fail yang sepadan di sini.
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.
Type c = es | UIC = es untuk memaparkan Bahasa Sepanyol.
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.
Jika anda cuba menentukan bahasa yang tidak wujud dalam rentetan pertanyaan, anda sepatutnya menggunakan SharedResource. resx. Terima Bahasa memaparkan Bahasa Inggeris kerana en wujud.
Jika JA ditentukan dalam rentetan pertanyaan, rentetan pertanyaan mengambil keutamaan dan Bahasa Jepun dipaparkan.
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.