ASP.NET Globalisasi dan pelokalan Core Blazor
Catatan
Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Peringatan
Versi ASP.NET Core ini tidak lagi didukung. Untuk informasi selengkapnya, lihat Kebijakan Dukungan .NET dan .NET Core. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Penting
Informasi ini berkaitan dengan produk pra-rilis yang mungkin dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Artikel ini menjelaskan cara merender konten global dan terlokalisasi kepada pengguna dalam budaya dan bahasa yang berbeda.
Globalisasi dan pelokalan
Untuk globalisasi, Blazor menyediakan pemformatan angka dan tanggal. Untuk pelokalan, Blazor merender konten menggunakan sistem .NET Resources.
Serangkaian fitur pelokalan ASP.NET Core terbatas didukung:
Didukung: IStringLocalizer dan IStringLocalizer<T> didukung di Blazor aplikasi.
Tidak didukung: IHtmlLocalizerpelokalan Anotasi Data , IViewLocalizer, dan ASP.NET fitur Core MVC dan tidak didukung di Blazor aplikasi.
Artikel ini menjelaskan cara menggunakan Blazorfitur globalisasi dan pelokalan berdasarkan:
- Header
Accept-Language
, yang diatur oleh browser berdasarkan preferensi bahasa pengguna di pengaturan browser. - Budaya yang ditetapkan oleh aplikasi tidak didasarkan pada nilai
Accept-Language
header. Pengaturan dapat statis untuk semua pengguna atau dinamis berdasarkan logika aplikasi. Saat pengaturan didasarkan pada preferensi pengguna, pengaturan biasanya disimpan untuk dimuat ulang pada kunjungan mendatang.
Untuk informasi umum tambahan, lihat sumber daya berikut ini:
- Globalisasi dan pelokalan di ASP.NET Core
- .NET Fundamentals: Globalisasi
- .NET Fundamentals: Pelokalan
Seringkali, istilah bahasa dan budaya digunakan secara bergantian ketika berhadapan dengan konsep globalisasi dan pelokalan.
Dalam artikel ini, bahasa mengacu pada pilihan yang dibuat oleh pengguna di pengaturan browser mereka. Pilihan bahasa pengguna dikirimkan dalam permintaan browser di Accept-Language
header. Pengaturan browser biasanya menggunakan kata "bahasa" di UI.
Budaya berkaitan dengan anggota .NET dan Blazor API. Misalnya, permintaan pengguna dapat menyertakan header yang menentukan bahasa dari perspektif pengguna, tetapi aplikasi pada akhirnya mengatur CurrentCulture properti ("budaya") dari bahasa yang diminta pengguna.Accept-Language
API biasanya menggunakan kata "budaya" dalam nama anggotanya.
Panduan dalam artikel ini tidak mencakup pengaturan atribut bahasa HTML halaman (<html lang="...">
), alat aksesiblitas mana yang digunakan. Anda dapat mengatur nilai secara statis dengan menetapkan bahasa ke lang
atribut <html>
tag atau ke document.documentElement.lang
di JavaScript. Anda dapat secara dinamis mengatur nilai document.documentElement.lang
dengan JS interop.
Catatan
Contoh kode dalam artikel ini mengadopsi jenis referensi nullable (NRTs) dan .NET compiler null-state static analysis, yang didukung di ASP.NET Core di .NET 6 atau yang lebih baru. Saat menargetkan ASP.NET Core 5.0 atau yang lebih lama, hapus penunjukan jenis null (?
) dari contoh artikel.
Globalisasi
Direktif @bind
atribut menerapkan format dan mengurai nilai untuk ditampilkan berdasarkan bahasa pilihan pertama pengguna yang didukung aplikasi. @bind
@bind:culture
mendukung parameter untuk menyediakan System.Globalization.CultureInfo untuk mengurai dan memformat nilai.
Budaya saat ini dapat diakses dari System.Globalization.CultureInfo.CurrentCulture properti.
CultureInfo.InvariantCulture digunakan untuk jenis bidang berikut (<input type="{TYPE}" />
, di mana {TYPE}
tempat penampung adalah jenisnya):
date
number
Jenis bidang sebelumnya:
- Ditampilkan menggunakan aturan pemformatan berbasis browser yang sesuai.
- Tidak boleh berisi teks bentuk bebas.
- Berikan karakteristik interaksi pengguna berdasarkan implementasi browser.
Blazor memberikan dukungan bawaan untuk merender nilai dalam budaya saat ini. Oleh karena itu, menentukan budaya dengan @bind:culture
tidak disarankan saat menggunakan date
jenis bidang dan number
.
Jenis bidang berikut ini memiliki persyaratan pemformatan tertentu dan tidak didukung oleh semua browser utama, sehingga tidak didukung oleh Blazor:
datetime-local
month
week
Untuk dukungan browser saat ini dari jenis sebelumnya, lihat Dapatkah saya menggunakan.
Dukungan globalisasi .NET dan Komponen Internasional untuk Unicode (ICU) (Blazor WebAssembly)
Blazor WebAssembly menggunakan API globalisasi yang berkurang dan serangkaian Komponen Internasional bawaan untuk lokal Unicode (ICU). Untuk informasi selengkapnya, lihat globalisasi .NET dan ICU: ICU di WebAssembly.
Untuk memuat file data ICU kustom untuk mengontrol lokal aplikasi, lihat WASM Globalization Icu. Saat ini, diperlukan pembuatan file data ICU kustom secara manual. Alat .NET untuk memudahkan proses pembuatan file direncanakan untuk .NET 9 pada bulan November 2024.
Blazor WebAssembly menggunakan API globalisasi yang berkurang dan serangkaian Komponen Internasional bawaan untuk lokal Unicode (ICU). Untuk informasi selengkapnya, lihat globalisasi .NET dan ICU: ICU di WebAssembly.
Memuat subset kustom lokal dalam Blazor WebAssembly aplikasi didukung di .NET 8 atau yang lebih baru. Untuk informasi selengkapnya, akses bagian ini untuk versi 8.0 atau yang lebih baru dari artikel ini.
Globalisasi invarian
Bagian ini hanya berlaku untuk skenario sisi Blazor klien.
Jika aplikasi tidak memerlukan pelokalan, konfigurasikan aplikasi untuk mendukung budaya invarian, yang umumnya didasarkan pada bahasa Inggris Amerika Serikat (en-US
). Menggunakan globalisasi invarian mengurangi ukuran unduhan aplikasi dan menghasilkan startup aplikasi yang lebih cepat. Atur InvariantGlobalization
properti ke true
dalam file proyek aplikasi (.csproj
):
<PropertyGroup>
<InvariantGlobalization>true</InvariantGlobalization>
</PropertyGroup>
Atau, konfigurasikan globalisasi invarian dengan pendekatan berikut:
Di
runtimeconfig.json
:{ "runtimeOptions": { "configProperties": { "System.Globalization.Invariant": true } } }
Dengan variabel lingkungan:
- Kunci:
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT
- Nilai:
true
atau1
- Kunci:
Untuk informasi selengkapnya, lihat Opsi konfigurasi runtime untuk globalisasi (dokumentasi.NET).
Informasi zona waktu
Bagian ini hanya berlaku untuk skenario sisi Blazor klien.
Mengadopsi globalisasi invarian hanya menghasilkan penggunaan nama zona waktu yang tidak dilokalkan. Untuk memangkas kode dan data zona waktu, yang mengurangi ukuran unduhan aplikasi dan menghasilkan startup aplikasi yang lebih cepat, terapkan <InvariantTimezone>
properti MSBuild dengan nilai true
dalam file proyek aplikasi:
<PropertyGroup>
<InvariantTimezone>true</InvariantTimezone>
</PropertyGroup>
Catatan
<BlazorEnableTimeZoneSupport>
mengambil alih pengaturan sebelumnya <InvariantTimezone>
. Sebaiknya hapus <BlazorEnableTimeZoneSupport>
pengaturan.
File data disertakan untuk membuat informasi zona waktu benar. Jika aplikasi tidak memerlukan fitur ini, pertimbangkan untuk menonaktifkannya dengan mengatur <BlazorEnableTimeZoneSupport>
properti MSBuild ke false
dalam file proyek aplikasi:
<PropertyGroup>
<BlazorEnableTimeZoneSupport>false</BlazorEnableTimeZoneSupport>
</PropertyGroup>
Komponen demonstrasi
Komponen berikut CultureExample1
dapat digunakan untuk menunjukkan Blazor konsep globalisasi dan pelokalan yang dicakup oleh artikel ini.
CultureExample1.razor
:
@page "/culture-example-1"
@using System.Globalization
<h1>Culture Example 1</h1>
<ul>
<li><b>CurrentCulture</b>: @CultureInfo.CurrentCulture</li>
<li><b>CurrentUICulture</b>: @CultureInfo.CurrentUICulture</li>
</ul>
<h2>Rendered values</h2>
<ul>
<li><b>Date</b>: @dt</li>
<li><b>Number</b>: @number.ToString("N2")</li>
</ul>
<h2><code><input></code> elements that don't set a <code>type</code></h2>
<p>
The following <code><input></code> elements use
<code>CultureInfo.CurrentCulture</code>.
</p>
<ul>
<li><label><b>Date:</b> <input @bind="dt" /></label></li>
<li><label><b>Number:</b> <input @bind="number" /></label></li>
</ul>
<h2><code><input></code> elements that set a <code>type</code></h2>
<p>
The following <code><input></code> elements use
<code>CultureInfo.InvariantCulture</code>.
</p>
<ul>
<li><label><b>Date:</b> <input type="date" @bind="dt" /></label></li>
<li><label><b>Number:</b> <input type="number" @bind="number" /></label></li>
</ul>
@code {
private DateTime dt = DateTime.Now;
private double number = 1999.69;
}
Format string angka (N2
) dalam contoh sebelumnya (.ToString("N2")
) adalah penentu format numerik .NET standar. N2
Format ini didukung untuk semua jenis numerik, termasuk pemisah grup, dan merender hingga dua tempat desimal.
Secara opsional, tambahkan item menu ke navigasi di NavMenu
komponen (NavMenu.razor
) untuk CultureExample1
komponen.
Mengatur budaya secara dinamis dari Accept-Language
header
Microsoft.Extensions.Localization
Tambahkan paket ke aplikasi.
Header Accept-Language
diatur oleh browser dan dikontrol oleh preferensi bahasa pengguna di pengaturan browser. Di pengaturan browser, pengguna mengatur satu atau beberapa bahasa pilihan dalam urutan preferensi. Urutan preferensi digunakan oleh browser untuk mengatur nilai kualitas (q
, 0-1) untuk setiap bahasa di header. Contoh berikut menentukan Amerika Serikat bahasa Inggris, Inggris, dan Kosta Rika Spanyol dengan preferensi untuk Amerika Serikat bahasa Inggris atau Inggris:
Accept-Language: en-US,en; q=0.9,es-CR; q=0.8
Budaya aplikasi diatur dengan mencocokkan bahasa yang diminta pertama yang cocok dengan budaya aplikasi yang didukung.
Dalam pengembangan sisi klien, atur BlazorWebAssemblyLoadAllGlobalizationData
properti ke true
dalam file proyek aplikasi sisi klien (.csproj
):
<PropertyGroup>
<BlazorWebAssemblyLoadAllGlobalizationData>true</BlazorWebAssemblyLoadAllGlobalizationData>
</PropertyGroup>
Dalam pengembangan sisi klien, secara dinamis mengatur budaya dari Accept-Language
header tidak didukung.
Catatan
Jika spesifikasi aplikasi memerlukan pembatasan budaya yang didukung ke daftar eksplisit, lihat bagian Secara dinamis mengatur budaya sisi klien menurut preferensi pengguna di artikel ini.
Aplikasi dilokalkan menggunakan Middleware Pelokalan. Tambahkan layanan pelokalan ke aplikasi dengan AddLocalization.
Tambahkan baris berikut ke Program
file tempat layanan terdaftar:
builder.Services.AddLocalization();
Dalam pengembangan sisi server, tentukan budaya aplikasi yang didukung sebelum middleware apa pun yang mungkin memeriksa budaya permintaan. Umumnya, tempatkan Middleware Pelokalan Permintaan segera sebelum memanggil MapRazorComponents. Contoh berikut mengonfigurasi budaya yang didukung untuk bahasa Inggris Amerika Serikat dan Bahasa Spanyol Costa Rican:
Dalam pengembangan sisi server, tentukan budaya aplikasi yang didukung segera setelah Middleware Perutean (UseRouting) ditambahkan ke alur pemrosesan. Contoh berikut mengonfigurasi budaya yang didukung untuk bahasa Inggris Amerika Serikat dan Bahasa Spanyol Costa Rican:
app.UseRequestLocalization(new RequestLocalizationOptions()
.AddSupportedCultures(new[] { "en-US", "es-CR" })
.AddSupportedUICultures(new[] { "en-US", "es-CR" }));
Untuk informasi tentang memesan Middleware Pelokalan di alur Program
middleware file, lihat ASP.NET Core Middleware.
Gunakan komponen yang CultureExample1
ditunjukkan di bagian Komponen demonstrasi untuk mempelajari cara kerja globalisasi. Terbitkan permintaan dengan bahasa Inggris Amerika Serikat (en-US
). Beralih ke Costa Rican Spanyol (es-CR
) di pengaturan bahasa browser. Minta halaman web lagi.
Catatan
Beberapa browser memaksa Anda menggunakan pengaturan bahasa default untuk permintaan dan pengaturan UI browser sendiri. Ini dapat membuat perubahan bahasa kembali ke bahasa yang Sulit Anda pahami karena semua layar antarmuka pengguna pengaturan mungkin berakhir dalam bahasa yang tidak dapat Anda baca. Browser seperti Opera adalah pilihan yang baik untuk pengujian karena memungkinkan Anda mengatur bahasa default untuk permintaan halaman web tetapi meninggalkan antarmuka pengguna pengaturan browser dalam bahasa Anda.
Ketika budaya Amerika Serikat Bahasa Inggris (en-US
), komponen yang dirender menggunakan pemformatan tanggal bulan/hari (6/7
), waktu 12 jam (PM
AM
/), dan pemisah koma dalam angka dengan titik untuk nilai desimal ():1,999.69
- Tanggal: 7/6/2021 06:45:22
- Nomor: 1.999,69
Ketika budayanya adalah Costa Rican Spanyol (es-CR
), komponen yang dirender menggunakan pemformatan tanggal hari/bulan (7/6
), waktu 24 jam, dan pemisah periode dalam angka dengan koma untuk nilai desimal (1.999,69
):
- Tanggal: 6/7/2021 6:49:38
- Nomor: 1.999,69
Mengatur budaya sisi klien secara statis
Atur BlazorWebAssemblyLoadAllGlobalizationData
properti ke true
dalam file proyek aplikasi (.csproj
):
<PropertyGroup>
<BlazorWebAssemblyLoadAllGlobalizationData>true</BlazorWebAssemblyLoadAllGlobalizationData>
</PropertyGroup>
Konfigurasi Intermediate Language (IL) Linker untuk penyajian sisi klien menghapus informasi internasionalisasi kecuali untuk lokal yang diminta secara eksplisit. Untuk informasi selengkapnya, lihat Mengonfigurasi Linker untuk ASP.NET Core Blazor.
Budaya aplikasi dapat diatur di JavaScript saat Blazor dimulai dengan applicationCulture
Blazor opsi mulai. Contoh berikut mengonfigurasi aplikasi untuk diluncurkan menggunakan budaya bahasa Inggris Amerika Serikat (en-US
).
Cegah Blazor mulai otomatis dengan menambahkan autostart="false"
ke Blazor<script>
tag:
<script src="{BLAZOR SCRIPT}" autostart="false"></script>
Dalam contoh sebelumnya, {BLAZOR SCRIPT}
tempat penampung adalah Blazor jalur skrip dan nama file. Untuk lokasi skrip, lihat struktur proyek ASP.NET CoreBlazor.
Tambahkan blok berikut <script>
setelah Blazortag dan <script>
sebelum tag penutup</body>
:
Blazor Web App:
<script>
Blazor.start({
webAssembly: {
applicationCulture: 'en-US'
}
});
</script>
Mandiri Blazor WebAssembly:
<script>
Blazor.start({
applicationCulture: 'en-US'
});
</script>
Nilai untuk applicationCulture
harus sesuai dengan format tag bahasa BCP-47. Untuk informasi lebih lanjut tentang startup Blazor, lihat startup BlazorASP.NET Core.
Alternatif untuk mengatur opsi mulai budaya Blazoradalah mengatur budaya dalam kode C#. Atur CultureInfo.DefaultThreadCurrentCulture Program
dan CultureInfo.DefaultThreadCurrentUICulture dalam file ke budaya yang sama.
System.Globalization Tambahkan namespace ke Program
file:
using System.Globalization;
Tambahkan pengaturan budaya sebelum garis yang membangun dan menjalankan WebAssemblyHostBuilder (await builder.Build().RunAsync();
):
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("en-US");
Catatan
Saat ini, Blazor WebAssembly aplikasi hanya memuat sumber daya berdasarkan DefaultThreadCurrentCulture. Untuk informasi selengkapnya, lihat Blazor WASM hanya bergantung pada budaya saat ini (budaya UI saat ini tidak dihormati) (dotnet/aspnetcore
#56824).
Gunakan komponen yang CultureExample1
ditunjukkan di bagian Komponen demonstrasi untuk mempelajari cara kerja globalisasi. Terbitkan permintaan dengan bahasa Inggris Amerika Serikat (en-US
). Beralih ke Costa Rican Spanyol (es-CR
) di pengaturan bahasa browser. Minta halaman web lagi. Ketika bahasa yang diminta adalah Bahasa Spanyol Costa Rican, budaya aplikasi tetap Amerika Serikat Bahasa Inggris (en-US
).
Mengatur budaya sisi server secara statis
Aplikasi sisi server dilokalkan menggunakan Middleware Pelokalan. Tambahkan layanan pelokalan ke aplikasi dengan AddLocalization.
Dalam file Program
:
builder.Services.AddLocalization();
Tentukan budaya statis dalam Program
file sebelum middleware apa pun yang mungkin memeriksa budaya permintaan. Umumnya, tempatkan Middleware Pelokalan Permintaan segera sebelum MapRazorComponents. Contoh berikut mengonfigurasi Amerika Serikat bahasa Inggris:
Tentukan budaya statis dalam Program
file segera setelah Middleware Perutean (UseRouting) ditambahkan ke alur pemrosesan. Contoh berikut mengonfigurasi Amerika Serikat bahasa Inggris:
app.UseRequestLocalization("en-US");
Nilai budaya untuk UseRequestLocalization harus sesuai dengan format tag bahasa BCP-47.
Untuk informasi tentang memesan Middleware Pelokalan di alur Program
middleware file, lihat ASP.NET Core Middleware.
Aplikasi sisi server dilokalkan menggunakan Middleware Pelokalan. Tambahkan layanan pelokalan ke aplikasi dengan AddLocalization.
Dalam Startup.ConfigureServices
(Startup.cs
):
services.AddLocalization();
Tentukan budaya statis di Startup.Configure
(Startup.cs
) segera setelah Middleware Perutean ditambahkan ke alur pemrosesan. Contoh berikut mengonfigurasi Amerika Serikat bahasa Inggris:
app.UseRequestLocalization("en-US");
Nilai budaya untuk UseRequestLocalization harus sesuai dengan format tag bahasa BCP-47.
Untuk informasi tentang memesan Middleware Pelokalan di alur Startup.Configure
middleware , lihat ASP.NET Core Middleware.
Gunakan komponen yang CultureExample1
ditunjukkan di bagian Komponen demonstrasi untuk mempelajari cara kerja globalisasi. Terbitkan permintaan dengan bahasa Inggris Amerika Serikat (en-US
). Beralih ke Costa Rican Spanyol (es-CR
) di pengaturan bahasa browser. Minta halaman web lagi. Ketika bahasa yang diminta adalah Bahasa Spanyol Costa Rican, budaya aplikasi tetap Amerika Serikat Bahasa Inggris (en-US
).
Mengatur budaya sisi klien secara dinamis berdasarkan preferensi pengguna
Contoh lokasi di mana aplikasi mungkin menyimpan preferensi pengguna termasuk dalam penyimpanan lokal browser (umum untuk skenario sisi klien), dalam pelokalan cookie atau database (umum untuk skenario sisi server), atau dalam layanan eksternal yang dilampirkan ke database eksternal dan diakses oleh API web. Contoh berikut menunjukkan cara menggunakan penyimpanan lokal browser.
Microsoft.Extensions.Localization
Tambahkan paket ke aplikasi.
Catatan
Untuk panduan tentang menambahkan paket ke aplikasi .NET, lihat artikel di bagian Menginstal dan mengelola paket di Alur kerja konsumsi paket (dokumentasi NuGet). Konfirmasikan versi paket yang benar di NuGet.org.
Atur properti ke BlazorWebAssemblyLoadAllGlobalizationData
true
dalam file proyek:
<PropertyGroup>
<BlazorWebAssemblyLoadAllGlobalizationData>true</BlazorWebAssemblyLoadAllGlobalizationData>
</PropertyGroup>
Budaya aplikasi untuk penyajian sisi klien diatur menggunakan Blazor API kerangka kerja. Pilihan budaya pengguna dapat dipertahankan di penyimpanan lokal browser.
Berikan JS fungsi setelah <script>
Blazortag untuk mendapatkan dan mengatur pilihan budaya pengguna dengan penyimpanan lokal browser:
<script>
window.blazorCulture = {
get: () => window.localStorage['BlazorCulture'],
set: (value) => window.localStorage['BlazorCulture'] = value
};
</script>
Catatan
Contoh sebelumnya mencemari klien dengan fungsi global. Untuk pendekatan yang lebih baik dalam aplikasi produksi, lihat Isolasi JavaScript dalam modul JavaScript.
Tambahkan namespace untuk System.Globalization dan Microsoft.JSInterop ke bagian Program
atas file:
using System.Globalization;
using Microsoft.JSInterop;
Hapus baris berikut:
- await builder.Build().RunAsync();
Ganti baris sebelumnya dengan kode berikut. Kode menambahkan Blazorlayanan pelokalan ke koleksi layanan aplikasi dengan AddLocalization dan menggunakan JS interop untuk memanggil JS dan mengambil pilihan budaya pengguna dari penyimpanan lokal. Jika penyimpanan lokal tidak berisi budaya untuk pengguna, kode menetapkan nilai default Amerika Serikat Bahasa Inggris (en-US
).
builder.Services.AddLocalization();
var host = builder.Build();
const string defaultCulture = "en-US";
var js = host.Services.GetRequiredService<IJSRuntime>();
var result = await js.InvokeAsync<string>("blazorCulture.get");
var culture = CultureInfo.GetCultureInfo(result ?? defaultCulture);
if (result == null)
{
await js.InvokeVoidAsync("blazorCulture.set", defaultCulture);
}
CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;
await host.RunAsync();
Catatan
Saat ini, Blazor WebAssembly aplikasi hanya memuat sumber daya berdasarkan DefaultThreadCurrentCulture. Untuk informasi selengkapnya, lihat Blazor WASM hanya bergantung pada budaya saat ini (budaya UI saat ini tidak dihormati) (dotnet/aspnetcore
#56824).
Komponen berikut menunjukkan CultureSelector
cara melakukan tindakan berikut:
- Atur pilihan budaya pengguna ke penyimpanan lokal browser melalui JS interop.
- Muat ulang komponen yang mereka minta (
forceLoad: true
), yang menggunakan budaya yang diperbarui.
CultureSelector.razor
:
@using System.Globalization
@inject IJSRuntime JS
@inject NavigationManager Navigation
<p>
<label>
Select your locale:
<select @bind="selectedCulture" @bind:after="ApplySelectedCultureAsync">
@foreach (var culture in supportedCultures)
{
<option value="@culture">@culture.DisplayName</option>
}
</select>
</label>
</p>
@code
{
private CultureInfo[] supportedCultures = new[]
{
new CultureInfo("en-US"),
new CultureInfo("es-CR"),
};
private CultureInfo? selectedCulture;
protected override void OnInitialized()
{
selectedCulture = CultureInfo.CurrentCulture;
}
private async Task ApplySelectedCultureAsync()
{
if (CultureInfo.CurrentCulture != selectedCulture)
{
await JS.InvokeVoidAsync("blazorCulture.set", selectedCulture!.Name);
Navigation.NavigateTo(Navigation.Uri, forceLoad: true);
}
}
}
@using System.Globalization
@inject IJSRuntime JS
@inject NavigationManager Navigation
<p>
<label>
Select your locale:
<select value="@selectedCulture" @onchange="HandleSelectedCultureChanged">
@foreach (var culture in supportedCultures)
{
<option value="@culture">@culture.DisplayName</option>
}
</select>
</label>
</p>
@code
{
private CultureInfo[] supportedCultures = new[]
{
new CultureInfo("en-US"),
new CultureInfo("es-CR"),
};
private CultureInfo? selectedCulture;
protected override void OnInitialized()
{
selectedCulture = CultureInfo.CurrentCulture;
}
private async Task HandleSelectedCultureChanged(ChangeEventArgs args)
{
selectedCulture = CultureInfo.GetCultureInfo((string)args.Value!);
if (CultureInfo.CurrentCulture != selectedCulture)
{
await JS.InvokeVoidAsync("blazorCulture.set", selectedCulture!.Name);
Navigation.NavigateTo(Navigation.Uri, forceLoad: true);
}
}
}
Catatan
Untuk informasi selengkapnya tentang IJSInProcessRuntime, lihat Memanggil fungsi JavaScript dari metode .NET di ASP.NET Core Blazor.
Di dalam tag </main>
penutup elemen dalam MainLayout
komponen (MainLayout.razor
), tambahkan CultureSelector
komponen:
<article class="bottom-row px-4">
<CultureSelector />
</article>
Gunakan komponen yang CultureExample1
ditunjukkan di bagian Komponen demonstrasi untuk mempelajari cara kerja contoh sebelumnya.
Mengatur budaya sisi server secara dinamis berdasarkan preferensi pengguna
Contoh lokasi di mana aplikasi mungkin menyimpan preferensi pengguna termasuk dalam penyimpanan lokal browser (umum untuk skenario sisi klien), dalam pelokalan cookie atau database (umum untuk skenario sisi server), atau dalam layanan eksternal yang dilampirkan ke database eksternal dan diakses oleh API web. Contoh berikut menunjukkan cara menggunakan pelokalan cookie.
Catatan
Contoh berikut mengasumsikan bahwa aplikasi mengadopsi interaktivitas global dengan menentukan penyajian sisi server interaktif (SSR interaktif) pada Routes
komponen dalam App
komponen (Components/App.razor
):
<Routes @rendermode="InteractiveServer" />
Jika aplikasi mengadopsi interaktivitas per halaman/komponen , lihat komentar di akhir bagian ini untuk memodifikasi mode render komponen contoh.
Microsoft.Extensions.Localization
Tambahkan paket ke aplikasi.
Catatan
Untuk panduan tentang menambahkan paket ke aplikasi .NET, lihat artikel di bagian Menginstal dan mengelola paket di Alur kerja konsumsi paket (dokumentasi NuGet). Konfirmasikan versi paket yang benar di NuGet.org.
Aplikasi sisi server dilokalkan menggunakan Middleware Pelokalan. Tambahkan layanan pelokalan ke aplikasi dengan AddLocalization.
Dalam file Program
:
builder.Services.AddLocalization();
Atur budaya default dan didukung aplikasi dengan RequestLocalizationOptions.
Sebelum panggilan ke MapRazorComponents dalam alur pemrosesan permintaan, letakkan kode berikut:
Setelah Middleware Perutean (UseRouting) ditambahkan ke alur pemrosesan permintaan, letakkan kode berikut:
var supportedCultures = new[] { "en-US", "es-CR" };
var localizationOptions = new RequestLocalizationOptions()
.SetDefaultCulture(supportedCultures[0])
.AddSupportedCultures(supportedCultures)
.AddSupportedUICultures(supportedCultures);
app.UseRequestLocalization(localizationOptions);
Untuk informasi tentang memesan Middleware Pelokalan di alur middleware, lihat ASP.NET Core Middleware.
Contoh berikut menunjukkan cara mengatur budaya saat ini dalam cookie yang dapat dibaca oleh Middleware Pelokalan.
Namespace berikut diperlukan untuk App
komponen:
Tambahkan yang berikut ini ke bagian App
atas file komponen (Components/App.razor
):
@using System.Globalization
@using Microsoft.AspNetCore.Localization
Tambahkan blok berikut @code
ke bagian App
bawah file komponen:
@code {
[CascadingParameter]
public HttpContext? HttpContext { get; set; }
protected override void OnInitialized()
{
HttpContext?.Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(
new RequestCulture(
CultureInfo.CurrentCulture,
CultureInfo.CurrentUICulture)));
}
}
Modifikasi pada Pages/_Host.cshtml
file memerlukan namespace berikut:
Tambahkan teks berikut ke file:
@using System.Globalization
@using Microsoft.AspNetCore.Localization
@{
this.HttpContext.Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(
new RequestCulture(
CultureInfo.CurrentCulture,
CultureInfo.CurrentUICulture)));
}
Untuk informasi tentang memesan Middleware Pelokalan di alur middleware, lihat ASP.NET Core Middleware.
Jika aplikasi tidak dikonfigurasi untuk memproses tindakan pengontrol:
Tambahkan layanan MVC dengan memanggil AddControllers kumpulan layanan dalam
Program
file:builder.Services.AddControllers();
Tambahkan perutean titik akhir pengontrol dalam
Program
file dengan memanggil MapControllers pada IEndpointRouteBuilder (app
):app.MapControllers();
Untuk menyediakan UI agar pengguna dapat memilih budaya, gunakan pendekatan berbasis pengalihan dengan pelokalan cookie. Aplikasi ini mempertahankan budaya yang dipilih pengguna melalui pengalihan ke pengontrol. Pengontrol mengatur budaya yang dipilih pengguna menjadi cookie dan mengalihkan pengguna kembali ke URI asli. Prosesnya mirip dengan apa yang terjadi di aplikasi web ketika pengguna mencoba mengakses sumber daya yang aman, di mana pengguna dialihkan ke halaman masuk lalu dialihkan kembali ke sumber daya asli.
Controllers/CultureController.cs
:
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
[Route("[controller]/[action]")]
public class CultureController : Controller
{
public IActionResult Set(string culture, string redirectUri)
{
if (culture != null)
{
HttpContext.Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(
new RequestCulture(culture, culture)));
}
return LocalRedirect(redirectUri);
}
}
Peringatan
Gunakan hasil LocalRedirect tindakan, seperti yang ditunjukkan dalam contoh sebelumnya, untuk mencegah serangan pengalihan terbuka. Untuk informasi selengkapnya, lihat Mencegah serangan pengalihan terbuka di ASP.NET Core.
Komponen berikut CultureSelector
menunjukkan cara memanggil Set
metode CultureController
dengan budaya baru. Komponen ditempatkan di Shared
folder untuk digunakan di seluruh aplikasi.
CultureSelector.razor
:
@using System.Globalization
@inject IJSRuntime JS
@inject NavigationManager Navigation
<p>
<label>
Select your locale:
<select @bind="selectedCulture" @bind:after="ApplySelectedCultureAsync">
@foreach (var culture in supportedCultures)
{
<option value="@culture">@culture.DisplayName</option>
}
</select>
</label>
</p>
@code
{
private CultureInfo[] supportedCultures = new[]
{
new CultureInfo("en-US"),
new CultureInfo("es-CR"),
};
private CultureInfo? selectedCulture;
protected override void OnInitialized()
{
selectedCulture = CultureInfo.CurrentCulture;
}
private async Task ApplySelectedCultureAsync()
{
if (CultureInfo.CurrentCulture != selectedCulture)
{
var uri = new Uri(Navigation.Uri)
.GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped);
var cultureEscaped = Uri.EscapeDataString(selectedCulture.Name);
var uriEscaped = Uri.EscapeDataString(uri);
Navigation.NavigateTo(
$"Culture/Set?culture={cultureEscaped}&redirectUri={uriEscaped}",
forceLoad: true);
}
}
}
@using System.Globalization
@inject IJSRuntime JS
@inject NavigationManager Navigation
<p>
<label>
Select your locale:
<select value="@selectedCulture" @onchange="HandleSelectedCultureChanged">
@foreach (var culture in supportedCultures)
{
<option value="@culture">@culture.DisplayName</option>
}
</select>
</label>
</p>
@code
{
private CultureInfo[] supportedCultures = new[]
{
new CultureInfo("en-US"),
new CultureInfo("es-CR"),
};
private CultureInfo? selectedCulture;
protected override void OnInitialized()
{
selectedCulture = CultureInfo.CurrentCulture;
}
private async Task HandleSelectedCultureChanged(ChangeEventArgs args)
{
selectedCulture = CultureInfo.GetCultureInfo((string)args.Value!);
if (CultureInfo.CurrentCulture != selectedCulture)
{
var uri = new Uri(Navigation.Uri)
.GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped);
var cultureEscaped = Uri.EscapeDataString(selectedCulture.Name);
var uriEscaped = Uri.EscapeDataString(uri);
Navigation.NavigateTo(
$"Culture/Set?culture={cultureEscaped}&redirectUri={uriEscaped}",
forceLoad: true);
}
}
}
CultureSelector
Tambahkan komponen ke MainLayout
komponen. Tempatkan markup berikut di dalam tag penutup </main>
dalam Components/Layout/MainLayout.razor
file:
CultureSelector
Tambahkan komponen ke MainLayout
komponen. Tempatkan markup berikut di dalam tag penutup </main>
dalam Shared/MainLayout.razor
file:
<article class="bottom-row px-4">
<CultureSelector />
</article>
Gunakan komponen yang CultureExample1
ditunjukkan di bagian Komponen demonstrasi untuk mempelajari cara kerja contoh sebelumnya.
Contoh sebelumnya mengasumsikan bahwa aplikasi mengadopsi interaktivitas global dengan menentukan mode render Server Interaktif pada Routes
komponen dalam App
komponen (Components/App.razor
):
<Routes @rendermode="InteractiveServer" />
Jika aplikasi mengadopsi interaktivitas per halaman/komponen , buat perubahan berikut:
Tambahkan mode render Server Interaktif ke bagian
CultureExample1
atas file komponen (Components/Pages/CultureExample1.razor
):@rendermode InteractiveServer
Di tata letak utama aplikasi (
Components/Layout/MainLayout.razor
), terapkan mode render Server Interaktif keCultureSelector
komponen:<CultureSelector @rendermode="InteractiveServer" />
Mengatur budaya secara dinamis dalam preferensi Blazor Web App pengguna
Bagian ini berlaku untuk Blazor Web Appyang mengadopsi interaktivitas Otomatis (Server dan WebAssembly).
Contoh lokasi di mana aplikasi mungkin menyimpan preferensi pengguna termasuk dalam penyimpanan lokal browser (umum untuk skenario sisi klien), dalam pelokalan cookie atau database (umum untuk skenario sisi server), penyimpanan lokal dan pelokalan cookie (Blazor Web Appdengan komponen server dan WebAssembly), atau dalam layanan eksternal yang dilampirkan ke database eksternal dan diakses oleh API web. Contoh berikut menunjukkan cara menggunakan penyimpanan lokal browser untuk komponen yang dirender sisi klien (CSR) dan pelokalan cookie untuk komponen server-side rendered (SSR).
Pembaruan untuk .Client
proyek
Microsoft.Extensions.Localization
Tambahkan paket ke .Client
proyek.
Catatan
Untuk panduan tentang menambahkan paket ke aplikasi .NET, lihat artikel di bagian Menginstal dan mengelola paket di Alur kerja konsumsi paket (dokumentasi NuGet). Konfirmasikan versi paket yang benar di NuGet.org.
Atur properti ke BlazorWebAssemblyLoadAllGlobalizationData
true
dalam .Client
file proyek:
<PropertyGroup>
<BlazorWebAssemblyLoadAllGlobalizationData>true</BlazorWebAssemblyLoadAllGlobalizationData>
</PropertyGroup>
Tambahkan namespace layanan untuk System.Globalization dan ke bagian .Client
atas file proyek Program
Microsoft.JSInterop:
using System.Globalization;
using Microsoft.JSInterop;
Hapus baris berikut:
- await builder.Build().RunAsync();
Ganti baris sebelumnya dengan kode berikut. Kode menambahkan Blazorlayanan pelokalan ke koleksi layanan aplikasi dengan AddLocalization dan menggunakan JS interop untuk memanggil JS dan mengambil pilihan budaya pengguna dari penyimpanan lokal. Jika penyimpanan lokal tidak berisi budaya untuk pengguna, kode menetapkan nilai default Amerika Serikat Bahasa Inggris (en-US
).
builder.Services.AddLocalization();
var host = builder.Build();
const string defaultCulture = "en-US";
var js = host.Services.GetRequiredService<IJSRuntime>();
var result = await js.InvokeAsync<string>("blazorCulture.get");
var culture = CultureInfo.GetCultureInfo(result ?? defaultCulture);
if (result == null)
{
await js.InvokeVoidAsync("blazorCulture.set", defaultCulture);
}
CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;
await host.RunAsync();
Catatan
Saat ini, Blazor WebAssembly aplikasi hanya memuat sumber daya berdasarkan DefaultThreadCurrentCulture. Untuk informasi selengkapnya, lihat Blazor WASM hanya bergantung pada budaya saat ini (budaya UI saat ini tidak dihormati) (dotnet/aspnetcore
#56824).
Tambahkan komponen berikut CultureSelector
ke .Client
proyek.
Komponen mengadopsi pendekatan berikut untuk bekerja baik untuk komponen SSR atau CSR:
- Nama tampilan setiap budaya yang tersedia dalam daftar dropdown disediakan oleh kamus karena data globalisasi sisi klien mencakup teks nama tampilan budaya yang dilokalkan yang disediakan data globalisasi sisi server. Misalnya, pelokalan sisi server ditampilkan
English (United States)
ketikaen-US
adalah budaya danIngles ()
ketika budaya yang berbeda digunakan. Karena pelokalan nama tampilan budaya tidak tersedia dengan Blazor WebAssembly globalisasi, nama tampilan untuk Amerika Serikat bahasa Inggris pada klien untuk budaya yang dimuat hanyalahen-US
. Menggunakan kamus kustom memungkinkan komponen untuk setidaknya menampilkan nama budaya inggris lengkap. - Ketika pengguna mengubah budaya, JS interop mengatur budaya di penyimpanan browser lokal dan tindakan pengontrol memperbarui pelokalan cookie dengan budaya. Pengontrol ditambahkan ke aplikasi nanti di bagian Pembaruan proyek server.
Pages/CultureSelector.razor
:
@using System.Globalization
@inject IJSRuntime JS
@inject NavigationManager Navigation
<p>
<label>
Select your locale:
<select @bind="@selectedCulture" @bind:after="ApplySelectedCultureAsync">
@foreach (var culture in supportedCultures)
{
<option value="@culture">@cultureDict[culture.Name]</option>
}
</select>
</label>
</p>
@code
{
private Dictionary<string, string> cultureDict =
new()
{
{ "en-US", "English (United States)" },
{ "es-CR", "Spanish (Costa Rica)" }
};
private CultureInfo[] supportedCultures = new[]
{
new CultureInfo("en-US"),
new CultureInfo("es-CR"),
};
private CultureInfo? selectedCulture;
protected override void OnInitialized()
{
selectedCulture = CultureInfo.CurrentCulture;
}
private async Task ApplySelectedCultureAsync()
{
if (CultureInfo.CurrentCulture != selectedCulture)
{
await JS.InvokeVoidAsync("blazorCulture.set", selectedCulture!.Name);
var uri = new Uri(Navigation.Uri)
.GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped);
var cultureEscaped = Uri.EscapeDataString(selectedCulture.Name);
var uriEscaped = Uri.EscapeDataString(uri);
Navigation.NavigateTo(
$"Culture/Set?culture={cultureEscaped}&redirectUri={uriEscaped}",
forceLoad: true);
}
}
}
Catatan
Untuk informasi selengkapnya tentang IJSInProcessRuntime, lihat Memanggil fungsi JavaScript dari metode .NET di ASP.NET Core Blazor.
.Client
Dalam proyek, tempatkan komponen berikut CultureClient
untuk mempelajari cara kerja globalisasi untuk komponen CSR.
Pages/CultureClient.razor
:
@page "/culture-client"
@rendermode InteractiveWebAssembly
@using System.Globalization
<PageTitle>Culture Client</PageTitle>
<h1>Culture Client</h1>
<ul>
<li><b>CurrentCulture</b>: @CultureInfo.CurrentCulture</li>
<li><b>CurrentUICulture</b>: @CultureInfo.CurrentUICulture</li>
</ul>
<h2>Rendered values</h2>
<ul>
<li><b>Date</b>: @dt</li>
<li><b>Number</b>: @number.ToString("N2")</li>
</ul>
<h2><code><input></code> elements that don't set a <code>type</code></h2>
<p>
The following <code><input></code> elements use
<code>CultureInfo.CurrentCulture</code>.
</p>
<ul>
<li><label><b>Date:</b> <input @bind="dt" /></label></li>
<li><label><b>Number:</b> <input @bind="number" /></label></li>
</ul>
<h2><code><input></code> elements that set a <code>type</code></h2>
<p>
The following <code><input></code> elements use
<code>CultureInfo.InvariantCulture</code>.
</p>
<ul>
<li><label><b>Date:</b> <input type="date" @bind="dt" /></label></li>
<li><label><b>Number:</b> <input type="number" @bind="number" /></label></li>
</ul>
@code {
private DateTime dt = DateTime.Now;
private double number = 1999.69;
}
Pembaruan proyek server
Microsoft.Extensions.Localization
Tambahkan paket ke proyek server.
Catatan
Untuk panduan tentang menambahkan paket ke aplikasi .NET, lihat artikel di bagian Menginstal dan mengelola paket di Alur kerja konsumsi paket (dokumentasi NuGet). Konfirmasikan versi paket yang benar di NuGet.org.
Aplikasi sisi server dilokalkan menggunakan Middleware Pelokalan. Tambahkan layanan pelokalan ke aplikasi dengan AddLocalization.
Dalam file proyek Program
server tempat layanan didaftarkan:
builder.Services.AddLocalization();
Atur budaya default dan didukung aplikasi dengan RequestLocalizationOptions.
Sebelum panggilan ke MapRazorComponents dalam alur pemrosesan permintaan, letakkan kode berikut:
var supportedCultures = new[] { "en-US", "es-CR" };
var localizationOptions = new RequestLocalizationOptions()
.SetDefaultCulture(supportedCultures[0])
.AddSupportedCultures(supportedCultures)
.AddSupportedUICultures(supportedCultures);
app.UseRequestLocalization(localizationOptions);
Contoh berikut menunjukkan cara mengatur budaya saat ini dalam cookie yang dapat dibaca oleh Middleware Pelokalan.
Namespace berikut diperlukan untuk App
komponen:
Tambahkan yang berikut ini ke bagian App
atas file komponen (Components/App.razor
):
@using System.Globalization
@using Microsoft.AspNetCore.Localization
Budaya aplikasi untuk penyajian sisi klien diatur menggunakan Blazor API kerangka kerja. Pilihan budaya pengguna dapat dipertahankan di penyimpanan lokal browser untuk komponen CSR.
BlazorSetelah tag , <script>
berikan JS fungsi untuk mendapatkan dan mengatur pilihan budaya pengguna dengan penyimpanan lokal browser:
<script>
window.blazorCulture = {
get: () => window.localStorage['BlazorCulture'],
set: (value) => window.localStorage['BlazorCulture'] = value
};
</script>
Catatan
Contoh sebelumnya mencemari klien dengan fungsi global. Untuk pendekatan yang lebih baik dalam aplikasi produksi, lihat Isolasi JavaScript dalam modul JavaScript.
Tambahkan blok berikut @code
ke bagian App
bawah file komponen:
@code {
[CascadingParameter]
public HttpContext? HttpContext { get; set; }
protected override void OnInitialized()
{
HttpContext?.Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(
new RequestCulture(
CultureInfo.CurrentCulture,
CultureInfo.CurrentUICulture)));
}
}
Jika proyek server tidak dikonfigurasi untuk memproses tindakan pengontrol:
Tambahkan layanan MVC dengan memanggil AddControllers kumpulan layanan dalam
Program
file:builder.Services.AddControllers();
Tambahkan perutean titik akhir pengontrol dalam
Program
file dengan memanggil MapControllers pada IEndpointRouteBuilder (app
):app.MapControllers();
Untuk memungkinkan pengguna memilih budaya untuk komponen SSR, gunakan pendekatan berbasis pengalihan dengan pelokalan cookie. Aplikasi ini mempertahankan budaya yang dipilih pengguna melalui pengalihan ke pengontrol. Pengontrol mengatur budaya yang dipilih pengguna menjadi cookie dan mengalihkan pengguna kembali ke URI asli. Prosesnya mirip dengan apa yang terjadi di aplikasi web ketika pengguna mencoba mengakses sumber daya yang aman, di mana pengguna dialihkan ke halaman masuk lalu dialihkan kembali ke sumber daya asli.
Controllers/CultureController.cs
:
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
[Route("[controller]/[action]")]
public class CultureController : Controller
{
public IActionResult Set(string culture, string redirectUri)
{
if (culture != null)
{
HttpContext.Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(
new RequestCulture(culture, culture)));
}
return LocalRedirect(redirectUri);
}
}
Peringatan
Gunakan hasil LocalRedirect tindakan, seperti yang ditunjukkan dalam contoh sebelumnya, untuk mencegah serangan pengalihan terbuka. Untuk informasi selengkapnya, lihat Mencegah serangan pengalihan terbuka di ASP.NET Core.
CultureSelector
Tambahkan komponen ke MainLayout
komponen. Tempatkan markup berikut di dalam tag penutup </main>
dalam Components/Layout/MainLayout.razor
file:
<article class="bottom-row px-4">
<CultureSelector @rendermode="InteractiveAuto" />
</article>
Gunakan komponen yang CultureExample1
ditunjukkan di bagian Komponen demonstrasi untuk mempelajari cara kerja contoh sebelumnya.
Dalam proyek server, tempatkan komponen berikut CultureServer
untuk mempelajari cara kerja globalisasi untuk komponen SSR.
Components/Pages/CultureServer.razor
:
@page "/culture-server"
@rendermode InteractiveServer
@using System.Globalization
<PageTitle>Culture Server</PageTitle>
<h1>Culture Server</h1>
<ul>
<li><b>CurrentCulture</b>: @CultureInfo.CurrentCulture</li>
<li><b>CurrentUICulture</b>: @CultureInfo.CurrentUICulture</li>
</ul>
<h2>Rendered values</h2>
<ul>
<li><b>Date</b>: @dt</li>
<li><b>Number</b>: @number.ToString("N2")</li>
</ul>
<h2><code><input></code> elements that don't set a <code>type</code></h2>
<p>
The following <code><input></code> elements use
<code>CultureInfo.CurrentCulture</code>.
</p>
<ul>
<li><label><b>Date:</b> <input @bind="dt" /></label></li>
<li><label><b>Number:</b> <input @bind="number" /></label></li>
</ul>
<h2><code><input></code> elements that set a <code>type</code></h2>
<p>
The following <code><input></code> elements use
<code>CultureInfo.InvariantCulture</code>.
</p>
<ul>
<li><label><b>Date:</b> <input type="date" @bind="dt" /></label></li>
<li><label><b>Number:</b> <input type="number" @bind="number" /></label></li>
</ul>
@code {
private DateTime dt = DateTime.Now;
private double number = 1999.69;
}
Tambahkan komponen CultureClient
dan CultureServer
ke navigasi bilah samping di Components/Layout/NavMenu.razor
:
<div class="nav-item px-3">
<NavLink class="nav-link" href="culture-server">
<span class="bi bi-list-nested-nav-menu" aria-hidden="true"></span> Culture (Server)
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="culture-client">
<span class="bi bi-list-nested-nav-menu" aria-hidden="true"></span> Culture (Client)
</NavLink>
</div>
Komponen Otomatis Interaktif
Panduan di bagian ini juga berfungsi untuk komponen yang mengadopsi mode render Otomatis Interaktif:
@rendermode InteractiveAuto
Pelokalan
Jika aplikasi belum mendukung pemilihan budaya dinamis, tambahkan Microsoft.Extensions.Localization
paket ke aplikasi.
Catatan
Untuk panduan tentang menambahkan paket ke aplikasi .NET, lihat artikel di bagian Menginstal dan mengelola paket di Alur kerja konsumsi paket (dokumentasi NuGet). Konfirmasikan versi paket yang benar di NuGet.org.
Pelokalan sisi klien
Atur BlazorWebAssemblyLoadAllGlobalizationData
properti ke true
dalam file proyek aplikasi (.csproj
):
<PropertyGroup>
<BlazorWebAssemblyLoadAllGlobalizationData>true</BlazorWebAssemblyLoadAllGlobalizationData>
</PropertyGroup>
Program
Dalam file, tambahkan namespace layanan untuk System.Globalization ke bagian atas file:
using System.Globalization;
Tambahkan Blazorlayanan pelokalan ke koleksi layanan aplikasi dengan AddLocalization:
builder.Services.AddLocalization();
Pelokalan sisi server
Gunakan Middleware Pelokalan untuk mengatur budaya aplikasi.
Jika aplikasi belum mendukung pemilihan budaya dinamis:
- Tambahkan layanan pelokalan ke aplikasi dengan AddLocalization.
- Tentukan budaya default dan didukung aplikasi dalam
Program
file. Contoh berikut mengonfigurasi budaya yang didukung untuk bahasa Inggris Amerika Serikat dan Bahasa Spanyol Costa Rican.
builder.Services.AddLocalization();
Tempatkan Middleware Pelokalan Permintaan sebelum middleware apa pun yang mungkin memeriksa budaya permintaan. Umumnya, tempatkan middleware segera sebelum memanggil MapRazorComponents:
Segera setelah Middleware Perutean (UseRouting) ditambahkan ke alur pemrosesan:
var supportedCultures = new[] { "en-US", "es-CR" };
var localizationOptions = new RequestLocalizationOptions()
.SetDefaultCulture(supportedCultures[0])
.AddSupportedCultures(supportedCultures)
.AddSupportedUICultures(supportedCultures);
app.UseRequestLocalization(localizationOptions);
Untuk informasi tentang memesan Middleware Pelokalan di alur middleware, lihat ASP.NET Core Middleware.
- Tambahkan layanan pelokalan ke aplikasi dengan AddLocalization.
- Tentukan budaya default dan didukung aplikasi di
Startup.Configure
(Startup.cs
). Contoh berikut mengonfigurasi budaya yang didukung untuk bahasa Inggris Amerika Serikat dan Bahasa Spanyol Costa Rican.
Dalam Startup.ConfigureServices
(Startup.cs
):
services.AddLocalization();
Segera Startup.Configure
setelah Middleware Perutean (UseRouting) ditambahkan ke alur pemrosesan:
var supportedCultures = new[] { "en-US", "es-CR" };
var localizationOptions = new RequestLocalizationOptions()
.SetDefaultCulture(supportedCultures[0])
.AddSupportedCultures(supportedCultures)
.AddSupportedUICultures(supportedCultures);
app.UseRequestLocalization(localizationOptions);
Untuk informasi tentang memesan Middleware Pelokalan di alur Startup.Configure
middleware , lihat ASP.NET Core Middleware.
Jika aplikasi harus melokalisasi sumber daya berdasarkan penyimpanan pengaturan budaya pengguna, gunakan budaya pelokalan cookie. Penggunaan cookie memastikan bahwa koneksi WebSocket dapat menyebarkan budaya dengan benar. Jika skema pelokalan didasarkan pada jalur URL atau string kueri, skema mungkin tidak dapat bekerja dengan WebSocket, sehingga gagal mempertahankan budaya. Oleh karena itu, pendekatan yang direkomendasikan adalah menggunakan budaya cookielokalisasi . Lihat bagian Secara dinamis mengatur budaya sisi server menurut preferensi pengguna di artikel ini untuk melihat contoh Razor ekspresi yang mempertahankan pilihan budaya pengguna.
Contoh sumber daya yang dilokalkan
Contoh sumber daya yang dilokalkan di bagian ini berfungsi dengan contoh sebelumnya dalam artikel ini di mana budaya yang didukung aplikasi adalah bahasa Inggris (en
) sebagai lokal default dan Spanyol (es
) sebagai lokal alternatif yang dapat dipilih pengguna atau yang ditentukan browser.
Buat file sumber daya untuk setiap lokal. Dalam contoh berikut, sumber daya dibuat untuk Greeting
string dalam bahasa Inggris dan Spanyol:
- Bahasa Inggris (
en
):Hello, World!
- Spanyol (
es
):¡Hola, Mundo!
Catatan
File sumber daya berikut dapat ditambahkan di Visual Studio dengan mengklik Pages
kanan folder dan memilih Tambahkan>File Sumber Daya Item>Baru. Beri nama file CultureExample2.resx
. Saat editor muncul, berikan data untuk entri baru. Atur Nama ke Greeting
dan Nilai ke Hello, World!
. Simpan file.
Jika menggunakan Visual Studio Code, sebaiknya instal Penampil dan Editor ResX Tim Heuer. Tambahkan file kosong CultureExample2.resx
ke Pages
folder . Ekstensi secara otomatis mengambil alih pengelolaan file di UI. Pilih tombol Tambahkan Sumber Daya Baru. Ikuti instruksi untuk menambahkan entri untuk Greeting
(kunci), Hello, World!
(nilai), dan None
(komentar). Simpan file. Jika Anda menutup dan membuka kembali file, Anda dapat melihat Greeting
sumber daya.
Penampil dan Editor ResX Tim Heuer tidak dimiliki atau dikelola oleh Microsoft dan tidak tercakup oleh Perjanjian Dukungan Microsoft atau lisensi apa pun.
Berikut ini menunjukkan file sumber daya umum. Anda dapat menempatkan file sumber daya secara manual ke folder aplikasi Pages
jika Anda lebih suka tidak menggunakan alat bawaan dengan lingkungan pengembangan terintegrasi (IDE), seperti editor file sumber daya bawaan Visual Studio atau Visual Studio Code dengan ekstensi untuk membuat dan mengedit file sumber daya.
Pages/CultureExample2.resx
:
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Greeting" xml:space="preserve">
<value>Hello, World!</value>
</data>
</root>
Catatan
File sumber daya berikut dapat ditambahkan di Visual Studio dengan mengklik Pages
kanan folder dan memilih Tambahkan>File Sumber Daya Item>Baru. Beri nama file CultureExample2.es.resx
. Saat editor muncul, berikan data untuk entri baru. Atur Nama ke Greeting
dan Nilai ke ¡Hola, Mundo!
. Simpan file.
Jika menggunakan Visual Studio Code, sebaiknya instal Penampil dan Editor ResX Tim Heuer. Tambahkan file kosong CultureExample2.resx
ke Pages
folder . Ekstensi secara otomatis mengambil alih pengelolaan file di UI. Pilih tombol Tambahkan Sumber Daya Baru. Ikuti instruksi untuk menambahkan entri untuk Greeting
(kunci), ¡Hola, Mundo!
(nilai), dan None
(komentar). Simpan file. Jika Anda menutup dan membuka kembali file, Anda dapat melihat Greeting
sumber daya.
Berikut ini menunjukkan file sumber daya umum. Anda dapat menempatkan file sumber daya secara manual ke folder aplikasi Pages
jika Anda lebih suka tidak menggunakan alat bawaan dengan lingkungan pengembangan terintegrasi (IDE), seperti editor file sumber daya bawaan Visual Studio atau Visual Studio Code dengan ekstensi untuk membuat dan mengedit file sumber daya.
Pages/CultureExample2.es.resx
:
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Greeting" xml:space="preserve">
<value>¡Hola, Mundo!</value>
</data>
</root>
Komponen berikut menunjukkan penggunaan string yang dilokalkan Greeting
dengan IStringLocalizer<T>. Razor Markup @Loc["Greeting"]
dalam contoh berikut melokalisasi string yang dikunci ke Greeting
nilai , yang diatur dalam file sumber daya sebelumnya.
Tambahkan namespace layanan untuk Microsoft.Extensions.Localization ke file aplikasi _Imports.razor
:
@using Microsoft.Extensions.Localization
CultureExample2.razor
:
@page "/culture-example-2"
@using System.Globalization
@inject IStringLocalizer<CultureExample2> Loc
<h1>Culture Example 2</h1>
<ul>
<li><b>CurrentCulture</b>: @CultureInfo.CurrentCulture</li>
<li><b>CurrentUICulture</b>: @CultureInfo.CurrentUICulture</li>
</ul>
<h2>Greeting</h2>
<p>
@Loc["Greeting"]
</p>
<p>
@greeting
</p>
@code {
private string? greeting;
protected override void OnInitialized()
{
greeting = Loc["Greeting"];
}
}
Secara opsional, tambahkan item menu untuk CultureExample2
komponen ke navigasi di NavMenu
komponen (NavMenu.razor
).
Sumber referensi penyedia budaya WebAssembly
Untuk lebih memahami bagaimana Blazor kerangka kerja memproses pelokalan, lihat WebAssemblyCultureProvider
kelas di sumber referensi ASP.NET Core.
Catatan
Tautan dokumentasi ke sumber referensi .NET biasanya memuat cabang default repositori, yang mewakili pengembangan saat ini untuk rilis .NET berikutnya. Untuk memilih tag rilis tertentu, gunakan daftar dropdown Beralih cabang atau tag. Untuk informasi lebih lanjut, lihat Cara memilih tag versi kode sumber ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Sumber Daya Bersama
Untuk membuat sumber daya bersama pelokalan, adopsi pendekatan berikut.
Buat kelas dummy dengan nama kelas arbitrer. Dalam contoh berikut:
- Aplikasi ini menggunakan
BlazorSample
namespace layanan, dan aset pelokalan menggunakanBlazorSample.Localization
namespace layanan. - Kelas dummy diberi nama
SharedResource
. - File kelas ditempatkan di
Localization
folder di akar aplikasi.
Localization/SharedResource.cs
:namespace BlazorSample.Localization; public class SharedResource { }
- Aplikasi ini menggunakan
Buat file sumber daya bersama dengan Tindakan Build .
Embedded resource
Dalam contoh berikut:File ditempatkan di
Localization
folder dengan kelas dummySharedResource
(Localization/SharedResource.cs
).Beri nama file sumber daya agar sesuai dengan nama kelas dummy. Contoh file berikut menyertakan file pelokalan default dan file untuk pelokalan Spanyol (
es
).Localization/SharedResource.resx
Localization/SharedResource.es.resx
Peringatan
Saat mengikuti pendekatan di bagian ini, Anda tidak dapat mengatur LocalizationOptions.ResourcesPath dan menggunakan IStringLocalizerFactory.Create secara bersamaan untuk memuat sumber daya.
Untuk mereferensikan kelas dummy untuk disuntikkan dalam Razor komponen, tempatkan
@using
IStringLocalizer<T> direktif untuk namespace pelokalan atau sertakan namespace pelokalan dalam referensi kelas dummy. Dalam contoh berikut:- Contoh pertama menyatakan
Localization
namespace layanan untukSharedResource
kelas dummy dengan direktif@using
. - Contoh kedua menyatakan
SharedResource
namespace kelas dummy secara eksplisit.
Razor Dalam komponen, gunakan salah satu pendekatan berikut:
@using Localization @inject IStringLocalizer<SharedResource> Loc
@inject IStringLocalizer<Localization.SharedResource> Loc
- Contoh pertama menyatakan
Untuk panduan tambahan, lihat Globalisasi dan pelokalan di ASP.NET Core.
Penimpaan lokasi menggunakan panel "Sensor" di alat pengembang
Saat menggunakan penimpaan lokasi menggunakan panel Sensor di Google Chrome atau alat pengembang Microsoft Edge, bahasa fallback diatur ulang setelah prarender. Hindari mengatur bahasa menggunakan panel Sensor saat pengujian. Atur bahasa menggunakan pengaturan bahasa browser.
Untuk informasi selengkapnya, lihat Blazor Pelokalan tidak berfungsi dengan InteractiveServer (dotnet/aspnetcore
#53707).
Sumber Daya Tambahan:
- Mengatur jalur dasar aplikasi
- Globalisasi dan pelokalan di ASP.NET Core
- Menggoralisasi dan melokalisasi aplikasi .NET
- Sumber daya dalam File .resx
- Toolkit Aplikasi Multibahasa Microsoft
- Pelokalan & Generik
- Memanggil
InvokeAsync(StateHasChanged)
menyebabkan halaman mundur ke budaya default (dotnet/aspnetcore #28521) - Blazor Pelokalan tidak berfungsi dengan InteractiveServer (
dotnet/aspnetcore
#53707) (Penimpaan lokasi menggunakan panel "Sensor"))
ASP.NET Core