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内切换语言相关推荐
- iOS国际化之app内切换语言
//国际化 #define AppLanguage @"myAppLanguage" #define UserDefaultLanguage ([[NSUserDefaults s ...
- Android 8.0 App内切换语言不生效的问题记录
国内大部分简单应该都只做了中文简体版,但是有部分项目需要面向国际化,甚至可能就是主打国外市场.因此我们有时候会遇到需要APP内做多语言切换的功能需求. 如何做多语言切换,网上资料还是很多的,本文也不是 ...
- 解决Android 7.0 App内切换语言不生效的问题
Android7.0及以前版本,Configuration中的语言相当于是App的全局设置: 1 public static void changeAppLanguage(Context contex ...
- IOS APP 国际化 程序内切换语言实现 不重新启动系统(支持项目中stroyboard 、xib 混用。完美解决方案)
IOS APP 国际化 程序内切换语言实现 不重新启动系统(支持项目中stroyboard .xib 混用.完美解决方案) 参考文章: (1)IOS APP 国际化 程序内切换语言实现 不重新启动系统 ...
- Android实现app内的语言切换功能
我在目前所在的公司负责一个app项目的维护,最近需要对这个项目进行国际化,适配10多个国家的语言,在实现国际化过程中,遇到了很多问题,最麻烦的就是翻译了,得一个个将翻译从excel复制到资源文件中,还 ...
- iOS开发之APP内部切换语言
2019独角兽企业重金招聘Python工程师标准>>> 前言 iOS开发中,随着APP越来越完善,很多APP都做了国际化,也实现了APP内部切换语言. 原理 国际化都会走到NSBun ...
- Android切换泰语,Android应用内切换语言
首先扯点别的:这是第一次在简书上写东西,我突然明白为啥这么多人在简书上写东西了,因为没有广告啊,哈哈. 最近接触到Android 应用内切换语言的问题,研究了两天,做个记录先.实现了中文,英文,泰语的 ...
- iOS--在应用内切换语言
前言 在一次项目中,要求在应用内切换语言的需求.如需跟随系统改变语言的,可以参考其他的博客,这里就不多说了 思路 创建一个国际化管理者,通过传递一个key,再根据当前的语言环境,获取对应的value. ...
- iOS App的国际化,以及App内的语言切换
一.国际化文件 其实国际化跟我们的NSDictionary差不多,我们要支持中文和英文,就会生成两个国际化文件(.string为后缀名),然后在两个国际化文件中,设置一个Key,在中文的国际化文件中这 ...
最新文章
- dev treeview控件_在Winform开发框架中使用DevExpress的TreeList和TreeListLookupEdit控件
- 极速发展的饿了么订单系统架构演进
- 在SharePoint Foundation 2010中显示来自其他站点的列表
- EFCore批量操作,你真的清楚吗
- 0010服务器无对应信息,服务器版本对应的内存
- 第十节: EF的三种追踪实体状态变化方式(DBEntityEntry、ChangeTracker、Local)
- mysql function DATE_FORMA T(date, format)
- input位置_3分钟短文 | PHP 数组任意位置插入新元素,你是怎么处理的?
- 内容分发网络CDN(互联网技术)
- Greg and Array CodeForces 296C 差分数组
- celeste第二章_蔚蓝全剧情全流程攻略 全关卡详解图文攻略
- hdu5773The All-purpose Zero
- 富文本编辑器tinymce支持从word复制粘贴保留格式和图片的插件wordpaster
- css 去除png图片黑色背景色,css的filter给png图片换色
- TPLinker实体关系抽取新范式TPLinker:单阶段联合抽取,并解决暴漏偏差~
- python机械臂仿真_使用VTK与Python实现机械臂三维模型可视化
- 小学生日常行为规范PPT模板
- C# 绘制验证码图片
- 阿里云2023届实习生招聘启动啦,快来加入IoT安全吧
- ios14测试版兼容软件,iOS14测试版抢先体验教程!你的iPhone可以更新吗?【附iOS14独有彩蛋】...
热门文章
- 2 -13 作业需求
- HDU 1043 Eight(八数码)
- axis2 调用webservice
- sqlite3存储格式
- OC-数组排序-NSSortDescriptor使用
- Dynamics AX 2012 R2 外部程序运行在没有AD的环境(如PDA) 调用AX服务
- UU看书于今日成功上线,各大小说网站发来贺电!!
- dailybuild
- c 复杂的前置后置面试题_采摘后18小时直达货架,利农集团用后置仓“直连”生鲜电商...
- python open文件安全隐患_python的其他安全隐患