Локализация конфигурации динамического виджета iOS 14

#swift #swiftui #ios14 #widgetkit

#swift #swiftui #ios14 #widgetkit

Вопрос:

Я пытаюсь загрузить разные конфигурации для виджетов в зависимости от языка приложения, но когда я использую что-то вроде:

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

Ответ №1:

Вы получаете только EN, потому что локализация в описании и названиях виджетов основана на языке устройства. Если вы попытаетесь установить язык устройства на другой, локализация должна сработать. На данный момент невозможно использовать язык в приложении для описания и локализации имени виджета.

Комментарии:

1. К сожалению, у вас есть какие-либо обходные пути для этого?

2. Я не думаю, что на данный момент есть обходной путь. Я делал виджет месяц назад, столкнулся с той же проблемой, и, к сожалению, я ничего не смог найти об этом. Надеюсь, в будущем они что-нибудь выпустят 🙂

3. @Jkrist Есть какое-либо официальное заявление по этому поводу?

Ответ №2:

Существует простое решение:

  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. У этого есть недостаток: если приложение не открывается, язык не обновляется.

2. Виджет не может быть добавлен, если приложение не будет открыто хотя бы один раз cfr Apple docs

3. Я бы рекомендовал выполнить шаг 3 как для sceneDidBecomeActive, так И для sceneWillEnterForeground