12/08/2018, 16:22

[Swift] Localization with UI (XIBs and Storyboards)

Cách làm thông thường là sẽ tạo 1 connect đến variable trong file .swift: @IBOutlet weak var cancelButton: UIButton! Rồi sau đó sẽ gọi localization: self.cancelButton = NSLocalizedString("Cancel", comment: "") Chúng ta có 2 việc cần làm ở đây: 1. Đầu tiên mình sẽ định nghĩa 1 protocol như sau: ...

Cách làm thông thường là sẽ tạo 1 connect đến variable trong file .swift: @IBOutlet weak var cancelButton: UIButton! Rồi sau đó sẽ gọi localization: self.cancelButton = NSLocalizedString("Cancel", comment: "")

Chúng ta có 2 việc cần làm ở đây:

1. Đầu tiên mình sẽ định nghĩa 1 protocol như sau:

public protocol Localizable {
    func localize()
}

Tạo 1 extension cho protocol vừa tạo nhằm kết nối với giá trị đã được localization:

public extension Localizable {
    
    public func localize(_ string: String?) -> String? {
        guard let term = string, term.hasPrefix("@") else {
            return string
        }
        guard !term.hasPrefix("@@") else {
            return term.substring(from: term.index(after: term.startIndex))
        }
        return NSLocalizedString(term.substring(from: term.index(after: term.startIndex)), comment: "")
    }
    
    public func localize(_ string: String?, _ setter: (String?) -> Void) {
        setter(localize(string))
    }

    public func localize(_ getter: (UIControlState) -> String?, _ setter: (String?, UIControlState) -> Void) {
        setter(localize(getter(.normal)), .normal)
        setter(localize(getter(.selected)), .selected)
        setter(localize(getter(.highlighted)), .highlighted)
        setter(localize(getter(.disabled)), .disabled)
    }
}

Mình sẽ định nghĩa các localization bắt đầu với ký tự "@" như code ở trên. Nếu bạn muốn bỏ localization thì chỉ cần sử dụng "@@". Đọc code chắc cũng đã hiểu nhỉ?             </div>
            
            <div class=

0