【问题标题】:Storyboard localization swift at runtime故事板在运行时快速本地化
【发布时间】:2015-10-26 08:36:55
【问题描述】:

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

http://tinypic.com/view.php?pic=fw3cyu&s=8#.VcBAIniloRl

【问题讨论】:

    标签: ios xcode swift localization storyboard


    【解决方案1】:

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

    中更改应用的语言

    https://github.com/pr0gramm3r8hai/InAppLocalize

    【讨论】:

    • Dip - 感谢您的快速回复并为我提供解决方案。但是,我想使用 main.strings 文件而不是自己构建它。谢谢。
    • 厕所男人!我也尝试了很多来解决这个问题,并且达到了这么多,欢迎您改进,:)
    • Dip - 我想分享一些我已经测试过的东西。我使用下面的代码可以用不同的语言调用新的故事板。但是,这不是重新加载情节提要。 var b : UIStoryboard = UIStoryboard(name:"Main", bundle: NSBundle(path: NSBundle.mainBundle().pathForResource("en", ofType: "lproj")!)) var r : UIViewController = b.instantiateInitialViewController()作为! UIViewController self.presentViewController(r, animated: true, completion: nil)
    • Dip - 粘贴下面的代码后,我可以使用 main.strings 语言文件重新加载情节提要。但是,可以定位其他资源文件,例如图像。 var b : UIStoryboard = UIStoryboard(name:"Main", bundle: NSBundle(path: NSBundle.mainBundle().pathForResource("zh-Hant", ofType: "lproj")!)) var r : UIViewController = b.instantiateInitialViewController () 作为! UIViewController UIApplication.sharedApplication().keyWindow?.rootViewController=r
    • 是的!但我认为用完整的另一个设计实例化另一个故事板可能不是正确的解决方案!在图像的情况下,这是应该使用的技术!但在故事板本地化的情况下,我们使用相同的故事板,但字符串来自本地化字符串文件!顺便说一句谢谢分享:)
    【解决方案2】:

    如果您想以编程方式本地化情节提要的标签,您可以简单地将 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!
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-05-02
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      相关资源
      最近更新 更多