[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ỉ?