This commit is contained in:
Isaac 2026-03-28 21:13:25 +08:00
parent 5cc27e5d04
commit 6257031092
3 changed files with 51 additions and 12 deletions

View file

@ -817,7 +817,7 @@ final class ContextControllerExtractedPresentationNode: ASDisplayNode, ContextCo
case let .reference(reference):
if let transitionInfo = reference.transitionInfo() {
if let referenceView = transitionInfo.referenceView as? ContextExtractableContainer {
if #available(iOS 26.0, *) {
if #available(iOS 26.2, *) {
if transitionInfo.referenceView.bounds.width == transitionInfo.referenceView.bounds.height {
contextExtractableContainer = (referenceView, convertFrame(transitionInfo.referenceView.bounds.inset(by: transitionInfo.insets), from: transitionInfo.referenceView, to: self.view))
}

View file

@ -43,6 +43,7 @@ final class TextProcessingContentComponent: Component {
let styles: [TextProcessingScreen.Style]
let inputText: TextWithEntities
let initialEditState: TextProcessingScreen.EditState?
let ignoredTranslationLanguages: [String]
let shouldDisplayStyleNotice: Bool
let copyCurrentResult: (() -> Void)?
let translateChat: ((String) -> Void)?
@ -55,6 +56,7 @@ final class TextProcessingContentComponent: Component {
styles: [TextProcessingScreen.Style],
inputText: TextWithEntities,
initialEditState: TextProcessingScreen.EditState?,
ignoredTranslationLanguages: [String],
shouldDisplayStyleNotice: Bool,
copyCurrentResult: (() -> Void)?,
translateChat: ((String) -> Void)?,
@ -66,6 +68,7 @@ final class TextProcessingContentComponent: Component {
self.mode = mode
self.inputText = inputText
self.initialEditState = initialEditState
self.ignoredTranslationLanguages = ignoredTranslationLanguages
self.shouldDisplayStyleNotice = shouldDisplayStyleNotice
self.copyCurrentResult = copyCurrentResult
self.translateChat = translateChat
@ -351,7 +354,7 @@ final class TextProcessingContentComponent: Component {
styles: component.styles,
externalState: self.translateState,
inputText: component.inputText,
mode: .translate,
mode: .translate(ignoredLanguages: component.ignoredTranslationLanguages),
copyAction: component.copyCurrentResult,
displayLanguageSelectionMenu: component.displayLanguageSelectionMenu,
present: { [weak self] c, a in
@ -816,6 +819,7 @@ private final class TextProcessingSheetComponent: Component {
styles: component.styles,
inputText: component.inputText,
initialEditState: component.initialEditState,
ignoredTranslationLanguages: component.ignoredTranslationLanguages,
shouldDisplayStyleNotice: component.shouldDisplayStyleNotice,
copyCurrentResult: component.copyCurrentResult != nil ? {
copyCurrentResultImpl()

View file

@ -50,8 +50,8 @@ func localizedLanguageName(strings: PresentationStrings, language: String, kind:
}
final class TextProcessingTranslateContentComponent: Component {
enum Mode {
case translate
enum Mode: Equatable {
case translate(ignoredLanguages: [String])
case stylize
case fix
}
@ -280,13 +280,38 @@ final class TextProcessingTranslateContentComponent: Component {
if component.externalState.result == nil {
switch component.mode {
case .translate:
var languageCode = component.strings.baseLanguageCode
case let .translate(ignoredLanguages):
var baseLang = component.strings.baseLanguageCode
let rawSuffix = "-raw"
if languageCode.hasSuffix(rawSuffix) {
languageCode = String(languageCode.dropLast(rawSuffix.count))
if baseLang.hasSuffix(rawSuffix) {
baseLang = String(baseLang.dropLast(rawSuffix.count))
}
component.externalState.result = (languageCode, nil, [])
var toLanguage = baseLang
let fromLanguage = component.externalState.sourceLanguage ?? ""
if toLanguage == fromLanguage {
if fromLanguage == "en" {
var dontTranslateLanguages = Set<String>()
if !ignoredLanguages.isEmpty {
dontTranslateLanguages = Set(ignoredLanguages)
} else {
dontTranslateLanguages.insert(baseLang)
for language in systemLanguageCodes() {
dontTranslateLanguages.insert(language)
}
}
toLanguage = dontTranslateLanguages.first(where: { $0 != "en" }) ?? "en"
} else {
toLanguage = "en"
}
if toLanguage == "en" && fromLanguage == "en" {
if let anyOtherLanguage = NSLocale.preferredLanguages.first(where: { !$0.hasPrefix("en-") }) {
toLanguage = anyOtherLanguage
}
}
}
component.externalState.result = (toLanguage, nil, [])
self.beginTranslationIfNecessary(reset: false)
case .stylize:
component.externalState.result = ("", component.inputText, [])
@ -303,6 +328,9 @@ final class TextProcessingTranslateContentComponent: Component {
let bottomInset: CGFloat = 14.0
let blockSpacing: CGFloat = 30.0
let fromLanguage = component.externalState.sourceLanguage ?? ""
let fromTitle = localizedLanguageName(strings: component.strings, language: fromLanguage, kind: .translateFrom)
let fromFormat: String
let toFormat: String
var toTitle: String
@ -377,7 +405,7 @@ final class TextProcessingTranslateContentComponent: Component {
theme: component.theme,
strings: component.strings,
titleFormat: fromFormat,
title: localizedLanguageName(strings: component.strings, language: component.externalState.sourceLanguage ?? "", kind: .translateFrom),
title: fromTitle,
titleAction: nil,
isExpanded: (
component.externalState.isSourceTextExpanded,
@ -415,6 +443,13 @@ final class TextProcessingTranslateContentComponent: Component {
}
}
let isTranslate: Bool
if case .translate = component.mode {
isTranslate = true
} else {
isTranslate = false
}
let targetTextSize = self.targetText.update(
transition: transition,
component: AnyComponent(TextProcessingTextAreaComponent(
@ -423,7 +458,7 @@ final class TextProcessingTranslateContentComponent: Component {
strings: component.strings,
titleFormat: toFormat,
title: toTitle,
titleAction: component.mode == .translate ? { [weak self] sourceView in
titleAction: isTranslate ? { [weak self] sourceView in
guard let self, let component = self.component, let result = component.externalState.result else {
return
}
@ -450,7 +485,7 @@ final class TextProcessingTranslateContentComponent: Component {
}
component.copyAction?()
} : nil,
emojify: (component.mode == .translate || component.mode == .stylize) ? (
emojify: (isTranslate || component.mode == .stylize) ? (
component.externalState.emojify,
{ [weak self] in
guard let self, let component = self.component else {