2017-05-09 23 views
1

アプリに複数の言語機能が必要です。ローカライゼーション文字列で言語を変更できますが、アプリを再起動しなければストーリーボードのテキストは変更されません。私は、テキストの整列を変更する必要があるユーザーにもアラビア語を追加しました。これは、アプリケーションを再起動するとうまくいきます。アプリを再起動せずにアプリの言語を変更したい

私はAppleLanguagesユーザーのデフォルトキーを使用して、動的テキストの言語とローカライズされた文字列を変更しています。 Objective Cのために

+0

を100%確かめるには、appControllerをappDelegateに設定してView Controllerを再ロードしています。 –

+0

@jitendra tanwar。あなたは最終的なソリューションのマルチランドを見つけましたか?助けてください –

+0

はい私はlangaugeの変更にrootviewコントローラをリロードすることによって問題を解決しました。また、ストーリーボード自体から言語を変更したい場合は、新たに追加したビュー(ラベル、ボタンなど)が他の言語ストーリーボードの文字列ファイルに存在するかどうかを確認してください。プロジェクトに複数の言語を追加した後に追加されたすべてのビュー(ラベル、ボタンなど)を手動で追加する必要があるためです。 –

答えて

0

+(void)setLanguage:(NSString*)language{ 

static dispatch_once_t onceToken; 
dispatch_once(&onceToken,^
{ 
    object_setClass([NSBundle mainBundle],[BundleEx class]); 
}); 
objc_setAssociatedObject([NSBundle mainBundle], &_bundle, language ? [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]] : nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

スウィフトの場合:

class func setLanguage(_ language: String) { 
var onceToken: Int 
if (onceToken == 0) { 
     /* TODO: move below code to a static variable initializer (dispatch_once is deprecated) */ 
    object_setClass(Bundle.main, BundleEx.self) 
} 
    onceToken = 1 
objc_setAssociatedObject(Bundle.main, bundle, language ? Bundle(path: Bundle.main.path(forResource: language, ofType: "lproj")) : nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
} 

は、上記の方法を追加し、ちょうどあなたが変換したい言語を渡します。あなたはその後、上記の方法にPARAMとして「JA」を送信ja.lprojを追加した場合

これは、再起動せずにストーリーボード言語を変換します。

希望します。

+0

bundleExとは –

関連する問題