当前位置:   article > 正文

swift5 ios的国际化(本地化,全球化,多语言)(最主要博客)_swift 国际化

swift 国际化

1.我主要参考的是这位大神的博客

链接: Swift - iOS应用的国际化与本地化

 title = NSLocalizedString("equipment", comment: "")

  • 1
  • 2

1.1 要注意的地方1

在这里插入图片描述

1.2 要注意的地方2

在这里插入图片描述

2.storyboard的国际化

iOS(swift)storyboard的国际化(本地化,全球化,多语言)

3. 在APP内切换语言

3.1 代码

LocalizableManager.swift

import UIKit

enum LanguageType {
    case chinese,english,auto
}

class LocalizableManager: NSObject {  
    static func localValue(_ str:String) -> String {
        LocalizableManager.shared.localValue(str: str)
    } 
    static func setLanguage(_ type:LanguageType){
        LocalizableManager.shared.setLanguage(type)
    }
    
    //单例
    static let shared = LocalizableManager()
    
     private override init() {      }
    
    var bundle:Bundle = Bundle.main
    
    private func localValue(str:String) -> String{
        //table参数值传nil也是可以的,传nil系统就会默认为Localizable
        bundle.localizedString(forKey: str, value: nil, table: "Localizable")
    }
    

    
    private func setLanguage(_ type:LanguageType){
        var typeStr = ""
        switch type {
        case .chinese:
            typeStr = "zh-Hans"
            UserDefaults.standard.setValue("zh-Hans", forKey: "language")
        case .english:
            typeStr = "en"
            UserDefaults.standard.setValue("en", forKey: "language")
        default:
            break
        }
        //返回项目中 en.lproj 文件的路径
        let path = Bundle.main.path(forResource: typeStr, ofType: "lproj")
        //用这个路径生成新的bundle
        bundle = Bundle(path: path!)!
        if type == .auto {
            //和系统语言一致
            bundle = Bundle.main
            UserDefaults.standard.removeObject(forKey: "language")
        }
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "languageChanged"), object: nil)
    }

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

ViewController.swift

import UIKit

class ViewController: UIViewController {
    
    
    @IBOutlet var languageLabel: UILabel!
    @IBOutlet var chineseBtn: UIButton!
    @IBOutlet var englishBtn: UIButton!
    @IBOutlet var autoBtn: UIButton!
    
    func setupUI(){
        
        languageLabel.text = LocalizableManager.localValue("english")
        chineseBtn.setTitle(LocalizableManager.localValue("chinese"), for: .normal)
        englishBtn.setTitle(LocalizableManager.localValue("english"), for: .normal)
        autoBtn.setTitle(LocalizableManager.localValue("auto"), for: .normal)
    }
    
    
    @IBAction func chineseBtnClick(_ sender: UIButton) {
        LocalizableManager.setLanguage(.chinese)
    }
    
    @IBAction func englishBtnClick(_ sender: Any) {
        LocalizableManager.setLanguage(.english)
    }
    
    @IBAction func autoBtnClick(_ sender: Any) {
        LocalizableManager.setLanguage(.auto)
    }
    
    

    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
        NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "languageChanged"), object: nil,  queue: nil) { (notification) in
            self.setupUI()
        }
    }
    
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

AppDelegate.swift

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        if let languageType = UserDefaults.standard.value(forKey: "language"){
            print("进来")
            print(languageType)
            let type = languageType as! String
            switch type {
            case "en":
                LocalizableManager.setLanguage(.english)
            case "zh-Hans":
                LocalizableManager.setLanguage(.chinese)
            default:
                break
            }
        }
        return true
    }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

3.2 demo下载

下载地址:XXyueliang / iosMultiLanguage - gitee

  • demo截图
    请添加图片描述

3.3 参考博客

swift 国际化,app内部中英语言切换 - csdn(swift)

在iOS App内优雅的动态切换语言 - 简书(oc)

4.app(应用)名国际化

请添加图片描述

5.获取当前语言,获取系统语言

/// 获取系统语言方法
private func getCurrentLanguage() -> String {
    // let preferredLang = Bundle.main.preferredLocalizations.first! as NSString 这句不行
     let preferredLang = NSLocale.preferredLanguages.first! as NSString
    switch String(describing: preferredLang) {
    case "en-US", "en-CN":
        return "en"//英文
    case "zh-Hans-US","zh-Hans-CN","zh-Hant-CN","zh-TW","zh-HK","zh-Hans":
        return "cn"//中文
    default:
        return "en"
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

iOS国际化(多语言)App名称国际化

6.遇到问题:法语和德语显示汉语,我本来是想跟随系统,除汉语外,APP都显示英语

  • 下面是可以达到上面要求的代码
//
//  LocalizableManager.swift
//  MultiLanguage
//
//  Created by macvivi on 2022/3/20.

//

import UIKit

enum LanguageType {
    case chinese,english,auto
}


class LocalizableManager: NSObject {
    
    static func localValue(_ str:String) -> String {
        LocalizableManager.shared.localValue(str: str)
    }
    
    static func setLanguage(_ type:LanguageType){
        LocalizableManager.shared.setLanguage(type)
    }
    
    
    //单例
    static let shared = LocalizableManager()
    
     private override init() {
        
    }
    
    var bundle:Bundle = Bundle.main
    
    private func localValue(str:String) -> String{
        //table参数值传nil也是可以的,传nil系统就会默认为Localizable
        bundle.localizedString(forKey: str, value: nil, table: "Localizable")
    }
    
    /// 获取系统语言方法
    private func getCurrentLanguage() -> String {
        let preferredLang = NSLocale.preferredLanguages.first! as NSString
        switch String(describing: preferredLang) {
        case "en-US", "en-CN":
            return "en"//英文
        case "zh-Hans-US","zh-Hans-CN","zh-Hant-CN","zh-TW","zh-HK","zh-Hans":
            return "cn"//中文
        default:
            return "en"
        }
    }

    
    private func setLanguage(_ type:LanguageType){
        var typeStr = getCurrentLanguage()
        // cn: 中文
        print(typeStr)
        switch type {
        case .chinese:
            typeStr = "zh-Hans"
        case .english:
            typeStr = "en"
        default:
            break
        }

        
        //返回项目中 en.lproj 文件的路径
        let path = Bundle.main.path(forResource: typeStr, ofType: "lproj")
        //用这个路径生成新的bundle
        bundle = Bundle(path: path!)!


    }

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/942972
推荐阅读
  

闽ICP备14008679号