Locale — bu nədir, Foundation sinfi və lokallaşdırma

Müəllif: IT Sectr Dərc olunub: 2026-07-12 Oxuma vaxtı: 9 dəq

Locale — iOS və macOS-da Foundation sinfi olub, istifadəçinin linqvistik və mədəni konvensiyalarını kapsullaşdırır: tarix, rəqəm, valyuta və ölçü vahidlərinin formatı. Apple Developer Documentation, 2024-ə görə, Locale DateFormatter-in ayı necə göstərdiyini (yanvar və ya January), ədəddə onluq ayırıcını (vergül və ya nöqtə) və valyuta simvolunu (manat, dollar və ya avro) müəyyən edir. Hər bir Locale nümunəsi ru_RU və ya en_US tipli identifikatora bağlıdır, burada birinci hissə dil kodu (ISO 639-1), ikinci hissə region kodudur (ISO 3166-1). TimeZone-dan fərqli olaraq, Locale zamanın mütləq dəyərinə deyil, yalnız onun mətn təsvirinə təsir edir.

Əsas məqamlar

  • Locale — iOS və macOS-da mədəni və linqvistik formatlama parametrləri üçün Foundation sinfi
  • ru_RU identifikatoru — dil kodu (ISO 639-1) və region kodunun (ISO 3166-1) birləşməsi
  • DateFormatter və NumberFormatter nəticələrin lokallaşdırılması üçün avtomatik olaraq Locale-dən istifadə edir
  • Locale.current — istifadəçinin sistem lokalı, ayrı-ayrı əməliyyatlar üçün dəyişdirilə bilər
  • Sabit vs avtomatik yeniləmə — Locale(identifier:) sabit lokal yaradır, Locale.current parametrlərdəki dəyişiklikləri izləyir

Foundation-da Locale nədir?

Locale — Swift-də value-tip (Objective-C-də NSLocale), müəyyən dil və region üçün xarakterik olan formatlama qaydaları toplusunu təmsil edir. TimeZone-dan fərqli olaraq, zamanın mütləq yerdəyişməsini təyin edən, Locale zamanın, rəqəmlərin və valyutanın mətn təsvirində necə görünəcəyini müəyyən edir. Eyni 2024-07-21 tarixi ru_RU üçün "21 iyul 2024-cü il" və en_US üçün "July 21, 2024" kimi göstəriləcək.

Hər bir Locale nümunəsi iki komponentdən ibarətdir: Language (dil — ayların, həftə günlərinin adlarını, söz sırasını müəyyən edir) və Region (region — rəqəm formatını, valyutanı, təqvimi müəyyən edir). Bu komponentlərin kombinasiyası BCP 47 standartına uyğun olaraq identifikatorda kodlanır: ru_RU (rus dili, Rusiya), en_US (ingilis, ABŞ), de_DE (alman, Almaniya).

Unicode CLDR (2024)-ə görə, iOS-da dəstəklənən lokalizasiyaların siyahısı 700-dən çox dil-region kombinasiyasını ötür. Foundation CLDR-dən (Common Locale Data Repository) məlumatlardan istifadə edir — Unicode Consortium tərəfindən dəstəklənən ən tam lokalizasiya məlumat anbarı. Bu, bütün Apple cihazlarında formatlamanın vahidliyini təmin edir.

Locale tarix və rəqəm formatına necə təsir edir?

DateFormatter düzgün ay və həftə günü adlarını seçmək, tarix komponentlərinin sırasını (gün/ay/il və ya ay/gün/il) və ayırıcıları müəyyən etmək üçün Locale-dən istifadə edir. Locale açıq şəkildə göstərilmədikdə, DateFormatter cihazın lokalından istifadə edir — bu UI üçün düzgündür, lakin format sabit olmalı olan server məlumatları üçün təhlükəlidir.

Komponentru_RUen_USde_DE
Tarix (medium)21 iyul 2024-cü ilJul 21, 202421.07.2024
Rəqəm (1000.5)1 000,51,000.51.000,5
Valyuta (100)100,00 ₽$100.00100,00 €
TəqvimQriqorianQriqorianQriqorian
Siyahı ayırıcısı;,;

NumberFormatter onluq ayırıcını (vergül və ya nöqtə), qruplaşdırıcı ayırıcını (boşluq, vergül, nöqtə) və valyuta simvolunu müəyyən etmək üçün Locale-dən istifadə edir. Rəqəmlərin pars edilməsi zamanı Locale-i nəzərə almamaq beynəlxalq tətbiqlərdə tez-tez rast gəlinən səhvlərdən biridir: "1,5" rəqəmi ru_RU üçün "bir tam yarım" deməkdir, lakin en_US üçün rəqəm analizatoru onu vergüldən sonra "beş" kimi oxuyacaq.

Vacib: Calendar.current vasitəsilə yaradılmış Calendar cihazın lokalını miras alır. Açıq şəkildə təyin edilmiş locale ilə Calendar(identifier: .gregorian) proqnozlaşdırıla bilən formatlama üçün tövsiyə olunan üsuldur. ISO 8601 tarixləri ilə işləyərkən həmişə Locale(identifier: "en_US_POSIX") istifadə edin — regional parametrlərin təsirinə məruz qalmayan texniki formatlama üçün xüsusi lokal.

Locale identifikatorları: əsas formatlar

Locale identifikatoru dil kodu (ISO 639-1, iki simvol) və region kodundan (ISO 3166-1, iki simvol) ibarətdir, alt xətt ilə ayrılır. Nümunələr: ru_RU, en_US, fr_FR, zh_Hans_CN (çin, sadələşdirilmiş yazı, Çin). Foundation həmçinin BCP 47 formatında identifikatorları dəstəkləyir: ru-RU, en-US, veb standartlarında istifadə olunur.

Tam identifikatorlardan əlavə, Locale yalnız dil əsasında yaradıla bilər: Locale(identifier: "ru") rus dili və bu dil üçün standart region (adətən Rusiya) ilə lokal qaytarır. Eynilə ingilis dili üçün: Locale(identifier: "en") ABŞ regionundan istifadə edir. Bu yanaşma konkret regiona bağlanmadan formatlama dilini təyin etmək üçün faydalıdır.

Xüsusi lokallar en_US_POSIX-i əhatə edir — tarix və rəqəmlərin maşın formatlaması üçün texniki lokal, istifadəçi parametrlərindən asılı olmayaraq sabit formatı təmin edir. Bu lokal server API-lərindən tarixlərin pars edilməsi üçün məcburidir, xüsusilə ISO 8601 formatı üçün. Qriqorian təqvimi, 24-saatlıq vaxt formatı və onluq ayırıcı kimi nöqtədən istifadə edir.

swift
import Foundation

// Mövcud lokal identifikatorları
let available: [String] = Locale.availableIdentifiers
print("Ümumi lokallar: \(available.count)")

// Rus lokallarını filtr et
let russianLocales = available.filter { $0.hasPrefix("ru") }
print("Rus lokalları: \(russianLocales)")

// Lokal komponentləri
let locale = Locale(identifier: "de_DE")
print("Dil: \(locale.languageCode ?? "nil")")
print("Region: \(locale.regionCode ?? "nil")")
print("Valyuta: \(locale.currencyCode ?? "nil")")
print("Təqvim: \(locale.calendar.identifier)")

Mövcud lokalların yoxlanılması Locale.availableIdentifiers vasitəsilə cari iOS versiyası tərəfindən dəstəklənən bütün identifikatorların massivini qaytarır. Region üzrə filtrləmə üçün Locale.availableIdentifiers.filter-dən regionCode yoxlaması ilə istifadə edin. Bu, sərt kodlanmış siyahı olmadan region seçimi UI-nin qurulması üçün faydalıdır.

Swift-də istifadəçinin cari lokalının təyini

Locale.current — iOS parametrlərində (Settings > General > Language & Region) istifadəçi tərəfindən təyin edilmiş cihazın cari lokalını əldə etməyin əsas yoludur. Bu xüsusiyyət tətbiqin yenidən başladılması olmadan parametrlərdə dil və ya region dəyişdirilərkən avtomatik yenilənir. Bununla belə, o, məzmunun göstərilməsi üçün üstünlük verilən lokalla üst-üstə düşməyə bilər: istifadəçi interfeys dilini ingilis edə bilər, lakin tarixləri rus formatında görə bilər.

İstifadəçinin üstünlüklərini daha dəqiq müəyyən etmək üçün Locale.preferredLanguages-dən istifadə edin — istifadəçi prioritetinə görə sıralanmış dillər massivi. Birinci element əsas interfeys dilidir. Bu siyahı Language & Region parametrlərinə uyğundur, o cümlədən dillərin üstünlük sırası ilə sürüklənməsi. Rabitə tətbiqləri (messencerlər, e-poçt müştəriləri) məzmunun göstərilmə dilini seçərkən bu sıranı nəzərə almalıdır.

swift
import Foundation

// Cari sistem lokalı
let current = Locale.current
print("Cari lokal: \(current.identifier)")
print("Dil: \(current.language?.disjointName ?? "nil")")

// İstifadəçinin seçdiyi dillər
let preferred = Locale.preferredLanguages
print("Seçilmiş dillər: \(preferred)")

// Cari lokalda regionu əldə et
if let region = current.regionCode {
    let regionLocale = Locale(identifier: "en_\(region)")
    let countryName = regionLocale.localizedString(
        forRegionCode: region
    )
    print("Ölkə: \(countryName ?? region)")
}

// 24 saat formatını yoxla
let uses24h = current.uses24hClock(
    for: .dateAndTime
)
print("24h istifadə edir: \(uses24h)")

UI-də lokallaşdırma: interfeys dilində ay və həftə günlərinin adlarını göstərmək üçün təyin edilmiş locale ilə Calendar-dan istifadə edin. Calendar.current.symbols(for: .month) cari lokalın dilində ayların adlarını qaytarır. İstifadəçinin dilində ölkə adlarını göstərmək üçün Locale.current.localizedString(forRegionCode:) istifadə edin.

Swift-də Locale: istifadə nümunələri

Tarixin formatlanması lokallaşdırma nəzərə alınmaqla — istifadəçiyə tarixlərin göstərilməsində əsas vəzifədir. Təyin edilmiş locale ilə DateFormatter avtomatik olaraq istifadəçinin regionu üçün düzgün tarix və vaxt formatını seçir. dateStyle və timeStyle üçün .short, .medium, .long, .full dəyərləri ilə formatlayıcı tarix komponentlərini tərtib etmək üçün lokal qaydalarından istifadə edir.

swift
import Foundation

let date = Date()

// Müxtəlif lokallarla formatlama
let formatter = DateFormatter()
formatter.dateStyle = .medium

formatter.locale = Locale(identifier: "ru_RU")
print("Rus: \(formatter.string(from: date))")

formatter.locale = Locale(identifier: "en_US")
print("İngilis: \(formatter.string(from: date))")

formatter.locale = Locale(identifier: "ja_JP")
print("Yapon: \(formatter.string(from: date))")

// Valyuta formatlaması lokalla
let numFormatter = NumberFormatter()
numFormatter.numberStyle = .currency

numFormatter.locale = Locale(identifier: "de_DE")
print("Alman valyutası: \(numFormatter.string(from: 1234.56) ?? "nil")")

numFormatter.locale = Locale(identifier: "en_US")
print("ABŞ valyutası: \(numFormatter.string(from: 1234.56) ?? "nil")")

Server API-lərindən tarixlərin pars edilməsi həmişə sabit format üçün Locale(identifier: "en_US_POSIX") istifadə etməlidir. Serverlər adətən tarixləri ingilis ay adları ilə ISO 8601 formatında göndərir və cihazın cari lokalından istifadə etmək, istifadəçi ingilis olmayan dildə regionda olduqda pars xətasına səbəb ola bilər. en_US_POSIX, pars etmənin cihaz parametrlərindən asılı olmamasını təmin edir.

swift
import Foundation

// Server tarixlərinin düzgün pars edilməsi
let isoFormatter = DateFormatter()
isoFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
isoFormatter.locale = Locale(identifier: "en_US_POSIX")
isoFormatter.timeZone = TimeZone(secondsFromGMT: 0)

let serverDate = "2024-07-21T14:30:00+0000"
if let parsed = isoFormatter.date(from: serverDate) {
    print("Pars edilmiş tarix: \(parsed)")
}

// Lokallaşdırılmış valyuta adı
let usLocale = Locale(identifier: "en_US")
let currencyName = usLocale.localizedString(
    forCurrencyCode: "RUB"
)
print("Rus rublu ABŞ lokalında: \(currencyName ?? "nil")")

Əlavə imkanlar: Locale öz komponentlərinin lokallaşdırılmış təsvirini localizedString(forRegionCode:), localizedString(forLanguageCode:), localizedString(forCurrencyCode:) və localizedString(forCalendarIdentifier:) metodları vasitəsilə təmin edir. Bu metodlar çağırıldıqları lokalın dilində adları qaytarır. Məsələn, Locale(identifier: "ru_RU").localizedString(forCountryCode: "DE") "Almaniya" qaytaracaq.

Locale ilə işləyərkən tipik səhvlər

Rəqəmlərin pars edilməsi zamanı Locale-i nəzərə almamaq — beynəlxalq tətbiqlərdə kritik səhvdir. Açıq lokal olmadan NumberFormatter cihazın cari lokalından istifadə edir. Rusiyada istifadəçi "1,5" daxil edərsə, NumberFormatter.number(from: "1,5") düzgün olaraq 1.5 qaytaracaq. Lakin eyni kod en_US lokalı olan cihazda işlədildikdə, pars etmə nil qaytaracaq, çünki en_US üçün onluq ayırıcı nöqtədir.

Server tarixləri üçün en_US_POSIX-in olmaması çətin aşkarlanan səhvlərə gətirib çıxarır. dateFormat və locale = Locale.current ilə DateFormatter tarix formatı Amerika formatından fərqlənən regionlardakı istifadəçilərdə xəta verə bilər. Məsələn, Almaniyada DateFormatter "21.07.2024" gözləyə bilər, lakin server "07/21/2024" göndərir. en_US_POSIX istifadəçinin regionundan asılı olmayaraq maşın pars etməsi üçün sabit formatı təmin edir.

Tarixlərin mətn sətirlərinin müqayisəsi Date istifadə etmək əvəzinə — başqa bir geniş yayılmış səhvdir. Tərtibatçılar bəzən müxtəlif lokallardan tarixlərin mətn təsvirlərini müqayisə edərək yanlış nəticələr əldə edirlər. Locale yalnız göstərilməni dəyişir, lakin tarixin mütləq dəyərini deyil. Həmişə Date obyektlərini müqayisə edin, onların mətn təsvirlərini deyil. Tarix komponentlərini müqayisə etmək üçün açıq şəkildə təyin edilmiş locale ilə Calendar-dan istifadə edin.

WWDC 2023-ə görə, tətbiqlərdə beynəlmiləlləşdirmə problemlərinin təxminən 30%-i Locale-in düzgün konfiqurasiya edilməməsi ilə bağlıdır. Apple server məlumatları ilə işləyərkən DateFormatter və NumberFormatter üçün həmişə locale-i açıq şəkildə təyin etməyi və Locale.current-dən yalnız UI-də göstərmək üçün istifadə etməyi tövsiyə edir. Bu sadə təcrübə regional parametrlərlə bağlı səhvlərin əksəriyyətini aradan qaldırır.

Tez-tez verilən suallar

Foundation-da Locale nədir?

Locale — mədəni və linqvistik formatlama qaydalarını təmsil edən Foundation sinfi: tarix, rəqəm, valyuta və ölçü vahidlərinin formatı. Məlumatların lokallaşdırılmış göstərilməsi üçün DateFormatter, NumberFormatter və Calendar ilə birlikdə istifadə olunur.

Locale və TimeZone arasında nə fərq var?

Locale göstərmə formatını (dil, regional konvensiyalar), TimeZone isə UTC-yə nisbətən zamanın mütləq yerdəyişməsini müəyyən edir. Locale mətn təsvirinə təsir edir, TimeZone — zamanın rəqəm dəyərinə. Hər ikisi tarixin tam formatlanması üçün birlikdə istifadə olunur.

en_US_POSIX nədir və nə üçün lazımdır?

en_US_POSIX — istifadəçi parametrlərindən asılı olmayaraq sabit formatı təmin edən texniki formatlama üçün xüsusi lokaldır. Server tarixlərinin (ISO 8601) pars edilməsi və formatın proqnozlaşdırıla bilən olması lazım olan API-lərlə iş üçün məcburidir.

Bütün mövcud lokalların siyahısını necə əldə etmək olar?

Locale.availableIdentifiers bütün dəstəklənən lokalların identifikatorları olan sətir massivini qaytarır. Dil üzrə filtrləmə üçün hasPrefix ilə filter, region əldə etmək üçün Locale(identifier:).regionCode istifadə edin.

Locale NumberFormatter-ə necə təsir edir?

NumberFormatter onluq ayırıcını (vergül və ya nöqtə), valyuta simvolunu və qruplaşdırıcı ayırıcını müəyyən etmək üçün Locale-dən istifadə edir. Sabit format üçün locale-i en_US_POSIX-ə təyin edin və ya formatterin xüsusiyyətlərini açıq şəkildə göstərin.

Nəticə

  • Locale — iOS və macOS-da tarix, rəqəm və valyuta formatlamasının lokallaşdırılması üçün fundamental sinif
  • ru_RU identifikatoru formatlamanı dəqiq tənzimləmək üçün dili (ISO 639-1) və regionu (ISO 3166-1) kodlayır
  • DateFormatter və NumberFormatter lokallaşdırılmış çıxış üçün avtomatik olaraq Locale.current istifadə edir
  • en_US_POSIX — server tarixlərinin pars edilməsi və sabit maşın formatlaması üçün məcburi lokaldır
  • Locale.current parametrlərdəki dəyişiklikləri izləyir, Locale(identifier:) sabit lokal yaradır
  • Rəqəmlərin pars edilməsi locale-in açıq şəkildə təyin edilməsini tələb edir — onluq ayırıcı istifadəçinin regionundan asılıdır
  • Calendar.current cihazın lokalını miras alır; proqnozlaşdırıla bilən hesablamalar üçün locale-i açıq təyin edin

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun