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()
})
}