2016-05-03 11 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ではルートをリロードしますが、英語のストーリーボードではアラビア語ではありません。

は、このようなアラビア1ロード力を試してみました:

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

を残念ながら、それは、ストーリーボードをロードしますが、画像はありませんと。リソースイメージを読み取ることはできません。

+0

残念なことに、これはインターフェイスのために、RTL UIが正しく動作するようにするために多くの問題を抱えています。フォーマッタとローカライズされた書式文字列は正しいことをしません。 一般的な期待は、アプリケーションがシステム言語に従い、インアプリ言語スイッチャーを実装していないということです。長期的には多くの問題を解決します。 – wakachamo

答えて

0

アラビア語のストーリーボードを外側に移動してMain-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()) 

をこの言語に基づいたストーリーボードを変更するが、イメージをロードしませんが! :

関連する問題