2014-10-21 67 views
5

我有下面的代码来切换语言运行库:如何在IOS中在运行时切换到语言后获取本地化故事板字符串?

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

而且我有一个检索本地化字符串辅助函数:

+(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]; 
} 

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

如何获取故事板字符串的本地化值?

+0

您使用的基地国际化或为每种语言单独的故事板? – 2014-10-21 21:38:26

+0

我正在使用Base内部化。 – Burak 2014-10-21 21:49:37

回答

2

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

这是我用过这个小小的类的帮助,这样做的最佳方式:

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 

当你想要陈GE的语言:

[[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]; 

当你想设置一个字符串:

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

这会刷新显示的当前视图的本地化字符串吗? – 2014-11-29 18:52:30

+0

您需要重新加载视图或至少重新获取字符串才能实现此目的。 – Segev 2014-11-29 18:57:36

相关问题