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

Swift 本地化iOS 14动态小部件配置,swift,swiftui,ios14,widgetkit,Swift,Swiftui,Ios14,Widgetkit,我正试图根据应用程序语言为小部件加载不同的配置,但当我使用类似以下内容时: Locale.preferredLanguages Bundle.main.preferredLocalizations Bundle.main.localizations 它们都只在IntentExtensionTarget中返回“en” 下面是我使用代码的示例: extension IntentHandler: ReciterAndSurahIntentHandling { func provi

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

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.
    }
}
extension IntentHandler:readersandurahintenthandling{
func提供UradeShoptionsCollection(用于意图:背诵者和UraHintent,完成:@escaping(INObjectCollection?,Error?)->Void){
Locale.preferredLanguages
Bundle.main.preferredLocalizations
Bundle.main.localizations
//它们都只返回“en”,我有多个应用程序本地化。
}
}

因为描述和小部件名称中的本地化是基于设备语言的,所以只能使用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)
     }
    
  • 小部件视图内的访问值:

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

  • 这很不幸,你对此有什么解决办法吗?我认为目前还没有解决办法。一个月前我在做一个小部件,有同样的问题,不幸的是,我找不到任何关于它的东西。希望将来他们会发布一些东西:)@Jkrist有任何官方声明吗?这有一个缺点,如果应用程序wan没有打开,语言将不会得到更新。如果应用程序没有打开,则无法添加小部件。至少在cfr Apple docsI建议对ScenedDBecomeactive和sceneWillEnterForeground执行步骤3时,应用程序将被打开