生活随笔
收集整理的這篇文章主要介紹了
Swift之本地国际化与App内切换语言
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
添加語言庫
- 點擊項目 -> PROJECT -> Info -> Localizations -> + , 添加需要的語言;
- 然后選擇新創建的 Localizable.string, 選中所需要的語言;
Localizable.strings 文件寫入
- 添加語言庫成功之后, Localizable.strings就生成了English、Chinese Simplified、Chinese Traditional三個語言文件;
- Localizable.strings 文件中寫入, 以"key" = “value”; 這樣的格式;
- English:
INTERNATIONALIZATION
= "Internationalization";
CHANGE
= "switch";
HANDSOME
= "Handsome Boy";
INTERNATIONALIZATION
= "國際化";
CHANGE
= "切換";
HANDSOME
= "帥哥";
INTERNATIONALIZATION
= "國際化";
CHANGE
= "切換";
HANDSOME
= "帥哥";
YDWLocalizationHelper
該工具類可以直接拖入工程中使用, 主要實現功能:
- 第一次進入App時, 自動根據系統的語言設定當前App的語言;
- 保存當前用戶設定的語言;
- 自定義切換語言功能;
- 控件賦值的獲取和設定;
- 切換語言后替換掉mainBundle為當前語言的bundle;
import UIKitclass YDWLocalizationHelper
: NSObject
{fileprivate
static let kSharedSettingsKey
= "DefaultUserSettings"var language
: Language
enum Language
: String
{case Chinese
= "zh-Hans"case English
= "en"case Tradition
= "zh-Hant"case Vietnamese
= "vi"var code
: String
{return rawValue
}}static let shared
: YDWLocalizationHelper
= {let appSettings
: YDWLocalizationHelper
if let savedData
= UserDefaults
.standard
.object(forKey
: YDWLocalizationHelper
.kSharedSettingsKey
) as
? Data
,let defaultSettings
= NSKeyedUnarchiver
.unarchiveObject(with
: savedData
) as
? YDWLocalizationHelper
{appSettings
= defaultSettings
} else {appSettings
= YDWLocalizationHelper()}return appSettings
}()func
valueWithKey(key
: String
!) -> String
{let str
= NSLocalizedString(key
, comment
: "")return str
}static func
saveSharedInstance() {let data
= NSKeyedArchiver
.archivedData(withRootObject
: YDWLocalizationHelper
.shared
)UserDefaults
.standard
.set(data
, forKey
: YDWLocalizationHelper
.kSharedSettingsKey
)}static func
localeIsChinese() -> Language
{if let lang
= Locale
.preferredLanguages
.first
{if lang
.hasPrefix("zh") {if lang
.contains("Hant") || lang
.contains("Trad") {return .Tradition
}return .Chinese
} else if lang
.contains("en") {return .English
} else if lang
.hasPrefix("viet") {return .Vietnamese
} else {return .English
}} else {return .English
}}override
init() {language
= YDWLocalizationHelper
.localeIsChinese()super.init()}}private var bundleByLanguageCode
: [String
: Foundation
.Bundle
] = [:]extension YDWLocalizationHelper
.Language
{var bundle
: Foundation
.Bundle
? {if let bundle
= bundleByLanguageCode
[code
] {return bundle
} else {let mainBundle
= Foundation
.Bundle
.main
if let path
= mainBundle
.path(forResource
: code
, ofType
: "lproj"),let bundle
= Foundation
.Bundle(path
: path
) {bundleByLanguageCode
[code
] = bundle
return bundle
} else {return nil
}}}
}
class Bundle
: Foundation
.Bundle
{override func
localizedString(forKey key
: String
, value
: String
?, table tableName
: String
?) -> String
{if let bundle
= YDWLocalizationHelper
.shared
.language
.bundle
{return bundle
.localizedString(forKey
: key
, value
: value
, table
: tableName
)} else {return super.localizedString(forKey
: key
, value
: value
, table
: tableName
)}}
}
語言切換
- AppDelegate中: object_setClass(Foundation.Bundle.main, Bundle.self)
func
application(_ application
: UIApplication
, didFinishLaunchingWithOptions launchOptions
: [UIApplication
.LaunchOptionsKey
: Any
]?) -> Bool
{object_setClass(Foundation
.Bundle
.main
, Bundle
.self)return true
}
- 使用:設定時只需要在控件上, 通過YDWLocalizationHelper.shared.valueWithKey(key: “INTERNATIONALIZATION”)來設定即可; 而切換語言只需要通過設定YDWLocalizationHelper.shared.language = .Chinese即可;(其中valueWithKey和YDWLocalizationHelper.shared.language實現如下)
func
valueWithKey(key
: String
!) -> String
{let str
= NSLocalizedString(key
, comment
: "")return str
}YDWLocalizationHelper
.shared
.language
= .Chinese
- 最后重載RootViewController即可:
let appDelegate
= UIApplication
.shared
.delegate as
! AppDelegateappDelegate
.setupRootViewController()
- 對于story 中的國際化, 需要重設一下RootViewController
func
resetRootViewController() {if let appdelegate
= UIApplication
.shared
.delegate
{let storyBoard
= UIStoryboard
.init(name
: "Main", bundle
: nil
)if let mainController
= storyBoard
.instantiateViewController(withIdentifier
: "rootViewController") as
? UINavigationController
{appdelegate
.window
??.rootViewController
= mainController
}}}
刷新界面
對于所有界面的刷新最方便的就是重新設置 rootViewController, 將keyWindow先變黑,假裝loading個幾秒,再變回來即可。如果需要再次回到之前所在頁面,再添加相應的跳轉VC的方法;
func
chooseLanguage(menu
: [String
: Any
]) {let language
= menu
["language"] as
! Stringvar noticeContent
= "正在設置語言..."if language
== "中文(簡體)" {noticeContent
= "正在設置語言..."YDWLocalizationHelper
.shared
.language
= .Chinese
} else if language
== "中文(繁體)" {noticeContent
= "正在設置語言..."YDWLocalizationHelper
.shared
.language
= .Tradition
} else if language
== "English" {noticeContent
= "Setting Language..."YDWLocalizationHelper
.shared
.language
= .English
} else if language
== "Ti?ng Vi?t" {noticeContent
= "Thi?t l?p ng?n ng?..."YDWLocalizationHelper
.shared
.language
= .Vietnamese
} else {noticeContent
= "正在設置語言..."YDWLocalizationHelper
.shared
.language
= .Chinese
}if UIApplication
.shared
.delegate
!= nil
{let appDelegate
= UIApplication
.shared
.delegate as
! AppDelegateappDelegate
.setupRootViewController()}let backView
= UIView(frame
: UIScreen
.main
.bounds
)backView
.backgroundColor
= .blackUIApplication
.shared
.keyWindow
?.addSubview(backView
)YDWToast
.showToast(text
: noticeContent
, duration
: 2, location
: .center
)DispatchQueue
.main
.asyncAfter(deadline
: DispatchTime
.now() + 2) {UIView
.animate(withDuration
: 0.2, animations
: {backView
.alpha
= 0}) { (isFinished
) inbackView
.removeFromSuperview()}}}
效果展示
完整示例
Swift之Internationalization本地國際化和App內切換語言
總結
以上是生活随笔為你收集整理的Swift之本地国际化与App内切换语言的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。