asp.net-core-da-bir-nece-dil-destekleyen-saytin-hazirlanmasi-1ci-hisse

Asp.NET CORE-da bir neçə dil dəstəkləyən saytın hazırlanması 1ci hissə

Veb saytların qlobal bazara çıxışını, daha böyük auditoriyaya müraciətini təmin etmək üçün onların qloballaşdırılması(globalization/qlobalizasiya) prosesi çox önəmlidir.

               Bu məqalədə Asp.NET CORE veb saytların qloballaşdırılması, lokalizasiyası(localization) qaydaları ilə tanış olacağıq.

               PS: Müəllif bu məqalədə terminologiya olacaq globalization(qloballaşdırılma/qloballaşma/qlobalizasiya) ,localization(lokalizasiya/lokallaşdırılma) və CultureInfo(mədəniyyət informasiyaları) sözlərini işlədir.


Bəs nədir axı bu globalization və localization?

-Globalization -- yazdığımız proqramın bir neçə mədəniyyət məlumatlarını(culture),bir neçə dili dəstəkləməsi prosesidir. Bunun hesabına yazdığımız tətbiqin bir neçə dildə işləməsini təmin edə bilərik.

-Localization—isə əksinə, həmin tətbiqin konkret olacaq lokal bir bölgəyə, ölkəyə, dilə adaptasiya formasıdır. Yəni proqramı lokalizasiya etmək dedikdə onu konkret  dilə adaptasiya etmək nəzərdə tutulut.

 .NET framework localization/globalization prosesini  CultureInfo adlanan klas və resurs faylları yaradaraq həyata keçirir.

İlk anlayışlarla tanış olduğumuza görə,gəlin  Asp.NET CORE MVC proyektində globalization/localization prosesini həyata keçirək. Bu bölmədə hələki yalnızca kontrollerin lokalizasiya olunma qaydası ilə tanış olacağıq.

               İlk öncə Asp.NET CORE MVC template generasiya edək.


               Daha sonra Resource qovluğu yaradaraq orada SharedResource.cs adlanan klas yaradırıq. Bu klasın məqsədi veb səhifəmizdə bir neçə səhifələr üçün ortaq tərcümə məlumatlarını saxlamağa xidmət etməkdir. Razılaşma qaydası belədir ki, adətən SharedResource adlanan klas yaradılır amma ki , Startup klasını da istifadə edə bilərik. Asp.NET CORE sistemi bu klasa refleksiya tətbiq edərək paylanılan resursları(shared resource) buradan oxuyur.

Daha sonra həmin qovluqda hər bir dilə uyğun resurs faylları yaradılmalıdır. Bizim veb səhifəmiz Azərbaycan dili (az-Latn-AZ), rus dili (ru-RU) və ingilis dilini (en-US) dəstəkləyəcək.

Hər bir dilə görə SharedResource.dilin-culture-yazilis-formasi.resx faylı yaratmalıyıq. Misalçün Azərbaycan dili üçün SharedResource.az-Latn-AZ.resx

Bununçün Resources qovluğu üzərində sağ düymə -> Add -> New Item seçirik. Açılan pəncərədən sağda Asp.NET Core seçərək axtarış yerində resources yazın Resource File şablonunu tapırıq. Faylı dilə uyğun olaraq (azərbaycan dili üçün SharedResource.az-Latn-AZ.resx) adlandırırıq

Daha sonra yaradılan faylın içərisinə bəzi sözlər yazırıq.

Hələlik rus və azərbaycan dilləri üçün Resource faylları yaradaq.

(Resources qovluğunda SharedResource.az-Latn-AZ.resxSharedResource.ru-RU.resx faylları)

Faylları konfiq etdikdən sonra artıq veb səhifənin işləməsini təmin etmək üçün lazımi funksionallığı qoşmaq lazımdır. Bununçün Startup faylını açıb aşağıdakıları oraya əlavə edirik.

  public void ConfigureServices(IServiceCollection services)
        {

            //lokalizasiya servisini qoşuruq.
            // lokalizasiya üçün tərcümə fayllarının Resources qovluğunda
            //yerləşdirini göstəririk
            services.AddLocalization(x => x.ResourcesPath = "Resources");


            services.Configure(op =>
            {
                //dəstəklənəcək dillərin siyahısı hazırlayırıq
                var supportedLanguages = new CultureInfo[]
                {
                    new CultureInfo("az-Latn-AZ"),
                    new CultureInfo("ru-RU")
                };

                //hec bir dil göstərilməzsə default olaraq Azərbaycan dilini götür
                op.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture(supportedLanguages[0]);

                //vaxt və tarix, pul formatı , rəqəm təsviri üçün
                op.SupportedCultures = supportedLanguages;

                //səhifədəki sözlərin tərcümə olunması üçün
                op.SupportedUICultures = supportedLanguages;



            });
    //.................
    //.................
}

               Lokalizasiyanın işini təmin etmək üçün bizə servis ( AddLocalization() ) və servisə uyğun middleware ( AddRequestLocalization() ) qoşmaq lazım olacaq. Servisin konfiqurasiyasını isə RequestLocalizationOptions adlanan klas üzərindən aparırıq. Orada servisin dəstəkləyəcəyi dillər və dil parametri olmasa default olaraq hansı dili dəstəkləyəcəyini göstəririk.

Servisin qoşulması lokalizasiya və qlobalizasiyanı işlətməyə tam imkan vermir. Bununçün UseRequestLocalization() adlanan middlewareni də qoşmaq lazımdır.

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

            app.UseHttpsRedirection();

            //lokalizasiya middleware-sinin əlavəsi
            app.UseRequestLocalization();
      //.........
      //.........
}
    

 Artıq lazımi konfiqurasiyalar bitdiyinə görə ilk önçə kontrollerin lokalizasiyasına baxa bilərik. Kontrollerin lokalizasiyası paylanılan(shared) və kontrollerə özəl(specific) lokalizasiya olmaqla 2 yerə bölünür. Əgər bir neçə kontrollerdə ortaq tərcümə olunası sözlər varsa ozaman paylanılan(shared) lokalizasiya istifadə olunur. Əgər hər kontrollerin özünəməxsus tərcümə olunmalı sözləri varsa bununçün hər kontrollerə uyğun resurs faylları yaradılmalıdır.(specific)

               Kontrollerin tərcümə məlumatlarını Shared resource-dan oxuya bilməsi üçün dependency injection( dependency injection sözünün dilimizə düzgün tərcüməsi asılılığın yeridilməsi dir) istifadəsi etməsi lazımdır.

 public class HomeController : Controller
    {
        private readonly IStringLocalizer sharedLocalizer;
        public HomeController(IStringLocalizer sharedLocalizer)
        {
            this.sharedLocalizer = sharedLocalizer;
        }
        public IActionResult Index()
        {
           ViewBag.TranslatedInfo = sharedLocalizer["Home"];
            return View();
        }
}

IStringLocalizer klası aşağı səviyyəli klas olaraq generic formada SharedResource-dan məlumat oxumağa kömək edir.

Kontrollerdə resx faylında olan hər hansı bir sözü oxumaq üçün aşağıdakı kodu yazırıq.

View faylı isə belə olacaq.

 @{
    ViewData["Title"] = "Home Page";
}

@ViewBag.TranslatedInfo

class="text-center">    

class="display-4">Welcome

   

Learn about "https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core.

Açılan səhifəyə baxaq:

Əgər dili dəyişmək istəyiriksə sadəcə url-dən culture adlanan key ilə məlumat ötürə bilərik. URL üçün həm culturehəm də uiculture sözləri istifadə oluna bilər. Amma culture –ni tək yazmaq kifayət edir çünki əgər uiculture üçün də culture informasiyası tətbiq olunur.

               İndiyə kimi göstərdiyimiz variant kontrollerin shared localization qaydası idi. İndi isə kontrollerin spesifik lokalizasiyasina baxaq. Bununçün Resources qovluğunda 2 cür adlandırma qaydası aparmaq olar:

1)Resources/Controllers/kontrollerin_adi. dilin-culture-yazilis-formasi.resx

-Misalçün HomeController-i rus dilinə lokalizasiya etmək istəsək ozaman Resources/Controllers/HomeController.ru-RU.resx

2)Resources/Controllers.kontroller_adi. dilin-culture-yazilis-formasi.resx

-Misalçün HomeController-i rus dilinə lokalizasiya etmək istəsək ozaman

Resources/Controllers.HomeController.ru-RU.resx

Resources/Controllers.HomeController.ru-RU.resx faylını belə edit edirik.

Yekunda alınan görünüş belə olacaq:

 

 

 

Tural

Tural Süleymani

Süleymani Tural Microsoft-un MCSD statuslu mütəxəssisidir, 2008-ci ildən bu yana proqramlaşdırma üzrə tədris aparır

Müəllifin bu dildə ən son postları

Bu yazıları da bəyənə bilərsiniz