2016-10-14 3 views
2

내 스토리 보드 (영어, 아랍어) 용으로 현지화를 만들었으며 앱을 변경 (전환) 한 기능을 수행했습니다. 언어 (로컬) 그것은 수동으로 응용 프로그램을 다시 시작 (다시 실행)하면 완벽하게 작동합니다. 뷰는 아랍어이면 Left-Right로, 영어이면 Left-Right로 플립하지만, 내 app을 수동으로 다시 시작하지 않고 어떻게 스토리 보드를 변경할 수 있습니까? 신속하게 프로그래밍 방식으로 앱을 다시로드하십시오.

나는 사전에 언어를

func setLocale(langCode:String){ 

    NSUserDefaults.standardUserDefaults().setObject([langCode], forKey: "AppleLanguages") 
    NSUserDefaults.standardUserDefaults().synchronize() 

} 

감사를 변경하려면이 기능을 사용했다.

+0

[ios swift에서 현지화가 가능합니다. 어떻게 런타임에 응용 프로그램 언어를 변경할 수 있습니까?] (http://stackoverflow.com/questions/35425788/localization-in-ios-swift-how-can-i-change-application-language-at-run-time) – MwcsMac

+0

NSLocalizedString 및 스토리 보드 현지화를 사용하고 있으므로 레이블을 변경하지 않으려 고합니다. 아랍어의 경우 오른쪽 - 왼쪽 또는 영어의 경우 왼쪽 - 오른쪽으로 이동해야하므로 번들을 다시로드해야합니다. 나는 많은 애플 리케이션을 보았다. 새 언어를 선택하자마자 선택한 언어로 된 앱이 다시 실행됩니다. – Diyaa

+0

이 요점을 확인하십시오. https://gist.github.com/afshin-hoseini/a46f431fbe6bb20fde8e8ed675e81018 – Afshin

답변

2

이렇게하면됩니다. 그러나이 코드는 Obj-C에 있습니다.

은 다음과 같이 NSBundle의 카테고리 클래스 만들기 :이 후

#import "NSBundle+ForceLocalization.h" 
#import <objc/runtime.h> 


static const char _bundle=0; 
@interface BundleEx : NSBundle 
@end 

@implementation BundleEx 

-(NSString*)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName 
{ 
    NSBundle* bundle=objc_getAssociatedObject(self, &_bundle); 
    return bundle ? [bundle localizedStringForKey:key value:value table:tableName] : [super localizedStringForKey:key value:value table:tableName]; 
} 
@end 

@implementation NSBundle (ForceLocalization) 

+(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); 
} 
@end 

, 단순히 전화 :

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects: langCode, nil] 
                forKey:@"AppleLanguages"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 
[NSBundle setLanguage: langCode]; 

는 다시 현재 화면의 UI를 다시로드해야합니다. 다른 컨트롤러로 이동하면 업데이트 된 언어가 표시됩니다.

+0

의견을 보내 주셔서 감사 드리며 전에 Obj-C에서 작동하지 않았습니다. – Diyaa

관련 문제