स्विफ्ट के साथ वर्तमान भाषा कोड कैसे प्राप्त करें?


131

मैं स्विफ्ट के साथ लिखे गए अपने ऐप में डिवाइस का भाषा कोड (en, es ...) प्राप्त करना चाहता हूं। यह कैसे मिल सकता है?

मैं यह कोशिश कर रहा हूँ:

var preferredLanguages : NSLocale!
let pre = preferredLanguages.displayNameForKey(NSLocaleIdentifier, value: preferredLanguages)

लेकिन यह शून्य देता है।

जवाबों:


185

स्विफ्ट 3 में

let langStr = Locale.current.languageCode

13
होना चाहिए: Locale.current.identifier लेकिन चीनी के लिए Locale.current.languageCode, यह हमेशा 'zh' लौटाता है, लेकिन इसे zh-HK, आदि को अलग करना पड़ता है
iXcoder

2
@ User9527 आपकी वजह से आपकी परियोजना सेटिंग में उस भाषा के लिए स्थानीयकरण सक्षम नहीं हुआ।
किरिल कुदेव ने

'लोकेल' टाइप करने के लिए 'स्ट्रिंग' के प्रकार को निर्दिष्ट नहीं कर सकता है?
पूजी वाहोनो

1
जहाँ तक मेरा ध्यान है, यह सेटिंग्स में वास्तविक भाषा सेट को लौटा देगा -> सामान्य -> ​​भाषा और क्षेत्र -> iPhone भाषा केवल इस परियोजना के लिए आपके प्रोजेक्ट में सक्षम भाषा के लिए स्थानीयकरण -> स्थानीयकरण। अन्यथा यह विकास की भाषा है।
Huralnyk

86

एप्लिकेशन भाषा और डिवाइस लोकेल भाषा के बीच अंतर करना महत्वपूर्ण है ( स्विफ्ट 3 में नीचे कोड है )

डिवाइस भाषा लौटाएगा :

let locale = NSLocale.current.languageCode

ऐप भाषा लौटाएगा :

let pre = Locale.preferredLanguages[0]

4
मैं डिवाइस भाषा या ऐप भाषा के बीच अंतर नहीं समझता। क्या आपके पास अंतर के बारे में कोई दस्तावेज है?
यिर्मयाह

1
@ जेरेमियाह लोकेल में डिवाइस भाषा होगी, उदाहरण के लिए आपकी डिवाइस भाषा फ्रेंच में कॉन्फ़िगर की गई है। प्री में उपयोगकर्ता (या ऐप) पसंदीदा भाषा होगी, उदाहरण: आपका ऐप केवल चीनी का समर्थन करता है, इसलिए आप एक फ्रेंच डिवाइस पर एक चीनी ऐप इंस्टॉल कर सकते हैं। आशा है मैं स्पष्ट किया इस 4 यू
raed

जब आप कहते हैं कि डिवाइस को फ्रेंच में कॉन्फ़िगर किया गया है तो आपका क्या मतलब है? ऐसा लगता है कि अगर मैं भाषा को अंग्रेजी में सेटिंग्स के अलावा किसी अन्य चीज में बदलता हूं तो इसे पसंदीदा भाषा में दर्शाया जाता है, लेकिन भाषा में नहीं। भाषाकोड कैसे बदला जाता है?
यिर्मयाह

यदि आप कुछ अन्य के लिए सेटिंग्स में बदल जाते हैं कि अंग्रेजी आपको NSLocale.current.languageCode में इसका मूल्य मिलेगा
raed

9
क्या यह दूसरा रास्ता नहीं है? जब मेरी ऐप डेवलपमेंट लैंग्वेज EN है और मैं DE कॉन्फ़िगर डिवाइस पर चलता हूं, जिसके लिए मैंने ऐप को स्थानीयकृत किया है, तो परिणाम यह है: Locale.current.languageCode: de Locale.current.identifier: de_DE Locale.preferredLanguages[0]: de जब मेरा ऐप डेवलपमेंट लैंग्वेज EN है और मैं FR कॉन्फ़िगर डिवाइस पर रन करता हूं, जिसके लिए मैंने स्थानीयकरण नहीं किया है app परिणाम है: Locale.current.languageCode: en Locale.current.identifier: en_FR Locale.preferredLanguages[0]: fr
Arjen Hiemstra

55

स्विफ्ट 4 और 5:

Locale.current.languageCode

'लोकेल' टाइप करने के लिए 'स्ट्रिंग' के प्रकार को निर्दिष्ट नहीं कर सकता है?
पूजी वाहोनो

2
कोशिश करो Locale(identifier: Locale.current.identifier);
कोन्या

Locale.autoupdatingCurrent.languageCodeभी उपलब्ध है
सी। बस्स


35

अपने ऐप में उपयोग की जाने वाली वर्तमान भाषा (पसंदीदा भाषाओं से अलग)

NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!

29

स्विफ्ट 3 और 4 और 4.2 और 5

Locale.current.languageCodeनियमित रूप से संकलन नहीं करता है। क्योंकि आपने अपनी परियोजना के लिए स्थानीयकरण लागू नहीं किया था।

आपके पास दो संभावित उपाय हैं

1) String(Locale.preferredLanguages[0].prefix(2)) यह फोन लैंग को ठीक से लौटाता है।

यदि आप प्रकार प्राप्त करना चाहते हैं en-En, तो आप उपयोग कर सकते हैंLocale.preferredLanguages[0]

2) चुनें Project(MyApp)-> Project (not Target)-> प्रेस + बटन में Localizations, फिर जो आप चाहते हैं भाषा जोड़ें।


यह वास्तव में दिलचस्प है! आपने समाधान कहां पढ़ा? सेब प्रलेखन में यह जानकारी नहीं मिल सकती है
kuzdu

16

स्विफ्ट 3

let preferredLanguage = Locale.preferredLanguages[0] as String
print (preferredLanguage) //en-US

let arr = preferredLanguage.components(separatedBy: "-")
let deviceLanguage = arr.first
print (deviceLanguage) //en

1
अलग भाषा कोड और देश कोड "-" छोटी गाड़ी है। आपका कोड कुछ मामलों पर टूट जाएगा जैसे 'zh-Hans-US'।
एविलिसन जियांग

let langStr = Locale.preferredLanguages.first!मैंने इस पोस्ट की समीक्षा की है। यह काम कर रहा है, और मैं langStr.lowercased().contains("es")उदाहरण के लिए सभी स्पेनिश भाषा विविधताओं के साथ अपनी भाषाओं के साथ तुलना करता हूं ।
इयान ओर्टेगा

8

आप नीचे दिए गए कोड का उपयोग कर सकते हैं यह स्विफ्ट 3 के साथ ठीक काम करता है

var preferredLanguage : String = Bundle.main.preferredLocalizations.first!

1
यह वह है जो वास्तव में अभी भी स्विफ्ट 4 के साथ काम करता है! धन्यवाद!
एलेक्स वैली

7

मैं उपयोगकर्ता द्वारा चुनी गई भाषा को सेटिंग्स ऐप में हर बार ट्रैक करना चाहता हूं जब उपयोगकर्ता मेरा ऐप लॉन्च करता है - जो अभी तक स्थानीय नहीं है (मेरा ऐप केवल अंग्रेजी में है)। मैंने यह तर्क अपनाया:

  1. सरणी में भाषाओं को संभालना आसान बनाने के लिए एक एनुम बनाएं

    enum Language: String {
    
    case none = ""
    case en = "English"
    case fr = "French"
    case it = "Italian"
    
    } // add as many languages you want
  2. स्थान में विस्तार करने के लिए कुछ बनाएं

    extension Locale {
    
        static var enLocale: Locale {
    
            return Locale(identifier: "en-EN")
        } // to use in **currentLanguage** to get the localizedString in English
    
        static var currentLanguage: Language? {
    
            guard let code = preferredLanguages.first?.components(separatedBy: "-").last else {
    
                print("could not detect language code")
    
                return nil
            }
    
            guard let rawValue = enLocale.localizedString(forLanguageCode: code) else {
    
                print("could not localize language code")
    
                return nil
            }
    
            guard let language = Language(rawValue: rawValue) else {
    
                print("could not init language from raw value")
    
                return nil
            }
            print("language: \(code)-\(rawValue)")
    
            return language
        }
    }
  3. जब आपको आवश्यकता होती है, तो आप बस एक्सटेंशन का उपयोग कर सकते हैं

    if let currentLanguage = Locale.currentLanguage {
        print(currentLanguage.rawValue)
        // Your code here.
    }

धन्यवाद @Syscall :)
मिनियाप्स

विस्तार से प्यार करें :)। अगर यह किसी भी तरह से पढ़ने में सक्षम नहीं है, तो इसे और अधिक समझ में आता है। क्योंकि उस तरह से उस मूल्य का उपयोग कुछ मूल्य बनाने के लिए किया जा सकता है।
अलिक्स

5

स्विफ्ट में, आप लोकेल का उपयोग करके प्राप्त कर सकते हैं।

let locale = Locale.current.identifier

2

Locale.current.languageCode मुझे गलत कोड देता है, इसलिए मैं इन एक्सटेंशन का उपयोग करता हूं:

extension Locale {
    static var preferredLanguageCode: String {
        let defaultLanguage = "en"
        let preferredLanguage = preferredLanguages.first ?? defaultLanguage
        return Locale(identifier: preferredLanguage).languageCode ?? defaultLanguage
    }

    static var preferredLanguageCodes: [String] {
        return Locale.preferredLanguages.compactMap({Locale(identifier: $0).languageCode})
    }
}

0

यह मैं स्विफ्ट 5 एक्सकोड 11 में उपयोग करता हूं:

वर्ग चर के अंदर:

let languagePrefix = Bundle.main.preferredLocalizations.first?.prefix(2)

यह एक स्ट्रिंग के रूप में आता है। यह 2 अक्षर लौटाता है, जैसे "en", "es", "de" ...

इससे मैं आसानी से यह निर्धारित कर सकता हूं कि किस भाषा को प्रदर्शित करना है:

 if languagePrefix == "es" { self.flipCard.setTitle("última carta", for: .normal) }
 if languagePrefix == "en" { self.flipCard.setTitle("Last Card", for: .normal) }

यदि आप भाषा की पूरी जानकारी चाहते हैं, तो हटा दें? .Prefex (2)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.