diff --git a/Sources/Logging/Strings/PaywallsStrings.swift b/Sources/Logging/Strings/PaywallsStrings.swift index 3b93dda9de..50352c1a65 100644 --- a/Sources/Logging/Strings/PaywallsStrings.swift +++ b/Sources/Logging/Strings/PaywallsStrings.swift @@ -24,6 +24,10 @@ enum PaywallsStrings { case caching_presented_paywall case clearing_presented_paywall + case looking_up_localization([Locale]) + case found_localization(Locale) + case fallback_localization(localeIdentifier: String) + // MARK: - Events case event_manager_initialized @@ -56,6 +60,15 @@ extension PaywallsStrings: LogMessage { case .clearing_presented_paywall: return "PurchasesOrchestrator: clearing presented paywall" + case let .looking_up_localization(locales): + return "Looking up localized configuration for \(locales.map(\.identifier))" + + case let .found_localization(locale): + return "Found localized configuration for '\(locale.identifier)'" + + case let .fallback_localization(localeIdentifier): + return "Failed looking up localization, using fallback: \(localeIdentifier)" + // MARK: - Events case .event_manager_initialized: diff --git a/Sources/Paywalls/PaywallData+Localization.swift b/Sources/Paywalls/PaywallData+Localization.swift index 38e368cc1a..86e6086286 100644 --- a/Sources/Paywalls/PaywallData+Localization.swift +++ b/Sources/Paywalls/PaywallData+Localization.swift @@ -23,11 +23,27 @@ public extension PaywallData { // Visible for testing internal func localizedConfiguration(for locales: [Locale]) -> LocalizedConfiguration { - return locales + Logger.verbose(Strings.paywalls.looking_up_localization(locales)) + + let result: (locale: Locale, config: LocalizedConfiguration)? = locales .lazy - .compactMap(self.config(for:)) + .compactMap { locale in + self.config(for: locale) + .map { (locale, $0) } + } .first { _ in true } // See https://github.com/apple/swift/issues/55374 - ?? self.fallbackLocalizedConfiguration + + if let result { + Logger.verbose(Strings.paywalls.found_localization(result.locale)) + + return result.config + } else { + let (locale, fallback) = self.fallbackLocalizedConfiguration + + Logger.warn(Strings.paywalls.fallback_localization(localeIdentifier: locale)) + + return fallback + } } // Visible for testing @@ -43,9 +59,9 @@ public extension PaywallData { return result } - private var fallbackLocalizedConfiguration: LocalizedConfiguration { + private var fallbackLocalizedConfiguration: (String, LocalizedConfiguration) { // This can't happen because `localization` has `@EnsureNonEmptyCollectionDecodable`. - guard let result = self.localization.first?.value else { + guard let result = self.localization.first else { fatalError("Corrupted data: localization is empty.") }