From daaf1b330e56840aefbb9c19a365979c49fce04b Mon Sep 17 00:00:00 2001 From: Marcus Kida Date: Tue, 25 Jun 2024 10:41:03 +0200 Subject: [PATCH] Implement translation language check (IOS-271) --- .../Extension/CoreDataStack/Instance.swift | 7 ------ .../MastodonCore/MastodonAuthentication.swift | 24 +++++++++++-------- .../View/Content/StatusView+ViewModel.swift | 9 +++++-- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/Instance.swift b/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/Instance.swift index 006c9881f..5c2dfa5c2 100644 --- a/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/Instance.swift +++ b/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/Instance.swift @@ -48,13 +48,6 @@ extension Instance { public var canFollowTags: Bool { version?.majorServerVersion(greaterThanOrEquals: 4) ?? false // following Tags is support beginning with Mastodon v4.0.0 } - - public var isTranslationEnabled: Bool { - if let configuration = configurationV2 { - return configuration.translation?.enabled == true - } - return false - } } extension String { diff --git a/MastodonSDK/Sources/MastodonCore/MastodonAuthentication.swift b/MastodonSDK/Sources/MastodonCore/MastodonAuthentication.swift index 02416c8d0..7b6eb13d3 100644 --- a/MastodonSDK/Sources/MastodonCore/MastodonAuthentication.swift +++ b/MastodonSDK/Sources/MastodonCore/MastodonAuthentication.swift @@ -6,8 +6,18 @@ import MastodonSDK public struct MastodonAuthentication: Codable, Hashable, UserIdentifier { public enum InstanceConfiguration: Codable, Hashable { - case v1(Mastodon.Entity.Instance, TranslationLanguages) + case v1(Mastodon.Entity.Instance) case v2(Mastodon.Entity.V2.Instance, TranslationLanguages) + + public func canTranslateFrom(_ sourceLocale: String, to targetLanguage: String) -> Bool { + switch self { + case .v1: + return false + case let .v2(instance, translationLanguages): + guard instance.configuration?.translation?.enabled == true else { return false } + return translationLanguages[sourceLocale]?.contains(targetLanguage) == true + } + } } public typealias ID = UUID @@ -127,13 +137,7 @@ public struct MastodonAuthentication: Codable, Hashable, UserIdentifier { } func updating(instanceV1 instance: Mastodon.Entity.Instance) -> Self { - guard - let instanceConfiguration = self.instanceConfiguration, - case let InstanceConfiguration.v1(_, translationLanguages) = instanceConfiguration - else { - return copy(instanceConfiguration: .v1(instance, [:])) - } - return copy(instanceConfiguration: .v1(instance, translationLanguages)) + return copy(instanceConfiguration: .v1(instance)) } func updating(instanceV2 instance: Mastodon.Entity.V2.Instance) -> Self { @@ -148,8 +152,8 @@ public struct MastodonAuthentication: Codable, Hashable, UserIdentifier { func updating(translationLanguages: TranslationLanguages) -> Self { switch self.instanceConfiguration { - case .v1(let instance, _): - return copy(instanceConfiguration: .v1(instance, translationLanguages)) + case .v1(let instance): + return copy(instanceConfiguration: .v1(instance)) case .v2(let instance, _): return copy(instanceConfiguration: .v2(instance, translationLanguages)) case .none: diff --git a/MastodonSDK/Sources/MastodonUI/View/Content/StatusView+ViewModel.swift b/MastodonSDK/Sources/MastodonUI/View/Content/StatusView+ViewModel.swift index 58bb9df89..2df12c01d 100644 --- a/MastodonSDK/Sources/MastodonUI/View/Content/StatusView+ViewModel.swift +++ b/MastodonSDK/Sources/MastodonUI/View/Content/StatusView+ViewModel.swift @@ -696,8 +696,13 @@ extension StatusView.ViewModel { } let authentication = authContext.mastodonAuthenticationBox.authentication - let instance = authentication.instance(in: context.managedObjectContext) - let isTranslationEnabled = instance?.isTranslationEnabled ?? false + let isTranslationEnabled: Bool = { + guard let language, let targetLanguage = Bundle.main.preferredLocalizations.first else { return false } + return authentication.instanceConfiguration?.canTranslateFrom( + language, + to: targetLanguage + ) ?? false + }() authorView.menuButton.menu = UIMenu(children: [ UIDeferredMenuElement.uncached({ menuElement in