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

时间:2020-10-02 16:58:42

标签: swift swiftui ios14

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

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

2 个答案:

答案 0 :(得分:3)

有一个简单的解决方案:

  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. 在小部件视图中访问值:

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

答案 1 :(得分:1)

您只会得到EN,因为描述和窗口小部件名称中的本地化基于设备语言。如果您尝试将设备语言设置为另一种语言,则应该进行本地化。到目前为止,无法在小部件描述和名称本地化中使用应用内语言。