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

最新文章

  1. C++STL 常用 函数 用法
  2. 音频文件解析(二):WAV格式文件波形绘制
  3. 软件包管理 之 Fedora/Redhat 在线安装更新软件包,yum 篇 ── 给新手指南
  4. JS 学习笔记--3--数据类型
  5. POJ 3484
  6. 【最小生成树】Codeforces 707B Bakery
  7. 曾经很长时间不会写的两个SQL语句(group by,having)
  8. liunx 同步时间
  9. 线程基础(CLR via C#)
  10. SpringBoot2.0初识
  11. 时间函数(1):time,ctime,gmtime,localtime
  12. Confluence 6 在升级过程中查看合并日志
  13. 数据库事务的四大特性以及事务的隔离级别-与-Spring事务传播机制&隔离级别
  14. 学习:MQTT协议及原理
  15. powerdns
  16. HDU2577 How to Type 2016-09-11 14:05 29人阅读 评论(0) 收藏
  17. Java并发(一)-了解线程安全
  18. Scope及其子类介绍
  19. OSG学习:计算纹理坐标
  20. windows下64位python的安装及机器学习相关包的安装(实用)

热门文章

  1. (0321) 路科 视频 ,讲 uvm_pkg
  2. mysql常用语句操作
  3. “adb”不是内部或外部命令——解决方案
  4. vue 图片转base 64
  5. C CODE STYLE 每天瞅一两眼
  6. Jmeter性能测试入门到项目实战03
  7. OCR开源项目
  8. 33. Java对异常处理的两种方式
  9. MySQL同步部分库注意的问题
  10. 当FTP不能满足大文件、海量文件传输时,有没有好的替代方案?