app多语言设置 swift3

2017-12-14 10:50:00 Alan_xz 阅读数 1277

代码

1、创建Localizable.string文件

1、选中文件点击右侧菜单栏
2、点击Localize..
3、选中Base与English
图1
图2
图3

2、填写Localizable.string文件内容

Localizable.strings(Base)内容格式如下:

/*
 MDHomeViewController.swift
 */
"今日"="今日";
"明日"="明日";
"本周"="本周";
"本月"="本月";
"本年"="本年";

Localizable.strings(English)内容格式如下:

/*
 MDHomeViewController.swift
 */
"今日"="Today";
"明日"="Tomorrow";
"本周"="Weak";
"本月"="Month";
"本年"="Year";

2、查找项目中文内容并替换

 "[^"]*[\u4E00-\u9FA5]+[^"\n]*?"(OC 中为@"[^"]*[\u4E00-\u9FA5]+[^"\n]*?")


调用 NSLocalizedString 方法  
比如:NSLocalizedString(str:"今日")

func NSLocalizedString(str:String) -> String{
    return NSLocalizedString(str, comment: str)
}
记得以前是可以直接一键替换的 ,现在不知道是Xcode版本的问题还是什么 一直不成功,有知道的可以评论。我会及时更新,谢谢大家!
正则查询

StoryBoard Or Xib

1、选中文件点击右侧菜单栏
2、点击Localize..
3、选中Base与English
4、文件内容基本如下:
/* Class = "UILabel"; text = "微信"; ObjectID = "2c7-OE-g5X"; */
"2c7-OE-g5X.text" = "微信";
在English中把 "2c7-OE-g5X.text" = "微信";  替换成 "2c7-OE-g5X.text" = "weChat"; 即可
BEC8C7B8-FF73-4A1F-AA3D-9E967E16556F.png

infoPlist

1、创建InfoPlist.string文件
2、选中文件点击右侧菜单栏
3、点击Localize..
4、选中Base与English
5、在InfoPlist.string(English)中 :
CFBundleDisplayName="英文名";

附:快速导出项目中中文字符

我们已经知道如何识别项目中的字符串了,但是如何取出来使用呢? 这就需要遍历项目中所有的指定后缀(e.g: .h、.m等)的文件,然后利用正则表达匹配所有使用到的中文字符串,并写入文件中。为了方便起见,我将此过程写了一个Mac客户端小应用,可直接将选中的项目中所有的中文字符串,导出到指定的路径下;该应用还可以选择对于重复出现的中文字符串进行处理,以及还可以将中文字符串导出为繁体; 小应用更值得关注的是它导出的文件,可以直接拿来当做多语言文件中的key=value 使用,非常简单,喜欢的可以去下载看看, 含有源码的哦;小应用运行图如下:

1610415-af673e2626489737.jpg

可参考 去看看

2017-03-05 22:30:05 feng2qing 阅读数 12841

一:跟随系统切换语言

1>创建好项目工程后, 新建一个多语言文件:

这里写图片描述

2>添加要设置的语言类型:

这里写图片描述

3>添加成功

这里写图片描述

细心的朋友可能会发现在English后面写的是3 Files Localized,这是因为英语是系统默认添加的,而且同时为Main.storyboardLaunchScreen.storyboard设置了多语言,我在自己添加的时候没有勾选这两项.

3>使用多语言文件在应用内设置对应语言

"label"="label";
"label"="标签";
"label"="ラベル";

4>在类中为控件赋值

NSLocalizedString的使用,有一个必要的条件,就是:多语言文件名字必须是Localizable,否则到最后显示的只能是key;者中设置完之后只能让应用跟随系统的语言版本进行切换,而用户不能手动进行切换

label.text = NSLocalizedString("label", nil)

相关宏说明

//跟随系统切换, 多语言文件名必须是Localizable
NSLocalizedString("label", nil);
//下面三个都可以手动设置多语言
//第一个参数:是多语言中的key
//第二个参数:是多语言文件的名字
//第三个参数:是对key的注释说明,一般传nil
NSLocalizedStringFromTable(@"label", @"STLocalizable", nil);
//指定多语言文件名和bundle
NSLocalizedStringFromTableInBundle(@"label", @"STLocalizable", bundle, nil);
//在上面的基础上增加一个默认值的参数
NSLocalizedStringWithDefaultValue(@"label", @"STLocalizable", bundle, @"label", nil);

也可以使用NSLocalizedStringFromTable

label.text = NSLocalizedStringFromTable(@"label", @"STLocalizable", nil);

这样在切换系统语言之后,启动应用后APP内部的语言也就跟着切换了


二:APP内手动切换语言

1>项目工程Show in Finder后,发现每一种语言都对应一个文件夹,后缀是.lproj,

这里写图片描述

在APP内切换语言的时候,实际上就是取这些文件夹中的STLocalizable.strings文件

这里写图片描述

2>获取STLocalizable.strings

获取这里写图片描述文件的value值,对应的想要切换语言的话,直接切换pathForResource后面的参数即可

NSString *path = [[NSBundle mainBundle] pathForResource:@"zh-Hans" ofType:@"lproj"];
NSString *labelString = [[NSBundle bundleWithPath:path] localizedStringForKey:@"label" value:nil table:@"STLocalizable"];
NSLog(@"result: %@", labelString);
//输出:MultiLanguage[1887:72599] result: 标签

3>在应用内切换语言,用NSUserDefaults存储当前语言

- (IBAction)changeLanguage:(UIButton *)sender {
    switch (sender.tag) {
        case 10: { //中文
            [[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:appLanguage];
        } break;
        case 11: { //日文
            [[NSUserDefaults standardUserDefaults] setObject:@"ja" forKey:appLanguage];
        } break;
        case 12: { //英文
            [[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:appLanguage];
        }  break;
        default:
            break;
    }
}

4>程序退出去后,下次进入继续使用上次关闭程序的语言

//根据NSUserDefaults的key去取多语言类型
NSString *laguageType =[NSString stringWithFormat:@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"appLanguage"]];
//在文件目录中确认多语言类型对应的路径
NSString *path = [[NSBundle mainBundle] pathForResource:laguageType ofType:@"lproj"];
//在多语言文件中查找label对应的值
NSString *labelText = [[NSBundle bundleWithPath:path] localizedStringForKey:@"label" value:nil table:@"ASLocalized"];
self.label.text = labelText;

扩展

用户第一次启动APP的时候显示什么语言

1>默认设置一种语言,比如英文,在APPDelegatedidFinishLaunchingWithOptions中:

if (![[NSUserDefaults standardUserDefaults] objectForKey:appLanguage]) { 
    //默认设为英文
    [[NSUserDefaults standardUserDefaults] setObject:@"en"  forKey:appLanguage];
}

2>跟随系统语言

需要获取系统的首选语言顺序,然后取第一个首选语言

//获取第一个首选语言
NSString *language = [NSLocale preferredLanguages][0];

或者判断做好的语言版本,在首选语言数组中是否存在

if (![[NSUserDefaults standardUserDefaults] objectForKey:appLanguage]) {
    NSArray  *languages = [NSLocale preferredLanguages];
    NSString *language = [languages objectAtIndex:0];
    if ([language hasPrefix:@"zh-Hans"]) {
        [[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:appLanguage];
    } else if ([language hasPrefix:@"ja"] ) {
        [[NSUserDefaults standardUserDefaults] setObject:@"ja" forKey:appLanguage];
    } else {
        [[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:appLanguage];
    }
}

修改系统默认开发语言(默认英语)

多语言开发可能用到的方法

#define LanguageKey @"appLanguage"
//获取当前语言
[[NSUserDefaults standardUserDefaults] objectForKey:LanguageKey];
//获取首选语言顺序
[NSLocale preferredLanguages];
//获取首选语言第一语言
[[NSLocale preferredLanguages] objectAtIndex:0];
//获取系统所有语言
[NSLocale availableLocaleIdentifiers];
//获取当前语言文件路径
NSString *currentLanguage = [[NSUserDefaults standardUserDefaults] ;objectForKey:LanguageKey];
NSString *path = [[NSBundle mainBundle] pathForResource:currentLanguage ofType:@"lproj"];
//根据key获取当前语言对应的本地字符串(参数value:如果key是nil或key在表中找不到本地化字符串,则返回的值。)
NSString *value = [[NSBundle bundleWithPath:path] localizedStringForKey:@"label" value:nil table:@"TiLocalizable"];
2018-12-13 11:46:47 qq_25639809 阅读数 1237

选择工程,添加一个语言
在这里插入图片描述

创建名为Localization的strings文件,并在右侧勾选语言
在这里插入图片描述
在strings文件里分别定义字符串的值
在这里插入图片描述

"Cancel" = "Cancel";
"OK" = "OK";
"Cancel" = "取消";
"OK" = "确定";

新建文件,处理语言的获取和保存修改

import Foundation

enum Language {
    case english
    case chinese
}

class LocalizationTool {
    
    static let shared = LocalizationTool()
    
    let defaults = UserDefaults.standard
    var bundle: Bundle?
    var currentLanguage: Language = .english
    
    func valueWithKey(key: String) -> String {
        let bundle = LocalizationTool.shared.bundle
        if let bundle = bundle {
            return NSLocalizedString(key, tableName: "Localization", bundle: bundle, value: "", comment: "")
        } else {
            return NSLocalizedString(key, comment: "")
        }
    }
    
    func setLanguage(language: Language) {
        if currentLanguage == language {
            return
        }
        switch language {
        case .english:
            defaults.set("en", forKey: Keys.language)
            break
        case .chinese:
            defaults.set("cn", forKey: Keys.language)
            break
        }
        currentLanguage = getLanguage()
    }
    
    func checkLanguage() {
        currentLanguage = getLanguage()
    }
    
    private func getLanguage() -> Language {
        var str = ""
        if let language = defaults.value(forKey: Dex4DKeys.language) as? String {
            str = language == "cn" ? "zh-Hans" : "en"
        } else {
            str = getSystemLanguage()
        }
        if let path = Bundle.main.path(forResource:str , ofType: "lproj") {
            bundle = Bundle(path: path)
        }
        return str == "en" ? .english : .chinese
    }
    
    private func getSystemLanguage() -> String {
        let preferredLang = Bundle.main.preferredLocalizations.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 "zh-Hans"
        default:
            return "en"
        }
    }
}

extension String {
    var localized: String {
        return LocalizationTool.shared.valueWithKey(key: self)
    }
}

再APPDelegate种调用,获取系统语言

LocalizationTool.shared.checkLanguage()

字符串多语言赋值:

let cancel = "Cancel".localized
let ok = "OK".localized
2017-06-30 10:04:16 aa654403231 阅读数 2139

重点是app 内部切换

1.配置languege.strings.infoPist.Strings












2.LocalizationTool.swift,实现内部切换

//
//  LocalizationTool.swift
//  IFXY
//
//  Created by LiuXing on 2017/3/7.
//  Copyright © 2017年 IFly. All rights reserved.
//

import UIKit

class LocalizationTool: NSObject {
     static let shareInstance = LocalizationTool()

     let def = UserDefaults.standard
     var bundle : Bundle?
     
     func valueWithKey(key: String!) -> String {
          let bundle = LocalizationTool.shareInstance.bundle
          let str = bundle?.localizedString(forKey: key, value: nil, table: "Language")
          return str!
     }
//    class func valueWithKey(key: String!) -> String {
//        
//        let languageString = SynthesizerSettingTool.shareIntance.vocieParams?.languageType
//        let path = Bundle.main.path(forResource: languageString!, ofType: "lproj")
//        let value = (Bundle.init(path: path!)?.localizedString(forKey: key, value: nil, table: "Language"))!
//        return value
//    }
     
     func setLanguage(langeuage:String) {
          var str=langeuage
          if langeuage=="" || langeuage==nil{
               
               let languages:[String]=UserDefaults.standard.object(forKey: "AppleLanguages") as! [String]
               let str2:String=languages[0]
               if ((str2=="zh-Hans-CN")||(str2=="zh-Hans")){
                    str="zh-Hans"
               }else{
                    str="en"
               }
               
          }
          UserDefaults.standard.set(str, forKey: "langeuage")
          UserDefaults.standard.synchronize()
          let path = Bundle.main.path(forResource:str , ofType: "lproj")
          bundle = Bundle(path: path!)
//          def.set(langeuage, forKey: UserLanguage)
//          def.synchronize()
          NotificationCenter.default.post(name: NSNotification.Name(rawValue: "LanguageChanged"), object: nil)

          
     }
}

3.在appdelegate里面     

       var languege:String=""
//        guard languege==UserDefaults.standard.value(forKey: "langeuage") as! String else{
//               languege=""
//        }
        if  (UserDefaults.standard.value(forKey: "langeuage")) != nil {
            languege=UserDefaults.standard.value(forKey: "langeuage") as! String
        }
        LocalizationTool.shareInstance.setLanguage(langeuage: languege)

4.语言切换界面



  func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        
        tableView.deselectRow(at: indexPath, animated: false)
        selectCol = indexPath.row
        tableView.reloadData()
        if   indexPath.row == 0 { 
 
          LocalizationTool.shareInstance.setLanguage(langeuage: "zh-Hans")
        }  else { 
 
          LocalizationTool.shareInstance.setLanguage(langeuage: "en")
        }
     

    
    }
点击切换语言之后,需要立即修改之前缓存的页面

 

        NotificationCenter.default.addObserver(self, selector: #selector(changeLanguage), name: NSNotification.Name(rawValue: "LanguageChanged"), object: nil)

页面所有的viewdidload方法里面加上监听

 

 func changeLanguage(){
           items = [["title": LocalizationTool.shareInstance.valueWithKey(key: "my_language_zh")],["title": LocalizationTool.shareInstance.valueWithKey(key: "trans_title_en")]]
          self.title = LocalizationTool.shareInstance.valueWithKey(key: "my_language_switch")//"切换语言"
          
          if (UserDefaults.standard.value(forKey: "langeuage") as! String) == "en"{ // 英语
               selectCol = 1
          } else {
               selectCol = 0
          }
          m_TableView.reloadData()
    }

tip:日期选择器

fileprivate lazy var datePicker:UIDatePicker = {[unowned self] in
        let datePic = UIDatePicker()
        datePic.backgroundColor = UIColor.white
     let languege=UserDefaults.standard.value(forKey: "langeuage") as! String
     var sexstr=UserAccountTool.shareIntance.account?.sex
     if languege=="en" {
          datePic.locale = Locale(identifier: "en")

 }else{
        datePic.locale = Locale(identifier: "zh_CN")  
     }
//        datePic.locale = Locale(identifier: "zh_CN")
        return datePic
        
    }()


2017-09-05 10:51:23 amberoot 阅读数 2001

1. 首先要配置localizable.strings,如下图:

详细的配置过程这里就不说了,可以另行百度。今天主要说的是怎样在内部切换语言环境。


2.  新建类:LanguageHelper.swift

代码中注释已经很详细了,这里就不多说了。请看代码:

//
//  LanguageHelper.swift
//
//  Created by amberoot on 17/8/24.
//  Copyright  2017年 amberoot. All rights reserved.
//

import UIKit

class LanguageHelper: NSObject {
    //单例
    static let shareInstance = LanguageHelper()
    
    let def = UserDefaults.standard
    var bundle : Bundle?
    
    ///根据用户设置的语言类型获取字符串
    func getUserStr(key: String) -> String
    {
         // 获取本地化字符串,字符串根据手机系统语言自动切换
        let str = NSLocalizedString(key, comment: "default")
        return str
    }
    ///根据app内部设置的语言类型获取字符串
    func getAppStr(key: String) -> String
    {
        // 获取本地化字符串,字符串会根据app系统语言自动切换
        let str = NSLocalizedString(key, tableName: "Localizable", bundle: LanguageHelper.shareInstance.bundle!, value: "default", comment: "default")
        return str
    }
    
    ///设置app语言环境
    func setLanguage(langeuage: String) {
        var str = langeuage
        //如果获取不到系统语言,就把app语言设置为首选语言
        if langeuage == "" {
            //获取系统首选语言顺序
            let languages:[String] = UserDefaults.standard.object(forKey: "AppleLanguages") as! [String]
            let str2:String = languages[0]
            //如果首选语言是中文,则设置APP语言为中文,否则设置成英文
            if ((str2=="zh-Hans-CN")||(str2=="zh-Hans"))
            {
                str = "zh-Hans"
            }else
            {
                str="en"
            }
            
        }
        //语言设置
        def.set(str, forKey: "langeuage")
        def.synchronize()
        //根据str获取语言数据(因为设置了本地化,所以项目中有en.lproj和zn-Hans.lproj)
        let path = Bundle.main.path(forResource:str , ofType: "lproj")
        bundle = Bundle(path: path!)
 
    
    }
}


3. LanguageHelper.swift的应用

(1)在AppDelegate.swift中设置app的初始语言

可以获取手机系统语言来设置APP的初始语言环境,也可以根据自己的需求设置APP的初始语言环境。




(2)实际应用:配置label的text或button的title等等



参考博客地址:http://www.zhimengzhe.com/bianchengjiaocheng/swift/337155.html