xcode6下storyboard国际化的一点思路

最近一个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上操作,十分没必要。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Demo同步更新到Swift2.3本文地址: http://mokai.me/iOS-i18n.html 在真正...
    _GKK_阅读 5,890评论 13 55
  • 国际化(Internationalization ,简写为I18N)的作用是防止将本土文化信息写死仔应用里(所谓本...
    西西西瓜啊阅读 11,393评论 23 15
  • Info.plist 用于向 iOS 提供关于 app , bundle 或者 framework 的一些重要信息...
    Alfred_小乐阅读 2,468评论 1 0
  • 感恩文姐组织集体观看《摔跤吧爸爸》!!!第二次看了,真是好电影!分享几点感悟:1、永远不要放弃梦想,有梦想谁都了不...
    幸福储钱罐阅读 157评论 0 1
  • javascript中的原型链与继承javascipt中的原型链和继承机制是这门语言所特有的,但js中的原型机制也...
    咖啡豆Bruce阅读 242评论 0 0