添加语言库

  • 点击项目 -> 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内切换语言相关推荐

  1. iOS国际化之app内切换语言

    //国际化 #define AppLanguage @"myAppLanguage" #define UserDefaultLanguage ([[NSUserDefaults s ...

  2. Android 8.0 App内切换语言不生效的问题记录

    国内大部分简单应该都只做了中文简体版,但是有部分项目需要面向国际化,甚至可能就是主打国外市场.因此我们有时候会遇到需要APP内做多语言切换的功能需求. 如何做多语言切换,网上资料还是很多的,本文也不是 ...

  3. 解决Android 7.0 App内切换语言不生效的问题

    Android7.0及以前版本,Configuration中的语言相当于是App的全局设置: 1 public static void changeAppLanguage(Context contex ...

  4. IOS APP 国际化 程序内切换语言实现 不重新启动系统(支持项目中stroyboard 、xib 混用。完美解决方案)

    IOS APP 国际化 程序内切换语言实现 不重新启动系统(支持项目中stroyboard .xib 混用.完美解决方案) 参考文章: (1)IOS APP 国际化 程序内切换语言实现 不重新启动系统 ...

  5. Android实现app内的语言切换功能

    我在目前所在的公司负责一个app项目的维护,最近需要对这个项目进行国际化,适配10多个国家的语言,在实现国际化过程中,遇到了很多问题,最麻烦的就是翻译了,得一个个将翻译从excel复制到资源文件中,还 ...

  6. iOS开发之APP内部切换语言

    2019独角兽企业重金招聘Python工程师标准>>> 前言 iOS开发中,随着APP越来越完善,很多APP都做了国际化,也实现了APP内部切换语言. 原理 国际化都会走到NSBun ...

  7. Android切换泰语,Android应用内切换语言

    首先扯点别的:这是第一次在简书上写东西,我突然明白为啥这么多人在简书上写东西了,因为没有广告啊,哈哈. 最近接触到Android 应用内切换语言的问题,研究了两天,做个记录先.实现了中文,英文,泰语的 ...

  8. iOS--在应用内切换语言

    前言 在一次项目中,要求在应用内切换语言的需求.如需跟随系统改变语言的,可以参考其他的博客,这里就不多说了 思路 创建一个国际化管理者,通过传递一个key,再根据当前的语言环境,获取对应的value. ...

  9. iOS App的国际化,以及App内的语言切换

    一.国际化文件 其实国际化跟我们的NSDictionary差不多,我们要支持中文和英文,就会生成两个国际化文件(.string为后缀名),然后在两个国际化文件中,设置一个Key,在中文的国际化文件中这 ...

最新文章

  1. dev treeview控件_在Winform开发框架中使用DevExpress的TreeList和TreeListLookupEdit控件
  2. 极速发展的饿了么订单系统架构演进
  3. 在SharePoint Foundation 2010中显示来自其他站点的列表
  4. EFCore批量操作,你真的清楚吗
  5. 0010服务器无对应信息,服务器版本对应的内存
  6. 第十节: EF的三种追踪实体状态变化方式(DBEntityEntry、ChangeTracker、Local)
  7. mysql function DATE_FORMA T(date, format)
  8. input位置_3分钟短文 | PHP 数组任意位置插入新元素,你是怎么处理的?
  9. 内容分发网络CDN(互联网技术)
  10. Greg and Array CodeForces 296C 差分数组
  11. celeste第二章_蔚蓝全剧情全流程攻略 全关卡详解图文攻略
  12. hdu5773The All-purpose Zero
  13. 富文本编辑器tinymce支持从word复制粘贴保留格式和图片的插件wordpaster
  14. css 去除png图片黑色背景色,css的filter给png图片换色
  15. TPLinker实体关系抽取新范式TPLinker:单阶段联合抽取,并解决暴漏偏差~
  16. python机械臂仿真_使用VTK与Python实现机械臂三维模型可视化
  17. 小学生日常行为规范PPT模板
  18. C# 绘制验证码图片
  19. 阿里云2023届实习生招聘启动啦,快来加入IoT安全吧
  20. ios14测试版兼容软件,iOS14测试版抢先体验教程!你的iPhone可以更新吗?【附iOS14独有彩蛋】...

热门文章

  1. 2 -13 作业需求
  2. HDU 1043 Eight(八数码)
  3. axis2 调用webservice
  4. sqlite3存储格式
  5. OC-数组排序-NSSortDescriptor使用
  6. Dynamics AX 2012 R2 外部程序运行在没有AD的环境(如PDA) 调用AX服务
  7. UU看书于今日成功上线,各大小说网站发来贺电!!
  8. dailybuild
  9. c 复杂的前置后置面试题_采摘后18小时直达货架,利农集团用后置仓“直连”生鲜电商...
  10. python open文件安全隐患_python的其他安全隐患