C # Resurs sənədləri (resx faylları) əvəzinə sadə bir i18n formasını necə istifadə etmək olar

Resurs sənədlərindən (resx faylları) bezdiniz?

Çoxlarınız kimi mən də illərdir C # tətbiqetmələrini inkişaf etdirirəm. Tərcüməni açar dəyərlər kimi saxlamaq üçün .resx fayllarından istifadə etməli olduğum vaxtlar oldu. Resx fayllarından istifadə etməyin bir sıra faydaları var:

1- Bu redaktor Visual Studio-da quraşdırılmışdır 2-Visual studiya tərcümə dəyərlərini təmin etmək üçün statik bir sinif yaradır

Ancaq bəzi problemlər də var: 1- Resx fayllarını redaktə etmək yalnız Visual Studio-da mümkündür. ZetaResourceEditor və ya ResXResourceManager kimi üçüncü tərəf tətbiqlərindən istifadə etsək də, Windows əməliyyat sistemi ilə məhdudlaşırıq. 2- Tətbiq çıxışında daha az dlls ilə maraqlananlar üçün resx faylları bir problemdir, çünki tətbiq çıxışı bir çox peyk toplaşmasına səbəb olur. 3- Resx yanaşması ilə asılılıq inyeksiyası əhəmiyyətsiz deyildir və statik sinif ətrafında bəzi sarımlara ehtiyac duyur.

Bir alternativə maraqlanırsınızsa, oxumağa davam edin.

JSON qurtarmağa!

Alternativ olaraq tərcümələrimizi saxlamaq üçün JSON-dan istifadə edə bilərik. Bu işi cəmi 6 mənbə kodu ilə yerinə yetirən libc.translation adlı bir depo yaratdım. Bu kod parçasının bizə necə kömək edəcəyini görək:

1- Nuget paketinə istinad edin: https://www.nuget.org/packages/libc.translation/

2- İndi tərcümələrimizi bir JSON sənədinə yazmalıyıq (yerli mənbəyimizi yaradın). Bizim JSON faylı tərcümə mədəniyyətləri kimi açarları olan bir obyektdir. Aşağıda bir nümunə:

Ərəb (ar), fars (fa) və ingilis (en) tərcümə açar dəyərləri olan bir JSON faylının nümunəsi

3- Bu faylı ILocalizationSource kimi istifadə etməyin iki yolu var:

3–1- Bu faylı məclisimizə əlavə et: Solution Explorer-də seçin və F4 vurun. Xüsusiyyətlər panelində "Fəaliyyət" olaraq "Göndərilmiş mənbə" seçin. İndi JSON faylı bizim məclisə daxil edilmişdir :-) Mənim yanaşmamdan istifadə etdiyinizi xatırlayın, çıxışda heç bir peyk məclisi olmayacaq.

3–2 - Bu faylı diskdə bir yerdə saxlayın.

4- Bu yazıda əlaqədar JSON (3-1) faylı ilə gedəcəyəm. Layihəmizin adı "libc.translation.tests" olarsa, bu kimi ILocalizationSource nümunəsini yarada bilərik:

ILocalizationSource bir nümunəsi yaradın

Localisation Source mənbəyi, JSON məlumatları üçün FileInfo, JObject və ya Stream təmin etməyə imkan verən bəzi digər konstruktor yüklənmələrinə də malikdir.

Çox vaxt birbaşa ILocalizationSource istifadə etmirik. Bunun əvəzinə mənbəyi Localizer konstruktoruna ötürürük:

ILocalizer bir nümunə yaradın

Bir "fallbackCulture" parametrinin olduğunu gördünüzmü? Adından da göründüyü kimi, tərcümələrimizdə bir mədəniyyət çatışmadıqda geri düşmə mədəniyyəti istifadə olunur. Yuxarıdakı misalda JSON, kodumuzda bir yerdə "Değe" (Alman) dilində "YanlışInput" düyməsinin tərcüməsini əldə etməyə çalışdığımızı fərz edək. "De" mədəniyyəti JSON sənədində göstərilməmişdir, buna görə də Lokalizator nümunəsi geriləmə mədəniyyətindən istifadə edir və "ar" (ərəb) dilindəki dəyərini qaytarır.

5- Bəzi düymələrdən və istədiyiniz mədəniyyətlərdən istifadə edərək tərcümə dəyərlərini əldə etməyin vaxtı gəldi:

5-1 - Bir mədəniyyət keçmədən tərcüməni əldə edin: Düyməni ötürün (həssas). Burada Lokalizator ip mədəniyyətini istifadə edəcək: (Mövzunun cari mədəniyyəti JSON sənədində olmadıqda, geri düşmə mədəniyyəti istifadə ediləcək)

Bir mədəniyyət keçmədən tərcümə alın

5–2 - Müəyyən bir mədəniyyətdə tərcüməni əldə edin: İstədiyiniz mədəniyyətdən keçin, sonra açar (hərfə həssas deyil) (Verilmiş mədəniyyət JSON sənədində olmadıqda yadda saxlama mədəniyyəti istifadə ediləcəkdir). Bir misala baxaq:

Müəyyən bir mədəniyyətdə tərcümə alın. Düşük mədəniyyətini də sınayın

Yuxarıdakı ilk blokda, "en" (İngilis dili) mədəniyyətindəki "invalidInput" düyməsi üçün tərcümə dəyərinə ehtiyac duyduq. İkinci blokda bu tərcüməni "de" (Alman) mədəniyyətində almağa çalışdıq, lakin "de" JSON sənədimizdə olmadığından, Localizer, tərcüməni geri qaytarma mədəniyyətində ("ar" olan) əldə etməyə çalışacaq ( Ərəb))

5–3 - Bir mədəniyyət keçmədən biçimli tərcümə alın (string.Format istifadə edin):

Bir mədəniyyət keçmədən biçimli tərcümə alın

Burada açarı ötürdük (bildirin ki, birinci hərf U hərfi olan "unknownError" dan fərqli olaraq kiçik hərflə yazılır) və mövcud ipin mədəniyyəti (ərəbcə) istifadə olunur. Həm də string.Format-a bənzər, Lokalizator "{0}" -ni "!!!" ilə əvəz edir.

Daha çox nümunə görmək üçün təqdim edilmiş testlərə nəzər sala bilərsiniz.

Nəticə:

Bu yazıda tətbiqlərimizi .Net Standard 2.0 (.Net Core & .Net Framework 4.6.1+) lokallaşdırmaq üçün alternativ bir yoldan istifadə etməyə çalışdıq. Bir ILocalizationSource yaratmağı və bunu ILocalizer nümunəsinə keçirməyin necə olduğunu gördük.

Saeid Farahi, əsasən .Net Çərçivə və .Net Core ekosisteminə yönəlmiş bir İran proqram təminatçısıdır. Ayrıca dünyanın hər yerindən gələn hər hansı bir işə təkliflə maraqlanır :-)