mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Various fixes
This commit is contained in:
parent
731442756a
commit
74cd2b6093
@ -92,6 +92,11 @@ public final class AvatarVideoNode: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if animationFile.isCustomTemplateEmoji {
|
||||||
|
animationNode.dynamicColor = .white
|
||||||
|
} else {
|
||||||
|
animationNode.dynamicColor = nil
|
||||||
|
}
|
||||||
self.backgroundNode.addSubnode(animationNode)
|
self.backgroundNode.addSubnode(animationNode)
|
||||||
} else {
|
} else {
|
||||||
let itemNativeFitSize = self.internalSize.width > 100.0 ? CGSize(width: 192.0, height: 192.0) : CGSize(width: 64.0, height: 64.0)
|
let itemNativeFitSize = self.internalSize.width > 100.0 ? CGSize(width: 192.0, height: 192.0) : CGSize(width: 64.0, height: 64.0)
|
||||||
@ -129,6 +134,7 @@ public final class AvatarVideoNode: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
itemLayer.layerTintColor = UIColor.white.cgColor
|
itemLayer.layerTintColor = UIColor.white.cgColor
|
||||||
|
|
||||||
self.itemLayer = itemLayer
|
self.itemLayer = itemLayer
|
||||||
self.backgroundNode.layer.addSublayer(itemLayer)
|
self.backgroundNode.layer.addSublayer(itemLayer)
|
||||||
}
|
}
|
||||||
|
@ -312,7 +312,7 @@ func chatContextMenuItems(context: AccountContext, peerId: PeerId, promoInfo: Ch
|
|||||||
updatedItems.append(.separator)
|
updatedItems.append(.separator)
|
||||||
updatedItems.append(.action(ContextMenuActionItem(text: strings.ChatList_Context_Back, icon: { theme in
|
updatedItems.append(.action(ContextMenuActionItem(text: strings.ChatList_Context_Back, icon: { theme in
|
||||||
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.contextMenu.primaryColor)
|
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.contextMenu.primaryColor)
|
||||||
}, action: { c, _ in
|
}, iconPosition: .left, action: { c, _ in
|
||||||
c.setItems(chatContextMenuItems(context: context, peerId: peerId, promoInfo: promoInfo, source: source, chatListController: chatListController, joined: joined) |> map { ContextController.Items(content: .list($0)) }, minHeight: nil)
|
c.setItems(chatContextMenuItems(context: context, peerId: peerId, promoInfo: promoInfo, source: source, chatListController: chatListController, joined: joined) |> map { ContextController.Items(content: .list($0)) }, minHeight: nil)
|
||||||
})))
|
})))
|
||||||
|
|
||||||
|
@ -1491,10 +1491,12 @@ public final class ChatListNode: ListView {
|
|||||||
if product.id.hasSuffix(".annual") {
|
if product.id.hasSuffix(".annual") {
|
||||||
let fraction = Float(product.priceCurrencyAndAmount.amount) / Float(12) / Float(shortestOptionPrice.0)
|
let fraction = Float(product.priceCurrencyAndAmount.amount) / Float(12) / Float(shortestOptionPrice.0)
|
||||||
let discount = Int32(round((1.0 - fraction) * 20.0) * 5.0)
|
let discount = Int32(round((1.0 - fraction) * 20.0) * 5.0)
|
||||||
if suggestions.contains(.annualPremium) {
|
if discount > 0 {
|
||||||
return .premiumAnnualDiscount(discount: discount)
|
if suggestions.contains(.annualPremium) {
|
||||||
} else if suggestions.contains(.upgradePremium) {
|
return .premiumAnnualDiscount(discount: discount)
|
||||||
return .premiumUpgrade(discount: discount)
|
} else if suggestions.contains(.upgradePremium) {
|
||||||
|
return .premiumUpgrade(discount: discount)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -340,7 +340,11 @@ private final class ContextControllerActionsListActionItemNode: HighlightTrackin
|
|||||||
if let titleVerticalOffset {
|
if let titleVerticalOffset {
|
||||||
titleFrame = titleFrame.offsetBy(dx: 0.0, dy: titleVerticalOffset)
|
titleFrame = titleFrame.offsetBy(dx: 0.0, dy: titleVerticalOffset)
|
||||||
}
|
}
|
||||||
let subtitleFrame = CGRect(origin: CGPoint(x: sideInset, y: titleFrame.maxY + titleSubtitleSpacing), size: subtitleSize)
|
var subtitleFrame = CGRect(origin: CGPoint(x: sideInset, y: titleFrame.maxY + titleSubtitleSpacing), size: subtitleSize)
|
||||||
|
if self.item.iconPosition == .left {
|
||||||
|
titleFrame = titleFrame.offsetBy(dx: 36.0, dy: 0.0)
|
||||||
|
subtitleFrame = subtitleFrame.offsetBy(dx: 36.0, dy: 0.0)
|
||||||
|
}
|
||||||
|
|
||||||
transition.updateFrame(node: self.highlightBackgroundNode, frame: CGRect(origin: CGPoint(), size: size), beginWithCurrentState: true)
|
transition.updateFrame(node: self.highlightBackgroundNode, frame: CGRect(origin: CGPoint(), size: size), beginWithCurrentState: true)
|
||||||
transition.updateFrameAdditive(node: self.titleLabelNode, frame: titleFrame)
|
transition.updateFrameAdditive(node: self.titleLabelNode, frame: titleFrame)
|
||||||
@ -348,7 +352,12 @@ private final class ContextControllerActionsListActionItemNode: HighlightTrackin
|
|||||||
|
|
||||||
if let iconSize = iconSize {
|
if let iconSize = iconSize {
|
||||||
let iconWidth = max(standardIconWidth, iconSize.width)
|
let iconWidth = max(standardIconWidth, iconSize.width)
|
||||||
let iconFrame = CGRect(origin: CGPoint(x: size.width - iconSideInset - iconWidth + floor((iconWidth - iconSize.width) / 2.0), y: floor((size.height - iconSize.height) / 2.0)), size: iconSize)
|
let iconFrame = CGRect(
|
||||||
|
origin: CGPoint(
|
||||||
|
x: self.item.iconPosition == .left ? iconSideInset : size.width - iconSideInset - iconWidth + floor((iconWidth - iconSize.width) / 2.0),
|
||||||
|
y: floor((size.height - iconSize.height) / 2.0)
|
||||||
|
),
|
||||||
|
size: iconSize)
|
||||||
transition.updateFrame(node: self.iconNode, frame: iconFrame, beginWithCurrentState: true)
|
transition.updateFrame(node: self.iconNode, frame: iconFrame, beginWithCurrentState: true)
|
||||||
if let animationNode = self.animationNode {
|
if let animationNode = self.animationNode {
|
||||||
transition.updateFrame(node: animationNode, frame: iconFrame, beginWithCurrentState: true)
|
transition.updateFrame(node: animationNode, frame: iconFrame, beginWithCurrentState: true)
|
||||||
|
@ -2631,7 +2631,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
|
|||||||
items.append(.separator)
|
items.append(.separator)
|
||||||
items.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.Common_Back, icon: { theme in
|
items.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.Common_Back, icon: { theme in
|
||||||
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.actionSheet.primaryTextColor)
|
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.actionSheet.primaryTextColor)
|
||||||
}, action: { c, _ in
|
}, iconPosition: .left, action: { c, _ in
|
||||||
guard let strongSelf = self else {
|
guard let strongSelf = self else {
|
||||||
c.dismiss(completion: nil)
|
c.dismiss(completion: nil)
|
||||||
return
|
return
|
||||||
|
@ -166,7 +166,7 @@ public func presentPeerReportOptions(context: AccountContext, parent: ViewContro
|
|||||||
items.append(.separator)
|
items.append(.separator)
|
||||||
items.append(.action(ContextMenuActionItem(text: presentationData.strings.Common_Back, icon: { theme in
|
items.append(.action(ContextMenuActionItem(text: presentationData.strings.Common_Back, icon: { theme in
|
||||||
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.actionSheet.primaryTextColor)
|
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.actionSheet.primaryTextColor)
|
||||||
}, action: { (c, _) in
|
}, iconPosition: .left, action: { (c, _) in
|
||||||
backAction(c)
|
backAction(c)
|
||||||
})))
|
})))
|
||||||
}
|
}
|
||||||
|
@ -422,7 +422,7 @@ private enum DataAndStorageEntry: ItemListNodeEntry {
|
|||||||
}, tag: DataAndStorageEntryTag.saveEditedPhotos)
|
}, tag: DataAndStorageEntryTag.saveEditedPhotos)
|
||||||
case let .pauseMusicOnRecording(_, text, value):
|
case let .pauseMusicOnRecording(_, text, value):
|
||||||
return ItemListSwitchItem(presentationData: presentationData, title: text, value: value, sectionId: self.section, style: .blocks, updated: { value in
|
return ItemListSwitchItem(presentationData: presentationData, title: text, value: value, sectionId: self.section, style: .blocks, updated: { value in
|
||||||
arguments.toggleSaveEditedPhotos(value)
|
arguments.togglePauseMusicOnRecording(value)
|
||||||
}, tag: DataAndStorageEntryTag.saveEditedPhotos)
|
}, tag: DataAndStorageEntryTag.saveEditedPhotos)
|
||||||
case let .openLinksIn(_, text, value):
|
case let .openLinksIn(_, text, value):
|
||||||
return ItemListDisclosureItem(presentationData: presentationData, title: text, label: value, sectionId: self.section, style: .blocks, action: {
|
return ItemListDisclosureItem(presentationData: presentationData, title: text, label: value, sectionId: self.section, style: .blocks, action: {
|
||||||
|
@ -468,9 +468,11 @@ final class LocalizationListControllerNode: ViewControllerTracingNode {
|
|||||||
if let activeLanguage = activeLanguageCode, supportedTranslationLanguages.contains(activeLanguage) {
|
if let activeLanguage = activeLanguageCode, supportedTranslationLanguages.contains(activeLanguage) {
|
||||||
ignoredLanguages = [activeLanguage]
|
ignoredLanguages = [activeLanguage]
|
||||||
}
|
}
|
||||||
let systemLanguage = systemLanguageCode()
|
let systemLanguages = systemLanguageCodes()
|
||||||
if !ignoredLanguages.contains(systemLanguage) {
|
for systemLanguage in systemLanguages {
|
||||||
ignoredLanguages.append(systemLanguage)
|
if !ignoredLanguages.contains(systemLanguage) {
|
||||||
|
ignoredLanguages.append(systemLanguage)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -478,9 +480,10 @@ final class LocalizationListControllerNode: ViewControllerTracingNode {
|
|||||||
if let activeLanguage = activeLanguageCode, supportedTranslationLanguages.contains(activeLanguage) {
|
if let activeLanguage = activeLanguageCode, supportedTranslationLanguages.contains(activeLanguage) {
|
||||||
ignoredLanguages = [activeLanguage]
|
ignoredLanguages = [activeLanguage]
|
||||||
}
|
}
|
||||||
let systemLanguageCode = systemLanguageCode()
|
for systemLanguageCode in systemLanguageCodes() {
|
||||||
if !ignoredLanguages.contains(systemLanguageCode) {
|
if !ignoredLanguages.contains(systemLanguageCode) {
|
||||||
ignoredLanguages.append(systemLanguageCode)
|
ignoredLanguages.append(systemLanguageCode)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -561,14 +564,18 @@ final class LocalizationListControllerNode: ViewControllerTracingNode {
|
|||||||
let transition = preparedLanguageListNodeTransition(presentationData: presentationData, from: previousEntriesAndPresentationData?.0 ?? [], to: entries, openSearch: openSearch, toggleShowTranslate: { value in
|
let transition = preparedLanguageListNodeTransition(presentationData: presentationData, from: previousEntriesAndPresentationData?.0 ?? [], to: entries, openSearch: openSearch, toggleShowTranslate: { value in
|
||||||
let _ = updateTranslationSettingsInteractively(accountManager: context.sharedContext.accountManager, { current in
|
let _ = updateTranslationSettingsInteractively(accountManager: context.sharedContext.accountManager, { current in
|
||||||
var updated = current.withUpdatedShowTranslate(value)
|
var updated = current.withUpdatedShowTranslate(value)
|
||||||
if !value {
|
if !updated.showTranslate && !updated.translateChats {
|
||||||
updated = updated.withUpdatedIgnoredLanguages(nil)
|
updated = updated.withUpdatedIgnoredLanguages(nil)
|
||||||
}
|
}
|
||||||
return updated
|
return updated
|
||||||
}).start()
|
}).start()
|
||||||
}, toggleTranslateChats: { value in
|
}, toggleTranslateChats: { value in
|
||||||
let _ = updateTranslationSettingsInteractively(accountManager: context.sharedContext.accountManager, { current in
|
let _ = updateTranslationSettingsInteractively(accountManager: context.sharedContext.accountManager, { current in
|
||||||
return current.withUpdatedTranslateChats(value)
|
var updated = current.withUpdatedTranslateChats(value)
|
||||||
|
if !updated.showTranslate && !updated.translateChats {
|
||||||
|
updated = updated.withUpdatedIgnoredLanguages(nil)
|
||||||
|
}
|
||||||
|
return updated
|
||||||
}).start()
|
}).start()
|
||||||
}, openDoNotTranslate: { [weak self] in
|
}, openDoNotTranslate: { [weak self] in
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
|
@ -69,7 +69,7 @@ private enum TranslationSettingsControllerEntry: ItemListNodeEntry {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func translationSettingsControllerEntries(theme: PresentationTheme, strings: PresentationStrings, settings: TranslationSettings, languages: [(String, String, String)]) -> [TranslationSettingsControllerEntry] {
|
private func translationSettingsControllerEntries(theme: PresentationTheme, strings: PresentationStrings, initiallySelectedLanguages: Set<String>, settings: TranslationSettings, languages: [(String, String, String)]) -> [TranslationSettingsControllerEntry] {
|
||||||
var entries: [TranslationSettingsControllerEntry] = []
|
var entries: [TranslationSettingsControllerEntry] = []
|
||||||
|
|
||||||
var index: Int32 = 0
|
var index: Int32 = 0
|
||||||
@ -77,11 +77,28 @@ private func translationSettingsControllerEntries(theme: PresentationTheme, stri
|
|||||||
if let ignoredLanguages = settings.ignoredLanguages {
|
if let ignoredLanguages = settings.ignoredLanguages {
|
||||||
selectedLanguages = Set(ignoredLanguages)
|
selectedLanguages = Set(ignoredLanguages)
|
||||||
} else {
|
} else {
|
||||||
selectedLanguages = Set([strings.baseLanguageCode, systemLanguageCode()])
|
selectedLanguages = Set([strings.baseLanguageCode])
|
||||||
|
for language in systemLanguageCodes() {
|
||||||
|
selectedLanguages.insert(language)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var addedLanguages = Set<String>()
|
||||||
|
|
||||||
for (code, title, subtitle) in languages {
|
for (code, title, subtitle) in languages {
|
||||||
entries.append(.language(index, theme, title, subtitle, selectedLanguages.contains(code), code))
|
if !addedLanguages.contains(code), initiallySelectedLanguages.contains(code) {
|
||||||
index += 1
|
addedLanguages.insert(code)
|
||||||
|
entries.append(.language(index, theme, title, subtitle, selectedLanguages.contains(code), code))
|
||||||
|
index += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (code, title, subtitle) in languages {
|
||||||
|
if !addedLanguages.contains(code) {
|
||||||
|
addedLanguages.insert(code)
|
||||||
|
entries.append(.language(index, theme, title, subtitle, selectedLanguages.contains(code), code))
|
||||||
|
index += 1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return entries
|
return entries
|
||||||
@ -97,11 +114,15 @@ public func translationSettingsController(context: AccountContext) -> ViewContro
|
|||||||
let _ = updateTranslationSettingsInteractively(accountManager: context.sharedContext.accountManager, { current in
|
let _ = updateTranslationSettingsInteractively(accountManager: context.sharedContext.accountManager, { current in
|
||||||
var updated = current
|
var updated = current
|
||||||
var updatedIgnoredLanguages = updated.ignoredLanguages ?? []
|
var updatedIgnoredLanguages = updated.ignoredLanguages ?? []
|
||||||
if value {
|
if current.ignoredLanguages == nil {
|
||||||
if current.ignoredLanguages == nil {
|
updatedIgnoredLanguages.append(interfaceLanguageCode)
|
||||||
updatedIgnoredLanguages.append(interfaceLanguageCode)
|
for language in systemLanguageCodes() {
|
||||||
updatedIgnoredLanguages.append(systemLanguageCode())
|
if !updatedIgnoredLanguages.contains(language) {
|
||||||
|
updatedIgnoredLanguages.append(language)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if value {
|
||||||
if !updatedIgnoredLanguages.contains(code) {
|
if !updatedIgnoredLanguages.contains(code) {
|
||||||
updatedIgnoredLanguages.append(code)
|
updatedIgnoredLanguages.append(code)
|
||||||
}
|
}
|
||||||
@ -143,12 +164,32 @@ public func translationSettingsController(context: AccountContext) -> ViewContro
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let initiallySelectedLanguages = Atomic<Set<String>?>(value: nil)
|
||||||
|
|
||||||
let sharedData = context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.translationSettings])
|
let sharedData = context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.translationSettings])
|
||||||
let signal = combineLatest(queue: Queue.mainQueue(), context.sharedContext.presentationData, sharedData)
|
let signal = combineLatest(queue: Queue.mainQueue(), context.sharedContext.presentationData, sharedData)
|
||||||
|> map { presentationData, sharedData -> (ItemListControllerState, (ItemListNodeState, Any)) in
|
|> map { presentationData, sharedData -> (ItemListControllerState, (ItemListNodeState, Any)) in
|
||||||
let settings = sharedData.entries[ApplicationSpecificSharedDataKeys.translationSettings]?.get(TranslationSettings.self) ?? TranslationSettings.defaultSettings
|
let settings = sharedData.entries[ApplicationSpecificSharedDataKeys.translationSettings]?.get(TranslationSettings.self) ?? TranslationSettings.defaultSettings
|
||||||
|
|
||||||
|
let initiallySelectedLanguages = initiallySelectedLanguages.modify({ current in
|
||||||
|
if let current {
|
||||||
|
return current
|
||||||
|
} else {
|
||||||
|
var selectedLanguages: Set<String>
|
||||||
|
if let ignoredLanguages = settings.ignoredLanguages {
|
||||||
|
selectedLanguages = Set(ignoredLanguages)
|
||||||
|
} else {
|
||||||
|
selectedLanguages = Set([presentationData.strings.baseLanguageCode])
|
||||||
|
for language in systemLanguageCodes() {
|
||||||
|
selectedLanguages.insert(language)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return selectedLanguages
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
let controllerState = ItemListControllerState(presentationData: ItemListPresentationData(presentationData), title: .text(presentationData.strings.DoNotTranslate_Title), leftNavigationButton: nil, rightNavigationButton: nil, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back))
|
let controllerState = ItemListControllerState(presentationData: ItemListPresentationData(presentationData), title: .text(presentationData.strings.DoNotTranslate_Title), leftNavigationButton: nil, rightNavigationButton: nil, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back))
|
||||||
let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: translationSettingsControllerEntries(theme: presentationData.theme, strings: presentationData.strings, settings: settings, languages: languages), style: .blocks, animateChanges: false)
|
let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: translationSettingsControllerEntries(theme: presentationData.theme, strings: presentationData.strings, initiallySelectedLanguages: initiallySelectedLanguages ?? Set(), settings: settings, languages: languages), style: .blocks, animateChanges: false)
|
||||||
|
|
||||||
return (controllerState, (listState, arguments))
|
return (controllerState, (listState, arguments))
|
||||||
}
|
}
|
||||||
|
@ -2860,7 +2860,7 @@ public final class VoiceChatControllerImpl: ViewController, VoiceChatController
|
|||||||
items.append(.separator)
|
items.append(.separator)
|
||||||
items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.Common_Back, icon: { theme in
|
items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.Common_Back, icon: { theme in
|
||||||
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.actionSheet.primaryTextColor)
|
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.actionSheet.primaryTextColor)
|
||||||
}, action: { [weak self] (c, _) in
|
}, iconPosition: .left, action: { [weak self] (c, _) in
|
||||||
guard let strongSelf = self else {
|
guard let strongSelf = self else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -2955,7 +2955,7 @@ public final class VoiceChatControllerImpl: ViewController, VoiceChatController
|
|||||||
items.append(.separator)
|
items.append(.separator)
|
||||||
items.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.Common_Back, icon: { theme in
|
items.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.Common_Back, icon: { theme in
|
||||||
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.actionSheet.primaryTextColor)
|
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.actionSheet.primaryTextColor)
|
||||||
}, action: { (c, _) in
|
}, iconPosition: .left, action: { (c, _) in
|
||||||
guard let strongSelf = self else {
|
guard let strongSelf = self else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -3001,7 +3001,7 @@ public final class VoiceChatControllerImpl: ViewController, VoiceChatController
|
|||||||
items.append(.separator)
|
items.append(.separator)
|
||||||
items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.Common_Back, icon: { theme in
|
items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.Common_Back, icon: { theme in
|
||||||
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.actionSheet.primaryTextColor)
|
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.actionSheet.primaryTextColor)
|
||||||
}, action: { [weak self] (c, _) in
|
}, iconPosition: .left, action: { [weak self] (c, _) in
|
||||||
guard let strongSelf = self else {
|
guard let strongSelf = self else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -203,13 +203,20 @@ extension TelegramUser {
|
|||||||
let restrictionInfo: PeerAccessRestrictionInfo? = rhs.restrictionInfo
|
let restrictionInfo: PeerAccessRestrictionInfo? = rhs.restrictionInfo
|
||||||
|
|
||||||
let accessHash: TelegramPeerAccessHash?
|
let accessHash: TelegramPeerAccessHash?
|
||||||
if let rhsAccessHashValue = lhs.accessHash, case .personal = rhsAccessHashValue {
|
if let rhsAccessHashValue = rhs.accessHash, case .personal = rhsAccessHashValue {
|
||||||
accessHash = rhsAccessHashValue
|
accessHash = rhsAccessHashValue
|
||||||
} else {
|
} else {
|
||||||
accessHash = lhs.accessHash ?? rhs.accessHash
|
accessHash = lhs.accessHash ?? rhs.accessHash
|
||||||
}
|
}
|
||||||
|
|
||||||
return TelegramUser(id: lhs.id, accessHash: accessHash, firstName: lhs.firstName, lastName: lhs.lastName, username: rhs.username, phone: lhs.phone, photo: rhs.photo.isEmpty ? lhs.photo : rhs.photo, botInfo: botInfo, restrictionInfo: restrictionInfo, flags: userFlags, emojiStatus: emojiStatus, usernames: rhs.usernames)
|
let photo: [TelegramMediaImageRepresentation]
|
||||||
|
if case .genericPublic = rhs.accessHash {
|
||||||
|
photo = lhs.photo
|
||||||
|
} else {
|
||||||
|
photo = rhs.photo
|
||||||
|
}
|
||||||
|
|
||||||
|
return TelegramUser(id: lhs.id, accessHash: accessHash, firstName: lhs.firstName, lastName: lhs.lastName, username: rhs.username, phone: lhs.phone, photo: photo, botInfo: botInfo, restrictionInfo: restrictionInfo, flags: userFlags, emojiStatus: emojiStatus, usernames: rhs.usernames)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -99,7 +99,6 @@ final class AvatarPreviewComponent: Component {
|
|||||||
let hadFile = self.component?.file != nil
|
let hadFile = self.component?.file != nil
|
||||||
var fileUpdated = false
|
var fileUpdated = false
|
||||||
if self.component?.file?.fileId != component.file?.fileId {
|
if self.component?.file?.fileId != component.file?.fileId {
|
||||||
self.imageNode.isHidden = false
|
|
||||||
fileUpdated = true
|
fileUpdated = true
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,9 +129,8 @@ final class AvatarPreviewComponent: Component {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.imageNode.isHidden = false
|
||||||
if file.isAnimatedSticker || file.isVideoSticker || file.mimeType == "video/webm" {
|
if file.isAnimatedSticker || file.isVideoSticker || file.mimeType == "video/webm" {
|
||||||
self.imageNode.isHidden = false
|
|
||||||
|
|
||||||
if self.animationNode == nil {
|
if self.animationNode == nil {
|
||||||
let animationNode = DefaultAnimatedStickerNodeImpl()
|
let animationNode = DefaultAnimatedStickerNodeImpl()
|
||||||
animationNode.autoplay = false
|
animationNode.autoplay = false
|
||||||
@ -150,7 +148,6 @@ final class AvatarPreviewComponent: Component {
|
|||||||
animationNode.visibility = false
|
animationNode.visibility = false
|
||||||
self.animationNode = nil
|
self.animationNode = nil
|
||||||
animationNode.removeFromSupernode()
|
animationNode.removeFromSupernode()
|
||||||
self.imageNode.isHidden = false
|
|
||||||
}
|
}
|
||||||
self.imageNode.setSignal(chatMessageSticker(account: component.context.account, userLocation: .other, file: file, small: false, synchronousLoad: false))
|
self.imageNode.setSignal(chatMessageSticker(account: component.context.account, userLocation: .other, file: file, small: false, synchronousLoad: false))
|
||||||
self.stickerFetchedDisposable.set(freeMediaFileResourceInteractiveFetched(account: component.context.account, userLocation: .other, fileReference: stickerPackFileReference(file), resource: chatMessageStickerResource(file: file, small: false)).start())
|
self.stickerFetchedDisposable.set(freeMediaFileResourceInteractiveFetched(account: component.context.account, userLocation: .other, fileReference: stickerPackFileReference(file), resource: chatMessageStickerResource(file: file, small: false)).start())
|
||||||
@ -205,6 +202,14 @@ final class AvatarPreviewComponent: Component {
|
|||||||
self.animationNode?.setup(source: source, width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), playbackMode: .count(1), mode: .direct(cachePathPrefix: nil))
|
self.animationNode?.setup(source: source, width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), playbackMode: .count(1), mode: .direct(cachePathPrefix: nil))
|
||||||
self.animationNode?.visibility = true
|
self.animationNode?.visibility = true
|
||||||
|
|
||||||
|
if let animationNode = self.animationNode as? DefaultAnimatedStickerNodeImpl {
|
||||||
|
if file.isCustomTemplateEmoji {
|
||||||
|
animationNode.dynamicColor = .white
|
||||||
|
} else {
|
||||||
|
animationNode.dynamicColor = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
self.cachedDisposable.set((source.cachedDataPath(width: 384, height: 384)
|
self.cachedDisposable.set((source.cachedDataPath(width: 384, height: 384)
|
||||||
|> deliverOn(Queue.concurrentDefaultQueue())).start())
|
|> deliverOn(Queue.concurrentDefaultQueue())).start())
|
||||||
}
|
}
|
||||||
|
@ -10074,7 +10074,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
})
|
})
|
||||||
|> deliverOnMainQueue).start(completed: { [weak self] in
|
|> deliverOnMainQueue).start(completed: { [weak self] in
|
||||||
if let strongSelf = self, type == .translated {
|
if let strongSelf = self, type == .translated {
|
||||||
Queue.mainQueue().after(0.3) {
|
Queue.mainQueue().after(0.15) {
|
||||||
strongSelf.chatDisplayNode.historyNode.refreshPollActionsForVisibleMessages()
|
strongSelf.chatDisplayNode.historyNode.refreshPollActionsForVisibleMessages()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -10106,7 +10106,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
} else {
|
} else {
|
||||||
var ignoredLanguages = Set<String>()
|
var ignoredLanguages = Set<String>()
|
||||||
ignoredLanguages.insert(strongSelf.presentationData.strings.baseLanguageCode)
|
ignoredLanguages.insert(strongSelf.presentationData.strings.baseLanguageCode)
|
||||||
ignoredLanguages.insert(systemLanguageCode())
|
for language in systemLanguageCodes() {
|
||||||
|
ignoredLanguages.insert(language)
|
||||||
|
}
|
||||||
ignoredLanguages.insert(langCode)
|
ignoredLanguages.insert(langCode)
|
||||||
updated.ignoredLanguages = Array(ignoredLanguages)
|
updated.ignoredLanguages = Array(ignoredLanguages)
|
||||||
}
|
}
|
||||||
|
@ -241,7 +241,7 @@ class ChatMessageInstantVideoBubbleContentNode: ChatMessageBubbleContentNode {
|
|||||||
|
|
||||||
let videoFrame = CGRect(origin: CGPoint(x: 1.0, y: 1.0), size: videoLayout.contentSize)
|
let videoFrame = CGRect(origin: CGPoint(x: 1.0, y: 1.0), size: videoLayout.contentSize)
|
||||||
|
|
||||||
let contentProperties = ChatMessageBubbleContentProperties(hidesSimpleAuthorHeader: false, headerSpacing: 0.0, hidesBackground: .never, forceFullCorners: false, forceAlignment: .none, shareButtonOffset: isExpanded ? nil : CGPoint(x: displaySize.width + 4.0, y: -25.0), hidesHeaders: !isExpanded, avatarOffset: !isExpanded && isPlaying ? -100.0 : 0.0)
|
let contentProperties = ChatMessageBubbleContentProperties(hidesSimpleAuthorHeader: false, headerSpacing: 0.0, hidesBackground: .never, forceFullCorners: false, forceAlignment: .none, shareButtonOffset: isExpanded ? nil : CGPoint(x: avatarInset + displaySize.width + 4.0, y: -25.0), hidesHeaders: !isExpanded, avatarOffset: !isExpanded && isPlaying ? -100.0 : 0.0)
|
||||||
|
|
||||||
let videoFrameWidth = videoFrame.width + 2.0
|
let videoFrameWidth = videoFrame.width + 2.0
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@ import ChatPresentationInterfaceState
|
|||||||
import TextNodeWithEntities
|
import TextNodeWithEntities
|
||||||
import AnimationCache
|
import AnimationCache
|
||||||
import MultiAnimationRenderer
|
import MultiAnimationRenderer
|
||||||
|
import TranslateUI
|
||||||
|
|
||||||
private enum PinnedMessageAnimation {
|
private enum PinnedMessageAnimation {
|
||||||
case slideToTop
|
case slideToTop
|
||||||
@ -70,6 +71,8 @@ final class ChatPinnedMessageTitlePanelNode: ChatTitleAccessoryPanelNode {
|
|||||||
private var currentLayout: (CGFloat, CGFloat, CGFloat)?
|
private var currentLayout: (CGFloat, CGFloat, CGFloat)?
|
||||||
private var currentMessage: ChatPinnedMessage?
|
private var currentMessage: ChatPinnedMessage?
|
||||||
private var previousMediaReference: AnyMediaReference?
|
private var previousMediaReference: AnyMediaReference?
|
||||||
|
private var currentTranslateToLanguage: String?
|
||||||
|
private let translationDisposable = MetaDisposable()
|
||||||
|
|
||||||
private var isReplyThread: Bool = false
|
private var isReplyThread: Bool = false
|
||||||
|
|
||||||
@ -229,6 +232,7 @@ final class ChatPinnedMessageTitlePanelNode: ChatTitleAccessoryPanelNode {
|
|||||||
deinit {
|
deinit {
|
||||||
self.fetchDisposable.dispose()
|
self.fetchDisposable.dispose()
|
||||||
self.statusDisposable?.dispose()
|
self.statusDisposable?.dispose()
|
||||||
|
self.translationDisposable.dispose()
|
||||||
}
|
}
|
||||||
|
|
||||||
private var theme: PresentationTheme?
|
private var theme: PresentationTheme?
|
||||||
@ -473,7 +477,30 @@ final class ChatPinnedMessageTitlePanelNode: ChatTitleAccessoryPanelNode {
|
|||||||
self.clippingContainer.frame = CGRect(origin: CGPoint(), size: CGSize(width: width, height: panelHeight))
|
self.clippingContainer.frame = CGRect(origin: CGPoint(), size: CGSize(width: width, height: panelHeight))
|
||||||
self.contentContainer.frame = CGRect(origin: CGPoint(), size: CGSize(width: width, height: panelHeight))
|
self.contentContainer.frame = CGRect(origin: CGPoint(), size: CGSize(width: width, height: panelHeight))
|
||||||
|
|
||||||
if self.currentLayout?.0 != width || self.currentLayout?.1 != leftInset || self.currentLayout?.2 != rightInset || messageUpdated || themeUpdated {
|
var translateToLanguage: String?
|
||||||
|
if let translationState = interfaceState.translationState, translationState.isEnabled {
|
||||||
|
translateToLanguage = translationState.toLang
|
||||||
|
if translateToLanguage == "nb" {
|
||||||
|
translateToLanguage = "nl"
|
||||||
|
} else if translateToLanguage == "pt-br" {
|
||||||
|
translateToLanguage = "pt"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var currentTranslateToLanguageUpdated = false
|
||||||
|
if self.currentTranslateToLanguage != translateToLanguage {
|
||||||
|
self.currentTranslateToLanguage = translateToLanguage
|
||||||
|
currentTranslateToLanguageUpdated = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if currentTranslateToLanguageUpdated || messageUpdated, let message = interfaceState.pinnedMessage?.message {
|
||||||
|
if let translation = message.attributes.first(where: { $0 is TranslationMessageAttribute }) as? TranslationMessageAttribute, translation.toLang == translateToLanguage {
|
||||||
|
} else if let translateToLanguage {
|
||||||
|
self.translationDisposable.set(translateMessageIds(context: self.context, messageIds: [message.id], toLang: translateToLanguage).start())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.currentLayout?.0 != width || self.currentLayout?.1 != leftInset || self.currentLayout?.2 != rightInset || messageUpdated || themeUpdated || currentTranslateToLanguageUpdated {
|
||||||
self.currentLayout = (width, leftInset, rightInset)
|
self.currentLayout = (width, leftInset, rightInset)
|
||||||
|
|
||||||
let previousMessageWasNil = self.currentMessage == nil
|
let previousMessageWasNil = self.currentMessage == nil
|
||||||
@ -481,7 +508,7 @@ final class ChatPinnedMessageTitlePanelNode: ChatTitleAccessoryPanelNode {
|
|||||||
|
|
||||||
if let currentMessage = self.currentMessage, let currentLayout = self.currentLayout {
|
if let currentMessage = self.currentMessage, let currentLayout = self.currentLayout {
|
||||||
self.dustNode?.update(revealed: false, animated: false)
|
self.dustNode?.update(revealed: false, animated: false)
|
||||||
self.enqueueTransition(width: currentLayout.0, panelHeight: panelHeight, leftInset: currentLayout.1, rightInset: currentLayout.2, transition: .immediate, animation: messageUpdatedAnimation, pinnedMessage: currentMessage, theme: interfaceState.theme, strings: interfaceState.strings, nameDisplayOrder: interfaceState.nameDisplayOrder, dateTimeFormat: interfaceState.dateTimeFormat, accountPeerId: self.context.account.peerId, firstTime: previousMessageWasNil, isReplyThread: isReplyThread)
|
self.enqueueTransition(width: currentLayout.0, panelHeight: panelHeight, leftInset: currentLayout.1, rightInset: currentLayout.2, transition: .immediate, animation: messageUpdatedAnimation, pinnedMessage: currentMessage, theme: interfaceState.theme, strings: interfaceState.strings, nameDisplayOrder: interfaceState.nameDisplayOrder, dateTimeFormat: interfaceState.dateTimeFormat, accountPeerId: self.context.account.peerId, firstTime: previousMessageWasNil, isReplyThread: isReplyThread, translateToLanguage: translateToLanguage)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -498,7 +525,7 @@ final class ChatPinnedMessageTitlePanelNode: ChatTitleAccessoryPanelNode {
|
|||||||
return LayoutResult(backgroundHeight: panelHeight, insetHeight: panelHeight)
|
return LayoutResult(backgroundHeight: panelHeight, insetHeight: panelHeight)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func enqueueTransition(width: CGFloat, panelHeight: CGFloat, leftInset: CGFloat, rightInset: CGFloat, transition: ContainedViewLayoutTransition, animation: PinnedMessageAnimation?, pinnedMessage: ChatPinnedMessage, theme: PresentationTheme, strings: PresentationStrings, nameDisplayOrder: PresentationPersonNameOrder, dateTimeFormat: PresentationDateTimeFormat, accountPeerId: PeerId, firstTime: Bool, isReplyThread: Bool) {
|
private func enqueueTransition(width: CGFloat, panelHeight: CGFloat, leftInset: CGFloat, rightInset: CGFloat, transition: ContainedViewLayoutTransition, animation: PinnedMessageAnimation?, pinnedMessage: ChatPinnedMessage, theme: PresentationTheme, strings: PresentationStrings, nameDisplayOrder: PresentationPersonNameOrder, dateTimeFormat: PresentationDateTimeFormat, accountPeerId: PeerId, firstTime: Bool, isReplyThread: Bool, translateToLanguage: String?) {
|
||||||
let message = pinnedMessage.message
|
let message = pinnedMessage.message
|
||||||
|
|
||||||
var animationTransition: ContainedViewLayoutTransition = .immediate
|
var animationTransition: ContainedViewLayoutTransition = .immediate
|
||||||
@ -652,7 +679,20 @@ final class ChatPinnedMessageTitlePanelNode: ChatTitleAccessoryPanelNode {
|
|||||||
let messageText: NSAttributedString
|
let messageText: NSAttributedString
|
||||||
let textFont = Font.regular(15.0)
|
let textFont = Font.regular(15.0)
|
||||||
if isText {
|
if isText {
|
||||||
let entities = (message.textEntitiesAttribute?.entities ?? []).filter { entity in
|
var text = message.text
|
||||||
|
var messageEntities = message.textEntitiesAttribute?.entities ?? []
|
||||||
|
|
||||||
|
if let translateToLanguage = translateToLanguage, !text.isEmpty {
|
||||||
|
for attribute in message.attributes {
|
||||||
|
if let attribute = attribute as? TranslationMessageAttribute, !attribute.text.isEmpty, attribute.toLang == translateToLanguage {
|
||||||
|
text = attribute.text
|
||||||
|
messageEntities = attribute.entities
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let entities = messageEntities.filter { entity in
|
||||||
switch entity.type {
|
switch entity.type {
|
||||||
case .Spoiler, .CustomEmoji:
|
case .Spoiler, .CustomEmoji:
|
||||||
return true
|
return true
|
||||||
@ -662,9 +702,9 @@ final class ChatPinnedMessageTitlePanelNode: ChatTitleAccessoryPanelNode {
|
|||||||
}
|
}
|
||||||
let textColor = theme.chat.inputPanel.primaryTextColor
|
let textColor = theme.chat.inputPanel.primaryTextColor
|
||||||
if entities.count > 0 {
|
if entities.count > 0 {
|
||||||
messageText = stringWithAppliedEntities(trimToLineCount(message.text, lineCount: 1), entities: entities, baseColor: textColor, linkColor: textColor, baseFont: textFont, linkFont: textFont, boldFont: textFont, italicFont: textFont, boldItalicFont: textFont, fixedFont: textFont, blockQuoteFont: textFont, underlineLinks: false, message: message)
|
messageText = stringWithAppliedEntities(trimToLineCount(text, lineCount: 1), entities: entities, baseColor: textColor, linkColor: textColor, baseFont: textFont, linkFont: textFont, boldFont: textFont, italicFont: textFont, boldItalicFont: textFont, fixedFont: textFont, blockQuoteFont: textFont, underlineLinks: false, message: message)
|
||||||
} else {
|
} else {
|
||||||
messageText = NSAttributedString(string: foldLineBreaks(textString.string), font: textFont, textColor: textColor)
|
messageText = NSAttributedString(string: foldLineBreaks(text), font: textFont, textColor: textColor)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
messageText = NSAttributedString(string: foldLineBreaks(textString.string), font: textFont, textColor: message.media.isEmpty || message.media.first is TelegramMediaWebpage ? theme.chat.inputPanel.primaryTextColor : theme.chat.inputPanel.secondaryTextColor)
|
messageText = NSAttributedString(string: foldLineBreaks(textString.string), font: textFont, textColor: message.media.isEmpty || message.media.first is TelegramMediaWebpage ? theme.chat.inputPanel.primaryTextColor : theme.chat.inputPanel.secondaryTextColor)
|
||||||
|
@ -174,9 +174,9 @@ final class ChatTranslationPanelNode: ASDisplayNode {
|
|||||||
}, action: { c, _ in
|
}, action: { c, _ in
|
||||||
var subItems: [ContextMenuItem] = []
|
var subItems: [ContextMenuItem] = []
|
||||||
|
|
||||||
subItems.append(.action(ContextMenuActionItem(text: presentationData.strings.Common_Back, icon: { theme in
|
subItems.append(.action(ContextMenuActionItem(text: presentationData.strings.ChatList_Context_Back, icon: { theme in
|
||||||
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.contextMenu.primaryColor)
|
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.contextMenu.primaryColor)
|
||||||
}, action: { c, _ in
|
}, iconPosition: .left, action: { c, _ in
|
||||||
c.popItems()
|
c.popItems()
|
||||||
})))
|
})))
|
||||||
subItems.append(.separator)
|
subItems.append(.separator)
|
||||||
@ -184,8 +184,19 @@ final class ChatTranslationPanelNode: ASDisplayNode {
|
|||||||
let enLocale = Locale(identifier: "en")
|
let enLocale = Locale(identifier: "en")
|
||||||
var languages: [(String, String, String)] = []
|
var languages: [(String, String, String)] = []
|
||||||
var addedLanguages = Set<String>()
|
var addedLanguages = Set<String>()
|
||||||
for code in popularTranslationLanguages {
|
|
||||||
if let title = enLocale.localizedString(forLanguageCode: code) {
|
var topLanguages: [String] = []
|
||||||
|
var langCode = languageCode
|
||||||
|
if langCode == "nb" {
|
||||||
|
langCode = "nl"
|
||||||
|
} else if langCode == "pt-br" {
|
||||||
|
langCode = "pt"
|
||||||
|
}
|
||||||
|
topLanguages.append(langCode)
|
||||||
|
topLanguages.append(contentsOf: popularTranslationLanguages)
|
||||||
|
|
||||||
|
for code in topLanguages {
|
||||||
|
if !addedLanguages.contains(code), let title = enLocale.localizedString(forLanguageCode: code) {
|
||||||
let languageLocale = Locale(identifier: code)
|
let languageLocale = Locale(identifier: code)
|
||||||
let subtitle = languageLocale.localizedString(forLanguageCode: code) ?? title
|
let subtitle = languageLocale.localizedString(forLanguageCode: code) ?? title
|
||||||
let value = (code, title.capitalized, subtitle.capitalized)
|
let value = (code, title.capitalized, subtitle.capitalized)
|
||||||
|
@ -4262,7 +4262,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
|
|||||||
|
|
||||||
subItems.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.Common_Back, icon: { theme in
|
subItems.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.Common_Back, icon: { theme in
|
||||||
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.contextMenu.primaryColor)
|
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.contextMenu.primaryColor)
|
||||||
}, action: { c, _ in
|
}, iconPosition: .left, action: { c, _ in
|
||||||
c.popItems()
|
c.popItems()
|
||||||
})))
|
})))
|
||||||
subItems.append(.separator)
|
subItems.append(.separator)
|
||||||
@ -4767,7 +4767,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
|
|||||||
|
|
||||||
subItems.append(.action(ContextMenuActionItem(text: strings.Common_Back, icon: { theme in
|
subItems.append(.action(ContextMenuActionItem(text: strings.Common_Back, icon: { theme in
|
||||||
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.contextMenu.primaryColor)
|
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.contextMenu.primaryColor)
|
||||||
}, action: { c, _ in
|
}, iconPosition: .left, action: { c, _ in
|
||||||
c.popItems()
|
c.popItems()
|
||||||
})))
|
})))
|
||||||
subItems.append(.separator)
|
subItems.append(.separator)
|
||||||
@ -4942,7 +4942,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
|
|||||||
|
|
||||||
subItems.append(.action(ContextMenuActionItem(text: strings.Common_Back, icon: { theme in
|
subItems.append(.action(ContextMenuActionItem(text: strings.Common_Back, icon: { theme in
|
||||||
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.contextMenu.primaryColor)
|
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.contextMenu.primaryColor)
|
||||||
}, action: { c, _ in
|
}, iconPosition: .left, action: { c, _ in
|
||||||
c.popItems()
|
c.popItems()
|
||||||
})))
|
})))
|
||||||
subItems.append(.separator)
|
subItems.append(.separator)
|
||||||
@ -5076,7 +5076,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
|
|||||||
|
|
||||||
subItems.append(.action(ContextMenuActionItem(text: strings.Common_Back, icon: { theme in
|
subItems.append(.action(ContextMenuActionItem(text: strings.Common_Back, icon: { theme in
|
||||||
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.contextMenu.primaryColor)
|
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.contextMenu.primaryColor)
|
||||||
}, action: { c, _ in
|
}, iconPosition: .left, action: { c, _ in
|
||||||
c.popItems()
|
c.popItems()
|
||||||
})))
|
})))
|
||||||
subItems.append(.separator)
|
subItems.append(.separator)
|
||||||
@ -5433,7 +5433,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
|
|||||||
|
|
||||||
subItems.append(.action(ContextMenuActionItem(text: self.presentationData.strings.Common_Back, icon: { theme in
|
subItems.append(.action(ContextMenuActionItem(text: self.presentationData.strings.Common_Back, icon: { theme in
|
||||||
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.contextMenu.primaryColor)
|
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.contextMenu.primaryColor)
|
||||||
}, action: { c, _ in
|
}, iconPosition: .left, action: { c, _ in
|
||||||
c.popItems()
|
c.popItems()
|
||||||
})))
|
})))
|
||||||
subItems.append(.separator)
|
subItems.append(.separator)
|
||||||
@ -6240,7 +6240,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
|
|||||||
items.append(.separator)
|
items.append(.separator)
|
||||||
items.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.Common_Back, icon: { theme in
|
items.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.Common_Back, icon: { theme in
|
||||||
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.actionSheet.primaryTextColor)
|
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.actionSheet.primaryTextColor)
|
||||||
}, action: { (c, _) in
|
}, iconPosition: .left, action: { (c, _) in
|
||||||
if let backAction = backAction {
|
if let backAction = backAction {
|
||||||
backAction(c)
|
backAction(c)
|
||||||
}
|
}
|
||||||
|
@ -165,7 +165,9 @@ public func chatTranslationState(context: AccountContext, peerId: EnginePeer.Id)
|
|||||||
dontTranslateLanguages = Set(ignoredLanguages)
|
dontTranslateLanguages = Set(ignoredLanguages)
|
||||||
} else {
|
} else {
|
||||||
dontTranslateLanguages.insert(baseLang)
|
dontTranslateLanguages.insert(baseLang)
|
||||||
dontTranslateLanguages.insert(systemLanguageCode())
|
for language in systemLanguageCodes() {
|
||||||
|
dontTranslateLanguages.insert(language)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return cachedChatTranslationState(engine: context.engine, peerId: peerId)
|
return cachedChatTranslationState(engine: context.engine, peerId: peerId)
|
||||||
|
@ -179,10 +179,11 @@ public func canTranslateText(context: AccountContext, text: String, showTranslat
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func systemLanguageCode() -> String {
|
public func systemLanguageCodes() -> [String] {
|
||||||
if let systemLanguage = Locale.preferredLanguages.first {
|
var languages: [String] = []
|
||||||
let language = systemLanguage.components(separatedBy: "-").first ?? systemLanguage
|
for language in Locale.preferredLanguages.prefix(2) {
|
||||||
return language
|
let language = language.components(separatedBy: "-").first ?? language
|
||||||
|
languages.append(language)
|
||||||
}
|
}
|
||||||
return ""
|
return languages
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user