我正在使用此设置动态更改我的iOS应用程序首选语言:
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"ar"] forKey:@"AppleLanguages"];
然后我从主NSBundle对象加载一个本地化的资源文件,但是加载的文件不是新语言,它是用默认的英语语言加载的,直到我完全重新启动应用程序然后加载阿拉伯语本地化。
我想强制NSBundle以新语言@“ar”加载资源文件,而不是应用程序启动时设置的语言。怎么样?
答案 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]默认同步]