iOS应用的运行时本地化

时间:2016-07-27 06:55:53

标签: ios localization

我想在运行时更改我的应用语言。为此,我实施了类别如

的类别

.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 = ?


因为它仍然需要重新启动我的应用以显示语言效果。

1 个答案:

答案 0 :(得分:0)

iOS已有多种语言的本地化文件,您可以在Localization / Localizable.strings中找到它。

在Localizable.strings(英文)

"text" = "This is a text";

然后,将您的设置文本代码放在一个函数中。这样,您可以在切换语言后重绘文本。

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

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