日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Swift之本地国际化与App内切换语言

發布時間:2024/5/21 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Swift之本地国际化与App内切换语言 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

添加語言庫

  • 點擊項目 -> PROJECT -> Info -> Localizations -> + , 添加需要的語言;

  • 添加完成的語言庫如下所示:

  • 創建Localizable.strings

  • 然后選擇新創建的 Localizable.string, 選中所需要的語言;

Localizable.strings 文件寫入

  • 添加語言庫成功之后, Localizable.strings就生成了English、Chinese Simplified、Chinese Traditional三個語言文件;
  • Localizable.strings 文件中寫入, 以"key" = “value”; 這樣的格式;
  • English:
INTERNATIONALIZATION = "Internationalization"; CHANGE = "switch"; HANDSOME = "Handsome Boy";
  • Chinese Simplified
INTERNATIONALIZATION = "國際化"; CHANGE = "切換"; HANDSOME = "帥哥";
  • Chinese Traditional
INTERNATIONALIZATION = "國際化"; CHANGE = "切換"; HANDSOME = "帥哥";

YDWLocalizationHelper

該工具類可以直接拖入工程中使用, 主要實現功能:

  • 第一次進入App時, 自動根據系統的語言設定當前App的語言;
  • 保存當前用戶設定的語言;
  • 自定義切換語言功能;
  • 控件賦值的獲取和設定;
  • 切換語言后替換掉mainBundle為當前語言的bundle;
import UIKitclass YDWLocalizationHelper: NSObject {fileprivate static let kSharedSettingsKey = "DefaultUserSettings"var language: Languageenum Language: String {case Chinese = "zh-Hans"case English = "en"case Tradition = "zh-Hant"case Vietnamese = "vi"var code: String {return rawValue}}// MARK: 創建單例static let shared: YDWLocalizationHelper = {let appSettings: YDWLocalizationHelperif 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}()// MARK: 獲取鍵值func valueWithKey(key: String!) -> String {let str = NSLocalizedString(key, comment: "")return str}// MARK: - 保存用戶當前語言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}}// MARK: 首次進入語言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.mainif let path = mainBundle.path(forResource: code, ofType: "lproj"),let bundle = Foundation.Bundle(path: path) {bundleByLanguageCode[code] = bundlereturn bundle} else {return nil}}} }// 當調用YDWLocalizationHelper.Language切換語言后替換掉mainBundle為當前語言的bundle 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實現如下)
// comment 是傳參, 假如value中需要外界來決定內容,可以用%@,然后comment傳參func valueWithKey(key: String!) -> String {let str = NSLocalizedString(key, comment: "")return str}// 切換語言時,只要設置就可以:YDWLocalizationHelper.shared.language = .Chinese // .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内切换语言的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。