Yerelleştirme Genişletilebilirliği

Tarafından Hisham Bin Ateya

Bu makalede:

  • Yerelleştirme API'lerindeki genişletilebilirlik noktalarını listeler.
  • ASP.NET Core uygulama yerelleştirmesini genişletme hakkında yönergeler sağlar.

Yerelleştirme API'lerinde Genişletilebilir Noktalar

ASP.NET Çekirdek yerelleştirme API'leri genişletilebilir olacak şekilde oluşturulur. Genişletilebilirlik, geliştiricilerin yerelleştirmeyi ihtiyaçlarına göre özelleştirmesine olanak tanır. Örneğin, OrchardCore'da bir POStringLocalizervardır. POStringLocalizer, yerelleştirme kaynaklarını depolamak için dosyaları kullanmak üzere Taşınabilir Nesne yerelleştirmesini kullanmayı PO ayrıntılı olarak açıklar.

Bu makalede, yerelleştirme API'lerinin sağladığı iki ana genişletilebilirlik noktası listelenir:

Yerelleştirme Kültürü Sağlayıcıları

ASP.NET Çekirdek yerelleştirme API'leri, yürütme isteğinin geçerli kültürünü belirleyebilen dört varsayılan sağlayıcıya sahiptir:

Yukarıdaki sağlayıcılar, Yerelleştirme Ara Yazılımı belgelerinde ayrıntılı olarak açıklanmıştır. Varsayılan sağlayıcılar gereksinimlerinizi karşılamıyorsa aşağıdaki yaklaşımlardan birini kullanarak özel bir sağlayıcı oluşturun:

CustomRequestCultureProvider kullanma

CustomRequestCultureProvider , geçerli yerelleştirme kültürünü belirlemek için basit bir temsilci kullanan bir özel RequestCultureProvider ayar sağlar:

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

RequestCultureProvider'ın yeni bir uygulamasını kullanma

Özel bir kaynaktan gelen istek kültürü bilgilerini belirleyen yeni bir uygulaması RequestCultureProvider oluşturulabilir. Örneğin, özel kaynak bir yapılandırma dosyası veya veritabanı olabilir.

Aşağıdaki örnekte, öğesinden appsettings.jsonistek kültürü bilgilerini belirlemek için öğesini RequestCultureProvider genişleten gösterilirAppSettingsRequestCultureProvider.

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

Yerelleştirme kaynakları

ASP.NET Core yerelleştirmesi ResourceManagerStringLocalizersağlar. ResourceManagerStringLocalizer, yerelleştirme kaynaklarını depolamak için kullanılan resx bir uygulamasıdırIStringLocalizer.

Dosyaları kullanmakla resx sınırlı değilsiniz. uygulanarak IStringLocalizer, herhangi bir veri kaynağı kullanılabilir.

Aşağıdaki örnek projeler şunu uygular IStringLocalizer: