我想在不重新启动应用的情况下更改应用的语言

时间:2017-05-09 10:57:16

标签: ios swift

我需要在我的应用中使用多种语言。我可以使用本地化字符串更改语言,但如果不重新启动应用程序,则故事板文本不会更改。我还为需要更改文本对齐的用户添加了阿拉伯语,如果我重新启动应用程序也可以正常工作。

我正在使用AppleLanguages用户默认密钥来更改动态文本的语言和本地化字符串。

1 个答案:

答案 0 :(得分:-1)

对于目标C:

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

对于Swift:

class func setLanguage(_ language: String) {
var onceToken: Int
if (onceToken == 0) {
        /* TODO: move below code to a static variable initializer (dispatch_once is deprecated) */
    object_setClass(Bundle.main, BundleEx.self)
}
    onceToken = 1
objc_setAssociatedObject(Bundle.main, bundle, language ? Bundle(path: Bundle.main.path(forResource: language, ofType: "lproj")) : nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}

添加上述方法,然后只传递要转换的语言。

如果您添加了 ja.lproj ,请发送" ja "作为上述方法的一个参数。

这将转换Storyboard语言而不重启。

希望它有所帮助。