#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:
Существует простое решение:
-
Добавьте возможности 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" } }
Комментарии:
1. У этого есть недостаток: если приложение не открывается, язык не обновляется.
2. Виджет не может быть добавлен, если приложение не будет открыто хотя бы один раз cfr Apple docs
3. Я бы рекомендовал выполнить шаг 3 как для sceneDidBecomeActive, так И для sceneWillEnterForeground