最近一个app需要实现切换语言的功能。
如果项目是纯代码编写的话,不涉及stroyboard。则这个只需要指定不同语言包里面的指定的table就可以了(默认是Localizable.Strings)
实现过程如下:
1.获得目标语言包.lproj文件的bundle(一般都是mainBundle)
2.利用这个bundle指定你的table(若指定为nil则默认是Localizable.Strings),使用func localizedStringForKey(key: String, value: String?, table tableName: String?) -> String
我的项目里面包含了storyboard,则需要对storyboard进行国际化。参考了这篇文章IOS APP 国际化 程序内切换语言实现 不重新启动系统(支持项目中stroyboard 、xib 混用。完美解决方案)
1.在xocde6里面,对storyboard进行国际化有两种形式,
就是interface builder storyboard和localizable strings两种。localizable strings这种是很常见的替换storyboard里的字符串文件,而interface builder storyboard则是一个完整的storyboard,你能修改更多东西(比如约束,图片等)但是要注意的是,这几个storyboard是独立的,就是说,比如你想要添加一个按钮,你要在这些stroyboard里逐个添加按钮,然后逐个连约束。
2.我国际化的storyboard使用的是interface builder storyboard这种形式,假如想再app内切换语言,第一就是切换Localizable文件,第二就是就是切换storyboard文件。
2.1 切换Localizable文件,可以拿到.lproj目录下的Localizable文件path作为bundle切换
// 获得语言bundle
let path = bundle.pathForResource(curLanguage, ofType: "lproj")
if (path != nil) {
newBundle = NSBundle(path: path!)!
}
// 用刚才获得的bundle作为国际化
newBundle.localizedStringForKey(key, value: "", table: table)
2.2切换stroyboard文件,其实也是同样的拿到.lproj目录下的stroyboard文件,然后把keywindow的rootViewController切换成新stroyboard的initial Controller。
// 获得语言bundle
let path = bundle.pathForResource(curLanguage, ofType: "lproj")
if (path != nil) {
newBundle = NSBundle(path: path!)!
}
// 这里需要指定你storyboard的initial Controller的storybordID
let sb = localizedStrongWithName(UIStoryboard(name: name, bundle: newBundle)
let vc = sb.instantiateViewControllerWithIdentifier(stroyboardInitIdentifier) as! UIViewController
UIApplication.sharedApplication().keyWindow?.rootViewController = vc
2.3 假如你成功切换storyboard之后你可能会发现,app里的图片都没了。这个时候需要对图片进行国际化,一个比较简单的做法就是,直接把需要用到的图片拖进行项目里(不放到Image.xcassets),然后点击图片右则属性栏进行国际化。
最后:建议storyboard的国际化放到项目最后再做,因为想要在添加什么ui元素的话要同时在多个storyboard上操作,十分没必要。。。
网友评论