Ios 故事板在运行时的本地化

Ios 故事板在运行时的本地化,ios,xcode,swift,localization,storyboard,Ios,Xcode,Swift,Localization,Storyboard,我在谷歌上发了很多关于IOS应用程序本地化的帖子。然而,他们中的大多数人都在谈论objective-C,而没有提到swift语言。我只是想知道,在运行时更改情节提要时,是否可以在Xcode中使用内置的定位功能。请参见下面的链接示例。多谢各位 您必须编写自定义的本地化方法,否则在iPhone中您只能从系统设置更改,这肯定会使设备重新启动,在这里,我在SWIFT中创建了一个自定义模块应用程序内本地化,从中可以在运行时更改应用程序的语言 如果您想以编程方式本地化故事板的标签,只需将UILabel子类化

我在谷歌上发了很多关于IOS应用程序本地化的帖子。然而,他们中的大多数人都在谈论objective-C,而没有提到swift语言。我只是想知道,在运行时更改情节提要时,是否可以在Xcode中使用内置的定位功能。请参见下面的链接示例。多谢各位


您必须编写自定义的本地化方法,否则在iPhone中您只能从系统设置更改,这肯定会使设备重新启动,在这里,我在SWIFT中创建了一个自定义模块应用程序内本地化,从中可以在运行时更改应用程序的语言


如果您想以编程方式本地化故事板的标签,只需将UILabel子类化,并在设置文本后对其进行翻译即可。因此,您不需要创建另一个故事板

class TranslatedLabel: UILabel {

    override func drawTextInRect(rect: CGRect) {
        self.text = Language.sharedInstance.stringforKey(self.text!)
        super.drawTextInRect(rect)
    } 
}

class Language {
    class var sharedInstance : Language {
        struct Static {
            static var onceToken : dispatch_once_t = 0
            static var instance : Language? = nil
        }
        dispatch_once(&Static.onceToken) {
            Static.instance = Language()
        }
        return Static.instance!
    }

    func stringforKey(key:String)->String{
        let lan:String =     NSUserDefaults.standardUserDefaults().objectForKey("language") as! String
        let string:String?
        if lan.containsString("Hans"){
            let path = NSBundle.mainBundle().pathForResource("zh-Hans", ofType: "lproj")
            let bundle = NSBundle(path: path!)
            string = bundle?.localizedStringForKey(key, value: nil, table: nil)
        }else if lan.containsString("Hant"){
            let path = NSBundle.mainBundle().pathForResource("zh-Hant", ofType: "lproj")
            let bundle = NSBundle(path: path!)
            string = bundle?.localizedStringForKey(key, value: nil, table: nil)
        }else{
            let path = NSBundle.mainBundle().pathForResource("en", ofType: "lproj")
            let bundle = NSBundle(path: path!)
            string = bundle?.localizedStringForKey(key, value: nil, table: nil)
        }

        return string!
    }
}

Dip-感谢您的快速响应,并为我提供解决方案。但是,我希望使用main.strings文件,而不是自己构建它。谢谢你,伙计!我也尝试了很多方法来解决这个问题,并且达到了这个程度,欢迎您改进:)Dip-我想分享一些我已经测试过的东西。我使用了下面的代码,可以用不同的语言调用新的故事板。但是,这不是重新加载情节提要。var b:UIStoryboard=UIStoryboard(名称:“Main”,bundle:NSBundle(路径:NSBundle.mainBundle().pathForResource(“en”,类型:“lproj”)!)var r:UIViewController=b.实例化初始视图控制器()为!UIViewController self.presentViewController(r,动画:true,完成:nil)Dip-粘贴下面的代码后,我可以使用main.strings语言文件重新加载情节提要。但是,可以找到其他资源文件,如图像。var b:UIStoryboard=UIStoryboard(名称:“Main”,bundle:NSBundle(路径:NSBundle.mainBundle().pathForResource(“zh Hant”,类型:“lproj”)!)var r:UIViewController=b.实例化初始视图控制器()为!UIViewController UIApplication.sharedApplication().keyWindow?.rootViewController=ryes!但是我认为用另一个完整的设计实例化另一个故事板可能不是正确的解决方案!对于图像,这是应该使用的技术!但是在故事板本地化的情况下,我们使用相同的故事板,但是字符串是从本地化的字符串文件中使用的!顺便说一句,用于共享的thnks:)