我正试图根据应用程序语言为小部件加载不同的配置,但当我使用以下内容时:
Locale.preferredLanguages
Bundle.main.preferredLocalizations
Bundle.main.localizations
他们都回来了";en";仅在IntentExtensionTarget中。
这里有一个我使用代码的例子:
extension IntentHandler: ReciterAndSurahIntentHandling {
func provideSurahOptionsCollection(for intent: ReciterAndSurahIntent, with completion: @escaping (INObjectCollection<NSString>?, Error?) -> Void) {
Locale.preferredLanguages
Bundle.main.preferredLocalizations
Bundle.main.localizations
// All of them return "en" only, and I have multiple localization for the app.
}
}
您只能获得EN,因为描述和小部件名称的本地化是基于设备语言的。如果您想尝试将设备语言设置为不同的语言,本地化应该会起作用。就目前而言,不可能在小部件描述和名称本地化方面使用应用内语言。
有一个简单的解决方案:
-
为父应用程序和小部件添加AppGroups功能。
-
创建简单的
UserDefaults
let SharedGroupName = "group.pl.blueworld.fieldservice" let PreferredLanguageKey = "PreferredLanguageKey" extension UserDefaults { static let shared = UserDefaults(suiteName: SharedGroupName)! }
-
将当前语言保存在共享
UserDefaults
中。func applicationDidBecomeActive(_ application: UIApplication) { UserDefaults.shared.setValue(Locale.preferredLanguages[0].prefix(2), forKey: PreferredLanguageKey) }
-
Widget View内的访问值:
struct MyView: View { var language: String { return UserDefaults.shared.string(forKey: PreferredLanguageKey) ?? "en" } }