Locale iOS और macOS में एक Foundation क्लास है जो उपयोगकर्ता की भाषाई और सांस्कृतिक परंपराओं को समाहित करती है: दिनांक प्रारूप, संख्या प्रारूप, मुद्रा और माप की इकाइयाँ। Apple Developer Documentation, 2024 के अनुसार, Locale यह निर्धारित करता है कि DateFormatter एक महीना कैसे प्रदर्शित करता है (जनवरी या January), संख्या में दशमलव विभाजक (अल्पविराम या बिंदु) और मुद्रा प्रतीक (रूबल, डॉलर या यूरो)। प्रत्येक Locale इंस्टेंस ru_RU या en_US जैसे पहचानकर्ता से जुड़ा होता है, जहां पहला भाग भाषा कोड (ISO 639-1) और दूसरा क्षेत्र कोड (ISO 3166-1) है। TimeZone के विपरीत, Locale समय के निरपेक्ष मान को प्रभावित नहीं करता, केवल उसके स्ट्रिंग प्रतिनिधित्व को प्रभावित करता है।
मुख्य बिंदु
Locale Swift में एक वैल्यू टाइप है (Objective-C में NSLocale) जो किसी विशेष भाषा और क्षेत्र के लिए विशिष्ट फ़ॉर्मेटिंग नियमों के एक सेट का प्रतिनिधित्व करता है। TimeZone के विपरीत, जो समय का निरपेक्ष ऑफ़सेट निर्धारित करता है, Locale यह निर्धारित करता है कि समय, संख्याएँ और मुद्रा स्ट्रिंग प्रतिनिधित्व में कैसी दिखती हैं। वही दिनांक 2024-07-21 ru_RU के लिए “21 जुलाई 2024” और en_US के लिए “July 21, 2024” के रूप में प्रदर्शित होगा।
प्रत्येक Locale इंस्टेंस में दो घटक होते हैं: भाषा (महीनों के नाम, सप्ताह के दिन, शब्द क्रम निर्धारित करता है) और क्षेत्र (संख्या प्रारूप, मुद्रा, कैलेंडर निर्धारित करता है)। इन घटकों के संयोजन को BCP 47 मानक के अनुसार एक पहचानकर्ता में एन्कोड किया जाता है: ru_RU (रूसी भाषा, रूस), en_US (अंग्रेज़ी, यूएसए), de_DE (जर्मन, जर्मनी)।
Unicode CLDR (2024) के अनुसार, iOS में समर्थित लोकेल की संख्या 700 से अधिक भाषा-क्षेत्र संयोजनों से अधिक है। Foundation CLDR (सामान्य लोकेल डेटा रिपॉजिटरी) से डेटा का उपयोग करता है — यूनिकोड कंसोर्टियम द्वारा अनुरक्षित स्थानीयकरण डेटा का सबसे व्यापक भंडार। यह सभी Apple उपकरणों पर सुसंगत फ़ॉर्मेटिंग सुनिश्चित करता है।
DateFormatter सही महीने और दिन के नाम चुनने, दिनांक घटकों का क्रम (दिन/महीना/वर्ष या महीना/दिन/वर्ष) और विभाजक निर्धारित करने के लिए Locale का उपयोग करता है। Locale को स्पष्ट रूप से निर्दिष्ट किए बिना, DateFormatter डिवाइस लोकेल का उपयोग करता है — यह UI के लिए सही है लेकिन सर्वर डेटा के लिए खतरनाक है जहां प्रारूप निश्चित होना चाहिए।
| घटक | ru_RU | en_US | de_DE |
|---|---|---|---|
| दिनांक (medium) | 21 जुलाई 2024 | Jul 21, 2024 | 21.07.2024 |
| संख्या (1000.5) | 1 000,5 | 1,000.5 | 1.000,5 |
| मुद्रा (100) | 100,00 ₽ | $100.00 | 100,00 € |
| कैलेंडर | ग्रेगोरियन | ग्रेगोरियन | ग्रेगोरियन |
| सूची विभाजक | ; | , | ; |
NumberFormatter दशमलव विभाजक (अल्पविराम या बिंदु), समूहीकरण विभाजक (स्थान, अल्पविराम, बिंदु) और मुद्रा प्रतीक निर्धारित करने के लिए Locale का उपयोग करता है। संख्याओं को पार्स करते समय Locale को अनदेखा करना अंतर्राष्ट्रीय अनुप्रयोगों में बग के सामान्य कारणों में से एक है: संख्या “1,5” का अर्थ ru_RU के लिए “साढ़े एक” है, लेकिन en_US के लिए डिजिटल पार्सर इसे अल्पविराम के बाद “पाँच” के रूप में पढ़ेगा।
महत्वपूर्ण: Calendar.current के माध्यम से बनाया गया Calendar डिवाइस लोकेल को इनहेरिट करता है। स्पष्ट रूप से निर्धारित लोकेल के साथ Calendar(identifier: .gregorian) पूर्वानुमान योग्य फ़ॉर्मेटिंग के लिए अनुशंसित तरीका है। ISO 8601 दिनांकों के साथ काम करते समय, हमेशा Locale(identifier: “en_US_POSIX”) का उपयोग करें — तकनीकी फ़ॉर्मेटिंग के लिए एक विशेष लोकेल जो क्षेत्रीय सेटिंग्स से प्रभावित नहीं होता।
Locale पहचानकर्ता में भाषा कोड (ISO 639-1, दो वर्ण) और क्षेत्र कोड (ISO 3166-1, दो वर्ण) होते हैं, जो अंडरस्कोर द्वारा अलग किए जाते हैं। उदाहरण: ru_RU, en_US, fr_FR, zh_Hans_CN (चीनी, सरलीकृत लिपि, चीन)। Foundation BCP 47 प्रारूप में पहचानकर्ताओं का भी समर्थन करता है: ru-RU, en-US, वेब मानकों में उपयोग किए जाते हैं।
पूर्ण पहचानकर्ताओं के अलावा, Locale को केवल भाषा द्वारा बनाया जा सकता है: Locale(identifier: “ru”) रूसी भाषा और उस भाषा के लिए डिफ़ॉल्ट क्षेत्र (आमतौर पर रूस) के साथ एक लोकेल लौटाता है। इसी तरह अंग्रेज़ी के लिए: Locale(identifier: “en”) यूएस क्षेत्र का उपयोग करता है। यह दृष्टिकोण किसी विशिष्ट क्षेत्र से बंधे बिना फ़ॉर्मेटिंग भाषा सेट करने के लिए उपयोगी है।
विशेष लोकेल में en_US_POSIX शामिल है — दिनांक और संख्याओं की मशीन फ़ॉर्मेटिंग के लिए एक तकनीकी लोकेल, जो उपयोगकर्ता सेटिंग्स की परवाह किए बिना एक स्थिर प्रारूप सुनिश्चित करता है। यह लोकेल सर्वर API से दिनांकों को पार्स करने के लिए अनिवार्य है, विशेष रूप से ISO 8601 प्रारूप के लिए। यह ग्रेगोरियन कैलेंडर, 24-घंटे समय प्रारूप और दशमलव विभाजक के रूप में बिंदु का उपयोग करता है।
import Foundation
// उपलब्ध लोकेल पहचानकर्ता
let available: [String] = Locale.availableIdentifiers
print("कुल लोकेल: \(available.count)")
// रूसी लोकेल फ़िल्टर करें
let russianLocales = available.filter { $0.hasPrefix("ru") }
print("रूसी लोकेल: \(russianLocales)")
// लोकेल घटक
let locale = Locale(identifier: "de_DE")
print("भाषा: \(locale.languageCode ?? "nil")")
print("क्षेत्र: \(locale.regionCode ?? "nil")")
print("मुद्रा: \(locale.currencyCode ?? "nil")")
print("कैलेंडर: \(locale.calendar.identifier)")
उपलब्ध लोकेल की जाँच Locale.availableIdentifiers के माध्यम से वर्तमान iOS संस्करण द्वारा समर्थित सभी पहचानकर्ताओं की एक सरणी लौटाती है। क्षेत्र के अनुसार फ़िल्टर करने के लिए, regionCode जाँच के साथ Locale.availableIdentifiers.filter का उपयोग करें। यह हार्डकोडेड सूची के बिना क्षेत्र चयन UI बनाने के लिए उपयोगी है।
Locale.current iOS सेटिंग्स (Settings > General > Language & Region) में उपयोगकर्ता द्वारा निर्धारित डिवाइस की वर्तमान लोकेल प्राप्त करने का प्राथमिक तरीका है। एप्लिकेशन को पुनरारंभ किए बिना सेटिंग्स में भाषा या क्षेत्र बदलने पर यह प्रॉपर्टी स्वचालित रूप से अपडेट होती है। हालांकि, यह सामग्री प्रदर्शन के लिए पसंदीदा लोकेल से मेल नहीं खा सकती है: उपयोगकर्ता इंटरफ़ेस भाषा को अंग्रेज़ी पर सेट कर सकता है लेकिन दिनांकों को रूसी प्रारूप में देख सकता है।
उपयोगकर्ता प्राथमिकताओं के अधिक सटीक निर्धारण के लिए, Locale.preferredLanguages का उपयोग करें — उपयोगकर्ता प्राथमिकता के अनुसार क्रमबद्ध भाषाओं की एक सरणी। पहला तत्व प्राथमिक इंटरफ़ेस भाषा है। यह सूची Language & Region में सेटिंग्स से मेल खाती है, जिसमें प्राथमिकता के क्रम में भाषाओं को खींचना शामिल है। संचार ऐप्स (मैसेंजर, ईमेल क्लाइंट) को सामग्री प्रदर्शन भाषा चुनते समय इस क्रम पर विचार करना चाहिए।
import Foundation
// वर्तमान सिस्टम लोकेल
let current = Locale.current
print("वर्तमान लोकेल: \(current.identifier)")
print("भाषा: \(current.language?.disjointName ?? "nil")")
// उपयोगकर्ता पसंदीदा भाषाएँ
let preferred = Locale.preferredLanguages
print("पसंदीदा भाषाएँ: \(preferred)")
// वर्तमान लोकेल से क्षेत्र प्राप्त करें
if let region = current.regionCode {
let regionLocale = Locale(identifier: "en_\(region)")
let countryName = regionLocale.localizedString(
forRegionCode: region
)
print("देश: \(countryName ?? region)")
}
// 24 घंटे प्रारूप जाँचें
let uses24h = current.uses24hClock(
for: .dateAndTime
)
print("24 घंटे का उपयोग करता है: \(uses24h)")
UI में स्थानीयकरण: इंटरफ़ेस भाषा में महीने और दिन के नाम प्रदर्शित करने के लिए, निर्धारित लोकेल के साथ Calendar का उपयोग करें। Calendar.current.symbols(for: .month) वर्तमान लोकेल की भाषा में महीने के नाम लौटाता है। उपयोगकर्ता की भाषा में देश के नाम प्रदर्शित करने के लिए, Locale.current.localizedString(forRegionCode:) का उपयोग करें।
दिनांक फ़ॉर्मेटिंग लोकेल जागरूकता के साथ उपयोगकर्ता को दिनांक प्रदर्शित करते समय एक महत्वपूर्ण कार्य है। निर्धारित लोकेल के साथ DateFormatter स्वचालित रूप से उपयोगकर्ता के क्षेत्र के लिए सही दिनांक और समय प्रारूप चुनता है। .short, .medium, .long, .full के मानों वाले dateStyle और timeStyle के लिए, फ़ॉर्मेटर दिनांक घटकों को संयोजित करने के लिए लोकेल नियमों का उपयोग करता है।
import Foundation
let date = Date()
// विभिन्न लोकेल के साथ प्रारूप
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.locale = Locale(identifier: "ru_RU")
print("रूसी: \(formatter.string(from: date))")
formatter.locale = Locale(identifier: "en_US")
print("अंग्रेज़ी: \(formatter.string(from: date))")
formatter.locale = Locale(identifier: "ja_JP")
print("जापानी: \(formatter.string(from: date))")
// लोकेल के साथ मुद्रा फ़ॉर्मेटिंग
let numFormatter = NumberFormatter()
numFormatter.numberStyle = .currency
numFormatter.locale = Locale(identifier: "de_DE")
print("जर्मन मुद्रा: \(numFormatter.string(from: 1234.56) ?? "nil")")
numFormatter.locale = Locale(identifier: "en_US")
print("अमेरिकी मुद्रा: \(numFormatter.string(from: 1234.56) ?? "nil")")
सर्वर API से दिनांक पार्स करना को निश्चित प्रारूप के लिए हमेशा Locale(identifier: “en_US_POSIX”) का उपयोग करना चाहिए। सर्वर आमतौर पर अंग्रेज़ी महीने के नामों के साथ ISO 8601 प्रारूप में दिनांक भेजते हैं, और वर्तमान डिवाइस लोकेल का उपयोग करने से पार्सिंग त्रुटियाँ हो सकती हैं यदि उपयोगकर्ता गैर-अंग्रेज़ी क्षेत्र में है। en_US_POSIX सुनिश्चित करता है कि पार्सिंग डिवाइस सेटिंग्स पर निर्भर नहीं करती।
import Foundation
// सही सर्वर दिनांक पार्सिंग
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("पार्स की गई दिनांक: \(parsed)")
}
// स्थानीयकृत मुद्रा नाम
let usLocale = Locale(identifier: "en_US")
let currencyName = usLocale.localizedString(
forCurrencyCode: "RUB"
)
print("अमेरिकी लोकेल में रूसी रूबल: \(currencyName ?? "nil")")
अतिरिक्त क्षमताएँ: Locale अपने घटकों का स्थानीयकृत विवरण methods localizedString(forRegionCode:), localizedString(forLanguageCode:), localizedString(forCurrencyCode:) और localizedString(forCalendarIdentifier:) के माध्यम से प्रदान करता है। ये विधियाँ उस लोकेल की भाषा में नाम लौटाती हैं जिस पर उन्हें कॉल किया जाता है। उदाहरण के लिए, Locale(identifier: “ru_RU”).localizedString(forCountryCode: “DE”) “जर्मनी” लौटाता है।
संख्याओं को पार्स करते समय Locale को अनदेखा करना अंतर्राष्ट्रीय अनुप्रयोगों में एक गंभीर त्रुटि है। स्पष्ट लोकेल के बिना NumberFormatter वर्तमान डिवाइस लोकेल का उपयोग करता है। यदि रूस में कोई उपयोगकर्ता “1,5” दर्ज करता है, तो NumberFormatter.number(from: “1,5”) सही ढंग से 1.5 लौटाता है। लेकिन यदि वही कोड en_US लोकेल वाले डिवाइस पर चलता है, तो पार्सिंग nil लौटाती है क्योंकि en_US के लिए दशमलव विभाजक बिंदु है।
सर्वर दिनांकों के लिए en_US_POSIX की अनुपस्थिति सूक्ष्म बग्स की ओर ले जाती है। dateFormat और locale = Locale.current वाला DateFormatter उन क्षेत्रों के उपयोगकर्ताओं के लिए टूट सकता है जहां दिनांक प्रारूप अमेरिकी से भिन्न है। उदाहरण के लिए, जर्मनी में DateFormatter “21.07.2024” की अपेक्षा कर सकता है जबकि सर्वर “07/21/2024” भेजता है। en_US_POSIX उपयोगकर्ता के क्षेत्र की परवाह किए बिना मशीन पार्सिंग के लिए एक निश्चित प्रारूप सुनिश्चित करता है।
Date का उपयोग करने के बजाय दिनांक स्ट्रिंग्स की तुलना करना एक और सामान्य गलती है। डेवलपर्स कभी-कभी विभिन्न लोकेल से दिनांकों के स्ट्रिंग प्रतिनिधित्व की तुलना करते हैं, जिससे गलत परिणाम मिलते हैं। Locale केवल प्रदर्शन बदलता है, दिनांक का निरपेक्ष मान नहीं। हमेशा Date ऑब्जेक्ट्स की तुलना करें, उनके स्ट्रिंग प्रतिनिधित्व की नहीं। दिनांक घटकों की तुलना करने के लिए, स्पष्ट रूप से निर्धारित लोकेल के साथ Calendar का उपयोग करें।
WWDC 2023 के अनुसार, अनुप्रयोगों में लगभग 30% अंतर्राष्ट्रीयकरण समस्याएँ गलत Locale कॉन्फ़िगरेशन से संबंधित हैं। Apple सर्वर डेटा के साथ काम करते समय हमेशा DateFormatter और NumberFormatter के लिए स्पष्ट रूप से लोकेल सेट करने और केवल UI प्रदर्शन के लिए Locale.current का उपयोग करने की अनुशंसा करता है। यह सरल अभ्यास क्षेत्रीय सेटिंग्स से संबंधित अधिकांश बग्स को समाप्त करता है।
अक्सर पूछे जाने वाले प्रश्न
Locale एक Foundation क्लास है जो सांस्कृतिक और भाषाई फ़ॉर्मेटिंग नियमों का प्रतिनिधित्व करती है: दिनांक प्रारूप, संख्या प्रारूप, मुद्रा और माप की इकाइयाँ। इसका उपयोग DateFormatter, NumberFormatter और Calendar के साथ स्थानीयकृत डेटा प्रदर्शन के लिए किया जाता है।
Locale प्रदर्शन प्रारूप (भाषा, क्षेत्रीय परंपराएँ) निर्धारित करता है, जबकि TimeZone UTC के सापेक्ष समय का निरपेक्ष ऑफ़सेट निर्धारित करता है। Locale स्ट्रिंग प्रतिनिधित्व को प्रभावित करता है, TimeZone समय के संख्यात्मक मान को प्रभावित करता है। दोनों का उपयोग पूर्ण दिनांक फ़ॉर्मेटिंग के लिए एक साथ किया जाता है।
en_US_POSIX तकनीकी फ़ॉर्मेटिंग के लिए एक विशेष लोकेल है जो उपयोगकर्ता सेटिंग्स की परवाह किए बिना एक स्थिर प्रारूप सुनिश्चित करता है। सर्वर दिनांकों (ISO 8601) को पार्स करने और API के साथ काम करने के लिए अनिवार्य है जहां प्रारूप पूर्वानुमान योग्य होना चाहिए।
Locale.availableIdentifiers सभी समर्थित लोकेल के पहचानकर्ताओं के साथ स्ट्रिंग्स की एक सरणी लौटाता है। भाषा के अनुसार फ़िल्टर करने के लिए, hasPrefix के साथ filter का उपयोग करें; क्षेत्र प्राप्त करने के लिए, Locale(identifier:).regionCode का उपयोग करें।
NumberFormatter दशमलव विभाजक (अल्पविराम या बिंदु), मुद्रा प्रतीक और समूहीकरण विभाजक निर्धारित करने के लिए Locale का उपयोग करता है। निश्चित प्रारूप के लिए, लोकेल को en_US_POSIX पर सेट करें या फ़ॉर्मेटर गुणों को स्पष्ट रूप से सेट करें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें