使用相同的本地化按钮切换语言应用

时间:2015-09-16 11:12:15

标签: ios objective-c localization

我正在使用两种语言开发iOS应用。 我本地化了每种语言的主要故事板,现在我正在尝试使用相同的按钮切换语言(切换按钮文本)。

我发现很多代码都可以通过按钮来更改应用程序语言 thisAdvance-Localization-in-ios-apps但我不知道如何使用.strings重新加载故事板,具体取决于按钮中选定的语言。 有什么帮助吗?感谢

localized Main.storyboard English strings file

1 个答案:

答案 0 :(得分:4)

我担心您无法使用Main.strings个文件。您最终会将故事板中的所有可本地化文本移至Localizable.strings并使用NSLocalizedString(key, comment)等方法从那里加载它们。

这是GitHub上的Working sample project。它的工作方式如下面的屏幕截图所示:

enter image description here

演示视图控制器的完整代码

#import "ViewController.h"

//--------------- Modify NSBunle behavior -------------
#import <objc/runtime.h>

@interface CustomizedBundle : NSBundle
@end

@implementation CustomizedBundle
static const char kAssociatedLanguageBundle = 0;

-(NSString*)localizedStringForKey:(NSString *)key
                            value:(NSString *)value
                            table:(NSString *)tableName {

    NSBundle* bundle=objc_getAssociatedObject(self, &kAssociatedLanguageBundle);

    return bundle ? [bundle localizedStringForKey:key value:value table:tableName] :
    [super localizedStringForKey:key value:value table:tableName];
}
@end

@implementation NSBundle (Custom)
+ (void)setLanguage:(NSString*)language {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        object_setClass([NSBundle mainBundle], [CustomizedBundle class]);
    });

    objc_setAssociatedObject([NSBundle mainBundle], &kAssociatedLanguageBundle, language ?
                             [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]] : nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end

//--------------- Demo ---------------------------------
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *label;
@property (weak, nonatomic) IBOutlet UIButton *button;

@property (nonatomic, assign) BOOL usingArabic;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self localizeTexts];
}

- (void)localizeTexts {
    self.label.text = NSLocalizedString(@"explanation_message", nil);
    [self.button setTitle:NSLocalizedString(@"language_switch_title", nil) forState:UIControlStateNormal];
}


- (IBAction)switchLanguageTouched:(id)sender {
    _usingArabic = !_usingArabic;
    NSString *targetLang = _usingArabic ? @"ar" : @"en";

    [NSBundle setLanguage:targetLang];

    [[NSUserDefaults standardUserDefaults] setObject:targetLang forKey:@"selectedLanguage"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    [NSBundle setLanguage:targetLang];

    [self localizeTexts];
}

@end

您的Localizable文件如下所示:

enter image description here

希望这会有所帮助。 快乐的编码!

修改: 没有调用类似&#39; localizeTexts&#39;在上面的例子中,刷新&#39;显示的文本值,无法反映当前选择的语言。该对象在内存中,因此您必须重新创建或更新其值。