2015-01-10 20 views
6

स्विफ्ट के साथ एक विशिष्ट भाषा का उपयोग करने के लिए एनएसएलोकलाइज्डस्ट्रिंग फोर्स फोर्स, मैं अपने ऐप को एक विशिष्ट Localizable.strings से डेटा पढ़ने के लिए कैसे मजबूर कर सकता हूं।स्विफ्ट

मैंने इसे देखा है FinishLaunchingWithOptions ViewController को तुरंत चालू करने से पहले लेकिन यह अभी भी मुझे ऐप में अंग्रेजी दिखाता है।

NSUserDefaults.standardUserDefaults().removeObjectForKey("AppleLanguages") 
NSUserDefaults.standardUserDefaults().setObject("fr", forKey: "AppleLanguages" 
NSUserDefaults.standardUserDefaults().synchronize() 

और मैं इस तरह "AppleLanguages" कुंजी के लिए किसी सरणी पारित करने के लिए कोशिश की, लेकिन यह अभी भी काम नहीं करता:

NSUserDefaults.standardUserDefaults().setObject(["fr"], forKey: "AppleLanguages" 

और एक बार यह हो जाए, मैं अनुप्रयोग के अंदर इस कॉल कर सकते हैं और ऐप को पुनरारंभ किए बिना परिवर्तनों को ध्यान में रखें?

उत्तर

24

AppleLanguages के मान को बदलकर तुरंत ऐप की भाषा बदलना संभव नहीं है। बदलाव प्रभावी होने से पहले ऐप को पुनरारंभ करना आवश्यक है।

ऐसा लगता है कि आपकी समस्या ऐप की भाषा बदलने के बजाय अलग-अलग भाषाओं के स्थानीयकरण तारों तक पहुंच रही है, है ना? यदि आप चाहते हैं कि आपका ऐप एकाधिक भाषाओं का समर्थन करे, तो आप केवल अनुवाद प्रदान कर सकते हैं और वास्तविक परिवर्तन के लिए सेटिंग्स.एप पर भरोसा कर सकते हैं।

यदि आप वर्तमान में उपयोग किए गए स्थानीयकरण के अलावा स्थानीयकरण स्ट्रिंग तक पहुंच बनाना चाहते हैं, तो आपको उचित अनुवाद बंडल तक पहुंच प्राप्त करने की आवश्यकता है। और उसके बाद बस अनुवाद के लिए बंडल पूछें। कोड के निम्नलिखित भाग को चाल करना चाहिए।

let language = "en" 
let path = NSBundle.mainBundle().pathForResource(language, ofType: "lproj") 
let bundle = NSBundle(path: path!) 
let string = bundle?.localizedStringForKey("key", value: nil, table: nil) 
+0

भाषा में बदलावों को ध्यान में रखा गया था लेकिन मुझे अपना कोड निष्पादित करने के बाद ऐप को पुनरारंभ करना याद आया। – sazz

+0

जानना अच्छा है, अगर आप ऐप को पुनरारंभ किए बिना भाषा बदलना चाहते हैं, तो आप उपर्युक्त कोड उदाहरण के साथ भी ऐसा करते हैं। बस इसे फ़ंक्शन/क्लास में लपेटें और NSLocalizedString के बजाय इसका उपयोग करें। हालांकि मैं भाषा बदलने के लिए मानक ऐप्पल तरीके का उपयोग करने की सिफारिश करता हूं। – Markus

+0

मेरे लिए काम नहीं करता है। रास्ता शून्य है। हो सकता है कि मैं XCUITests से इन तक नहीं पहुंच सकता? वह चूसना होगा ... – Radu

1

@Radu मैं भी XCUITests के लिए काम @Markus 'मूल जवाब के लिए धन्यवाद इस बनाया:

आप स्पष्ट रूप से अपने MainBundle के लिए पथ निर्दिष्ट कर सकते हैं, यह केवल सिम्युलेटर के साथ अपने मैक पर काम करेंगे, लेकिन यह अक्सर निरंतर एकीकरण प्लेटफार्मों में प्रयोग किया जाता है तो यह स्वीकार्य हो सकता है:

let app = XCUIApplication() 
let language:String? = "en" 
let path = "/Users/{username}/{path_to_your_project}/\(language).lproj" 
let bundle = NSBundle(path: path) 
let string = bundle?.localizedStringForKey("key", value: nil, table: nil) 
0

NSLocalizedString के साथ आप बंडल निर्दिष्ट कर सकते हैं।

let language = "fr" 
let path = Bundle.main.path(forResource: language, ofType: "lproj")! 
let bundle = Bundle(path: path)! 
let localizedString = NSLocalizedString(key, bundle: bundle, comment: "") 

या एक बंडल के साथ, आप भी localizedStringForKey:value:table: सीधे भी कह सकते हैं।