swift 應用內切換語言


1:在project info中的locations添加需要的語言
2:創建Localizable.strings文件 點擊右邊的localization勾選需要的語言
3:創建InfoPlist.strings翻譯Info.plist中的提示文字和應用名稱
4:創建 AppSettings.swift

import UIKit

class AppSettings: NSObject {
    
    fileprivate static let kSharedSettingsKey = "DefaultUserSettings"
    
    static let shared: AppSettings = {
        let appSettings: AppSettings
        if let savedData = UserDefaults.standard.object(forKey: AppSettings.kSharedSettingsKey) as? Data,
           let defaultSettings = NSKeyedUnarchiver.unarchiveObject(with: savedData) as? AppSettings {
            appSettings = defaultSettings
        } else {
            appSettings = AppSettings()
        }
        
        return appSettings
    }()
    
    static func saveSharedInstance() {
        let data = NSKeyedArchiver.archivedData(withRootObject: AppSettings.shared)
        UserDefaults.standard.set(data, forKey: AppSettings.kSharedSettingsKey)
    }
    
    enum Language: String {
        /// 請注意, 這個命名不是隨意的, 是根據你本地的語言包,可以show in finder 看到. en.lproj / zh-Hans.lproj
        case English = "en"
        case Indonesian = "id-ID"
        case Japanese = "ja-JP"
        case Korean = "ko"
        case Singapore = "zh-Hant-TW"
        var code: String {
            return rawValue
        }
    }
    // 判斷當前語言
    static func currentLanguage() -> String {
        /*
         本地緩存之前選擇的語言, 若沒有擇返回系統語言。
         若不需要此功能, 擇直接返回系統語言。
         */
        if stringDefaults(k: "AppLanguage").count > 0 {
            return stringDefaults(k: "AppLanguage")
        }
        else {
            return Locale.preferredLanguages[0]
        }
    }
    
    var language: Language
    override init() {
        // 第一次初始語言, 看手機是什么語言
        if AppSettings.currentLanguage().hasPrefix("id-ID") {
            language = .Indonesian
        }
        else if AppSettings.currentLanguage().hasPrefix("ja") {
            language = .Japanese
        }
        else if AppSettings.currentLanguage().hasPrefix("ko") {
            language = .Korean
        }
        else if AppSettings.currentLanguage().hasPrefix("zh-Hant-TW") {
            language = .Singapore
        }
        else {
            language = .English
        }
        
        super.init()
    }
    
}
private var bundleByLanguageCode: [String: Foundation.Bundle] = [:]
extension AppSettings.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
            }
        }
    }
}
/// 首先, 我們會在啟動時設置成我們自己的Bundle,這樣就可以做到,當使用時會調用這個方法.
class LanguageBundle: Foundation.Bundle {
    override func localizedString(forKey key: String, value: String?, table tableName: String?) -> String {
        if let bundle = AppSettings.shared.language.bundle {
            return bundle.localizedString(forKey: key, value: value, table: tableName)
        } else {
            return super.localizedString(forKey: key, value: value, table: tableName)
        }
    }
}

AppDelegate中

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        object_setClass(Foundation.Bundle.main, LanguageBundle.self)
        
        return true
    }

使用

//切換語言時,只要設置就可以:
AppSettings.shared.language = .English 
setDefaults(v: "en", k: "AppLanguage")

切換語言后重啟app

func reStart()->Void {
        DispatchQueue.main.async(execute: {
            UIApplication.shared.keyWindow?.rootViewController = BulgeTabBarExample()
        })
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM