4

我正在尝试根据应用程序语言为小部件加载不同的配置,但是当我使用类似的东西时:

Locale.preferredLanguages
Bundle.main.preferredLocalizations
Bundle.main.localizations

他们都只在 IntentExtensionTarget 中返回“en”。

这是我使用代码的示例:

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.
    }
}
4

2 回答 2

4

您只能获得 EN,因为描述和小部件名称中的本地化是基于设备语言的。如果您尝试将设备语言设置为其他语言,则本地化应该可以工作。就目前而言,无法在小部件描述和名称本地化上使用应用内语言。

于 2020-10-22T12:44:11.487 回答
3

有一个简单的解决方案:

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

  2. 创建简单UserDefaults

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

     func applicationDidBecomeActive(_ application: UIApplication) {
         UserDefaults.shared.setValue(Locale.preferredLanguages[0].prefix(2), forKey: PreferredLanguageKey)
     }
    
  4. 小部件视图中的访问值:

     struct MyView: View {
         var language: String {
             return UserDefaults.shared.string(forKey: PreferredLanguageKey) ?? "en"
         }
     }
    
于 2021-01-17T17:03:59.110 回答