Skip to content

Commit 74daadb

Browse files
Bugfix FXIOS-15230 [Translations Phase 2] Long-press active translate button to change language (#33157)
* Bugfix FXIOS-15230 [Translations Phase 2] Wire long-press on active translate button and filter original page language from picker * Bugfix FXIOS-15230 [Translations Phase 2] Set bold attributed title after preferredAction to prevent reset * Bugfix FXIOS-15230 [Translations Phase 2] Only show long-press on translate button when active * Bugfix FXIOS-15230 [Translations Phase 2] Apply bold title after all actions, use source language for filtering in main menu * Bugfix FXIOS-15230 [Translations Phase 2] Filter translated-to language from language picker
1 parent c0e14a8 commit 74daadb

6 files changed

Lines changed: 72 additions & 20 deletions

File tree

firefox-ios/Client/Frontend/Browser/BrowserViewController/Views/BrowserViewController.swift

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2936,21 +2936,7 @@ class BrowserViewController: UIViewController,
29362936
if data.isTranslated, let langCode = data.translatedToLanguage {
29372937
configureShowOriginalHeader(for: alert, languageCode: langCode)
29382938
} else {
2939-
let title: String = .Translations.LanguagePicker.Title
2940-
let attributedTitleKey = "attributedTitle"
2941-
alert.title = title
2942-
alert.setValue(
2943-
NSAttributedString(
2944-
string: title,
2945-
attributes: [
2946-
.font: DefaultDynamicFontHelper.preferredBoldFont(
2947-
withTextStyle: .headline,
2948-
size: UIFont.labelFontSize
2949-
)
2950-
]
2951-
),
2952-
forKey: attributedTitleKey
2953-
)
2939+
alert.title = .Translations.LanguagePicker.Title
29542940
}
29552941

29562942
data.languages.forEach { code in
@@ -2984,6 +2970,22 @@ class BrowserViewController: UIViewController,
29842970
alert.addAction(UIAlertAction(title: .CancelString, style: .cancel))
29852971
}
29862972

2973+
if let title = alert.title {
2974+
let attributedTitleKey = "attributedTitle"
2975+
alert.setValue(
2976+
NSAttributedString(
2977+
string: title,
2978+
attributes: [
2979+
.font: DefaultDynamicFontHelper.preferredBoldFont(
2980+
withTextStyle: .headline,
2981+
size: UIFont.labelFontSize
2982+
)
2983+
]
2984+
),
2985+
forKey: attributedTitleKey
2986+
)
2987+
}
2988+
29872989
if let popover = alert.popoverPresentationController {
29882990
if let sourceButton {
29892991
popover.sourceView = sourceButton

firefox-ios/Client/Frontend/Browser/MainMenu/MainMenuCoordinator.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,10 @@ class MainMenuCoordinator: BaseCoordinator, LegacyFeatureFlaggable {
178178
let manager = PreferredTranslationLanguagesManager(prefs: prefs)
179179
let supported = await ASTranslationModelsFetcher.shared.fetchSupportedTargetLanguages()
180180
let languages = manager.preferredLanguages(supportedTargetLanguages: supported)
181-
let pageLanguage = try? await TranslationsService().detectPageLanguage(for: windowUUID)
182-
let filteredLanguages = languages.filter { $0 != pageLanguage }
181+
let pageLanguage = isTranslated
182+
? translationConfig?.sourceLanguage
183+
: (try? await TranslationsService().detectPageLanguage(for: windowUUID))
184+
let filteredLanguages = languages.filter { $0 != pageLanguage && $0 != translatedLanguage }
183185
if isSingleLanguageFlow, let language = filteredLanguages.first, !isTranslated {
184186
store.dispatch(TranslationLanguageSelectedAction(
185187
windowUUID: windowUUID,

firefox-ios/Client/Frontend/Browser/Toolbars/Redux/ToolbarActionConfiguration.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ struct ToolbarActionConfiguration: Equatable, LegacyFeatureFlaggable {
5858
actionType == .readerMode ||
5959
actionType == .readerModeWithSummarizer ||
6060
actionType == .summarizer ||
61+
(actionType == .translate && isSelected) ||
6162
(actionType == .tabs && isShowingTopTabs == false)
6263
}
6364
}

firefox-ios/Client/Frontend/Browser/Toolbars/Redux/ToolbarMiddleware.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,9 @@ final class ToolbarMiddleware: LegacyFeatureFlaggable {
369369
actionType: GeneralBrowserActionType.showSummarizer)
370370
store.dispatch(action)
371371
}
372+
case .translate:
373+
// Long-press on translate is handled in TranslationsMiddleware.
374+
break
372375
default:
373376
break
374377
}

firefox-ios/Client/Frontend/Browser/Toolbars/Redux/TranslationsConfiguration.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,17 @@ struct TranslationConfiguration: Equatable, LegacyFeatureFlaggable {
5555
let state: IconState?
5656
/// The language code the page was translated to, if in the active state (e.g. "en", "fr").
5757
let translatedToLanguage: String?
58+
/// The original language of the page before translation (e.g. "de", "fr").
59+
let sourceLanguage: String?
5860

5961
// We initially set icon state as nil until we can detect the
6062
// web page and determine if we should show the translation icon
6163
// and set the icon to .inactive state.
62-
init(prefs: Prefs, state: IconState? = nil, translatedToLanguage: String? = nil) {
64+
init(prefs: Prefs, state: IconState? = nil, translatedToLanguage: String? = nil, sourceLanguage: String? = nil) {
6365
self.prefs = prefs
6466
self.state = state
6567
self.translatedToLanguage = translatedToLanguage
68+
self.sourceLanguage = sourceLanguage
6669
}
6770

6871
var isMultiLanguageFlow: Bool {
@@ -85,5 +88,6 @@ struct TranslationConfiguration: Equatable, LegacyFeatureFlaggable {
8588
return lhs.isTranslationFeatureEnabled == rhs.isTranslationFeatureEnabled
8689
&& lhs.state == rhs.state
8790
&& lhs.translatedToLanguage == rhs.translatedToLanguage
91+
&& lhs.sourceLanguage == rhs.sourceLanguage
8892
}
8993
}

firefox-ios/Client/Frontend/Translations/TranslationsMiddleware.swift

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,6 @@ final class TranslationsMiddleware: LegacyFeatureFlaggable {
9191
private func handleTappingOnTranslateButton(for action: ToolbarMiddlewareAction, and state: AppState) {
9292
guard let gestureType = action.gestureType,
9393
let type = action.buttonType,
94-
gestureType == .tap,
9594
type == .translate
9695
else { return }
9796

@@ -112,6 +111,20 @@ final class TranslationsMiddleware: LegacyFeatureFlaggable {
112111
return
113112
}
114113

114+
if gestureType == .longPress {
115+
guard translationConfiguration.state == .active,
116+
featureFlags.isFeatureEnabled(.translationLanguagePicker, checking: .buildOnly)
117+
else { return }
118+
showLanguagePickerForActiveTranslation(
119+
for: action,
120+
translatedToLanguage: translationConfiguration.translatedToLanguage,
121+
sourceLanguage: translationConfiguration.sourceLanguage
122+
)
123+
return
124+
}
125+
126+
guard gestureType == .tap else { return }
127+
115128
if translationConfiguration.state == .inactive,
116129
featureFlags.isFeatureEnabled(.translationLanguagePicker, checking: .buildOnly) {
117130
let capturedButton = action.buttonTapped
@@ -160,6 +173,28 @@ final class TranslationsMiddleware: LegacyFeatureFlaggable {
160173
}
161174
}
162175

176+
private func showLanguagePickerForActiveTranslation(
177+
for action: ToolbarMiddlewareAction,
178+
translatedToLanguage: String?,
179+
sourceLanguage: String?
180+
) {
181+
let capturedButton = action.buttonTapped
182+
Task {
183+
let manager = PreferredTranslationLanguagesManager(prefs: profile.prefs)
184+
let supported = await translationsService.fetchSupportedTargetLanguages()
185+
let languages = manager.preferredLanguages(supportedTargetLanguages: supported)
186+
let filteredLanguages = languages.filter { $0 != sourceLanguage && $0 != translatedToLanguage }
187+
store.dispatch(GeneralBrowserAction(
188+
buttonTapped: capturedButton,
189+
translationLanguages: filteredLanguages,
190+
isPageTranslated: true,
191+
translatedToLanguage: translatedToLanguage,
192+
windowUUID: action.windowUUID,
193+
actionType: GeneralBrowserActionType.showTranslationLanguagePicker
194+
))
195+
}
196+
}
197+
163198
private func handleTappingRetryButtonOnToast(for action: TranslationsAction, and state: AppState) {
164199
guard let language = selectedTargetLanguages[action.windowUUID] else {
165200
logger.log(
@@ -318,10 +353,12 @@ final class TranslationsMiddleware: LegacyFeatureFlaggable {
318353

319354
private func performTranslation(for action: Action, targetLanguage: String, isPrivate: Bool, autoTranslate: Bool) async {
320355
do {
356+
var detectedSourceLanguage: String?
321357
try await translationsService.translateCurrentPage(
322358
for: action.windowUUID,
323359
to: targetLanguage,
324360
onLanguageIdentified: { identifiedLanguage, deviceLanguage in
361+
detectedSourceLanguage = identifiedLanguage
325362
self.translationsTelemetry.pageLanguageIdentified(
326363
identifiedLanguage: identifiedLanguage,
327364
deviceLanguage: deviceLanguage
@@ -340,6 +377,7 @@ final class TranslationsMiddleware: LegacyFeatureFlaggable {
340377
for: ToolbarActionType.translationCompleted,
341378
with: .active,
342379
translatedToLanguage: targetLanguage,
380+
sourceLanguage: detectedSourceLanguage,
343381
and: action.windowUUID
344382
)
345383
maybeShowAutoTranslatePrompt(windowUUID: action.windowUUID)
@@ -386,13 +424,15 @@ final class TranslationsMiddleware: LegacyFeatureFlaggable {
386424
for actionType: ToolbarActionType,
387425
with state: TranslationConfiguration.IconState,
388426
translatedToLanguage: String? = nil,
427+
sourceLanguage: String? = nil,
389428
and windowUUID: WindowUUID
390429
) {
391430
let toolbarAction = ToolbarAction(
392431
translationConfiguration: TranslationConfiguration(
393432
prefs: profile.prefs,
394433
state: state,
395-
translatedToLanguage: translatedToLanguage
434+
translatedToLanguage: translatedToLanguage,
435+
sourceLanguage: sourceLanguage
396436
),
397437
windowUUID: windowUUID,
398438
actionType: actionType

0 commit comments

Comments
 (0)