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()
})
}
swift 应用内切换语言的更多相关文章
- IOS APP 国际化 程序内切换语言实现 不重新启动系统(支持项目中stroyboard 、xib 混用。完美解决方案)
上篇 IOS APP 国际化(实现不跟随系统语言,不用重启应用,代码切换stroyboard ,xib ,图片,其他资源 介绍了纯代码刷新 实现程序内切换语言. 但效率底下,也存在一些问题.暂放弃. ...
- App内切换语言
前几天客户提需求,对App增加一个功能,这个功能目前市面上已经很常见,那就是应用内切换语言.啥意思,就是 英.中.法.德.日...语言随意切换. (本案例采用Data-Bingding模式,麻麻再也不 ...
- Android 应用内切换语言
extends :http://bbs.51cto.com/thread-1075165-1.html,http://www.cnblogs.com/loulijun/p/3164746.html 1 ...
- 解决Android 7.0 App内切换语言不生效的问题
Android7.0及以前版本,Configuration中的语言相当于是App的全局设置: public static void changeAppLanguage(Context context, ...
- iOS开发--应用国际化,应用内切换语言
1.前言 自己负责的项目需要做国际化,并且要求应用内部切换语言.这个是可以做到的,也并不难,可以直接戳Github看一下 https://github.com/leo90821/Localiztion ...
- iOS APP语言国际化之应用内切换语言环境
最近接了一个项目,需求是要做一款应用的英文版本,客户并不清楚,以为要另做一个APP.沟通后告诉他们在之前应用基础上加个国际化功能就好,把之前的语言国际化重新梳理记录一下. 一般设置更改本地语言环境后, ...
- android 多语言(在APP里面内切换语言)
创建SharedPreferences的管理类 public class PreferenceUtil { private static SharedPreferences mSharedPrefer ...
- Android 应用内多语言切换
最近公司的 App 里需要用到多语言切换,简单来说,就是如果用户没有选择语言选项时,App 默认跟随系统语言,如果用户在 App 内进行了语言设置,那么就使用用户设置的语言.当然,你会发现,App 的 ...
- 【Swift 3.0】iOS 国际化切换语言
有的 App 可能有切换语言的选项,结合系统自动切换最简单的办法: fileprivate var localizedBundle: Bundle = { return Bundle(path: Bu ...
- 初步swift该研究指出语言(基本数据类型)
笔者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/28258805 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...
随机推荐
- websphere+IHS+plugin集群搭建
配置:wa1+was2 was1:Dmgr app01 oracle ihs was2:Dmgr app02 原理:通过Dmgr管理下面两个agent,再通过agent去间接控制运行在节点上的ser ...
- JS a标签文件下载
aDownload(url, fileName) { const link = document.createElement('a') link.style.display = 'none' link ...
- Delphi 自定义窗体类名
原理就是覆盖原CreateParams函数,重写新CreateParams函数,在新CreateParams函数继承完之后马上修改Parames.WinClassName type TForm1 = ...
- 在java路径上找不到javax.servlet.http.HttpServlet
1.将写好的网页代码导入Java中会发现index.jsp文件开头部分出现报错 2.错误提示是找不到java路径问题 3.在项目中鼠标右键进行找到Build Path选项点击进去 4.找到Librar ...
- Linux - TOP命令解析
第一行: 当前系统时间1 系统已经运行时间(在这期间没有重启过)2 users 当前有2个用户登录系统 load average:后面的三个数分别是1分钟.5分钟.15分钟的负载情况.如果这个数除以 ...
- Oracle View的 With Check OPTION 參數有什麼用途?
1. 當通過View Insert數據到定義此View的SQL中的基本表的時候,insert的資料要符合SQL中here條件,否則Insert View 的操作無法成功: 2. 注意:WITH REA ...
- wpf treeview 选中节点加载数据并绑定
<TreeView Grid.Row="0" Grid.Column="0" x:Name="FolderView" Canvas.T ...
- 2.9 系统IO
iostream: 输入流 cin; c 指代 character 输出流 cout, cerr(立即刷新缓冲区), clog(缓冲区满后刷新) 命名空间 访问方式 namespace NameSpa ...
- VS Code 快速下载
最近在官网下载Visual Studio Code时,下载速度特别慢,经过搜索后发现,将下载地址前部分更换为国内地址后,下载速度飞快. 具体步骤如下: VSCodeSetup-x64-1.72.0 官 ...
- 论文笔记:To BLOB or Not To BLOB: Large Object Storage in a Database or a Filesystem?
论文笔记:To BLOB or Not To BLOB: Large Object Storage in a Database or a Filesystem? Conclusion 如果对象平均大小 ...