2016-07-27 10 views
0

実行時に自分のアプリケーション言語を変更したいと思います。そのために私は
iOSアプリケーションの実行時のローカライゼーション

.hファイルのようなカテゴリクラスを実装しました。

@interface NSBundle (Language) 

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

@end 


.mファイル

#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 (Language) 

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

    [[NSNotificationCenter defaultCenter] postNotificationName:@"changeLanguage" object:self]; 
} 


とボタンで[NSBundle setLanguage:langCode];
のような言語の変更]をクリックしますが、今、私は私が
などのラベルテキストを設定するために何を書くべきだと少し混乱しています

lbl.text = ? 


言語の効果を表示するにはまだアプリを再起動する必要があるためです。

答えて

0

iOSには複数の言語用のローカリゼーションファイルがあります.Lisation/Localizable.stringsで見つけることができます。 Localizable.strings(英語)では

"text" = "This is a text"; 

次に、関数の中で、あなたの設定テキストコードを置きます。そのため、言語を切り替えた後にテキストを再描画することができます。

func loadText() { 
    lbl.text = String.localizedString("text") 
} 

func changeLanguage() { // Change Language Notification 
    loadText() 
} 
+0

私は1つのviewcontrollerだけでなく、アプリの遅れを完全に調整したいと思っています。 –

+0

あなたのアプリのすべてのView Controllerのテキストを変更することはできません。しかし、すべてのView ControllerのviewWillAppearにloadText関数を置くことができます。 – steven2211

+0

私はそれが可能だと思います。あなたは私の質問でそれを可能にすることができますが、私はアプリを再起動する必要があります。 –

関連する問題