在Swift 3中更改应用程序内部的语言
在Swift 3中更改应用程序内部的语言是一个常见的需求。为了实现这一目标,我们可以使用NSUserDefaults
中的"AppleLanguages"键来确定用户的首选语言设置。这个键返回一个语言代码的数组,其中第一个是用户为手机设置的语言,后续的语言代码将作为备用语言使用,如果在首选语言中找不到资源的话。如果在桌面上,用户可以在系统偏好设置中指定多个语言并自定义顺序。
如果希望覆盖全局设置并设置自己的语言列表,可以使用setObject:forKey:
方法来实现。这将优先于全局设置的值,并将返回给应用程序中执行本地化的任何代码。下面是实现这一目标的代码示例:
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de", @"en", @"fr", nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize]; //使更改立即生效
以上代码将使德语成为应用程序的首选语言,英语和法语作为备选语言。建议在应用程序启动的早期调用此代码。您可以在此处阅读有关语言/区域首选项的更多信息:[Internationalization Programming Topics: Getting the Current Language and Locale](https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPInternational/Introduction/Introduction.html)
然而,有一些用户在尝试上述方法时遇到了问题。例如,有些人发现无论如何都无法更改默认语言,而有些人发现只有在重新启动应用程序后才能看到更改的效果。还有人发现在使用NSLocalizedString
时可以正常工作,但在使用图像时无法正常工作。
为了解决这些问题,有些用户建议在main()
函数中初始化UIKit之前设置语言偏好。这样做可以确保语言设置在应用程序启动之前生效。还有人建议在applicationDidEnterBackground
方法中删除"AppleLanguages"键,以便用户可以随时手动更改语言。
此外,有些用户在尝试设置语言后发现应用程序的界面布局没有立即反映出来,即使按下HOME键再重新启动应用程序也没有改变语言。而有些用户则发现只有在使用Xcode重新运行应用程序时才能看到语言的变化。
尽管上述方法对大多数用户都有效,但也有一些特殊情况需要特殊处理。例如,某些用户发现这些方法无法正确处理在"Localizable.stringsdict"文件中定义的复数项。此外,还有一些用户报告说在模拟器上尝试上述方法时出现了卡顿的情况。
在iOS 13及以上版本中,可以避免使用"AppleLanguages"键,而是使用"preferred languages"来设置应用程序的语言。这个新的方法可以在[reddit.com/r/iOSBeta](https://www.reddit.com/r/iOSBeta/comments/bxfkzm/feature_preferred_language_allows_individual_apps/)上找到更多信息。
虽然有一些特殊情况需要特殊处理,但对于大多数开发者来说,上述方法应该可以解决在Swift 3中更改应用程序内部语言的需求。