2014-10-21 11 views
8

मेरे पास स्थानीयकरण योग्य टेक्स्ट्स में लिखे गए कई स्थानीयकृत ग्रंथ हैं, और मैं इनका उपयोग करने और उन्हें इंटरफ़ेस बिल्डर में दिखाए जाने का एक तरीका ढूंढ रहा हूं। यही है, मेरे सभी विचारों के लिए आउटलेट बनाने और कोड में टेक्स्ट सेट करने के बजाय, मैं IB_DESIGNABLE उइलाबेल सबक्लास बनाना चाहता हूं, जो मेरी Localizable.strings फ़ाइल तक पहुंचने के लिए और फिर इंटरफ़ेस बिल्डर पर स्थानीयकृत टेक्स्ट को सीधे दिखाना चाहिए।IBInspectable और NSLocalizedString

समस्या यह है कि NSLocalizedString इंटरफ़ेस बिल्डर में कोई परिणाम नहीं देता है, लेकिन केवल जब मैं वास्तव में चलाता हूं कोड। इंटरफ़ेस बिल्डर को यह बताने का कोई तरीका है कि स्थानीयकरण के लिए उपयोग करने के लिए फ़ाइल (उदाहरण के लिए readyForInterfacebuilder में)?

उत्तर

6

आखिर में मैंने इसे स्वयं समझ लिया। जवाब है: इंटरफ़ेस बिल्डर में Localizable.strings फ़ाइल से अनुवाद प्राप्त करने के लिए [[NSBundle bundleForClass:self.class] localizedStringForKey:key value:@"" table:nil] का उपयोग करें।

#if TARGET_INTERFACE_BUILDER 
#undef NSLocalizedString 
#define NSLocalizedString(key, comment) [[NSBundle bundleForClass:self.class] localizedStringForKey:key value:@"" table:nil] 
#endif 
+0

Btw, के लिए @rickster करने के लिए धन्यवाद [इस उत्तर] में सही दिशा को इंगित करना (http://stackoverflow.com/questions/24603232/xcode-6-ib-designable-not-loading-resources-from-bundle-in-interface-bui lder # 24604071) – JRV

12

धन्यवाद JRV के जवाब देने के लिए मैं अंत में इस वर्ग तय:

@IBDesignable class ALLocalizableLabel: UILabel { 

    @IBInspectable var localizeString:String = "" { 
     didSet { 
      #if TARGET_INTERFACE_BUILDER 
       var bundle = NSBundle(forClass: self.dynamicType) 
       self.text = bundle.localizedStringForKey(self.localizeString, value:"", table: nil) 
      #else 
       self.text = NSLocalizedString(self.localizeString, comment:""); 
      #endif 
     } 
    } 

} 

इस की संभावना बनाता है यह बोध मुझे NSLocalizedString मैक्रो (केवल इंटरफ़ेस बिल्डर के लिए) फिर से परिभाषित करने के लिए यह संभव बना दिया

Localized string set in interface builder

: इंटरफ़ेस बिल्डर में कुंजी सेट यह सीधे लेबल इंटरफ़ेस बिल्डर में लेबल अपडेट करेगा, काफी ठंडा और कुछ एक्सकोड डिफ़ॉल्ट रूप से समर्थन करना चाहिए!

साथ ही आप Github पर देख सकते हैं: https://github.com/AvdLee/ALLocalizableLabel

+0

यह इंटरफ़ेस बिल्डर में मेरे लिए काम नहीं करता है, जब तक कि मैंने 'लेआउट सबव्यूव्यू 'ओवरराइड शामिल नहीं किया। क्या आप समझा सकते हैं कि इसकी आवश्यकता क्यों है? – Kevin

1

यह मेरे लिए काम किया,

import Foundation 
import UIKit 

@IBDesignable 
class YourLabel: UILabel { 
    @IBInspectable var stringLocalizationKey: String = ""{ 
     didSet{ 
      text = stringLocalizationKey.localized 
      setup() 
     } 
    } 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     setup() 
    } 

    func setup(){ 
     textAlignment = NSTextAlignment.center 
    } 

    override open func layoutSubviews() { 
     super.layoutSubviews() 
     self.preferredMaxLayoutWidth = self.frame.size.width 
     self.layoutIfNeeded() 
    } 

    override func prepareForInterfaceBuilder() { 
     let bundle = Bundle(for: type(of: self)) 
     self.text = bundle.localizedString(forKey: self.stringLocalizationKey, value:"", table: nil) 
    } 
} 

और यह String एक्सटेंशन जोड़ने:

extension String { 
    var localized: String { 
     return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "") 
    } 
} 
संबंधित मुद्दे