iOS - 多语言工具类

iOS App本地化,多语言工具类

复制代码
//
//  LanguageManager.swift
//  InledcoLightSwift
//
//  语言工具类
//
//  Created by huang zhengguo on 2017/10/12.
//  Copyright © 2017年 huang zhengguo. All rights reserved.
//

import UIKit

class LanguageManager {
    
    // 语言列表定义
    enum LanguageFlag: String {
        case auto = "auto"          // 自动,跟随系统
        case english = "en"         // 英文
        case chinese = "zh-Hans"    // 中文
    }
    
    // 语言文件
    static private let languageFile = ""
    // 用户保存标记
    static private var languageFilePath: String?
    static private var bundle: Bundle?
    static private var currentLanguageFlag: LanguageFlag! = .auto
    static private let userLangDefineFlag: String = "USERLANGUAGEFLAG"
    
    /// 根据键获取对应语言文本
    /// - parameter key: 键值
    ///
    /// - returns: 键值对应的文本
    class func getValueForKey(key: String) -> String {
        let language = LanguageFlag.chinese
        
        self.languageFilePath = Bundle.main.path(forResource: language.rawValue, ofType: "lproj")
        self.bundle = Bundle.init(path: self.languageFilePath!)
        
        if self.bundle != nil {
            return (self.bundle?.localizedString(forKey: key, value: nil, table: self.languageFile))!
        }
        
        return Bundle.main.localizedString(forKey: key, value: nil, table: self.languageFile)
    }
    
    /// 获取当前语言标记
    ///
    /// - returns: 当前语言标记
    static func getCurrentLanguageFlag() -> LanguageFlag! {
        let languageStr = UserDefaults.standard.object(forKey: self.userLangDefineFlag) as? String
        switch languageStr {
        case LanguageFlag.auto.rawValue?:
            return LanguageFlag.auto
        case LanguageFlag.english.rawValue?:
            return LanguageFlag.english
        case LanguageFlag.chinese.rawValue?:
            return LanguageFlag.chinese
        default:
            return LanguageFlag.auto
        }
    }
    
    /// 设置语言
    /// - parameter language: 表示语言的枚举
    ///
    /// - returns: void
    class func setLanguage(language: LanguageFlag!) -> Void {
        // 1.如果用户设置和当前设置相同,则直接返回
        if language == self.currentLanguageFlag {
            return
        }
        
        // 2.如果不同,则设置新语言
        if language.rawValue == LanguageFlag.auto.rawValue {
            // 如果选择的是自动,则删除用户的设置
            UserDefaults.standard.removeObject(forKey: self.userLangDefineFlag)
            self.languageFilePath = nil
            self.bundle = nil
        } else {
            // 获取语言文件
            self.languageFilePath = Bundle.main.path(forResource: language.rawValue, ofType: "lproj")
            self.bundle = Bundle.init(path: self.languageFilePath!)
            // 存储到本地
            UserDefaults.standard.setValue(language.rawValue, forKey: self.userLangDefineFlag)
        }
        
        // 3.重新获取当前设置
        self.currentLanguageFlag = self.getCurrentLanguageFlag()
    }
}
复制代码

 

posted @   sims  阅读(217)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示