iphone - 仅在 iPhone 上重新启动后才更改语言

标签 iphone localization restart

我正在尝试更改应用程序语言,但是当我在 main.h 中运行此代码时,在关闭应用程序并再次运行它后语言会发生变化。是否可以在不重新启动的情况下更改语言?

int main(int argc, char *argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSArray *languages = [NSArray arrayWithObject:@"en_GB"];
    [[NSUserDefaults standardUserDefaults] setObject:languages forKey:@"AppleLanguages"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}

最佳答案

更新答案“如何更改应用内的语言”

NSLocalizedString()(及其变体)访问 NSUserDefaults 中的“AppleLanguages”键来确定用户的首选语言设置。这将返回一组语言代码,第一个是用户为其手机设置的语言代码,如果资源在首选语言中不可用,则后续的代码将用作后备。

如果您愿意,可以通过使用 setObject:forKey: 方法来设置您自己的语言列表,就像您所做的那样,覆盖您自己的应用程序的全局设置。这将优先于全局设置值,并返回到应用程序中执行本地化的任何代码。其代码如下所示:

[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de", @"en", @"fr", nil] forKey:@"AppleLanguages"]; 

注意:为了安全起见,请确保使用适当的预定义语言名称。

下面是代码片段,但您的项目中必须包含所有本地化文件。

@implementation LocalizeLanguage

static NSBundle *bundle = nil;

+(void)initialize {
     NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
     NSArray* languages = [defs objectForKey:@"AppleLanguages"];
     NSString *current = [[languages objectAtIndex:0] retain];
     [self setLocalizeLanguage:current];
}

/*
  [LocalizeLanguage setLocalizeLanguage:@"en"];
  [LocalizeLanguage setLocalizeLanguage:@"fr"];
*/

+(void)setLocalizeLanguage:(NSString *)lang {
     NSLog(@"preferredLang: %@", lang);
     NSString *path = [[ NSBundle mainBundle ] pathForResource:lang ofType:@"lproj" ];
     bundle = [[NSBundle bundleWithPath:path] retain];
}

+(NSString *)get:(NSString *)key alter:(NSString *)alternate {
    return [bundle localizedStringForKey:key value:alternate table:nil];
}

@end

关于iphone - 仅在 iPhone 上重新启动后才更改语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5912018/

相关文章:

android - Android Oreo 中应用程序更新后如何重新启动前台服务?

node.js - 如何在出现全局错误时在脚本内部重新启动 Node.js 服务器?

iphone - iOS 从 NSUserDefaults 调用电话号码

iphone - 如何在 MonoTouch 中注册 UIApplicationWillEnterForegroundNotification

iPhone - 20.0 和 20.0f 之间的区别

ios - 如何指定本地化Info.plist文件的路径

ios - App在ios中的本地化错误

iphone - 在固件 3.1 上打开邮件应用程序

iphone - iOS 应用程序因语言环境更改而崩溃

restart - 如何在 Airflow 1.8 上出现故障时重新启动 dag?