我在iOS应用程序中添加了一个手动语言部分,您可以在其中更改应用程序应显示的语言。如果有人选择手动语言,我会覆盖" AppleLanguages" standardUserDefaults如此
NSString *language = [[[NSUserDefaults alloc] initWithSuiteName:kAppGroup] objectForKey:kManualLanguageKey];
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:language, nil]
forKey:@"AppleLanguages"];
现在,当用户重新启动应用程序时(终止后),应用程序会自动加载正确的LocalizedStrings。
现在这是我的问题:
即使这解决了我更改应用程序语言的问题,它也无法正确显示数字等。 Number / DateFormatter和localizedStringWithFormat取决于[NSLocale currentLocale]。我知道我可以覆盖当前的lokale,就像这样
[[NSUserDefaults standardUserDefaults] setObject:language
forKey:@"AppleLocale"];
但是一旦用户决定禁用手动语言,我就无法在系统设置中选择真实的语言/区域。在我覆盖它之前,我可以将currentLocale存储在我自己的userDefaults中,但如果用户决定(无论出于何种原因)在应用程序中的手动语言处于活动状态时更改系统语言,我将无法获得此新功能选定的系统语言。
有没有办法在不手动更改NumberFormatter等的语言环境属性的情况下获得正确的数字和日期格式?
答案 0 :(得分:3)
好的,我找到了一种在用户在http://www.thetawelle.de/?p=3800上禁用手动语言后重置当前语言环境的方法
在main.m中,如果手动语言的bool为false,我会重置当前语言:
NSArray *keysToRemove = @[@"AppleLanguages",@"NSLanguages",@"AppleLocale"];
NSLog( @"RESETTING TO USE SYSTEM LOCALE" );
@try {
for( NSString *currentKey in keysToRemove ) {
if( [defaults objectForKey:currentKey] ) {
[defaults removeObjectForKey:currentKey];
}
}
}
@catch (NSException *exception) {
// NOTHNG TO CATCH HERE
}
@finally {
[defaults synchronize];
}
之后,当前的语言环境和语言将返回到系统设置中选择的语言和区域。