2016-05-03 103 views
4

我正在研究一个具有切换按钮的应用程序,以便在英语和阿拉伯语之间进行切换,并且应该在飞行中。我用了https://github.com/maximbilan/ios_language_manager的方法,除非故事板是通过接口不是字符串本地化它工作在所有情况下罚款:使用本地化的故事板动态本地化

enter image description here

现在,当我重新加载这样的根视图控制器:

func reloadRootVC(){ 

    let delegate : AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 

    let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) 

    delegate.window?.rootViewController = (storyboard.instantiateInitialViewController()) 
} 

它使用本地化的字符串和RTL重新加载根目录,但英文故事板不是阿拉伯语的。

试图强制装载阿拉伯语一个这样的:

let storyboard = UIStoryboard(name: "Main", bundle: NSBundle(path: NSBundle.mainBundle().pathForResource(LanguageManager.currentLanguageCode(), ofType: "lproj")!)) 

但不幸的是它加载的故事板,但没有图像。它无法读取任何资源图像。

+0

不幸的是,你将会遇到很多麻烦,使它能够用于接口,以及让RTL UI的行为正确,更不用说格式化器和本地化格式字符串没有做正确的事情。 The一般的期望是,应用程序遵循系统语言,并且不实施应用程序内语言切换器......从长远来看,它将为您节省很多麻烦。:( – wakachamo

回答

0

我结束了被外界并将其命名为主要-AR移动阿拉伯故事板,然后在UIStoryboard添加一个扩展名调酒和故事板的初始化加-AR到分镜头名称末尾如果我在阿拉伯语模式。

extension UIStoryboard { 
public override class func initialize() { 
    struct Static { 
     static var token: dispatch_once_t = 0 
    } 

    // make sure this isn't a subclass 
    if self !== UIStoryboard.self { 
     return 
    } 

    dispatch_once(&Static.token) { 
     let originalSelector = #selector(UIStoryboard.init(name:bundle:)) 
     let swizzledSelector = #selector(UIStoryboard.initWithLoc(_:bundle:)) 

     let originalMethod = class_getClassMethod(self, originalSelector) 
     let swizzledMethod = class_getClassMethod(self, swizzledSelector) 

     class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)) 

     method_exchangeImplementations(originalMethod, swizzledMethod) 

    } 
} 

// MARK: - Method Swizzling 

class func initWithLoc(name: String, bundle storyboardBundleOrNil: NSBundle?) -> UIStoryboard{ 
    var newName = name 
    if LanguageManager.isCurrentLanguageRTL(){ 
     newName += "-AR" 
     if #available(iOS 9.0, *) { 
      UIView.appearance().semanticContentAttribute = .ForceRightToLeft 
     } else { 
      // Fallback on earlier versions 

     } 
    } 
    else{ 
     if #available(iOS 9.0, *) { 
      UIView.appearance().semanticContentAttribute = .ForceLeftToRight 
     } else { 
      // Fallback on earlier versions 
     } 
    } 
    return initWithLoc(newName, bundle: storyboardBundleOrNil) 
} 
} 
0

变化,这是用来初始化故事板捆绑:

 let path = Bundle.main.path(forResource: "ar", ofType: "lproj") 
     let bundle = Bundle(path: path!) 
     let delegate : AppDelegate = UIApplication.shared.delegate as! AppDelegate 
     let storyboard = UIStoryboard(name: "Main", bundle: bundle) 
     delegate.window?.rootViewController = (storyboard.instantiateInitialViewController()) 

虽然这种变化基于语言的故事板,但不加载图像! :(