Locale, iOS ve macOS'ta kullanıcının dilsel ve kültürel kurallarını (tarih biçimi, sayı biçimi, para birimleri ve ölçü birimleri) kapsayan bir Foundation sınıfıdır. Apple Developer Documentation, 2024'e göre, Locale DateFormatter'ın bir ayı nasıl görüntülediğini (Ocak veya January), bir sayıdaki ondalık ayırıcıyı (virgül veya nokta) ve para birimi sembolünü (ruble, dolar veya euro) belirler. Her Locale örneği, ilk kısmı dil kodu (ISO 639-1) ve ikinci kısmı bölge kodu (ISO 3166-1) olan ru_RU veya en_US gibi bir tanımlayıcıya bağlıdır. TimeZone'un aksine Locale, zamanın mutlak değerini etkilemez, yalnızca dize temsilini etkiler.
Önemli Noktalar
Locale, Swift'te belirli bir dil ve bölgeye özgü biçimlendirme kuralları kümesini temsil eden bir değer türüdür (Objective-C'de NSLocale). Zamanın mutlak ofsetini belirleyen TimeZone'un aksine Locale, zamanın, sayıların ve para biriminin dize temsilinde nasıl görüneceğini belirler. Aynı tarih 2024-07-21, ru_RU için “21 Temmuz 2024” ve en_US için “July 21, 2024” olarak görüntülenecektir.
Her Locale örneği iki bileşenden oluşur: Dil (ay adlarını, haftanın günlerini, kelime sırasını belirler) ve Bölge (sayı biçimini, para birimini, takvimi belirler). Bu bileşenlerin birleşimi BCP 47 standardına göre bir tanımlayıcıda kodlanır: ru_RU (Rusça, Rusya), en_US (İngilizce, ABD), de_DE (Almanca, Almanya).
Unicode CLDR (2024)'e göre, iOS'ta desteklenen yerel ayar sayısı 700'den fazla dil-bölge kombinasyonunu aşmaktadır. Foundation, Unicode Consortium tarafından yönetilen en kapsamlı yerelleştirme veri deposu olan CLDR'den (Common Locale Data Repository) veri kullanır. Bu, tüm Apple cihazlarında tutarlı biçimlendirme sağlar.
DateFormatter, doğru ay ve gün adlarını seçmek, tarih bileşenlerinin sırasını (gün/ay/yıl veya ay/gün/yıl) ve ayırıcıları belirlemek için Locale kullanır. Locale açıkça belirtilmeden DateFormatter, cihazın yerel ayarlarını kullanır — bu kullanıcı arayüzü için doğrudur ancak biçimin sabit olması gereken sunucu verileri için tehlikelidir.
| Bileşen | ru_RU | en_US | de_DE |
|---|---|---|---|
| Tarih (medium) | 21 Temmuz 2024 | Jul 21, 2024 | 21.07.2024 |
| Sayı (1000.5) | 1 000,5 | 1,000.5 | 1.000,5 |
| Para birimi (100) | 100,00 ₽ | $100.00 | 100,00 € |
| Takvim | Miladi | Miladi | Miladi |
| Liste ayırıcısı | ; | , | ; |
NumberFormatter, ondalık ayırıcıyı (virgül veya nokta), gruplama ayırıcısını (boşluk, virgül, nokta) ve para birimi sembolünü belirlemek için Locale kullanır. Sayıları ayrıştırırken Locale'i göz ardı etmek, uluslararası uygulamalarda yaygın hata nedenlerinden biridir: “1,5” sayısı ru_RU için “bir buçuk” anlamına gelir, ancak en_US için dijital ayrıştırıcı bunu virgülden sonra “beş” olarak okur.
Önemli: Calendar.current aracılığıyla oluşturulan Calendar, cihazın yerel ayarlarını devralır. Açıkça belirtilmiş yerel ayarlarla Calendar(identifier: .gregorian), öngörülebilir biçimlendirme için önerilen yaklaşımdır. ISO 8601 tarihleriyle çalışırken her zaman Locale(identifier: “en_US_POSIX”) kullanın — bölgesel ayarlardan etkilenmeyen teknik biçimlendirme için özel bir yerel ayar.
Locale tanımlayıcısı, bir dil kodu (ISO 639-1, iki karakter) ve bir bölge kodundan (ISO 3166-1, iki karakter) oluşur ve alt çizgi ile ayrılır. Örnekler: ru_RU, en_US, fr_FR, zh_Hans_CN (Çince, basitleştirilmiş yazı, Çin). Foundation ayrıca web standartlarında kullanılan BCP 47 biçimindeki (ru-RU, en-US) tanımlayıcıları da destekler.
Tam tanımlayıcıların yanı sıra, Locale yalnızca dile göre oluşturulabilir: Locale(identifier: “ru”), Rusça dilini ve bu dil için varsayılan bölgeyi (genellikle Rusya) döndürür. İngilizce için de benzer şekilde: Locale(identifier: “en”) ABD bölgesini kullanır. Bu yaklaşım, belirli bir bölgeye bağlı kalmadan biçimlendirme dilini ayarlamak için kullanışlıdır.
Özel yerel ayarlar, kullanıcı ayarlarından bağımsız olarak kararlı bir biçim sağlayan teknik biçimlendirme için en_US_POSIX'i içerir. Bu yerel ayar, özellikle ISO 8601 biçimi için sunucu API'lerinden tarihleri ayrıştırmak için zorunludur. Miladi takvim, 24 saatlik zaman biçimi ve ondalık ayırıcı olarak nokta kullanır.
import Foundation
// Kullanılabilir yerel ayar tanımlayıcıları
let available: [String] = Locale.availableIdentifiers
print("Toplam yerel ayar: \(available.count)")
// Rus yerel ayarlarını filtrele
let russianLocales = available.filter { $0.hasPrefix("ru") }
print("Rus yerel ayarları: \(russianLocales)")
// Yerel ayar bileşenleri
let locale = Locale(identifier: "de_DE")
print("Dil: \(locale.languageCode ?? "nil")")
print("Bölge: \(locale.regionCode ?? "nil")")
print("Para birimi: \(locale.currencyCode ?? "nil")")
print("Takvim: \(locale.calendar.identifier)")
Kullanılabilir yerel ayarları kontrol etme Locale.availableIdentifiers aracılığıyla mevcut iOS sürümü tarafından desteklenen tüm tanımlayıcıların bir dizisini döndürür. Bölgeye göre filtrelemek için regionCode kontrolü ile Locale.availableIdentifiers.filter kullanın. Bu, sabit kodlanmış bir liste olmadan bölge seçim arayüzü oluşturmak için kullanışlıdır.
Locale.current, iOS ayarlarında (Settings > General > Language & Region) kullanıcı tarafından belirlenen cihazın mevcut yerel ayarlarını almanın birincil yoludur. Bu özellik, uygulamayı yeniden başlatmadan ayarlarda dil veya bölge değiştirildiğinde otomatik olarak güncellenir. Ancak, içerik görüntüleme için tercih edilen yerel ayarlarla eşleşmeyebilir: bir kullanıcı arayüz dilini İngilizce olarak ayarlayabilir ancak tarihleri Rusça biçiminde görüntüleyebilir.
Kullanıcı tercihlerini daha doğru belirlemek için Locale.preferredLanguages kullanın — kullanıcı önceliğine göre sıralanmış bir dil dizisi. İlk öğe birincil arayüz dilidir. Bu liste, dilleri tercih sırasına göre sürüklemeyi de içeren Language & Region ayarlarına karşılık gelir. İletişim uygulamaları (mesajlaşma uygulamaları, e-posta istemcileri), içerik görüntüleme dilini seçerken bu sırayı dikkate almalıdır.
import Foundation
// Mevcut sistem yerel ayarları
let current = Locale.current
print("Mevcut yerel ayar: \(current.identifier)")
print("Dil: \(current.language?.disjointName ?? "nil")")
// Kullanıcı tercih edilen diller
let preferred = Locale.preferredLanguages
print("Tercih edilen diller: \(preferred)")
// Mevcut yerel ayardan bölge al
if let region = current.regionCode {
let regionLocale = Locale(identifier: "en_\(region)")
let countryName = regionLocale.localizedString(
forRegionCode: region
)
print("Ülke: \(countryName ?? region)")
}
// 24 saat biçimini kontrol et
let uses24h = current.uses24hClock(
for: .dateAndTime
)
print("24 saat kullanır: \(uses24h)")
Kullanıcı arayüzünde yerelleştirme: ay ve gün adlarını arayüz dilinde görüntülemek için, ayarlanmış yerel ayarlarla Calendar kullanın. Calendar.current.symbols(for: .month), geçerli yerel ayarın dilinde ay adlarını döndürür. Ülke adlarını kullanıcının dilinde görüntülemek için Locale.current.localizedString(forRegionCode:) kullanın.
Tarih biçimlendirme yerel ayar farkındalığı ile, kullanıcıya tarihleri görüntülerken önemli bir görevdir. Ayarlanmış yerel ayarlarla DateFormatter, kullanıcının bölgesi için otomatik olarak doğru tarih ve saat biçimini seçer. .short, .medium, .long, .full değerlerine sahip dateStyle ve timeStyle için biçimlendirici, tarih bileşenlerini oluşturmak için yerel ayar kurallarını kullanır.
import Foundation
let date = Date()
// Farklı yerel ayarlarla biçimlendirme
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.locale = Locale(identifier: "ru_RU")
print("Rusça: \(formatter.string(from: date))")
formatter.locale = Locale(identifier: "en_US")
print("İngilizce: \(formatter.string(from: date))")
formatter.locale = Locale(identifier: "ja_JP")
print("Japonca: \(formatter.string(from: date))")
// Yerel ayarla para birimi biçimlendirme
let numFormatter = NumberFormatter()
numFormatter.numberStyle = .currency
numFormatter.locale = Locale(identifier: "de_DE")
print("Alman para birimi: \(numFormatter.string(from: 1234.56) ?? "nil")")
numFormatter.locale = Locale(identifier: "en_US")
print("ABD para birimi: \(numFormatter.string(from: 1234.56) ?? "nil")")
Sunucu API'lerinden tarih ayrıştırma sabit bir biçim için her zaman Locale(identifier: “en_US_POSIX”) kullanmalıdır. Sunucular genellikle İngilizce ay adlarıyla ISO 8601 biçiminde tarih gönderir ve geçerli cihaz yerel ayarlarını kullanmak, kullanıcı İngilizce olmayan bir bölgedeyse ayrıştırma hatalarına neden olabilir. en_US_POSIX, ayrıştırmanın cihaz ayarlarına bağlı olmamasını sağlar.
import Foundation
// Doğru sunucu tarihi ayrıştırma
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("Ayrıştırılan tarih: \(parsed)")
}
// Yerelleştirilmiş para birimi adı
let usLocale = Locale(identifier: "en_US")
let currencyName = usLocale.localizedString(
forCurrencyCode: "RUB"
)
print("ABD yerel ayarında Rus rublesi: \(currencyName ?? "nil")")
Ek özellikler: Locale, localizedString(forRegionCode:), localizedString(forLanguageCode:), localizedString(forCurrencyCode:) ve localizedString(forCalendarIdentifier:) yöntemleri aracılığıyla bileşenlerinin yerelleştirilmiş açıklamalarını sağlar. Bu yöntemler, çağrıldıkları yerel ayarın dilinde adları döndürür. Örneğin, Locale(identifier: “ru_RU”).localizedString(forCountryCode: “DE”) “Almanya” döndürür.
Sayıları ayrıştırırken Locale'i göz ardı etmek uluslararası uygulamalarda kritik bir hatadır. Açık yerel ayar olmadan NumberFormatter, geçerli cihaz yerel ayarlarını kullanır. Rusya'da bir kullanıcı “1,5” girerse, NumberFormatter.number(from: “1,5”) doğru şekilde 1.5 döndürür. Ancak aynı kod en_US yerel ayarlı bir cihazda çalıştırılırsa, en_US için ondalık ayırıcı nokta olduğundan ayrıştırma nil döndürür.
Sunucu tarihleri için en_US_POSIX eksikliği ince hatalara yol açar. dateFormat ve locale = Locale.current ile DateFormatter, tarih biçiminin Amerikan biçiminden farklı olduğu bölgelerdeki kullanıcılar için bozulabilir. Örneğin, Almanya'da DateFormatter “21.07.2024” beklerken sunucu “07/21/2024” gönderir. en_US_POSIX, kullanıcının bölgesinden bağımsız olarak makine ayrıştırması için sabit bir biçim sağlar.
Date yerine tarih dizelerini karşılaştırmak bir diğer yaygın hatadır. Geliştiriciler bazen farklı yerel ayarlardan tarihlerin dize temsillerini karşılaştırarak yanlış sonuçlar alırlar. Locale yalnızca görüntülemeyi değiştirir, tarihin mutlak değerini değiştirmez. Her zaman Date nesnelerini karşılaştırın, dize temsillerini değil. Tarih bileşenlerini karşılaştırmak için açıkça belirtilmiş yerel ayarlarla Calendar kullanın.
WWDC 2023'e göre, uygulamalardaki uluslararasılaştırma sorunlarının yaklaşık %30'u yanlış Locale yapılandırmasıyla ilgilidir. Apple, sunucu verileriyle çalışırken DateFormatter ve NumberFormatter için her zaman yerel ayarları açıkça belirlemeyi ve Locale.current'ı yalnızca kullanıcı arayüzü görüntülemesi için kullanmayı önerir. Bu basit uygulama, bölgesel ayarlarla ilgili hataların çoğunu ortadan kaldırır.
Sıkça Sorulan Sorular
Locale, kültürel ve dilsel biçimlendirme kurallarını (tarih biçimi, sayı biçimi, para birimi ve ölçü birimleri) temsil eden bir Foundation sınıfıdır. Yerelleştirilmiş veri görüntüleme için DateFormatter, NumberFormatter ve Calendar ile birlikte kullanılır.
Locale görüntüleme biçimini (dil, bölgesel kurallar) belirlerken, TimeZone UTC'ye göre zamanın mutlak ofsetini belirler. Locale dize temsilini etkiler, TimeZone zamanın sayısal değerini etkiler. Tam tarih biçimlendirmesi için her ikisi birlikte kullanılır.
en_US_POSIX, kullanıcı ayarlarından bağımsız olarak kararlı bir biçim sağlayan teknik biçimlendirme için özel bir yerel ayardır. Sunucu tarihlerini (ISO 8601) ayrıştırmak ve biçimin öngörülebilir olması gereken API'lerle çalışmak için zorunludur.
Locale.availableIdentifiers, desteklenen tüm yerel ayarların tanımlayıcılarını içeren bir dize dizisi döndürür. Dile göre filtrelemek için hasPrefix ile filter kullanın; bölgeyi almak için Locale(identifier:).regionCode kullanın.
NumberFormatter, ondalık ayırıcıyı (virgül veya nokta), para birimi sembolünü ve gruplama ayırıcısını belirlemek için Locale kullanır. Sabit bir biçim için yerel ayarı en_US_POSIX olarak ayarlayın veya biçimlendirici özelliklerini açıkça belirleyin.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun