【譯】如何運用 Swift 的屬性包裝器實現應用本地化
- 原文地址:Localize Swift Application
- 原文作者:Dmytro Pylypenko
- 譯文出自:掘金翻譯計劃
- 本文永久連結:github.com/xitu/gold-m…
- 譯者:chaingangway
- 校對者:Bruce-pac
如何運用 Swift 的屬性包裝器實現應用本地化
您好,Swift 開發者,在本文中,我想與您分享我的經驗和知識,主要內容有屬性包裝器(Property Wrapper)的使用,以及如何簡化程式碼並使其易於維護。我會通過幾個主題對此進行說明。
在 Swift 5.1 中,Apple 引入了屬性包裝器,它可以讓我們在屬性和訪問邏輯(getter 和 setter)之間設定中間層。
下面的內容是在 @IBOutlet
變數內部使用屬性包裝器的簡便方法來實現應用本地化。
優化下面這個基礎版本:
class NatureViewController: UIViewController {
@IBOutlet private var label: UILabel! {
didSet {
label.title = NSLocalizedString("natureTitle",comment: "")
}
}
@IBOutlet private var button: UIButton! {
didSet {
button.setTitle(NSLocalizedString ("saveNatureButton",comment: ""),for: .normal)
}
}
}
複製程式碼
我們可以用屬性包裝器 @Localized
改程序式碼,如下:
class NatureViewController: UIViewController {
@Localized("natureTitle")
@IBOutlet private var label: UILabel!
@Localized("saveNatureButton")
@IBOutlet private var button: UIButton!
}
複製程式碼
這程式碼看起來很優雅,不是嗎?下面讓我們建立 @Localized
@Localized(.natureTitle)
。
@propertyWrapper
struct Localized<T: Localizable> {
private let key: LocalizationKey
var wrappedValue: T? = nil {
didSet {
wrappedValue?.set(localization: key)
}
}
init(_ key: LocalizationKey) {
self.key = key
}
}
複製程式碼
為了能讓更多的型別能夠支援 Localizable
協議,
我們要實現 UILabel
和 UIButton
的擴充套件方法。
protocol Localizable {
func set(localization: LocalizationKey)
}
extension UIButton: Localizable {
func set(localization key: LocalizationKey) {
setTitle(key.string,for: .normal)
}
}
extension UILabel: Localizable {
func set(localization key: LocalizationKey) {
text = key.string
}
}
複製程式碼
最後我們只需要實現 LocalizationKey
:
enum LocalizationKey: String {
case
natureTitle,saveNatureButton
}
extension LocalizationKey {
var string: String {
NSLocalizedString(rawValue,comment: rawValue)
}
}
複製程式碼
我們可以直接用 raw 的值來表示相應的 key,String
型別預設遵守這個協議,所以只需要列舉中的值與 Localizable.strings
中的 key 保持一致就可以了。
最終的程式碼如下:
class NatureViewController: UIViewController {
@Localized(.natureTitle)
@IBOutlet private var label: UILabel!
@Localized(.saveNatureButton)
@IBOutlet private var button: UIButton!
}
複製程式碼
本章結束!關於 @Localized
還有一些潛在功能:
- 格式化字串資料,並進行動態替換。
- 能夠確定來自指定的表單和資源包的字串。
想了解更多關於屬性包裝器的知識,請閱讀官方檔案: Properties - The Swift Programming Language (Swift 5.2)
如果發現譯文存在錯誤或其他需要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可獲得相應獎勵積分。文章開頭的 本文永久連結 即為本文在 GitHub 上的 MarkDown 連結。
掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。