在IOS中如何在运行时切换到语言后获得本地化的故事板string?

我有以下代码来切换语言运行时:

-(void) switchToLanguage:(NSString *)lang{ self.language = lang; [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:self.language, nil] forKey:@"AppleLanguages"]; [[NSUserDefaults standardUserDefaults] synchronize]; } 

我有一个帮助函数来检索本地化的string:

 +(NSString *) getLocalizedString:(NSString *)key{ AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; NSString *path = [[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"strings" inDirectory:nil forLocalization:appDelegate.language]; NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path]; return [dict objectForKey:key]; } 

这是工作。 我的故事板也是本地化的,但是当我切换到另一种语言时,它们并没有改变。

我如何获得故事板string的本地化值?

在运行时更改语言有点棘手。

这是我在这个小小的class级的帮助下做的最好的方式:

Language.m:

 #import "Language.h" @implementation Language static NSBundle *bundle = nil; +(void)initialize { NSUserDefaults* defs = [NSUserDefaults standardUserDefaults]; NSArray* languages = [defs objectForKey:@"AppleLanguages"]; NSString *current = [languages objectAtIndex:0]; [self setLanguage:current]; } +(void)setLanguage:(NSString *)l { NSString *path = [[ NSBundle mainBundle ] pathForResource:l ofType:@"lproj" ]; bundle = [NSBundle bundleWithPath:path]; } +(NSString *)get:(NSString *)key alter:(NSString *)alternate { return [bundle localizedStringForKey:key value:alternate table:nil]; } @end 

Language.h:

 import <Foundation/Foundation.h> @interface Language : NSObject +(void)setLanguage:(NSString *)l; +(NSString *)get:(NSString *)key alter:(NSString *)alternate; @end 

当你想改变语言:

 [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", @"de", nil] forKey:@"AppleLanguages"]; [[NSUserDefaults standardUserDefaults] synchronize]; [Language setLanguage:@"en"]; [(AppDelegate *)[[UIApplication sharedApplication] delegate] window].rootViewController = [self.storyboard instantiateInitialViewController]; 

当你想设置一个string:

 [self.someButton setTitle:[Language get:@"Some Button Text" alter:nil] forState:UIControlStateNormal];