本地化iOS 14动态小部件配置



我正试图根据应用程序语言为小部件加载不同的配置,但当我使用以下内容时:

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,因为描述和小部件名称的本地化是基于设备语言的。如果您想尝试将设备语言设置为不同的语言,本地化应该会起作用。就目前而言,不可能在小部件描述和名称本地化方面使用应用内语言。

有一个简单的解决方案:

  1. 为父应用程序和小部件添加AppGroups功能。

  2. 创建简单的UserDefaults

    let SharedGroupName = "group.pl.blueworld.fieldservice"
    let PreferredLanguageKey = "PreferredLanguageKey"
    extension UserDefaults {
    static let shared = UserDefaults(suiteName: SharedGroupName)!
    }
    
  3. 将当前语言保存在共享UserDefaults中。

    func applicationDidBecomeActive(_ application: UIApplication) {
    UserDefaults.shared.setValue(Locale.preferredLanguages[0].prefix(2), forKey: PreferredLanguageKey)
    }
    
  4. Widget View内的访问值:

    struct MyView: View {
    var language: String {
    return UserDefaults.shared.string(forKey: PreferredLanguageKey) ?? "en"
    }
    }
    

最新更新