如何在不重启应用程序的情况下更改 iOS9 中的应用程序语言?
How can I change app's language in iOS9 WITHOUT restart app?
当我根据设备语言独立更改应用程序的语言时,只有在我重新启动它时它才起作用。我根据Stack Overflow中的答案尝试了几次,例如:
#import "NSBundle+Language.h"
#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);
}
@end
未生效
当应用程序设置屏幕中的语言发生变化时,我收到 post 通知,收听通知的视图将重新加载视图,但不起作用,语言没有改变。
你的代码在我的演示中有效,只需设置另一种语言,然后重新加载可见的视图。
当我根据设备语言独立更改应用程序的语言时,只有在我重新启动它时它才起作用。我根据Stack Overflow中的答案尝试了几次,例如:
#import "NSBundle+Language.h"
#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);
}
@end
未生效
当应用程序设置屏幕中的语言发生变化时,我收到 post 通知,收听通知的视图将重新加载视图,但不起作用,语言没有改变。
你的代码在我的演示中有效,只需设置另一种语言,然后重新加载可见的视图。