2014-10-21 15 views
8

Tôi có rất nhiều văn bản đã bản địa hóa được viết trong tệp Localizable.strings của mình và tôi đang tìm cách sử dụng chúng và hiển thị chúng trong trình tạo giao diện. Tức là, thay vì tạo các cửa hàng cho tất cả các khung nhìn của tôi và đặt văn bản trong mã, tôi muốn tạo một lớp con UILabel IB_DESIGNABLE UILabel, phải truy cập tệp Localizable.strings của tôi và sau đó hiển thị văn bản được bản địa hóa trực tiếp trên trình tạo giao diện.IBInspectable và NSLocalizedString

Vấn đề là, NSLocalizedString không cung cấp bất kỳ kết quả nào trong trình tạo giao diện, nhưng chỉ khi tôi thực sự chạy mã này. Có cách nào để nói cho người xây dựng giao diện mà tập tin để sử dụng cho nội địa hóa (ví dụ trong preparForInterfaceBuilder)?

Trả lời

6

Cuối cùng tôi đã tự tìm ra. Câu trả lời là: sử dụng [[NSBundle bundleForClass:self.class] localizedStringForKey:key value:@"" table:nil] để nhận bản dịch từ tệp Localizable.strings trong trình tạo giao diện. Điều này thực hiện đã làm cho nó có thể cho tôi để xác định lại NSLocalizedString vĩ mô (chỉ cho xây dựng giao diện):

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

BTW, nhờ @rickster cho chỉ đúng hướng trong [câu trả lời này] (http://stackoverflow.com/questions/24603232/xcode-6-ib-designable-not-loading-resources-from-bundle-in-interface-bui lder # 24604071) – JRV

12

Nhờ câu trả lời JRV của tôi cuối cùng đã cố định lớp này:

@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 
     } 
    } 

} 

Điều này tạo ra khả năng đặt khóa trong trình tạo giao diện:

Localized string set in interface builder

Điều này sẽ cập nhật nhãn trực tiếp trong trình tạo giao diện, khá thú vị và xcode nào đó sẽ hỗ trợ theo mặc định!

Bạn có thể tìm thấy điều này trên Github cũng như: https://github.com/AvdLee/ALLocalizableLabel

+0

Điều này không hiệu quả đối với tôi trong Trình tạo giao diện, cho đến khi tôi bao gồm ghi đè 'layoutSubviews'. Bạn có thể giải thích tại sao nó cần thiết? – Kevin

1

này đã làm việc cho tôi,

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) 
    } 
} 

Và thêm String phần mở rộng này:

extension String { 
    var localized: String { 
     return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "") 
    } 
} 
Các vấn đề liên quan