iOS更改应用程序语言不会生效

时间:2013-12-28 19:08:05

标签: ios localization nsbundle

我正在使用此设置动态更改我的iOS应用程序首选语言:

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"ar"] forKey:@"AppleLanguages"];

然后我从主NSBundle对象加载一个本地化的资源文件,但是加载的文件不是新语言,它是用默认的英语语言加载的,直到我完全重新启动应用程序然后加载阿拉伯语本地化。

我想强制NSBundle以新语言@“ar”加载资源文件,而不是应用程序启动时设置的语言。怎么样?

3 个答案:

答案 0 :(得分:3)

您的方法是一种获取所需内容的hacky方式,需要重启才能生效。

最好使用NSLocalizedStringFromTableInBundle代替NSLocalizedString,并提供该语言的捆绑包。

NSString* path = [[NSBundle mainBundle] pathForResource:@"ar" ofType:@"lproj"];
NSBundle* ar_bundle = [NSBundle bundleWithPath:path];

NSLocalizedStringFromTableInBundle(@"str", nil, ar_bundle, @"comment");

如果您将捆绑包放在全局范围内,则可以轻松创建宏:

#define ARLocalizedString(str, cmt) NSLocalizedStringFromTableInBundle(str, nil, ar_bundle, cmt)

答案 1 :(得分:0)

我已尝试过此功能,并且无需重新启动应用即可正常工作:

socket.io

newLangbundle - >在.pch中定义一个全局变量,并根据语言选择使用它来改变它,

//Use this in constants
#ifdef NSLocalizedString
#undef NSLocalizedString
#endif
#define NSLocalizedString(str, cmt) NSLocalizedStringFromTableInBundle(str, nil, newLangbundle, cmt)

答案 2 :(得分:0)

更改语言后,您需要同步用户默认值: [[NSUserDefaults standardUserDefaults]默认同步]