Locale — bu nima, Foundation klassi va lokalizatsiya

Muallif: IT Sectr Nashr etilgan: 2026-07-12 O'qish vaqti: 9 daq

Locale — iOS va macOS da Foundation sinfi bo'lib, foydalanuvchining lingvistik va madaniy konvensiyalarini inkapsulatsiya qiladi: sanalar, raqamlar, valyutalar va o'lchov birliklari formati. Apple Developer Documentation, 2024 ma'lumotlariga ko'ra, Locale DateFormatter oyni qanday ko'rsatishini (yanvar yoki January), sondagi o'nli ajratkichni (vergul yoki nuqta) va valyuta belgisini (so'm, dollar yoki yevro) belgilaydi. Har bir Locale namunasi ru_RU yoki en_US turidagi identifikatorga bog'langan bo'lib, birinchi qism til kodi (ISO 639-1), ikkinchi qism mintaqa kodidir (ISO 3166-1). TimeZone dan farqli o'laroq, Locale vaqtning mutlaq qiymatiga emas, balki faqat uning matnli ko'rinishiga ta'sir qiladi.

Asosiy ma'lumotlar

  • Locale — iOS va macOS da madaniy va lingvistik formatlash sozlamalari uchun Foundation sinfi
  • ru_RU identifikatori — til kodi (ISO 639-1) va mintaqa kodining (ISO 3166-1) birikmasi
  • DateFormatter va NumberFormatter natijalarni lokalizatsiya qilish uchun avtomatik ravishda Locale dan foydalanadi
  • Locale.current — foydalanuvchining tizim lokali, alohida operatsiyalar uchun qayta belgilanishi mumkin
  • Barqaror vs avtomatik yangilash — Locale(identifier:) barqaror lokal yaratadi, Locale.current sozlamalardagi o'zgarishlarni kuzatadi

Foundation da Locale nima?

Locale — Swift da value-tip (Objective-C da NSLocale), ma'lum bir til va mintaqaga xos formatlash qoidalari to'plamini ifodalaydi. TimeZone dan farqli o'laroq, vaqtning mutlaq siljishini belgilaydigan, Locale vaqt, raqamlar va valyutaning matn ko'rinishida qanday ko'rinishini belgilaydi. Xuddi shu 2024-07-21 sanasi ru_RU uchun "21 iyul 2024" va en_US uchun "July 21, 2024" ko'rinishida ko'rsatiladi.

Har bir Locale namunasi ikki komponentdan iborat: Language (til — oylar, hafta kunlari nomlarini, so'z tartibini belgilaydi) va Region (mintaqa — raqam formatini, valyutani, taqvimni belgilaydi). Ushbu komponentlarning kombinatsiyasi identifikatorda BCP 47 standartiga muvofiq kodlanadi: ru_RU (rus tili, Rossiya), en_US (ingliz, AQSh), de_DE (nemis, Germaniya).

Unicode CLDR (2024) ma'lumotlariga ko'ra, iOS da qo'llab-quvvatlanadigan lokalizatsiyalar ro'yxati 700 dan ortiq til-mintaqa kombinatsiyasini tashkil qiladi. Foundation CLDR (Common Locale Data Repository) ma'lumotlaridan foydalanadi — Unicode Consortium tomonidan qo'llab-quvvatlanadigan eng to'liq lokalizatsiya ma'lumotlar ombori. Bu barcha Apple qurilmalarida formatlashning bir xilligini ta'minlaydi.

Locale sana va raqam formatiga qanday ta'sir qiladi?

DateFormatter to'g'ri oy va hafta kuni nomlarini tanlash, sana komponentlarining tartibini (kun/oy/yil yoki oy/kun/yil) va ajratkichlarni aniqlash uchun Locale dan foydalanadi. Locale aniq ko'rsatilmagan bo'lsa, DateFormatter qurilma lokalidan foydalanadi — bu UI uchun to'g'ri, lekin server ma'lumotlari uchun xavfli, chunki format barqaror bo'lishi kerak.

Komponentru_RUen_USde_DE
Sana (medium)21 iyul 2024Jul 21, 202421.07.2024
Raqam (1000.5)1 000,51,000.51.000,5
Valyuta (100)100,00 ₽$100.00100,00 €
TaqvimGrigorianGrigorianGrigorian
Ro'yxat ajratkichi;,;

NumberFormatter o'nli ajratkichni (vergul yoki nuqta), guruhlash ajratkichini (bo'shliq, vergul, nuqta) va valyuta belgisini aniqlash uchun Locale dan foydalanadi. Raqamlarni pars qilishda Locale ni e'tiborsiz qoldirish xalqaro ilovalarda keng tarqalgan xatolardan biridir: "1,5" raqami ru_RU uchun "bir yarim" degani, lekin en_US uchun raqam analizatori uni verguldan keyin "besh" deb o'qiydi.

Muhim: Calendar.current orqali yaratilgan Calendar qurilma lokalidan meros oladi. Aniq belgilangan locale bilan Calendar(identifier: .gregorian) — bashorat qilinadigan formatlash uchun tavsiya etilgan usul. ISO 8601 sanalari bilan ishlashda har doim Locale(identifier: "en_US_POSIX") dan foydalaning — mintaqaviy sozlamalar ta'siriga uchramaydigan texnik formatlash uchun maxsus lokal.

Locale identifikatorlari: asosiy formatlar

Locale identifikatori til kodi (ISO 639-1, ikki belgi) va mintaqa kodidan (ISO 3166-1, ikki belgi) iborat bo'lib, pastki chiziq bilan ajratilgan. Misollar: ru_RU, en_US, fr_FR, zh_Hans_CN (xitoy, soddalashtirilgan yozuv, Xitoy). Foundation BCP 47 formatidagi identifikatorlarni ham qo'llab-quvvatlaydi: ru-RU, en-US, veb standartlarida qo'llaniladi.

To'liq identifikatorlardan tashqari, Locale faqat til asosida yaratilishi mumkin: Locale(identifier: "ru") rus tili va ushbu til uchun standart mintaqa (odatda Rossiya) bilan lokalni qaytaradi. Xuddi shunday ingliz tili uchun: Locale(identifier: "en") AQSh mintaqasidan foydalanadi. Ushbu yondashuv ma'lum bir mintaqaga bog'lanmasdan formatlash tilini o'rnatish uchun foydalidir.

Maxsus lokallar en_US_POSIX ni o'z ichiga oladi — sana va raqamlarni mashina formatlash uchun texnik lokal, foydalanuvchi sozlamalaridan qat'iy nazar barqaror formatni ta'minlaydi. Ushbu lokal server API laridan sanalarni pars qilish uchun majburiydir, ayniqsa ISO 8601 formati uchun. Grigorian taqvimi, 24 soatlik vaqt formati va o'nli ajratkich sifatida nuqtadan foydalanadi.

swift
import Foundation

// Mavjud lokal identifikatorlari
let available: [String] = Locale.availableIdentifiers
print("Jami lokallar: \(available.count)")

// Rus lokallarini filtrla
let russianLocales = available.filter { $0.hasPrefix("ru") }
print("Rus lokallari: \(russianLocales)")

// Lokal komponentlari
let locale = Locale(identifier: "de_DE")
print("Til: \(locale.languageCode ?? "nil")")
print("Mintaqa: \(locale.regionCode ?? "nil")")
print("Valyuta: \(locale.currencyCode ?? "nil")")
print("Taqvim: \(locale.calendar.identifier)")

Mavjud lokallarni tekshirish Locale.availableIdentifiers orqali joriy iOS versiyasi tomonidan qo'llab-quvvatlanadigan barcha identifikatorlar massivini qaytaradi. Mintaqa bo'yicha filtrlash uchun Locale.availableIdentifiers.filter dan regionCode tekshiruvi bilan foydalaning. Bu qattiq kodlangan ro'yxatsiz mintaqa tanlash UI sini qurish uchun foydalidir.

Swift da foydalanuvchining joriy lokalini aniqlash

Locale.current — iOS sozlamalarida (Settings > General > Language & Region) foydalanuvchi tomonidan o'rnatilgan qurilmaning joriy lokalini olishning asosiy usuli. Bu xususiyat ilovani qayta ishga tushirmasdan sozlamalarda til yoki mintaqa o'zgartirilganda avtomatik ravishda yangilanadi. Biroq, u kontentni ko'rsatish uchun afzal qilingan lokal bilan mos kelmasligi mumkin: foydalanuvchi interfeys tilini ingliz qilishi mumkin, lekin sanalarni rus formatida ko'rishi mumkin.

Foydalanuvchining afzalliklarini aniqroq aniqlash uchun Locale.preferredLanguages dan foydalaning — foydalanuvchi prioriteti bo'yicha tartiblangan tillar massivi. Birinchi element asosiy interfeys tilidir. Ushbu ro'yxat Language & Region sozlamalariga mos keladi, jumladan tillarni afzallik tartibida sudrab tashlash. Aloqa ilovalari (messendjerlar, email mijozlar) kontentni ko'rsatish tilini tanlashda ushbu tartibni hisobga olishlari kerak.

swift
import Foundation

// Joriy tizim lokali
let current = Locale.current
print("Joriy lokal: \(current.identifier)")
print("Til: \(current.language?.disjointName ?? "nil")")

// Foydalanuvchi afzal ko'rgan tillar
let preferred = Locale.preferredLanguages
print("Afzal tillar: \(preferred)")

// Joriy lokaldan mintaqani olish
if let region = current.regionCode {
    let regionLocale = Locale(identifier: "en_\(region)")
    let countryName = regionLocale.localizedString(
        forRegionCode: region
    )
    print("Mamlakat: \(countryName ?? region)")
}

// 24h formatini tekshirish
let uses24h = current.uses24hClock(
    for: .dateAndTime
)
print("24h ishlatadi: \(uses24h)")

UI da lokalizatsiya: interfeys tilida oy va hafta kunlari nomlarini ko'rsatish uchun locale o'rnatilgan Calendar dan foydalaning. Calendar.current.symbols(for: .month) joriy lokal tilida oy nomlarini qaytaradi. Foydalanuvchi tilida mamlakat nomlarini ko'rsatish uchun Locale.current.localizedString(forRegionCode:) dan foydalaning.

Swift da Locale: foydalanish misollari

Sanalarni formatlash lokalni hisobga olgan holda — foydalanuvchiga sanalarni ko'rsatishda asosiy vazifadir. O'rnatilgan locale bilan DateFormatter avtomatik ravishda foydalanuvchi mintaqasi uchun to'g'ri sana va vaqt formatini tanlaydi. dateStyle va timeStyle uchun .short, .medium, .long, .full qiymatlari bilan formatlovchi sana komponentlarini tuzish uchun lokal qoidalaridan foydalanadi.

swift
import Foundation

let date = Date()

// Turli lokallar bilan formatlash
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("Ingliz: \(formatter.string(from: date))")

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

// Lokal bilan valyuta formatlash
let numFormatter = NumberFormatter()
numFormatter.numberStyle = .currency

numFormatter.locale = Locale(identifier: "de_DE")
print("Nemis valyutasi: \(numFormatter.string(from: 1234.56) ?? "nil")")

numFormatter.locale = Locale(identifier: "en_US")
print("AQSh valyutasi: \(numFormatter.string(from: 1234.56) ?? "nil")")

Server API laridan sanalarni pars qilish har doim barqaror format uchun Locale(identifier: "en_US_POSIX") dan foydalanishi kerak. Serverlar odatda sanalarni ISO 8601 formatida ingliz oy nomlari bilan yuboradi va qurilmaning joriy lokalini ishlatish, foydalanuvchi ingliz bo'lmagan tildagi mintaqada bo'lsa, pars xatosiga olib kelishi mumkin. en_US_POSIX pars qilish qurilma sozlamalariga bog'liq emasligini ta'minlaydi.

swift
import Foundation

// Server sanalarini to'g'ri pars qilish
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 qilingan sana: \(parsed)")
}

// Lokalizatsiya qilingan valyuta nomi
let usLocale = Locale(identifier: "en_US")
let currencyName = usLocale.localizedString(
    forCurrencyCode: "RUB"
)
print("Rus rubli AQSh lokalida: \(currencyName ?? "nil")")

Qo'shimcha imkoniyatlar: Locale o'z komponentlarining lokalizatsiya qilingan tavsifini localizedString(forRegionCode:), localizedString(forLanguageCode:), localizedString(forCurrencyCode:) va localizedString(forCalendarIdentifier:) metodlari orqali ta'minlaydi. Bu metodlar chaqirilgan lokalning tilida nomlarni qaytaradi. Masalan, Locale(identifier: "ru_RU").localizedString(forCountryCode: "DE") "Germaniya" ni qaytaradi.

Locale bilan ishlashda odatiy xatolar

Raqamlarni pars qilishda Locale ni e'tiborsiz qoldirish — xalqaro ilovalarda jiddiy xato. Aniq lokalsiz NumberFormatter qurilmaning joriy lokalini ishlatadi. Agar foydalanuvchi Rossiyada "1,5" kiritsa, NumberFormatter.number(from: "1,5") to'g'ri 1.5 ni qaytaradi. Ammo xuddi shu kod en_US lokali qurilmada bajarilsa, pars qilish nil qaytaradi, chunki en_US uchun o'nli ajratkich nuqtadir.

Server sanalari uchun en_US_POSIX ning yo'qligi qiyin aniqlanadigan xatolarga olib keladi. dateFormat va locale = Locale.current bilan DateFormatter sana formati Amerika formatidan farq qiladigan mintaqalardagi foydalanuvchilarda ishlamay qolishi mumkin. Masalan, Germaniyada DateFormatter "21.07.2024" ni kutishi mumkin, lekin server "07/21/2024" ni yuboradi. en_US_POSIX foydalanuvchi mintaqasidan qat'iy nazar mashina pars qilish uchun barqaror formatni ta'minlaydi.

Sananing matn qatorlarini taqqoslash Date o'rniga — yana bir keng tarqalgan xato. Dasturchilar ba'zan turli lokallardan sanalarning matn ko'rinishlarini taqqoslab, noto'g'ri natijalar oladilar. Locale faqat ko'rinishni o'zgartiradi, lekin sananing mutlaq qiymatini emas. Har doim Date obyektlarini taqqoslang, ularning matn ko'rinishlarini emas. Sana komponentlarini taqqoslash uchun aniq belgilangan locale bilan Calendar dan foydalaning.

WWDC 2023 ma'lumotlariga ko'ra, ilovalardagi internatsionalizatsiya muammolarining taxminan 30% Locale ni noto'g'ri konfiguratsiya qilish bilan bog'liq. Apple server ma'lumotlari bilan ishlashda DateFormatter va NumberFormatter uchun har doim locale ni aniq belgilashni va Locale.current dan faqat UI da ko'rsatish uchun foydalanishni tavsiya qiladi. Ushbu oddiy amaliyot mintaqaviy sozlamalar bilan bog'liq xatolarning ko'pchiligini bartaraf qiladi.

Ko'p beriladigan savollar

Foundation da Locale nima?

Locale — madaniy va lingvistik formatlash qoidalarini ifodalovchi Foundation sinfi: sana, raqam, valyuta va o'lchov birliklari formati. Ma'lumotlarni lokalizatsiya qilingan ko'rsatish uchun DateFormatter, NumberFormatter va Calendar bilan birga ishlatiladi.

Locale va TimeZone o'rtasidagi farq nima?

Locale ko'rsatish formatini (til, mintaqaviy konvensiyalar), TimeZone esa UTC ga nisbatan vaqtning mutlaq siljishini belgilaydi. Locale matn ko'rinishiga, TimeZone esa vaqtning raqam qiymatiga ta'sir qiladi. Ikkalasi to'liq sanani formatlash uchun birgalikda ishlatiladi.

en_US_POSIX nima va u nima uchun kerak?

en_US_POSIX — foydalanuvchi sozlamalaridan qat'iy nazar barqaror formatni ta'minlaydigan texnik formatlash uchun maxsus lokal. Server sanalarini (ISO 8601) pars qilish va format bashorat qilinadigan bo'lishi kerak bo'lgan API lar bilan ishlash uchun majburiy.

Barcha mavjud lokallar ro'yxatini qanday olish mumkin?

Locale.availableIdentifiers barcha qo'llab-quvvatlanadigan lokallar identifikatorlarining qator massivini qaytaradi. Til bo'yicha filtrlash uchun hasPrefix bilan filter, mintaqani olish uchun Locale(identifier:).regionCode dan foydalaning.

Locale NumberFormatter ga qanday ta'sir qiladi?

NumberFormatter o'nli ajratkichni (vergul yoki nuqta), valyuta belgisini va guruhlash ajratkichini aniqlash uchun Locale dan foydalanadi. Barqaror format uchun locale ni en_US_POSIX ga o'rnating yoki formatter xususiyatlarini aniq belgilang.

Xulosa

  • Locale — iOS va macOS da sanalar, raqamlar va valyutalar formatlashni lokalizatsiya qilish uchun fundamental sinf
  • ru_RU identifikatori formatlashni aniq sozlash uchun tilni (ISO 639-1) va mintaqani (ISO 3166-1) kodlaydi
  • DateFormatter va NumberFormatter lokalizatsiya qilingan chiqish uchun avtomatik ravishda Locale.current dan foydalanadi
  • en_US_POSIX — server sanalarini pars qilish va barqaror mashina formatlash uchun majburiy lokal
  • Locale.current sozlamalardagi o'zgarishlarni kuzatadi, Locale(identifier:) barqaror lokal yaratadi
  • Raqamlarni pars qilish locale ni aniq belgilashni talab qiladi — o'nli ajratkich foydalanuvchi mintaqasiga bog'liq
  • Calendar.current qurilma lokalidan meros oladi; bashorat qilinadigan hisoblar uchun locale ni aniq belgilang

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing