diff --git a/ios/brave-ios/Sources/Brave/Frontend/Brave Translate/BraveTranslateTabHelper.swift b/ios/brave-ios/Sources/Brave/Frontend/Brave Translate/BraveTranslateTabHelper.swift index 4d25c91e2edd..a2ee1120ba14 100644 --- a/ios/brave-ios/Sources/Brave/Frontend/Brave Translate/BraveTranslateTabHelper.swift +++ b/ios/brave-ios/Sources/Brave/Frontend/Brave Translate/BraveTranslateTabHelper.swift @@ -183,12 +183,6 @@ class BraveTranslateTabHelper: NSObject { let translationSession = self.translationSession ?? BraveTranslateSession() let isTranslationRequest = BraveTranslateSession.isPhraseTranslationRequest(request) - // We cannot process translation requests when translation is not enabled - // Other requests like fetching the core script and css can be processed - if Preferences.Translate.translateEnabled.value != true && isTranslationRequest { - throw BraveTranslateError.translateDisabled - } - // The message is for HTML or CSS request if self.translationSession == nil && isTranslationRequest @@ -331,10 +325,6 @@ class BraveTranslateTabHelper: NSObject { state: isTranslationSupported ? .available : .unavailable ) - if !isTranslationSupported { - return - } - try Task.checkCancellation() // Check if the user can view the translation onboarding @@ -363,6 +353,14 @@ class BraveTranslateTabHelper: NSObject { // User enabled translation via onboarding if translateEnabled == true { + // Lazy loading. Load the translate script if needed. + _ = try await tab.webView?.callAsyncJavaScript( + "return await window.__firefox__.\(BraveTranslateScriptHandler.namespace).loadTranslateScript();", + arguments: [:], + contentWorld: BraveTranslateScriptHandler.scriptSandbox + ) + + // Automatically translate startTranslation(canShowToast: true) } } diff --git a/ios/brave-ios/Sources/Brave/Frontend/UserContent/UserScripts/Scripts_Dynamic/ScriptHandlers/Sandboxed/BraveTranslateScriptHandler.swift b/ios/brave-ios/Sources/Brave/Frontend/UserContent/UserScripts/Scripts_Dynamic/ScriptHandlers/Sandboxed/BraveTranslateScriptHandler.swift index dae8af12109b..cd7dc7bcbbd2 100644 --- a/ios/brave-ios/Sources/Brave/Frontend/UserContent/UserScripts/Scripts_Dynamic/ScriptHandlers/Sandboxed/BraveTranslateScriptHandler.swift +++ b/ios/brave-ios/Sources/Brave/Frontend/UserContent/UserScripts/Scripts_Dynamic/ScriptHandlers/Sandboxed/BraveTranslateScriptHandler.swift @@ -104,8 +104,11 @@ class BraveTranslateScriptHandler: NSObject, TabContentScript { body: [String: Any] ) async throws -> (Any?, String?) { if command == "load_brave_translate_script" { - let script = try await BraveTranslateScriptHandler.elementScriptTask.value - return (script, nil) + if Preferences.Translate.translateEnabled.value == true { + let script = try await BraveTranslateScriptHandler.elementScriptTask.value + return (script, nil) + } + return (nil, BraveTranslateError.translateDisabled.rawValue) } if command == "ready" { diff --git a/ios/brave-ios/Sources/Brave/Frontend/UserContent/UserScripts/Scripts_Dynamic/Scripts/Sandboxed/BraveTranslateScript.js b/ios/brave-ios/Sources/Brave/Frontend/UserContent/UserScripts/Scripts_Dynamic/Scripts/Sandboxed/BraveTranslateScript.js index 0286ddb18db7..1cf68b357b74 100644 --- a/ios/brave-ios/Sources/Brave/Frontend/UserContent/UserScripts/Scripts_Dynamic/Scripts/Sandboxed/BraveTranslateScript.js +++ b/ios/brave-ios/Sources/Brave/Frontend/UserContent/UserScripts/Scripts_Dynamic/Scripts/Sandboxed/BraveTranslateScript.js @@ -33,21 +33,42 @@ Object.defineProperty(window.__firefox__, "$", { }, 100); }), "loadTranslateScript": (function() { - if (window.__firefox__.$.translateScriptLoaded) { - return; - } - - window.webkit.messageHandlers["$"].postMessage({ - "command": "load_brave_translate_script" - }).then((script) => { - try { - new Function(script).call(window /*this*/); - window.__firefox__.$.translateScriptLoaded = true - } catch (error) { - cr.googleTranslate.onTranslateElementError(error); + return new Promise((resolve, reject) => { + if (window.__firefox__.$.translateScriptLoaded) { + return resolve(); } - }).catch((error) => { - cr.googleTranslate.onTranslateElementError(error); + + window.webkit.messageHandlers["$"].postMessage({ + "command": "load_brave_translate_script" + }).then((script) => { + try { + cr.googleTranslate.readyCallback = () => { + cr.googleTranslate.readyCallback = null; + resolve(); + } + + new Function(script).call(window /*this*/); + window.__firefox__.$.translateScriptLoaded = true; + + if ((cr.googleTranslate.libReady || cr.googleTranslate.finished) && cr.googleTranslate.readyCallback) { + cr.googleTranslate.readyCallback = null; + resolve(); + } + + setTimeout(() => { + if (cr.googleTranslate.readyCallback) { + cr.googleTranslate.readyCallback = null; + resolve(); + } + }, 3000); + } catch (error) { + cr.googleTranslate.onTranslateElementError(error); + reject(error); + } + }).catch((error) => { + cr.googleTranslate.onTranslateElementError(error); + reject(error); + }); }); }) }