Bagikan melalui


Ekstensibilitas Pelokalan

Oleh Hisham Bin Ateya

Artikel ini:

  • Mencantumkan titik ekstensibilitas pada API pelokalan.
  • Memberikan instruksi tentang cara memperluas pelokalan aplikasi ASP.NET Core.

Titik yang Dapat Diperluas dalam API Pelokalan

ASP.NET API pelokalan Inti dibangun agar dapat diperluas. Ekstensibilitas memungkinkan pengembang untuk menyesuaikan pelokalan sesuai dengan kebutuhan mereka. Misalnya, OrchardCore memiliki POStringLocalizer. POStringLocalizer menjelaskan secara rinci menggunakan pelokalan Objek Portabel untuk menggunakan PO file untuk menyimpan sumber daya pelokalan.

Artikel ini mencantumkan dua titik ekstensibilitas utama yang disediakan API pelokalan:

Penyedia Budaya Lokalisasi

ASP.NET API pelokalan Core memiliki empat penyedia default yang dapat menentukan budaya permintaan yang dijalankan saat ini:

Penyedia sebelumnya dijelaskan secara rinci dalam dokumentasi Middleware Pelokalan. Jika penyedia default tidak memenuhi kebutuhan Anda, buat penyedia kustom menggunakan salah satu pendekatan berikut:

Menggunakan CustomRequestCultureProvider

CustomRequestCultureProvider menyediakan kustom RequestCultureProvider yang menggunakan delegasi sederhana untuk menentukan budaya pelokalan saat ini:

options.AddInitialRequestCultureProvider(new CustomRequestCultureProvider(async context =>
{
    var currentCulture = "en";
    var segments = context.Request.Path.Value.Split(new char[] { '/' }, 
        StringSplitOptions.RemoveEmptyEntries);

    if (segments.Length > 1 && segments[0].Length == 2)
    {
        currentCulture = segments[0];
    }

    var requestCulture = new ProviderCultureResult(currentCulture);

    return Task.FromResult(requestCulture);
}));
options.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(async context =>
{
    var currentCulture = "en";
    var segments = context.Request.Path.Value.Split(new char[] { '/' }, 
        StringSplitOptions.RemoveEmptyEntries);

    if (segments.Length > 1 && segments[0].Length == 2)
    {
        currentCulture = segments[0];
    }

    var requestCulture = new ProviderCultureResult(currentCulture);

    return Task.FromResult(requestCulture);
}));

Menggunakan implementasi baru RequestCultureProvider

Implementasi RequestCultureProvider baru dapat dibuat yang menentukan informasi budaya permintaan dari sumber kustom. Misalnya, sumber kustom dapat menjadi file konfigurasi atau database.

Contoh berikut menunjukkan AppSettingsRequestCultureProvider, yang memperluas RequestCultureProvider untuk menentukan informasi budaya permintaan dari appsettings.json:

public class AppSettingsRequestCultureProvider : RequestCultureProvider
{
    public string CultureKey { get; set; } = "culture";

    public string UICultureKey { get; set; } = "ui-culture";

    public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
    {
        if (httpContext == null)
        {
            throw new ArgumentNullException();
        }

        var configuration = httpContext.RequestServices.GetService<IConfigurationRoot>();
        var culture = configuration[CultureKey];
        var uiCulture = configuration[UICultureKey];

        if (culture == null && uiCulture == null)
        {
            return Task.FromResult((ProviderCultureResult)null);
        }

        if (culture != null && uiCulture == null)
        {
            uiCulture = culture;
        }

        if (culture == null && uiCulture != null)
        {
            culture = uiCulture;
        }
        
        var providerResultCulture = new ProviderCultureResult(culture, uiCulture);

        return Task.FromResult(providerResultCulture);
    }
}

Sumber daya pelokalan

ASP.NET Core menyediakan ResourceManagerStringLocalizer. ResourceManagerStringLocalizer adalah implementasi dari IStringLocalizer yang menggunakan resx untuk menyimpan sumber daya pelokalan.

Anda tidak terbatas pada penggunaan resx file. Dengan menerapkan IStringLocalizer, sumber data apa pun dapat digunakan.

Contoh proyek berikut mengimplementasikan IStringLocalizer: