diff --git a/BUCK b/BUCK index 718bbaa7bf..5122ec3b5a 100644 --- a/BUCK +++ b/BUCK @@ -43,6 +43,7 @@ resource_dependencies = [ "//submodules/LegacyComponents:LegacyComponentsResources", "//submodules/TelegramUI:TelegramUIAssets", "//submodules/TelegramUI:TelegramUIResources", + "//submodules/WalletUI:WalletUIResources", "//:AppResources", "//:AppStringResources", "//:InfoPlistStringResources", diff --git a/Telegram-iOS/en.lproj/Localizable.strings b/Telegram-iOS/en.lproj/Localizable.strings index 4cb008ec4b..cf153361c0 100644 --- a/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram-iOS/en.lproj/Localizable.strings @@ -4756,23 +4756,23 @@ Any member of this group will be able to see messages in the channel."; "ChatSearch.ResultsTooltip" = "Tap to view as a list."; -"Updated.JustNow" = "just now"; -"Updated.MinutesAgo_0" = "%@ minutes ago"; //three to ten -"Updated.MinutesAgo_1" = "1 minute ago"; //one -"Updated.MinutesAgo_2" = "2 minutes ago"; //two -"Updated.MinutesAgo_3_10" = "%@ minutes ago"; //three to ten -"Updated.MinutesAgo_many" = "%@ minutes ago"; // more than ten -"Updated.MinutesAgo_any" = "%@ minutes ago"; // more than ten -"Updated.HoursAgo_0" = "%@ hours ago"; -"Updated.HoursAgo_1" = "1 hour ago"; -"Updated.HoursAgo_2" = "2 hours ago"; -"Updated.HoursAgo_3_10" = "%@ hours ago"; -"Updated.HoursAgo_any" = "%@ hours ago"; -"Updated.HoursAgo_many" = "%@ hours ago"; -"Updated.HoursAgo_0" = "%@ hours ago"; -"Updated.YesterdayAt" = "yesterday at %@"; -"Updated.AtDate" = "%@"; -"Updated.TodayAt" = "today at %@"; +"Wallet.Updated.JustNow" = "just now"; +"Wallet.Updated.MinutesAgo_0" = "%@ minutes ago"; //three to ten +"Wallet.Updated.MinutesAgo_1" = "1 minute ago"; //one +"Wallet.Updated.MinutesAgo_2" = "2 minutes ago"; //two +"Wallet.Updated.MinutesAgo_3_10" = "%@ minutes ago"; //three to ten +"Wallet.Updated.MinutesAgo_many" = "%@ minutes ago"; // more than ten +"Wallet.Updated.MinutesAgo_any" = "%@ minutes ago"; // more than ten +"Wallet.Updated.HoursAgo_0" = "%@ hours ago"; +"Wallet.Updated.HoursAgo_1" = "1 hour ago"; +"Wallet.Updated.HoursAgo_2" = "2 hours ago"; +"Wallet.Updated.HoursAgo_3_10" = "%@ hours ago"; +"Wallet.Updated.HoursAgo_any" = "%@ hours ago"; +"Wallet.Updated.HoursAgo_many" = "%@ hours ago"; +"Wallet.Updated.HoursAgo_0" = "%@ hours ago"; +"Wallet.Updated.YesterdayAt" = "yesterday at %@"; +"Wallet.Updated.AtDate" = "%@"; +"Wallet.Updated.TodayAt" = "today at %@"; "Wallet.Info.WalletCreated" = "Wallet Created"; "Wallet.Info.Address" = "Your wallet address"; @@ -4906,3 +4906,60 @@ Any member of this group will be able to see messages in the channel."; "Conversation.WalletRequiredSetup" = "Set Up"; "Wallet.CreateInvoice.Title" = "Create Invoice"; + +"Wallet.Navigation.Close" = "Close"; +"Wallet.Navigation.Back" = "Back"; +"Wallet.Navigation.Done" = "Done"; +"Wallet.Navigation.Cancel" = "Cancel"; +"Wallet.Alert.OK" = "OK"; +"Wallet.Alert.Cancel" = "Cancel"; + +"Wallet.Month.GenJanuary" = "January"; +"Wallet.Month.GenFebruary" = "February"; +"Wallet.Month.GenMarch" = "March"; +"Wallet.Month.GenApril" = "April"; +"Wallet.Month.GenMay" = "May"; +"Wallet.Month.GenJune" = "June"; +"Wallet.Month.GenJuly" = "July"; +"Wallet.Month.GenAugust" = "August"; +"Wallet.Month.GenSeptember" = "September"; +"Wallet.Month.GenOctober" = "October"; +"Wallet.Month.GenNovember" = "November"; +"Wallet.Month.GenDecember" = "December"; +"Wallet.Month.ShortJanuary" = "Jan"; +"Wallet.Month.ShortFebruary" = "Feb"; +"Wallet.Month.ShortMarch" = "Mar"; +"Wallet.Month.ShortApril" = "Apr"; +"Wallet.Month.ShortMay" = "May"; +"Wallet.Month.ShortJune" = "Jun"; +"Wallet.Month.ShortJuly" = "Jul"; +"Wallet.Month.ShortAugust" = "Aug"; +"Wallet.Month.ShortSeptember" = "Sep"; +"Wallet.Month.ShortOctober" = "Oct"; +"Wallet.Month.ShortNovember" = "Nov"; +"Wallet.Month.ShortDecember" = "Dec"; + +"Wallet.Weekday.Today" = "Today"; +"Wallet.Weekday.Yesterday" = "Yesterday"; + +"Wallet.Info.TransactionDateHeader" = "%1$@ %2$@"; +"Wallet.Info.TransactionDateHeaderYear" = "%1$@ %2$@, %3$@"; + +"Wallet.UnknownError" = "An error occurred. Please try again later."; + +"Wallet.ContextMenuCopy" = "Copy"; + +"Wallet.Time.PreciseDate_m1" = "Jan %1$@, %2$@ at %3$@"; +"Wallet.Time.PreciseDate_m2" = "Feb %1$@, %2$@ at %3$@"; +"Wallet.Time.PreciseDate_m3" = "Mar %1$@, %2$@ at %3$@"; +"Wallet.Time.PreciseDate_m4" = "Apr %1$@, %2$@ at %3$@"; +"Wallet.Time.PreciseDate_m5" = "May %1$@, %2$@ at %3$@"; +"Wallet.Time.PreciseDate_m6" = "Jun %1$@, %2$@ at %3$@"; +"Wallet.Time.PreciseDate_m7" = "Jul %1$@, %2$@ at %3$@"; +"Wallet.Time.PreciseDate_m8" = "Aug %1$@, %2$@ at %3$@"; +"Wallet.Time.PreciseDate_m9" = "Sep %1$@, %2$@ at %3$@"; +"Wallet.Time.PreciseDate_m10" = "Oct %1$@, %2$@ at %3$@"; +"Wallet.Time.PreciseDate_m11" = "Nov %1$@, %2$@ at %3$@"; +"Wallet.Time.PreciseDate_m12" = "Dec %1$@, %2$@ at %3$@"; + +"Wallet.VoiceOver.Editing.ClearText" = "Clear text"; diff --git a/submodules/AlertUI/BUCK b/submodules/AlertUI/BUCK index a362e196c3..bde039a00d 100644 --- a/submodules/AlertUI/BUCK +++ b/submodules/AlertUI/BUCK @@ -7,7 +7,6 @@ static_library( ]), deps = [ "//submodules/Display:Display#shared", - "//submodules/AccountContext:AccountContext", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/AlertUI/Sources/ThemedTextAlertController.swift b/submodules/AlertUI/Sources/ThemedTextAlertController.swift index b76325c7db..e59dafd6d4 100644 --- a/submodules/AlertUI/Sources/ThemedTextAlertController.swift +++ b/submodules/AlertUI/Sources/ThemedTextAlertController.swift @@ -1,14 +1,22 @@ import Foundation import UIKit import Display -import AccountContext +import SwiftSignalKit -public func textAlertController(context: AccountContext, title: String?, text: String, actions: [TextAlertAction], actionLayout: TextAlertContentActionLayout = .horizontal, allowInputInset: Bool = true) -> AlertController { - let presentationData = context.sharedContext.currentPresentationData.with { $0 } +public final class AlertControllerContext { + public let theme: AlertControllerTheme + public let themeSignal: Signal - let controller = standardTextAlertController(theme: AlertControllerTheme(presentationTheme: presentationData.theme), title: title, text: text, actions: actions, actionLayout: actionLayout, allowInputInset: allowInputInset) - let presentationDataDisposable = context.sharedContext.presentationData.start(next: { [weak controller] presentationData in - controller?.theme = AlertControllerTheme(presentationTheme: presentationData.theme) + public init(theme: AlertControllerTheme, themeSignal: Signal) { + self.theme = theme + self.themeSignal = themeSignal + } +} + +public func textAlertController(alertContext: AlertControllerContext, title: String?, text: String, actions: [TextAlertAction], actionLayout: TextAlertContentActionLayout = .horizontal, allowInputInset: Bool = true) -> AlertController { + let controller = standardTextAlertController(theme: alertContext.theme, title: title, text: text, actions: actions, actionLayout: actionLayout, allowInputInset: allowInputInset) + let presentationDataDisposable = alertContext.themeSignal.start(next: { [weak controller] theme in + controller?.theme = theme }) controller.dismissed = { presentationDataDisposable.dispose() @@ -17,9 +25,8 @@ public func textAlertController(context: AccountContext, title: String?, text: S return controller } -public func richTextAlertController(context: AccountContext, title: NSAttributedString?, text: NSAttributedString, actions: [TextAlertAction], actionLayout: TextAlertContentActionLayout = .horizontal, allowInputInset: Bool = true, dismissAutomatically: Bool = true) -> AlertController { - let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let theme = AlertControllerTheme(presentationTheme: presentationData.theme) +public func richTextAlertController(alertContext: AlertControllerContext, title: NSAttributedString?, text: NSAttributedString, actions: [TextAlertAction], actionLayout: TextAlertContentActionLayout = .horizontal, allowInputInset: Bool = true, dismissAutomatically: Bool = true) -> AlertController { + let theme = alertContext.theme var dismissImpl: (() -> Void)? let controller = AlertController(theme: theme, contentNode: TextAlertContentNode(theme: theme, title: title, text: text, actions: actions.map { action in @@ -34,8 +41,8 @@ public func richTextAlertController(context: AccountContext, title: NSAttributed controller?.dismissAnimated() } - let presentationDataDisposable = context.sharedContext.presentationData.start(next: { [weak controller] presentationData in - controller?.theme = AlertControllerTheme(presentationTheme: presentationData.theme) + let presentationDataDisposable = alertContext.themeSignal.start(next: { [weak controller] theme in + controller?.theme = theme }) controller.dismissed = { presentationDataDisposable.dispose() diff --git a/submodules/AnimationUI/Sources/AnimatedStickerNode.swift b/submodules/AnimationUI/Sources/AnimatedStickerNode.swift index e3110824c4..d6c0259194 100644 --- a/submodules/AnimationUI/Sources/AnimatedStickerNode.swift +++ b/submodules/AnimationUI/Sources/AnimatedStickerNode.swift @@ -302,13 +302,12 @@ public struct AnimatedStickerStatus: Equatable { } public enum AnimatedStickerNodeResource { - case resource(MediaResource) + case resource(Account, MediaResource) case localFile(String) } public final class AnimatedStickerNode: ASDisplayNode { private let queue: Queue - private var account: Account? private var fileReference: FileMediaReference? private let disposable = MetaDisposable() private let fetchDisposable = MetaDisposable() @@ -386,7 +385,7 @@ public final class AnimatedStickerNode: ASDisplayNode { self.addSubnode(self.renderer!) } - public func setup(account: Account, resource: AnimatedStickerNodeResource, fitzModifier: EmojiFitzModifier? = nil, width: Int, height: Int, playbackMode: AnimatedStickerPlaybackMode = .loop, mode: AnimatedStickerMode) { + public func setup(resource: AnimatedStickerNodeResource, fitzModifier: EmojiFitzModifier? = nil, width: Int, height: Int, playbackMode: AnimatedStickerPlaybackMode = .loop, mode: AnimatedStickerMode) { if width < 2 || height < 2 { return } @@ -407,7 +406,7 @@ public final class AnimatedStickerNode: ASDisplayNode { } } switch resource { - case let .resource(resource): + case let .resource(account, resource): self.disposable.set((account.postbox.mediaBox.resourceData(resource) |> deliverOnMainQueue).start(next: { data in f(data) @@ -417,7 +416,7 @@ public final class AnimatedStickerNode: ASDisplayNode { } case .cached: switch resource { - case let .resource(resource): + case let .resource(account, resource): self.disposable.set((chatMessageAnimationData(postbox: account.postbox, resource: resource, fitzModifier: fitzModifier, width: width, height: height, synchronousLoad: false) |> deliverOnMainQueue).start(next: { [weak self] data in if let strongSelf = self, data.complete { diff --git a/submodules/BotPaymentsUI/BUCK b/submodules/BotPaymentsUI/BUCK index a29631df06..6b633815f2 100644 --- a/submodules/BotPaymentsUI/BUCK +++ b/submodules/BotPaymentsUI/BUCK @@ -19,6 +19,7 @@ static_library( "//submodules/Stripe:Stripe", "//submodules/CountrySelectionUI:CountrySelectionUI", "//submodules/AppBundle:AppBundle", + "//submodules/PresentationDataUtils:PresentationDataUtils", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/BotPaymentsUI/Sources/BotCheckoutControllerNode.swift b/submodules/BotPaymentsUI/Sources/BotCheckoutControllerNode.swift index 554afe1041..337d8fb95c 100644 --- a/submodules/BotPaymentsUI/Sources/BotCheckoutControllerNode.swift +++ b/submodules/BotPaymentsUI/Sources/BotCheckoutControllerNode.swift @@ -8,8 +8,10 @@ import SwiftSignalKit import PassKit import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext import AlertUI +import PresentationDataUtils import TelegramNotices import TelegramStringFormatting import PasswordSetupUI diff --git a/submodules/BotPaymentsUI/Sources/BotCheckoutHeaderItem.swift b/submodules/BotPaymentsUI/Sources/BotCheckoutHeaderItem.swift index 76eda283df..8c7a1dd064 100644 --- a/submodules/BotPaymentsUI/Sources/BotCheckoutHeaderItem.swift +++ b/submodules/BotPaymentsUI/Sources/BotCheckoutHeaderItem.swift @@ -6,6 +6,7 @@ import SwiftSignalKit import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import PhotoResources class BotCheckoutHeaderItem: ListViewItem, ItemListItem { diff --git a/submodules/BotPaymentsUI/Sources/BotCheckoutInfoControllerNode.swift b/submodules/BotPaymentsUI/Sources/BotCheckoutInfoControllerNode.swift index a55891ee94..e5d5502661 100644 --- a/submodules/BotPaymentsUI/Sources/BotCheckoutInfoControllerNode.swift +++ b/submodules/BotPaymentsUI/Sources/BotCheckoutInfoControllerNode.swift @@ -8,6 +8,7 @@ import SwiftSignalKit import TelegramPresentationData import AccountContext import AlertUI +import PresentationDataUtils import CountrySelectionUI private final class BotCheckoutInfoAddressItems { diff --git a/submodules/BotPaymentsUI/Sources/BotCheckoutPriceItem.swift b/submodules/BotPaymentsUI/Sources/BotCheckoutPriceItem.swift index cd6e6f7e66..46df1456df 100644 --- a/submodules/BotPaymentsUI/Sources/BotCheckoutPriceItem.swift +++ b/submodules/BotPaymentsUI/Sources/BotCheckoutPriceItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import TelegramPresentationData import ItemListUI +import PresentationDataUtils class BotCheckoutPriceItem: ListViewItem, ItemListItem { let theme: PresentationTheme diff --git a/submodules/BotPaymentsUI/Sources/BotReceiptControllerNode.swift b/submodules/BotPaymentsUI/Sources/BotReceiptControllerNode.swift index af19356d93..60978a85b2 100644 --- a/submodules/BotPaymentsUI/Sources/BotReceiptControllerNode.swift +++ b/submodules/BotPaymentsUI/Sources/BotReceiptControllerNode.swift @@ -7,6 +7,7 @@ import TelegramCore import SwiftSignalKit import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext import TelegramStringFormatting diff --git a/submodules/CallListUI/BUCK b/submodules/CallListUI/BUCK index d524cb8e2f..d023a5116c 100644 --- a/submodules/CallListUI/BUCK +++ b/submodules/CallListUI/BUCK @@ -18,6 +18,7 @@ static_library( "//submodules/AvatarNode:AvatarNode", "//submodules/TelegramStringFormatting:TelegramStringFormatting", "//submodules/AlertUI:AlertUI", + "//submodules/PresentationDataUtils:PresentationDataUtils", "//submodules/TelegramNotices:TelegramNotices", "//submodules/MergeLists:MergeLists", ], diff --git a/submodules/CallListUI/Sources/CallListCallItem.swift b/submodules/CallListUI/Sources/CallListCallItem.swift index 63da73e68c..bdf96659e9 100644 --- a/submodules/CallListUI/Sources/CallListCallItem.swift +++ b/submodules/CallListUI/Sources/CallListCallItem.swift @@ -7,6 +7,7 @@ import SwiftSignalKit import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AvatarNode import TelegramStringFormatting diff --git a/submodules/CallListUI/Sources/CallListController.swift b/submodules/CallListUI/Sources/CallListController.swift index ca207e1b13..35f05f730c 100644 --- a/submodules/CallListUI/Sources/CallListController.swift +++ b/submodules/CallListUI/Sources/CallListController.swift @@ -7,8 +7,10 @@ import TelegramCore import SwiftSignalKit import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext import AlertUI +import PresentationDataUtils import AppBundle public enum CallListControllerMode { diff --git a/submodules/CallListUI/Sources/CallListControllerNode.swift b/submodules/CallListUI/Sources/CallListControllerNode.swift index 46f1300fd9..3aa080eb51 100644 --- a/submodules/CallListUI/Sources/CallListControllerNode.swift +++ b/submodules/CallListUI/Sources/CallListControllerNode.swift @@ -8,6 +8,7 @@ import SwiftSignalKit import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import AccountContext import TelegramNotices diff --git a/submodules/ChatListUI/BUCK b/submodules/ChatListUI/BUCK index b430b2d0bd..63bed811f5 100644 --- a/submodules/ChatListUI/BUCK +++ b/submodules/ChatListUI/BUCK @@ -17,6 +17,7 @@ static_library( "//submodules/TelegramBaseController:TelegramBaseController", "//submodules/OverlayStatusController:OverlayStatusController", "//submodules/AlertUI:AlertUI", + "//submodules/PresentationDataUtils:PresentationDataUtils", "//submodules/UndoUI:UndoUI", "//submodules/TelegramNotices:TelegramNotices", "//submodules/SearchUI:SearchUI", diff --git a/submodules/ChatListUI/Sources/ChatContextMenus.swift b/submodules/ChatListUI/Sources/ChatContextMenus.swift index 051713c3f0..9456cbff24 100644 --- a/submodules/ChatListUI/Sources/ChatContextMenus.swift +++ b/submodules/ChatListUI/Sources/ChatContextMenus.swift @@ -9,6 +9,7 @@ import Display import TelegramUIPreferences import OverlayStatusController import AlertUI +import PresentationDataUtils func archiveContextMenuItems(context: AccountContext, groupId: PeerGroupId, chatListController: ChatListControllerImpl?) -> Signal<[ContextMenuItem], NoError> { let strings = context.sharedContext.currentPresentationData.with({ $0 }).strings @@ -179,7 +180,7 @@ func chatContextMenuItems(context: AccountContext, peerId: PeerId, source: ChatC var cancelImpl: (() -> Void)? let progressSignal = Signal { subscriber in let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) chatListController?.present(controller, in: .window(.root)) diff --git a/submodules/ChatListUI/Sources/ChatListController.swift b/submodules/ChatListUI/Sources/ChatListController.swift index 8d7ef3646a..d4c8fea48f 100644 --- a/submodules/ChatListUI/Sources/ChatListController.swift +++ b/submodules/ChatListUI/Sources/ChatListController.swift @@ -10,6 +10,7 @@ import TelegramBaseController import OverlayStatusController import AccountContext import AlertUI +import PresentationDataUtils import UndoUI import TelegramNotices import SearchUI @@ -873,7 +874,7 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController, if let controller = controller as? UndoOverlayController { switch controller.content { case let .archivedChat(archivedChat): - if peerIds.contains(archivedChat.peerId) { + if peerIds.contains(PeerId(archivedChat.peerId)) { controller.dismiss() } default: @@ -1210,7 +1211,7 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController, let context = strongSelf.context let presentationData = strongSelf.presentationData let progressSignal = Signal { subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: nil)) + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) self?.present(controller, in: .window(.root)) return ActionDisposable { [weak controller] in Queue.mainQueue().async() { @@ -1302,7 +1303,7 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController, }) if value { - strongSelf.present(UndoOverlayController(context: strongSelf.context, content: .hidArchive(title: strongSelf.presentationData.strings.ChatList_UndoArchiveHiddenTitle, text: strongSelf.presentationData.strings.ChatList_UndoArchiveHiddenText, undo: false), elevatedLayout: false, animateInAsReplacement: true, action: { [weak self] shouldCommit in + strongSelf.present(UndoOverlayController(presentationData: strongSelf.context.sharedContext.currentPresentationData.with { $0 }, content: .hidArchive(title: strongSelf.presentationData.strings.ChatList_UndoArchiveHiddenTitle, text: strongSelf.presentationData.strings.ChatList_UndoArchiveHiddenText, undo: false), elevatedLayout: false, animateInAsReplacement: true, action: { [weak self] shouldCommit in guard let strongSelf = self else { return } @@ -1320,7 +1321,7 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController, } }), in: .current) } else { - strongSelf.present(UndoOverlayController(context: strongSelf.context, content: .revealedArchive(title: strongSelf.presentationData.strings.ChatList_UndoArchiveRevealedTitle, text: strongSelf.presentationData.strings.ChatList_UndoArchiveRevealedText, undo: false), elevatedLayout: false, animateInAsReplacement: true, action: { _ in + strongSelf.present(UndoOverlayController(presentationData: strongSelf.context.sharedContext.currentPresentationData.with { $0 }, content: .revealedArchive(title: strongSelf.presentationData.strings.ChatList_UndoArchiveRevealedTitle, text: strongSelf.presentationData.strings.ChatList_UndoArchiveRevealedText, undo: false), elevatedLayout: false, animateInAsReplacement: true, action: { _ in }), in: .current) } }) @@ -1414,7 +1415,7 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController, return true }) - strongSelf.present(UndoOverlayController(context: strongSelf.context, content: .removedChat(text: strongSelf.presentationData.strings.Undo_ChatCleared), elevatedLayout: false, animateInAsReplacement: true, action: { shouldCommit in + strongSelf.present(UndoOverlayController(presentationData: strongSelf.context.sharedContext.currentPresentationData.with { $0 }, content: .removedChat(text: strongSelf.presentationData.strings.Undo_ChatCleared), elevatedLayout: false, animateInAsReplacement: true, action: { shouldCommit in guard let strongSelf = self else { return } @@ -1617,7 +1618,8 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController, title = "" undo = true } - strongSelf.present(UndoOverlayController(context: strongSelf.context, content: .archivedChat(peerId: peerIds[0], title: title, text: text, undo: undo), elevatedLayout: false, animateInAsReplacement: true, action: action), in: .current) + let controller = UndoOverlayController(presentationData: strongSelf.context.sharedContext.currentPresentationData.with { $0 }, content: .archivedChat(peerId: peerIds[0].toInt64(), title: title, text: text, undo: undo), elevatedLayout: false, animateInAsReplacement: true, action: action) + strongSelf.present(controller, in: .current) strongSelf.chatListDisplayNode.playArchiveAnimation() }) @@ -1680,7 +1682,7 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController, return true }) - self.present(UndoOverlayController(context: self.context, content: .removedChat(text: statusText), elevatedLayout: false, animateInAsReplacement: true, action: { [weak self] shouldCommit in + self.present(UndoOverlayController(presentationData: self.context.sharedContext.currentPresentationData.with { $0 }, content: .removedChat(text: statusText), elevatedLayout: false, animateInAsReplacement: true, action: { [weak self] shouldCommit in guard let strongSelf = self else { return } diff --git a/submodules/ChatListUI/Sources/Node/ChatListItem.swift b/submodules/ChatListUI/Sources/Node/ChatListItem.swift index c4b07f05df..3804fa1e17 100644 --- a/submodules/ChatListUI/Sources/Node/ChatListItem.swift +++ b/submodules/ChatListUI/Sources/Node/ChatListItem.swift @@ -7,6 +7,7 @@ import SwiftSignalKit import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AvatarNode import TelegramStringFormatting import AccountContext diff --git a/submodules/ComposePollUI/BUCK b/submodules/ComposePollUI/BUCK index 1c817c07d5..674cdc4d74 100644 --- a/submodules/ComposePollUI/BUCK +++ b/submodules/ComposePollUI/BUCK @@ -14,6 +14,7 @@ static_library( "//submodules/ItemListUI:ItemListUI", "//submodules/AccountContext:AccountContext", "//submodules/AlertUI:AlertUI", + "//submodules/PresentationDataUtils:PresentationDataUtils", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/ComposePollUI/Sources/CreatePollController.swift b/submodules/ComposePollUI/Sources/CreatePollController.swift index ff84146754..9e7e56b2cc 100644 --- a/submodules/ComposePollUI/Sources/CreatePollController.swift +++ b/submodules/ComposePollUI/Sources/CreatePollController.swift @@ -6,8 +6,10 @@ import Postbox import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext import AlertUI +import PresentationDataUtils private let maxTextLength = 255 private let maxOptionLength = 100 diff --git a/submodules/ComposePollUI/Sources/CreatePollOptionActionItem.swift b/submodules/ComposePollUI/Sources/CreatePollOptionActionItem.swift index be6ef2655a..ba1dae70be 100644 --- a/submodules/ComposePollUI/Sources/CreatePollOptionActionItem.swift +++ b/submodules/ComposePollUI/Sources/CreatePollOptionActionItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import TelegramPresentationData import ItemListUI +import PresentationDataUtils class CreatePollOptionActionItem: ListViewItem, ItemListItem { let theme: PresentationTheme diff --git a/submodules/ComposePollUI/Sources/CreatePollOptionItem.swift b/submodules/ComposePollUI/Sources/CreatePollOptionItem.swift index bbb4da5e3b..6b076495d3 100644 --- a/submodules/ComposePollUI/Sources/CreatePollOptionItem.swift +++ b/submodules/ComposePollUI/Sources/CreatePollOptionItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import TelegramPresentationData import ItemListUI +import PresentationDataUtils struct CreatePollOptionItemEditing { let editable: Bool diff --git a/submodules/ContactListUI/BUCK b/submodules/ContactListUI/BUCK index f7fc812125..3bd0b47b9e 100644 --- a/submodules/ContactListUI/BUCK +++ b/submodules/ContactListUI/BUCK @@ -23,6 +23,7 @@ static_library( "//submodules/TelegramPermissionsUI:TelegramPermissionsUI", "//submodules/TelegramNotices:TelegramNotices", "//submodules/AlertUI:AlertUI", + "//submodules/PresentationDataUtils:PresentationDataUtils", "//submodules/ShareController:ShareController", "//submodules/AppBundle:AppBundle", "//submodules/OverlayStatusController:OverlayStatusController", diff --git a/submodules/ContactListUI/Sources/ContactContextMenus.swift b/submodules/ContactListUI/Sources/ContactContextMenus.swift index bd62875929..66d4fa6e5e 100644 --- a/submodules/ContactListUI/Sources/ContactContextMenus.swift +++ b/submodules/ContactListUI/Sources/ContactContextMenus.swift @@ -7,6 +7,7 @@ import Postbox import TelegramCore import Display import AlertUI +import PresentationDataUtils import OverlayStatusController func contactContextMenuItems(context: AccountContext, peerId: PeerId, contactsController: ContactsController?) -> Signal<[ContextMenuItem], NoError> { @@ -62,7 +63,7 @@ func contactContextMenuItems(context: AccountContext, peerId: PeerId, contactsCo var cancelImpl: (() -> Void)? let progressSignal = Signal { subscriber in let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) contactsController?.present(controller, in: .window(.root)) diff --git a/submodules/ContactListUI/Sources/ContactListActionItem.swift b/submodules/ContactListUI/Sources/ContactListActionItem.swift index 9e808abbc2..27e30043b4 100644 --- a/submodules/ContactListUI/Sources/ContactListActionItem.swift +++ b/submodules/ContactListUI/Sources/ContactListActionItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import TelegramPresentationData import ItemListUI +import PresentationDataUtils import ContactsPeerItem import AccountContext diff --git a/submodules/ContactListUI/Sources/ContactListNode.swift b/submodules/ContactListUI/Sources/ContactListNode.swift index 0399dcf601..d320ec4454 100644 --- a/submodules/ContactListUI/Sources/ContactListNode.swift +++ b/submodules/ContactListUI/Sources/ContactListNode.swift @@ -10,6 +10,7 @@ import TelegramUIPreferences import DeviceAccess import MergeLists import ItemListUI +import PresentationDataUtils import MediaResources import AccountContext import TelegramPermissions diff --git a/submodules/ContactListUI/Sources/ContactsController.swift b/submodules/ContactListUI/Sources/ContactsController.swift index c622232279..38377dbdf5 100644 --- a/submodules/ContactListUI/Sources/ContactsController.swift +++ b/submodules/ContactListUI/Sources/ContactsController.swift @@ -10,6 +10,7 @@ import TelegramUIPreferences import DeviceAccess import AccountContext import AlertUI +import PresentationDataUtils import TelegramPermissions import TelegramNotices import ContactsPeerItem diff --git a/submodules/ContactListUI/Sources/InviteContactsController.swift b/submodules/ContactListUI/Sources/InviteContactsController.swift index 72f6d06ade..5b6fc926c6 100644 --- a/submodules/ContactListUI/Sources/InviteContactsController.swift +++ b/submodules/ContactListUI/Sources/InviteContactsController.swift @@ -10,6 +10,7 @@ import TelegramPresentationData import AccountContext import ShareController import AlertUI +import PresentationDataUtils import SearchUI public class InviteContactsController: ViewController, MFMessageComposeViewControllerDelegate, UINavigationControllerDelegate { diff --git a/submodules/ContactsPeerItem/Sources/ContactsPeerItem.swift b/submodules/ContactsPeerItem/Sources/ContactsPeerItem.swift index ea5e22fd0f..adac687d00 100644 --- a/submodules/ContactsPeerItem/Sources/ContactsPeerItem.swift +++ b/submodules/ContactsPeerItem/Sources/ContactsPeerItem.swift @@ -8,6 +8,7 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import CheckNode import AvatarNode import TelegramStringFormatting diff --git a/submodules/ItemListAddressItem/Sources/ItemListAddressItem.swift b/submodules/ItemListAddressItem/Sources/ItemListAddressItem.swift index ee53aee5e8..9ad3ec1d6d 100644 --- a/submodules/ItemListAddressItem/Sources/ItemListAddressItem.swift +++ b/submodules/ItemListAddressItem/Sources/ItemListAddressItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext import TextFormat import AppBundle diff --git a/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift b/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift index 3b05d6f1c6..3e72510504 100644 --- a/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift +++ b/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift @@ -7,6 +7,7 @@ import TelegramCore import SwiftSignalKit import TelegramPresentationData import ItemListUI +import PresentationDataUtils import ActivityIndicator import AvatarNode import TelegramStringFormatting diff --git a/submodules/ItemListPeerActionItem/Sources/ItemListPeerActionItem.swift b/submodules/ItemListPeerActionItem/Sources/ItemListPeerActionItem.swift index 1beb5ff42b..96ccdaf7dd 100644 --- a/submodules/ItemListPeerActionItem/Sources/ItemListPeerActionItem.swift +++ b/submodules/ItemListPeerActionItem/Sources/ItemListPeerActionItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import TelegramPresentationData import ItemListUI +import PresentationDataUtils public enum ItemListPeerActionItemHeight { case generic diff --git a/submodules/ItemListPeerItem/Sources/ItemListPeerItem.swift b/submodules/ItemListPeerItem/Sources/ItemListPeerItem.swift index 4c9ca50b38..ab3a13e382 100644 --- a/submodules/ItemListPeerItem/Sources/ItemListPeerItem.swift +++ b/submodules/ItemListPeerItem/Sources/ItemListPeerItem.swift @@ -8,6 +8,7 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import AvatarNode import TelegramStringFormatting import PeerPresenceStatusManager diff --git a/submodules/ItemListStickerPackItem/Sources/ItemListStickerPackItem.swift b/submodules/ItemListStickerPackItem/Sources/ItemListStickerPackItem.swift index 097f6ab802..2c8664528f 100644 --- a/submodules/ItemListStickerPackItem/Sources/ItemListStickerPackItem.swift +++ b/submodules/ItemListStickerPackItem/Sources/ItemListStickerPackItem.swift @@ -7,6 +7,7 @@ import Postbox import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import StickerResources import AnimationUI @@ -599,7 +600,7 @@ class ItemListStickerPackItemNode: ItemListRevealOptionsItemNode { animationNode = AnimatedStickerNode() strongSelf.animationNode = animationNode strongSelf.addSubnode(animationNode) - animationNode.setup(account: item.account, resource: .resource(resource), width: 80, height: 80, mode: .cached) + animationNode.setup(resource: .resource(item.account, resource), width: 80, height: 80, mode: .cached) } animationNode.visibility = strongSelf.visibility != .none && item.playAnimatedStickers animationNode.isHidden = !item.playAnimatedStickers diff --git a/submodules/ItemListUI/BUCK b/submodules/ItemListUI/BUCK index fb4db9fd5d..47ab22d750 100644 --- a/submodules/ItemListUI/BUCK +++ b/submodules/ItemListUI/BUCK @@ -9,7 +9,6 @@ static_library( "//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit#shared", "//submodules/AsyncDisplayKit:AsyncDisplayKit#shared", "//submodules/Display:Display#shared", - "//submodules/AccountContext:AccountContext", "//submodules/TelegramPresentationData:TelegramPresentationData", "//submodules/MergeLists:MergeLists", "//submodules/TextFormat:TextFormat", diff --git a/submodules/ItemListUI/Sources/ItemListController.swift b/submodules/ItemListUI/Sources/ItemListController.swift index b71842e2d4..c0ceb9b119 100644 --- a/submodules/ItemListUI/Sources/ItemListController.swift +++ b/submodules/ItemListUI/Sources/ItemListController.swift @@ -2,9 +2,7 @@ import Foundation import UIKit import Display import SwiftSignalKit -import TelegramCore import TelegramPresentationData -import AccountContext import ProgressNavigationButtonNode public enum ItemListNavigationButtonStyle { @@ -217,15 +215,6 @@ open class ItemListController: ViewController, KeyShortcutResponder, Presentable public var willDisappear: ((Bool) -> Void)? public var didDisappear: ((Bool) -> Void)? - convenience public init(context: AccountContext, state: Signal<(ItemListControllerState, (ItemListNodeState, ItemGenerationArguments)), NoError>, tabBarItem: Signal? = nil) { - self.init(sharedContext: context.sharedContext, state: state, tabBarItem: tabBarItem) - } - - convenience public init(sharedContext: SharedAccountContext, state: Signal<(ItemListControllerState, (ItemListNodeState, ItemGenerationArguments)), NoError>, tabBarItem: Signal? = nil) { - let presentationData = sharedContext.currentPresentationData.with { $0 } - self.init(theme: presentationData.theme, strings: presentationData.strings, updatedPresentationData: sharedContext.presentationData |> map { ($0.theme, $0.strings) }, state: state, tabBarItem: tabBarItem) - } - public init(theme: PresentationTheme, strings: PresentationStrings, updatedPresentationData: Signal<(theme: PresentationTheme, strings: PresentationStrings), NoError>, state: Signal<(ItemListControllerState, (ItemListNodeState, ItemGenerationArguments)), NoError>, tabBarItem: Signal?) { self.state = state |> map { controllerState, nodeStateAndArgument -> (ItemListControllerState, (ItemListNodeState, Any)) in diff --git a/submodules/JoinLinkPreviewUI/BUCK b/submodules/JoinLinkPreviewUI/BUCK index f8a1ad7c8e..4d51dd1621 100644 --- a/submodules/JoinLinkPreviewUI/BUCK +++ b/submodules/JoinLinkPreviewUI/BUCK @@ -14,6 +14,7 @@ static_library( "//submodules/TelegramPresentationData:TelegramPresentationData", "//submodules/AccountContext:AccountContext", "//submodules/AlertUI:AlertUI", + "//submodules/PresentationDataUtils:PresentationDataUtils", "//submodules/ShareController:ShareController", "//submodules/SelectablePeerNode:SelectablePeerNode", ], diff --git a/submodules/JoinLinkPreviewUI/Sources/JoinLinkPreviewController.swift b/submodules/JoinLinkPreviewUI/Sources/JoinLinkPreviewController.swift index 7332e5b9ac..786da5a1a8 100644 --- a/submodules/JoinLinkPreviewUI/Sources/JoinLinkPreviewController.swift +++ b/submodules/JoinLinkPreviewUI/Sources/JoinLinkPreviewController.swift @@ -8,6 +8,7 @@ import SwiftSignalKit import TelegramPresentationData import AccountContext import AlertUI +import PresentationDataUtils public final class JoinLinkPreviewController: ViewController { private var controllerNode: JoinLinkPreviewControllerNode { diff --git a/submodules/LanguageLinkPreviewUI/BUCK b/submodules/LanguageLinkPreviewUI/BUCK index cafd7c1364..705b6bac09 100644 --- a/submodules/LanguageLinkPreviewUI/BUCK +++ b/submodules/LanguageLinkPreviewUI/BUCK @@ -16,6 +16,7 @@ static_library( "//submodules/TextFormat:TextFormat", "//submodules/ShareController:ShareController", "//submodules/AlertUI:AlertUI", + "//submodules/PresentationDataUtils:PresentationDataUtils", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/LanguageLinkPreviewUI/Sources/LanguageLinkPreviewController.swift b/submodules/LanguageLinkPreviewUI/Sources/LanguageLinkPreviewController.swift index 1d604ca476..e21023b548 100644 --- a/submodules/LanguageLinkPreviewUI/Sources/LanguageLinkPreviewController.swift +++ b/submodules/LanguageLinkPreviewUI/Sources/LanguageLinkPreviewController.swift @@ -8,6 +8,7 @@ import SwiftSignalKit import TelegramPresentationData import AccountContext import AlertUI +import PresentationDataUtils public final class LanguageLinkPreviewController: ViewController { private var controllerNode: LanguageLinkPreviewControllerNode { diff --git a/submodules/MtProtoKit/MTProtoKit/MTNetworkAvailability.m b/submodules/MtProtoKit/MTProtoKit/MTNetworkAvailability.m index 96073ac465..0b242aa3ca 100644 --- a/submodules/MtProtoKit/MTProtoKit/MTNetworkAvailability.m +++ b/submodules/MtProtoKit/MTProtoKit/MTNetworkAvailability.m @@ -144,7 +144,7 @@ static void MTNetworkAvailabilityContextRelease(const void *info) ((flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0)); BOOL canConnectWithoutUserInteraction = (canConnectionAutomatically && (flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0); - BOOL isNetworkReachable = (isReachable && (!needsConnection || canConnectWithoutUserInteraction)); + BOOL isNetworkReachable = isReachable; bool isWWAN = false; #if TARGET_OS_IPHONE diff --git a/submodules/NotificationSoundSelectionUI/Sources/NotificationSoundSelection.swift b/submodules/NotificationSoundSelectionUI/Sources/NotificationSoundSelection.swift index c80321a5b2..99ab202e06 100644 --- a/submodules/NotificationSoundSelectionUI/Sources/NotificationSoundSelection.swift +++ b/submodules/NotificationSoundSelectionUI/Sources/NotificationSoundSelection.swift @@ -7,6 +7,7 @@ import TelegramCore import AVFoundation import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext import TelegramStringFormatting import AppBundle diff --git a/submodules/OverlayStatusController/BUCK b/submodules/OverlayStatusController/BUCK index ee77bca12b..d177a806b0 100644 --- a/submodules/OverlayStatusController/BUCK +++ b/submodules/OverlayStatusController/BUCK @@ -8,7 +8,6 @@ static_library( deps = [ "//submodules/Display:Display#shared", "//submodules/LegacyComponents:LegacyComponents", - "//submodules/TelegramPresentationData:TelegramPresentationData", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/OverlayStatusController/Sources/OverlayStatusController.swift b/submodules/OverlayStatusController/Sources/OverlayStatusController.swift index 43dd030712..0a730a7bcd 100644 --- a/submodules/OverlayStatusController/Sources/OverlayStatusController.swift +++ b/submodules/OverlayStatusController/Sources/OverlayStatusController.swift @@ -1,7 +1,6 @@ import Foundation import UIKit import Display -import TelegramPresentationData import LegacyComponents public enum OverlayStatusControllerType { @@ -80,26 +79,26 @@ private final class OverlayStatusControllerNode: ViewControllerTracingNode { private let dismissed: () -> Void private let contentController: OverlayStatusContentController - init(theme: PresentationTheme, strings: PresentationStrings, type: OverlayStatusControllerType, dismissed: @escaping () -> Void) { + init(style: OverlayStatusControllerStyle, type: OverlayStatusControllerType, dismissed: @escaping () -> Void) { self.dismissed = dismissed var isUserInteractionEnabled = true switch type { case let .loading(cancelled): - let controller = TGProgressWindowController(light: theme.actionSheet.backgroundType == .light)! + let controller = TGProgressWindowController(light: style == .light)! controller.cancelled = { cancelled?() } self.contentController = .loading(controller) case .success: - self.contentController = .progress(TGProgressWindowController(light: theme.actionSheet.backgroundType == .light)) + self.contentController = .progress(TGProgressWindowController(light: style == .light)) case let .shieldSuccess(text, increasedDelay): - self.contentController = .shieldSuccess(TGProxyWindowController(light: theme.actionSheet.backgroundType == .light, text: text, shield: true, star: false), increasedDelay) + self.contentController = .shieldSuccess(TGProxyWindowController(light: style == .light, text: text, shield: true, star: false), increasedDelay) case let .genericSuccess(text, increasedDelay): - let controller = TGProxyWindowController(light: theme.actionSheet.backgroundType == .light, text: text, shield: false, star: false)! + let controller = TGProxyWindowController(light: style == .light, text: text, shield: false, star: false)! self.contentController = .genericSuccess(controller, increasedDelay) isUserInteractionEnabled = false case let .starSuccess(text): - self.contentController = .genericSuccess(TGProxyWindowController(light: theme.actionSheet.backgroundType == .light, text: text, shield: false, star: true), false) + self.contentController = .genericSuccess(TGProxyWindowController(light: style == .light, text: text, shield: false, star: true), false) } super.init() @@ -129,9 +128,13 @@ private final class OverlayStatusControllerNode: ViewControllerTracingNode { } } +public enum OverlayStatusControllerStyle { + case light + case dark +} + public final class OverlayStatusController: ViewController, StandalonePresentableController { - private let theme: PresentationTheme - private let strings: PresentationStrings + private let style: OverlayStatusControllerStyle private let type: OverlayStatusControllerType private var animatedDidAppear = false @@ -140,9 +143,8 @@ public final class OverlayStatusController: ViewController, StandalonePresentabl return self.displayNode as! OverlayStatusControllerNode } - public init(theme: PresentationTheme, strings: PresentationStrings, type: OverlayStatusControllerType) { - self.theme = theme - self.strings = strings + public init(style: OverlayStatusControllerStyle, type: OverlayStatusControllerType) { + self.style = style self.type = type super.init(navigationBarPresentationData: nil) @@ -155,7 +157,7 @@ public final class OverlayStatusController: ViewController, StandalonePresentabl } override public func loadDisplayNode() { - self.displayNode = OverlayStatusControllerNode(theme: self.theme, strings: self.strings, type: self.type, dismissed: { [weak self] in + self.displayNode = OverlayStatusControllerNode(style: self.style, type: self.type, dismissed: { [weak self] in self?.presentingViewController?.dismiss(animated: false, completion: nil) }) diff --git a/submodules/PassportUI/BUCK b/submodules/PassportUI/BUCK index bb0d57f428..6910b1af26 100644 --- a/submodules/PassportUI/BUCK +++ b/submodules/PassportUI/BUCK @@ -22,6 +22,7 @@ static_library( "//submodules/DateSelectionUI:DateSelectionUI", "//submodules/PasswordSetupUI:PasswordSetupUI", "//submodules/AppBundle:AppBundle", + "//submodules/PresentationDataUtils:PresentationDataUtils", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/PassportUI/Sources/Form/FormEditableBlockItemNode.swift b/submodules/PassportUI/Sources/Form/FormEditableBlockItemNode.swift index 46f5e652bf..d2643b76c0 100644 --- a/submodules/PassportUI/Sources/Form/FormEditableBlockItemNode.swift +++ b/submodules/PassportUI/Sources/Form/FormEditableBlockItemNode.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import TelegramPresentationData import ItemListUI +import PresentationDataUtils class FormEditableBlockItemNode: ASDisplayNode, FormControllerItemNode, FormBlockItemNodeProto, UIGestureRecognizerDelegate { private let topSeparatorInset: FormBlockItemInset diff --git a/submodules/PassportUI/Sources/LegacySecureIdAttachmentMenu.swift b/submodules/PassportUI/Sources/LegacySecureIdAttachmentMenu.swift index 0d83db3d8d..47b6cd3395 100644 --- a/submodules/PassportUI/Sources/LegacySecureIdAttachmentMenu.swift +++ b/submodules/PassportUI/Sources/LegacySecureIdAttachmentMenu.swift @@ -9,6 +9,7 @@ import OverlayStatusController import AccountContext import LegacyUI import ImageCompression +import PresentationDataUtils enum SecureIdAttachmentMenuType { case generic @@ -64,7 +65,7 @@ func presentLegacySecureIdAttachmentMenu(context: AccountContext, present: @esca return } uploadStarted = true - let statusController = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: nil)) + let statusController = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) let statusDisposable = (Signal { subscriber in present(statusController) return ActionDisposable { diff --git a/submodules/PassportUI/Sources/SecureIdAuthController.swift b/submodules/PassportUI/Sources/SecureIdAuthController.swift index 3fb3175387..bc68678938 100644 --- a/submodules/PassportUI/Sources/SecureIdAuthController.swift +++ b/submodules/PassportUI/Sources/SecureIdAuthController.swift @@ -10,6 +10,7 @@ import TextFormat import ProgressNavigationButtonNode import AccountContext import AlertUI +import PresentationDataUtils import PasswordSetupUI public enum SecureIdRequestResult: String { diff --git a/submodules/PassportUI/Sources/SecureIdDocumentFormController.swift b/submodules/PassportUI/Sources/SecureIdDocumentFormController.swift index c8af7010b9..5a18bf37a5 100644 --- a/submodules/PassportUI/Sources/SecureIdDocumentFormController.swift +++ b/submodules/PassportUI/Sources/SecureIdDocumentFormController.swift @@ -9,6 +9,7 @@ import TelegramPresentationData import ProgressNavigationButtonNode import AccountContext import AlertUI +import PresentationDataUtils enum SecureIdDocumentFormScrollToSubject { case selfie diff --git a/submodules/PassportUI/Sources/SecureIdPlaintextFormControllerNode.swift b/submodules/PassportUI/Sources/SecureIdPlaintextFormControllerNode.swift index 7347a55436..f0fa1f96da 100644 --- a/submodules/PassportUI/Sources/SecureIdPlaintextFormControllerNode.swift +++ b/submodules/PassportUI/Sources/SecureIdPlaintextFormControllerNode.swift @@ -9,6 +9,7 @@ import CoreTelephony import TelegramPresentationData import AccountContext import AlertUI +import PresentationDataUtils import CountrySelectionUI private func cleanPhoneNumber(_ text: String?) -> String { diff --git a/submodules/PassportUI/Sources/SecureIdValueFormFileItem.swift b/submodules/PassportUI/Sources/SecureIdValueFormFileItem.swift index 29ae52fa0e..1028f65a84 100644 --- a/submodules/PassportUI/Sources/SecureIdValueFormFileItem.swift +++ b/submodules/PassportUI/Sources/SecureIdValueFormFileItem.swift @@ -5,6 +5,7 @@ import Display import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import TelegramStringFormatting import RadialStatusNode import PhotoResources diff --git a/submodules/PasswordSetupUI/BUCK b/submodules/PasswordSetupUI/BUCK index 16010b0356..4b8336b73c 100644 --- a/submodules/PasswordSetupUI/BUCK +++ b/submodules/PasswordSetupUI/BUCK @@ -16,6 +16,7 @@ static_library( "//submodules/ProgressNavigationButtonNode:ProgressNavigationButtonNode", "//submodules/ActivityIndicator:ActivityIndicator", "//submodules/AlertUI:AlertUI", + "//submodules/PresentationDataUtils:PresentationDataUtils", "//submodules/ItemListUI:ItemListUI", ], frameworks = [ diff --git a/submodules/PasswordSetupUI/Sources/ResetPasswordController.swift b/submodules/PasswordSetupUI/Sources/ResetPasswordController.swift index d120b4a566..f8b43dd9bd 100644 --- a/submodules/PasswordSetupUI/Sources/ResetPasswordController.swift +++ b/submodules/PasswordSetupUI/Sources/ResetPasswordController.swift @@ -6,8 +6,10 @@ import Postbox import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext import AlertUI +import PresentationDataUtils private final class ResetPasswordControllerArguments { let updateCodeText: (String) -> Void diff --git a/submodules/PasswordSetupUI/Sources/SetupTwoStepVerificationControllerNode.swift b/submodules/PasswordSetupUI/Sources/SetupTwoStepVerificationControllerNode.swift index aef4edb0b5..2bc9da7259 100644 --- a/submodules/PasswordSetupUI/Sources/SetupTwoStepVerificationControllerNode.swift +++ b/submodules/PasswordSetupUI/Sources/SetupTwoStepVerificationControllerNode.swift @@ -9,6 +9,7 @@ import TelegramPresentationData import ActivityIndicator import AccountContext import AlertUI +import PresentationDataUtils public enum SetupTwoStepVerificationInitialState { case automatic diff --git a/submodules/PeerInfoUI/BUCK b/submodules/PeerInfoUI/BUCK index c12c6592dc..ec2fe0c8ec 100644 --- a/submodules/PeerInfoUI/BUCK +++ b/submodules/PeerInfoUI/BUCK @@ -15,6 +15,7 @@ static_library( "//submodules/AccountContext:AccountContext", "//submodules/ItemListUI:ItemListUI", "//submodules/AlertUI:AlertUI", + "//submodules/PresentationDataUtils:PresentationDataUtils", "//submodules/ItemListAvatarAndNameInfoItem:ItemListAvatarAndNameInfoItem", "//submodules/UndoUI:UndoUI", "//submodules/TelegramUIPreferences:TelegramUIPreferences", diff --git a/submodules/PeerInfoUI/Sources/ChannelAdminController.swift b/submodules/PeerInfoUI/Sources/ChannelAdminController.swift index 3241670210..cc9895a318 100644 --- a/submodules/PeerInfoUI/Sources/ChannelAdminController.swift +++ b/submodules/PeerInfoUI/Sources/ChannelAdminController.swift @@ -6,8 +6,10 @@ import Postbox import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext import AlertUI +import PresentationDataUtils import ItemListAvatarAndNameInfoItem import Emoji diff --git a/submodules/PeerInfoUI/Sources/ChannelAdminsController.swift b/submodules/PeerInfoUI/Sources/ChannelAdminsController.swift index 58225ba45d..7a2004be49 100644 --- a/submodules/PeerInfoUI/Sources/ChannelAdminsController.swift +++ b/submodules/PeerInfoUI/Sources/ChannelAdminsController.swift @@ -7,9 +7,11 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import AccountContext import TemporaryCachedPeerDataManager import AlertUI +import PresentationDataUtils import UndoUI import ItemListPeerItem import ItemListPeerActionItem @@ -525,7 +527,7 @@ public func channelAdminsController(context: AccountContext, peerId: PeerId, loa guard let peer = peer, let user = user else { return } - presentControllerImpl?(UndoOverlayController(context: context, content: .succeed(text: presentationData.strings.Channel_OwnershipTransfer_TransferCompleted(user.displayTitle, peer.displayTitle).0), elevatedLayout: false, action: { _ in }), nil) + presentControllerImpl?(UndoOverlayController(presentationData: context.sharedContext.currentPresentationData.with { $0 }, content: .succeed(text: presentationData.strings.Channel_OwnershipTransfer_TransferCompleted(user.displayTitle, peer.displayTitle).0), elevatedLayout: false, action: { _ in }), nil) }) } diff --git a/submodules/PeerInfoUI/Sources/ChannelBannedMemberController.swift b/submodules/PeerInfoUI/Sources/ChannelBannedMemberController.swift index 693f53f6f3..1774bb7f83 100644 --- a/submodules/PeerInfoUI/Sources/ChannelBannedMemberController.swift +++ b/submodules/PeerInfoUI/Sources/ChannelBannedMemberController.swift @@ -6,10 +6,12 @@ import Postbox import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import TelegramStringFormatting import OverlayStatusController import AccountContext import AlertUI +import PresentationDataUtils import ItemListAvatarAndNameInfoItem private final class ChannelBannedMemberControllerArguments { @@ -673,7 +675,7 @@ public func channelBannedMemberController(context: AccountContext, peerId: PeerI }, completed: { if previousRights == nil { let presentationData = context.sharedContext.currentPresentationData.with { $0 } - presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .genericSuccess(presentationData.strings.GroupPermission_AddSuccess, false)), nil) + presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, type: .genericSuccess(presentationData.strings.GroupPermission_AddSuccess, false)), nil) } updated(cleanResolvedRights.flags.isEmpty ? nil : cleanResolvedRights) dismissImpl?() diff --git a/submodules/PeerInfoUI/Sources/ChannelBlacklistController.swift b/submodules/PeerInfoUI/Sources/ChannelBlacklistController.swift index 58615df3d7..490723ef51 100644 --- a/submodules/PeerInfoUI/Sources/ChannelBlacklistController.swift +++ b/submodules/PeerInfoUI/Sources/ChannelBlacklistController.swift @@ -7,9 +7,11 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import OverlayStatusController import AccountContext import AlertUI +import PresentationDataUtils import ItemListPeerItem private final class ChannelBlacklistControllerArguments { @@ -317,7 +319,7 @@ public func channelBlacklistController(context: AccountContext, peerId: PeerId) } let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let progress = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: nil)) + let progress = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) presentControllerImpl?(progress, nil) removePeerDisposable.set((context.peerChannelMemberCategoriesContextsManager.updateMemberBannedRights(account: context.account, peerId: peerId, memberId: peer.id, bannedRights: TelegramChatBannedRights(flags: [.banReadMessages], untilDate: Int32.max)) |> deliverOnMainQueue).start(error: { [weak progress] _ in diff --git a/submodules/PeerInfoUI/Sources/ChannelDiscussionGroupSetupController.swift b/submodules/PeerInfoUI/Sources/ChannelDiscussionGroupSetupController.swift index c689f2e26c..8ce9d0c849 100644 --- a/submodules/PeerInfoUI/Sources/ChannelDiscussionGroupSetupController.swift +++ b/submodules/PeerInfoUI/Sources/ChannelDiscussionGroupSetupController.swift @@ -7,9 +7,11 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import OverlayStatusController import AccountContext import AlertUI +import PresentationDataUtils import ItemListPeerItem import ItemListPeerActionItem @@ -247,7 +249,7 @@ public func channelDiscussionGroupSetupController(context: AccountContext, peerI var cancelImpl: (() -> Void)? let progressSignal = Signal { subscriber in let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) presentControllerImpl?(controller, nil) @@ -279,7 +281,7 @@ public func channelDiscussionGroupSetupController(context: AccountContext, peerI }, completed: { dismiss() /*let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .success) + let controller = OverlayStatusController(theme: presentationData.theme, type: .success) presentControllerImpl?(controller, nil)*/ })) })) @@ -347,7 +349,7 @@ public func channelDiscussionGroupSetupController(context: AccountContext, peerI var cancelImpl: (() -> Void)? let progressSignal = Signal { subscriber in let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) presentControllerImpl?(controller, nil) @@ -402,7 +404,7 @@ public func channelDiscussionGroupSetupController(context: AccountContext, peerI var cancelImpl: (() -> Void)? let progressSignal = Signal { subscriber in let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) presentControllerImpl?(controller, nil) @@ -482,7 +484,7 @@ public func channelDiscussionGroupSetupController(context: AccountContext, peerI var cancelImpl: (() -> Void)? let progressSignal = Signal { subscriber in let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) presentControllerImpl?(controller, nil) @@ -513,7 +515,7 @@ public func channelDiscussionGroupSetupController(context: AccountContext, peerI }, completed: { if case .group = peer.info { let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .success) + let controller = OverlayStatusController(theme: presentationData.theme, type: .success) presentControllerImpl?(controller, nil) dismissImpl?() diff --git a/submodules/PeerInfoUI/Sources/ChannelDiscussionGroupSetupHeaderItem.swift b/submodules/PeerInfoUI/Sources/ChannelDiscussionGroupSetupHeaderItem.swift index 03aba65955..8879a8eaad 100644 --- a/submodules/PeerInfoUI/Sources/ChannelDiscussionGroupSetupHeaderItem.swift +++ b/submodules/PeerInfoUI/Sources/ChannelDiscussionGroupSetupHeaderItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import TelegramPresentationData import ItemListUI +import PresentationDataUtils import TextFormat import AppBundle diff --git a/submodules/PeerInfoUI/Sources/ChannelDiscussionGroupSetupSearchItem.swift b/submodules/PeerInfoUI/Sources/ChannelDiscussionGroupSetupSearchItem.swift index abbf889903..cdcda09c84 100644 --- a/submodules/PeerInfoUI/Sources/ChannelDiscussionGroupSetupSearchItem.swift +++ b/submodules/PeerInfoUI/Sources/ChannelDiscussionGroupSetupSearchItem.swift @@ -7,6 +7,7 @@ import TelegramCore import SwiftSignalKit import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext import SearchBarNode diff --git a/submodules/PeerInfoUI/Sources/ChannelInfoController.swift b/submodules/PeerInfoUI/Sources/ChannelInfoController.swift index fe29d31158..112bfddd45 100644 --- a/submodules/PeerInfoUI/Sources/ChannelInfoController.swift +++ b/submodules/PeerInfoUI/Sources/ChannelInfoController.swift @@ -8,12 +8,14 @@ import TelegramCore import LegacyComponents import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext import TextFormat import OverlayStatusController import TelegramStringFormatting import ShareController import AlertUI +import PresentationDataUtils import GalleryUI import LegacyUI import ItemListAvatarAndNameInfoItem @@ -849,7 +851,7 @@ public func channelInfoController(context: AccountContext, peerId: PeerId) -> Vi var cancelImpl: (() -> Void)? let progressSignal = Signal { subscriber in let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) presentControllerImpl?(controller, nil) diff --git a/submodules/PeerInfoUI/Sources/ChannelMembersController.swift b/submodules/PeerInfoUI/Sources/ChannelMembersController.swift index d06d845cf3..51e617516a 100644 --- a/submodules/PeerInfoUI/Sources/ChannelMembersController.swift +++ b/submodules/PeerInfoUI/Sources/ChannelMembersController.swift @@ -7,8 +7,10 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import AccountContext import AlertUI +import PresentationDataUtils import ItemListPeerItem private final class ChannelMembersControllerArguments { diff --git a/submodules/PeerInfoUI/Sources/ChannelOwnershipTransferController.swift b/submodules/PeerInfoUI/Sources/ChannelOwnershipTransferController.swift index 3d073e2d7e..23e9d66464 100644 --- a/submodules/PeerInfoUI/Sources/ChannelOwnershipTransferController.swift +++ b/submodules/PeerInfoUI/Sources/ChannelOwnershipTransferController.swift @@ -10,6 +10,7 @@ import ActivityIndicator import TextFormat import AccountContext import AlertUI +import PresentationDataUtils import PasswordSetupUI private final class ChannelOwnershipTransferPasswordFieldNode: ASDisplayNode, UITextFieldDelegate { diff --git a/submodules/PeerInfoUI/Sources/ChannelPermissionsController.swift b/submodules/PeerInfoUI/Sources/ChannelPermissionsController.swift index 8e4f75ce64..fea31f8d5f 100644 --- a/submodules/PeerInfoUI/Sources/ChannelPermissionsController.swift +++ b/submodules/PeerInfoUI/Sources/ChannelPermissionsController.swift @@ -7,10 +7,12 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import OverlayStatusController import AccountContext import TemporaryCachedPeerDataManager import AlertUI +import PresentationDataUtils import ItemListPeerItem import TelegramPermissionsUI import ItemListPeerActionItem @@ -701,7 +703,7 @@ public func channelPermissionsController(context: AccountContext, peerId origina } let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let progress = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: nil)) + let progress = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) presentControllerImpl?(progress, nil) let signal = convertGroupToSupergroup(account: context.account, peerId: view.peerId) diff --git a/submodules/PeerInfoUI/Sources/ChannelVisibilityController.swift b/submodules/PeerInfoUI/Sources/ChannelVisibilityController.swift index b681b522b0..0e337cc96e 100644 --- a/submodules/PeerInfoUI/Sources/ChannelVisibilityController.swift +++ b/submodules/PeerInfoUI/Sources/ChannelVisibilityController.swift @@ -7,10 +7,12 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import OverlayStatusController import AccountContext import ShareController import AlertUI +import PresentationDataUtils import TelegramNotices import ItemListPeerItem @@ -914,7 +916,7 @@ public func channelVisibilityController(context: AccountContext, peerId: PeerId, if let link = link { UIPasteboard.general.string = link let presentationData = context.sharedContext.currentPresentationData.with { $0 } - presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .genericSuccess(presentationData.strings.Username_LinkCopied, false)), nil) + presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, type: .genericSuccess(presentationData.strings.Username_LinkCopied, false)), nil) } }) }, revokePrivateLink: { diff --git a/submodules/PeerInfoUI/Sources/ChatSlowmodeItem.swift b/submodules/PeerInfoUI/Sources/ChatSlowmodeItem.swift index a341b78f3c..ece533eaea 100644 --- a/submodules/PeerInfoUI/Sources/ChatSlowmodeItem.swift +++ b/submodules/PeerInfoUI/Sources/ChatSlowmodeItem.swift @@ -8,6 +8,7 @@ import TelegramUIPreferences import TelegramPresentationData import LegacyComponents import ItemListUI +import PresentationDataUtils class ChatSlowmodeItem: ListViewItem, ItemListItem { let theme: PresentationTheme diff --git a/submodules/PeerInfoUI/Sources/ConvertToSupergroupController.swift b/submodules/PeerInfoUI/Sources/ConvertToSupergroupController.swift index cd43aefc48..135d19b19e 100644 --- a/submodules/PeerInfoUI/Sources/ConvertToSupergroupController.swift +++ b/submodules/PeerInfoUI/Sources/ConvertToSupergroupController.swift @@ -6,8 +6,10 @@ import Postbox import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext import AlertUI +import PresentationDataUtils private final class ConvertToSupergroupArguments { let convert: () -> Void diff --git a/submodules/PeerInfoUI/Sources/DeviceContactInfoController.swift b/submodules/PeerInfoUI/Sources/DeviceContactInfoController.swift index 2eb94165da..7e86cdc436 100644 --- a/submodules/PeerInfoUI/Sources/DeviceContactInfoController.swift +++ b/submodules/PeerInfoUI/Sources/DeviceContactInfoController.swift @@ -7,9 +7,11 @@ import TelegramCore import MessageUI import TelegramPresentationData import ItemListUI +import PresentationDataUtils import TelegramStringFormatting import AccountContext import AlertUI +import PresentationDataUtils import PhotoResources import MediaResources import ItemListAvatarAndNameInfoItem diff --git a/submodules/PeerInfoUI/Sources/GroupInfoController.swift b/submodules/PeerInfoUI/Sources/GroupInfoController.swift index 89d17fa041..3aae2d12e5 100644 --- a/submodules/PeerInfoUI/Sources/GroupInfoController.swift +++ b/submodules/PeerInfoUI/Sources/GroupInfoController.swift @@ -10,12 +10,14 @@ import TelegramPresentationData import SafariServices import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import TextFormat import AccountContext import TelegramStringFormatting import TemporaryCachedPeerDataManager import ShareController import AlertUI +import PresentationDataUtils import MediaResources import PhotoResources import GalleryUI diff --git a/submodules/PeerInfoUI/Sources/GroupInfoSearchItem.swift b/submodules/PeerInfoUI/Sources/GroupInfoSearchItem.swift index caac5af9c8..ea6ab27fd2 100644 --- a/submodules/PeerInfoUI/Sources/GroupInfoSearchItem.swift +++ b/submodules/PeerInfoUI/Sources/GroupInfoSearchItem.swift @@ -6,6 +6,7 @@ import Postbox import TelegramCore import SwiftSignalKit import ItemListUI +import PresentationDataUtils import AccountContext final class ChannelMembersSearchItem: ItemListControllerSearch { diff --git a/submodules/PeerInfoUI/Sources/GroupInfoSearchNavigationContentNode.swift b/submodules/PeerInfoUI/Sources/GroupInfoSearchNavigationContentNode.swift index d611b6ca0d..a5b0dfb0e0 100644 --- a/submodules/PeerInfoUI/Sources/GroupInfoSearchNavigationContentNode.swift +++ b/submodules/PeerInfoUI/Sources/GroupInfoSearchNavigationContentNode.swift @@ -6,6 +6,7 @@ import Postbox import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import SearchBarNode private let searchBarFont = Font.regular(17.0) diff --git a/submodules/PeerInfoUI/Sources/GroupPreHistorySetupController.swift b/submodules/PeerInfoUI/Sources/GroupPreHistorySetupController.swift index 58cf27799f..33b2192343 100644 --- a/submodules/PeerInfoUI/Sources/GroupPreHistorySetupController.swift +++ b/submodules/PeerInfoUI/Sources/GroupPreHistorySetupController.swift @@ -6,6 +6,7 @@ import Postbox import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext private final class GroupPreHistorySetupArguments { diff --git a/submodules/PeerInfoUI/Sources/GroupStickerPackCurrentItem.swift b/submodules/PeerInfoUI/Sources/GroupStickerPackCurrentItem.swift index 1f9fa3103d..08b58c0231 100644 --- a/submodules/PeerInfoUI/Sources/GroupStickerPackCurrentItem.swift +++ b/submodules/PeerInfoUI/Sources/GroupStickerPackCurrentItem.swift @@ -7,6 +7,7 @@ import Postbox import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import ActivityIndicator import StickerResources import AppBundle diff --git a/submodules/PeerInfoUI/Sources/GroupStickerPackSetupController.swift b/submodules/PeerInfoUI/Sources/GroupStickerPackSetupController.swift index 6823f6ad42..8171277302 100644 --- a/submodules/PeerInfoUI/Sources/GroupStickerPackSetupController.swift +++ b/submodules/PeerInfoUI/Sources/GroupStickerPackSetupController.swift @@ -7,6 +7,7 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import AccountContext import StickerPackPreviewUI import ItemListStickerPackItem diff --git a/submodules/PeerInfoUI/Sources/GroupsInCommonController.swift b/submodules/PeerInfoUI/Sources/GroupsInCommonController.swift index fcf4760b38..48a5213c07 100644 --- a/submodules/PeerInfoUI/Sources/GroupsInCommonController.swift +++ b/submodules/PeerInfoUI/Sources/GroupsInCommonController.swift @@ -7,6 +7,7 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import AccountContext import ItemListPeerItem diff --git a/submodules/PeerInfoUI/Sources/ItemListCallListItem.swift b/submodules/PeerInfoUI/Sources/ItemListCallListItem.swift index 71f4ab6724..f4d46829d8 100644 --- a/submodules/PeerInfoUI/Sources/ItemListCallListItem.swift +++ b/submodules/PeerInfoUI/Sources/ItemListCallListItem.swift @@ -7,6 +7,7 @@ import Postbox import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import TelegramStringFormatting class ItemListCallListItem: ListViewItem, ItemListItem { diff --git a/submodules/PeerInfoUI/Sources/ItemListSecretChatKeyItem.swift b/submodules/PeerInfoUI/Sources/ItemListSecretChatKeyItem.swift index e39bc62ac5..25f800bc18 100644 --- a/submodules/PeerInfoUI/Sources/ItemListSecretChatKeyItem.swift +++ b/submodules/PeerInfoUI/Sources/ItemListSecretChatKeyItem.swift @@ -6,6 +6,7 @@ import SwiftSignalKit import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import EncryptionKeyVisualization class ItemListSecretChatKeyItem: ListViewItem, ItemListItem { diff --git a/submodules/PeerInfoUI/Sources/PeerReportController.swift b/submodules/PeerInfoUI/Sources/PeerReportController.swift index d898e41625..835c709b74 100644 --- a/submodules/PeerInfoUI/Sources/PeerReportController.swift +++ b/submodules/PeerInfoUI/Sources/PeerReportController.swift @@ -6,9 +6,11 @@ import Postbox import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext import ContextUI import AlertUI +import PresentationDataUtils public enum PeerReportSubject { case peer(PeerId) diff --git a/submodules/PeerInfoUI/Sources/PhoneLabelController.swift b/submodules/PeerInfoUI/Sources/PhoneLabelController.swift index 1a4a3cadba..d67f497052 100644 --- a/submodules/PeerInfoUI/Sources/PhoneLabelController.swift +++ b/submodules/PeerInfoUI/Sources/PhoneLabelController.swift @@ -6,6 +6,7 @@ import Postbox import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext import TelegramStringFormatting diff --git a/submodules/PeerInfoUI/Sources/UserInfoController.swift b/submodules/PeerInfoUI/Sources/UserInfoController.swift index 1e5be89fb3..7a282615ab 100644 --- a/submodules/PeerInfoUI/Sources/UserInfoController.swift +++ b/submodules/PeerInfoUI/Sources/UserInfoController.swift @@ -8,6 +8,7 @@ import TelegramCore import LegacyComponents import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext import TextFormat import OverlayStatusController @@ -15,6 +16,7 @@ import TelegramStringFormatting import AccountContext import ShareController import AlertUI +import PresentationDataUtils import TelegramNotices import GalleryUI import ItemListAvatarAndNameInfoItem @@ -785,7 +787,7 @@ public func openAddPersonContactImpl(context: AccountContext, peerId: PeerId, pu } let presentationData = context.sharedContext.currentPresentationData.with { $0 } - present(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .genericSuccess(presentationData.strings.AddContact_StatusSuccess(peer.compactDisplayTitle).0, true)), nil) + present(OverlayStatusController(theme: presentationData.theme, type: .genericSuccess(presentationData.strings.AddContact_StatusSuccess(peer.compactDisplayTitle).0, true)), nil) } }), completed: nil, cancelled: nil)) }) @@ -1065,7 +1067,7 @@ public func userInfoController(context: AccountContext, peerId: PeerId, mode: Pe let progressSignal = Signal { subscriber in let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: nil)) + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) presentControllerImpl?(controller, nil) return ActionDisposable { [weak controller] in Queue.mainQueue().async() { @@ -1348,7 +1350,7 @@ public func userInfoController(context: AccountContext, peerId: PeerId, mode: Pe let _ = (enqueueMessages(account: context.account, peerId: peerId, messages: [.message(text: "", attributes: [], mediaReference: .standalone(media: contact), replyToMessageId: nil, localGroupingKey: nil)]) |> deliverOnMainQueue).start(next: { [weak controller] _ in let presentationData = context.sharedContext.currentPresentationData.with { $0 } - controller?.present(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .success), in: .window(.root)) + controller?.present(OverlayStatusController(theme: presentationData.theme, type: .success), in: .window(.root)) }) }) } @@ -1384,7 +1386,7 @@ public func userInfoController(context: AccountContext, peerId: PeerId, mode: Pe var cancelImpl: (() -> Void)? let progressSignal = Signal { subscriber in let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) presentControllerImpl?(controller, nil) diff --git a/submodules/PeerInfoUI/Sources/UserInfoEditingPhoneActionItem.swift b/submodules/PeerInfoUI/Sources/UserInfoEditingPhoneActionItem.swift index e780fb69d0..1901973af6 100644 --- a/submodules/PeerInfoUI/Sources/UserInfoEditingPhoneActionItem.swift +++ b/submodules/PeerInfoUI/Sources/UserInfoEditingPhoneActionItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import TelegramPresentationData import ItemListUI +import PresentationDataUtils class UserInfoEditingPhoneActionItem: ListViewItem, ItemListItem { let theme: PresentationTheme diff --git a/submodules/PeerInfoUI/Sources/UserInfoEditingPhoneItem.swift b/submodules/PeerInfoUI/Sources/UserInfoEditingPhoneItem.swift index 6dcadd8838..cc173f5780 100644 --- a/submodules/PeerInfoUI/Sources/UserInfoEditingPhoneItem.swift +++ b/submodules/PeerInfoUI/Sources/UserInfoEditingPhoneItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import TelegramPresentationData import ItemListUI +import PresentationDataUtils import SinglePhoneInputNode import AppBundle diff --git a/submodules/PeersNearbyUI/BUCK b/submodules/PeersNearbyUI/BUCK index 385a18107f..36d45a0cf8 100644 --- a/submodules/PeersNearbyUI/BUCK +++ b/submodules/PeersNearbyUI/BUCK @@ -18,6 +18,7 @@ static_library( "//submodules/OverlayStatusController:OverlayStatusController", "//submodules/DeviceLocationManager:DeviceLocationManager", "//submodules/AlertUI:AlertUI", + "//submodules/PresentationDataUtils:PresentationDataUtils", "//submodules/ItemListPeerItem:ItemListPeerItem", "//submodules/TelegramPermissionsUI:TelegramPermissionsUI", "//submodules/ItemListPeerActionItem:ItemListPeerActionItem", diff --git a/submodules/PeersNearbyUI/Sources/PeersNearbyController.swift b/submodules/PeersNearbyUI/Sources/PeersNearbyController.swift index ccb4759411..b34045e909 100644 --- a/submodules/PeersNearbyUI/Sources/PeersNearbyController.swift +++ b/submodules/PeersNearbyUI/Sources/PeersNearbyController.swift @@ -8,10 +8,12 @@ import MapKit import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import OverlayStatusController import DeviceLocationManager import AccountContext import AlertUI +import PresentationDataUtils import ItemListPeerItem import TelegramPermissionsUI import ItemListPeerActionItem @@ -313,7 +315,7 @@ public func peersNearbyController(context: AccountContext) -> ViewController { var cancelImpl: (() -> Void)? let progressSignal = Signal { subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) presentControllerImpl?(controller, nil) diff --git a/submodules/PeersNearbyUI/Sources/PeersNearbyHeaderItem.swift b/submodules/PeersNearbyUI/Sources/PeersNearbyHeaderItem.swift index 2560e0a5fe..7bbb9e9428 100644 --- a/submodules/PeersNearbyUI/Sources/PeersNearbyHeaderItem.swift +++ b/submodules/PeersNearbyUI/Sources/PeersNearbyHeaderItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import TelegramPresentationData import ItemListUI +import PresentationDataUtils import PeersNearbyIconNode class PeersNearbyHeaderItem: ListViewItem, ItemListItem { diff --git a/submodules/PresentationDataUtils/BUCK b/submodules/PresentationDataUtils/BUCK new file mode 100644 index 0000000000..382c4e90d9 --- /dev/null +++ b/submodules/PresentationDataUtils/BUCK @@ -0,0 +1,20 @@ +load("//Config:buck_rule_macros.bzl", "static_library") + +static_library( + name = "PresentationDataUtils", + srcs = glob([ + "Sources/**/*.swift", + ]), + deps = [ + "//submodules/Display:Display#shared", + "//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit#shared", + "//submodules/AccountContext:AccountContext", + "//submodules/TelegramPresentationData:TelegramPresentationData", + "//submodules/AlertUI:AlertUI", + "//submodules/ItemListUI:ItemListUI", + ], + frameworks = [ + "$SDKROOT/System/Library/Frameworks/Foundation.framework", + "$SDKROOT/System/Library/Frameworks/UIKit.framework", + ], +) diff --git a/submodules/PresentationDataUtils/Info.plist b/submodules/PresentationDataUtils/Info.plist new file mode 100644 index 0000000000..e1fe4cfb7b --- /dev/null +++ b/submodules/PresentationDataUtils/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + + diff --git a/submodules/PresentationDataUtils/Sources/AlertTheme.swift b/submodules/PresentationDataUtils/Sources/AlertTheme.swift new file mode 100644 index 0000000000..e9245c8313 --- /dev/null +++ b/submodules/PresentationDataUtils/Sources/AlertTheme.swift @@ -0,0 +1,13 @@ +import Foundation +import Display +import AlertUI +import AccountContext +import SwiftSignalKit + +public func textAlertController(context: AccountContext, title: String?, text: String, actions: [TextAlertAction], actionLayout: TextAlertContentActionLayout = .horizontal, allowInputInset: Bool = true) -> AlertController { + return textAlertController(alertContext: AlertControllerContext(theme: AlertControllerTheme(presentationTheme: context.sharedContext.currentPresentationData.with({ $0 }).theme), themeSignal: context.sharedContext.presentationData |> map { presentationData in AlertControllerTheme(presentationTheme: presentationData.theme) }), title: title, text: text, actions: actions, actionLayout: actionLayout, allowInputInset: allowInputInset) +} + +public func richTextAlertController(context: AccountContext, title: NSAttributedString?, text: NSAttributedString, actions: [TextAlertAction], actionLayout: TextAlertContentActionLayout = .horizontal, allowInputInset: Bool = true, dismissAutomatically: Bool = true) -> AlertController { + return richTextAlertController(alertContext: AlertControllerContext(theme: AlertControllerTheme(presentationTheme: context.sharedContext.currentPresentationData.with({ $0 }).theme), themeSignal: context.sharedContext.presentationData |> map { presentationData in AlertControllerTheme(presentationTheme: presentationData.theme) }), title: title, text: text, actions: actions, actionLayout: actionLayout, allowInputInset: allowInputInset, dismissAutomatically: dismissAutomatically) +} diff --git a/submodules/PresentationDataUtils/Sources/ItemListController.swift b/submodules/PresentationDataUtils/Sources/ItemListController.swift new file mode 100644 index 0000000000..7887853851 --- /dev/null +++ b/submodules/PresentationDataUtils/Sources/ItemListController.swift @@ -0,0 +1,18 @@ +import Foundation +import Display +import AlertUI +import AccountContext +import SwiftSignalKit +import ItemListUI +import PresentationDataUtils + +public extension ItemListController { + convenience init(context: AccountContext, state: Signal<(ItemListControllerState, (ItemListNodeState, ItemGenerationArguments)), NoError>, tabBarItem: Signal? = nil) { + self.init(sharedContext: context.sharedContext, state: state, tabBarItem: tabBarItem) + } + + convenience init(sharedContext: SharedAccountContext, state: Signal<(ItemListControllerState, (ItemListNodeState, ItemGenerationArguments)), NoError>, tabBarItem: Signal? = nil) { + let presentationData = sharedContext.currentPresentationData.with { $0 } + self.init(theme: presentationData.theme, strings: presentationData.strings, updatedPresentationData: sharedContext.presentationData |> map { ($0.theme, $0.strings) }, state: state, tabBarItem: tabBarItem) + } +} diff --git a/submodules/PresentationDataUtils/Sources/OverlayStatusController.swift b/submodules/PresentationDataUtils/Sources/OverlayStatusController.swift new file mode 100644 index 0000000000..2b73980cb8 --- /dev/null +++ b/submodules/PresentationDataUtils/Sources/OverlayStatusController.swift @@ -0,0 +1,10 @@ +import Foundation +import UIKit +import OverlayStatusController +import TelegramPresentationData + +public extension OverlayStatusController { + convenience init(theme: PresentationTheme, type: OverlayStatusControllerType) { + self.init(style: theme.actionSheet.backgroundType == .light ? .light : .dark, type: type) + } +} diff --git a/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift b/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift index 6a3be9ecf7..fea9d073a3 100644 --- a/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift +++ b/submodules/ReactionSelectionNode/Sources/ReactionSelectionNode.swift @@ -135,7 +135,7 @@ final class ReactionNode: ASDisplayNode { renderSize = CGSize(width: intrinsicSize.width * 2.5, height: intrinsicSize.height * 2.5) } } - self.animationNode.setup(account: account, resource: .localFile(path), width: Int(renderSize.width), height: Int(renderSize.height), mode: .direct) + self.animationNode.setup(resource: .localFile(path), width: Int(renderSize.width), height: Int(renderSize.height), mode: .direct) case .reply: self.intrinsicOffset = CGPoint(x: 0.0, y: 0.0) self.imageNode.image = UIImage(named: "Chat/Context Menu/ReactionReply", in: getAppBundle(), compatibleWith: nil) diff --git a/submodules/SettingsUI/BUCK b/submodules/SettingsUI/BUCK index 35c1679cca..fe9149899e 100644 --- a/submodules/SettingsUI/BUCK +++ b/submodules/SettingsUI/BUCK @@ -16,6 +16,7 @@ static_library( "//submodules/AccountContext:AccountContext", "//submodules/ActivityIndicator:ActivityIndicator", "//submodules/AlertUI:AlertUI", + "//submodules/PresentationDataUtils:PresentationDataUtils", "//submodules/AvatarNode:AvatarNode", "//submodules/CallListUI:CallListUI", "//submodules/ChatListSearchItemNode:ChatListSearchItemNode", diff --git a/submodules/SettingsUI/Sources/ChangePhoneNumberCodeController.swift b/submodules/SettingsUI/Sources/ChangePhoneNumberCodeController.swift index 94016770c4..99002dac2f 100644 --- a/submodules/SettingsUI/Sources/ChangePhoneNumberCodeController.swift +++ b/submodules/SettingsUI/Sources/ChangePhoneNumberCodeController.swift @@ -6,9 +6,11 @@ import Postbox import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import OverlayStatusController import AccountContext import AlertUI +import PresentationDataUtils import AuthorizationUI private final class ChangePhoneNumberCodeControllerArguments { @@ -272,7 +274,7 @@ func changePhoneNumberCodeController(context: AccountContext, phoneNumber: Strin return $0.withUpdatedChecking(false) } let presentationData = context.sharedContext.currentPresentationData.with { $0 } - presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .success), nil) + presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, type: .success), nil) dismissImpl?() })) } diff --git a/submodules/SettingsUI/Sources/ChangePhoneNumberController.swift b/submodules/SettingsUI/Sources/ChangePhoneNumberController.swift index 14f571f47b..5316c2bd5a 100644 --- a/submodules/SettingsUI/Sources/ChangePhoneNumberController.swift +++ b/submodules/SettingsUI/Sources/ChangePhoneNumberController.swift @@ -8,6 +8,7 @@ import TelegramPresentationData import ProgressNavigationButtonNode import AccountContext import AlertUI +import PresentationDataUtils import CountrySelectionUI final class ChangePhoneNumberController: ViewController { diff --git a/submodules/SettingsUI/Sources/ChangePhoneNumberIntroController.swift b/submodules/SettingsUI/Sources/ChangePhoneNumberIntroController.swift index dac4925bf2..193936bd8b 100644 --- a/submodules/SettingsUI/Sources/ChangePhoneNumberIntroController.swift +++ b/submodules/SettingsUI/Sources/ChangePhoneNumberIntroController.swift @@ -7,6 +7,7 @@ import TelegramPresentationData import TextFormat import AccountContext import AlertUI +import PresentationDataUtils import AppBundle private final class ChangePhoneNumberIntroControllerNode: ASDisplayNode { diff --git a/submodules/SettingsUI/Sources/Data and Storage/AutodownloadConnectionTypeController.swift b/submodules/SettingsUI/Sources/Data and Storage/AutodownloadConnectionTypeController.swift index c090fbfc20..7f707bf109 100644 --- a/submodules/SettingsUI/Sources/Data and Storage/AutodownloadConnectionTypeController.swift +++ b/submodules/SettingsUI/Sources/Data and Storage/AutodownloadConnectionTypeController.swift @@ -7,6 +7,7 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import AccountContext enum AutomaticDownloadConnectionType { diff --git a/submodules/SettingsUI/Sources/Data and Storage/AutodownloadDataUsagePickerItem.swift b/submodules/SettingsUI/Sources/Data and Storage/AutodownloadDataUsagePickerItem.swift index 6847e9a6c5..0904075772 100644 --- a/submodules/SettingsUI/Sources/Data and Storage/AutodownloadDataUsagePickerItem.swift +++ b/submodules/SettingsUI/Sources/Data and Storage/AutodownloadDataUsagePickerItem.swift @@ -8,6 +8,7 @@ import TelegramUIPreferences import TelegramPresentationData import LegacyComponents import ItemListUI +import PresentationDataUtils enum AutomaticDownloadDataUsage: Int { case low diff --git a/submodules/SettingsUI/Sources/Data and Storage/AutodownloadMediaCategoryController.swift b/submodules/SettingsUI/Sources/Data and Storage/AutodownloadMediaCategoryController.swift index 4f1986aed4..c2e7578ab5 100644 --- a/submodules/SettingsUI/Sources/Data and Storage/AutodownloadMediaCategoryController.swift +++ b/submodules/SettingsUI/Sources/Data and Storage/AutodownloadMediaCategoryController.swift @@ -7,6 +7,7 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import AccountContext public func autodownloadDataSizeString(_ size: Int64, decimalSeparator: String = ".") -> String { diff --git a/submodules/SettingsUI/Sources/Data and Storage/AutodownloadSizeLimitItem.swift b/submodules/SettingsUI/Sources/Data and Storage/AutodownloadSizeLimitItem.swift index 8ee436470a..9959e3e399 100644 --- a/submodules/SettingsUI/Sources/Data and Storage/AutodownloadSizeLimitItem.swift +++ b/submodules/SettingsUI/Sources/Data and Storage/AutodownloadSizeLimitItem.swift @@ -7,6 +7,7 @@ import TelegramCore import TelegramPresentationData import LegacyComponents import ItemListUI +import PresentationDataUtils private let autodownloadSizeValues: [(CGFloat, Int32)] = [ (0.000, 512 * 1024), diff --git a/submodules/SettingsUI/Sources/Data and Storage/CalculatingCacheSizeItem.swift b/submodules/SettingsUI/Sources/Data and Storage/CalculatingCacheSizeItem.swift index a87567a626..53d791f08b 100644 --- a/submodules/SettingsUI/Sources/Data and Storage/CalculatingCacheSizeItem.swift +++ b/submodules/SettingsUI/Sources/Data and Storage/CalculatingCacheSizeItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import TelegramPresentationData import ItemListUI +import PresentationDataUtils import ActivityIndicator class CalculatingCacheSizeItem: ListViewItem, ItemListItem { diff --git a/submodules/SettingsUI/Sources/Data and Storage/DataAndStorageSettingsController.swift b/submodules/SettingsUI/Sources/Data and Storage/DataAndStorageSettingsController.swift index e175018ab0..a0787890f6 100644 --- a/submodules/SettingsUI/Sources/Data and Storage/DataAndStorageSettingsController.swift +++ b/submodules/SettingsUI/Sources/Data and Storage/DataAndStorageSettingsController.swift @@ -8,6 +8,7 @@ import LegacyComponents import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import AccountContext private final class DataAndStorageControllerArguments { diff --git a/submodules/SettingsUI/Sources/Data and Storage/NetworkUsageStatsController.swift b/submodules/SettingsUI/Sources/Data and Storage/NetworkUsageStatsController.swift index 1d84317953..d87d11d041 100644 --- a/submodules/SettingsUI/Sources/Data and Storage/NetworkUsageStatsController.swift +++ b/submodules/SettingsUI/Sources/Data and Storage/NetworkUsageStatsController.swift @@ -6,6 +6,7 @@ import Postbox import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext private enum NetworkUsageControllerSection { diff --git a/submodules/SettingsUI/Sources/Data and Storage/ProxyListSettingsController.swift b/submodules/SettingsUI/Sources/Data and Storage/ProxyListSettingsController.swift index bebd008b71..1ad4fb7e0e 100644 --- a/submodules/SettingsUI/Sources/Data and Storage/ProxyListSettingsController.swift +++ b/submodules/SettingsUI/Sources/Data and Storage/ProxyListSettingsController.swift @@ -11,6 +11,7 @@ import MtProtoKit import MtProtoKitDynamic #endif import ItemListUI +import PresentationDataUtils import AccountContext import UrlEscaping import ShareController diff --git a/submodules/SettingsUI/Sources/Data and Storage/ProxyServerActionSheetController.swift b/submodules/SettingsUI/Sources/Data and Storage/ProxyServerActionSheetController.swift index 1692b8b0cc..13e5c42928 100644 --- a/submodules/SettingsUI/Sources/Data and Storage/ProxyServerActionSheetController.swift +++ b/submodules/SettingsUI/Sources/Data and Storage/ProxyServerActionSheetController.swift @@ -43,7 +43,7 @@ public final class ProxyServerActionSheetController: ActionSheetController { } strongSelf.isDismissed = true if success { - strongSelf.present(OverlayStatusController(theme: theme, strings: strings, type: .shieldSuccess(strings.SocksProxySetup_ProxyEnabled, false)), in: .window(.root)) + strongSelf.present(OverlayStatusController(theme: theme, type: .shieldSuccess(strings.SocksProxySetup_ProxyEnabled, false)), in: .window(.root)) } strongSelf.dismissAnimated() }, present: { [weak self] c, a in diff --git a/submodules/SettingsUI/Sources/Data and Storage/ProxyServerSettingsController.swift b/submodules/SettingsUI/Sources/Data and Storage/ProxyServerSettingsController.swift index 561dc3fabf..491d6c4912 100644 --- a/submodules/SettingsUI/Sources/Data and Storage/ProxyServerSettingsController.swift +++ b/submodules/SettingsUI/Sources/Data and Storage/ProxyServerSettingsController.swift @@ -11,6 +11,7 @@ import MtProtoKitDynamic #endif import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext import UrlEscaping import UrlHandling diff --git a/submodules/SettingsUI/Sources/Data and Storage/ProxySettingsActionItem.swift b/submodules/SettingsUI/Sources/Data and Storage/ProxySettingsActionItem.swift index 80a4794fcd..4cf98c625a 100644 --- a/submodules/SettingsUI/Sources/Data and Storage/ProxySettingsActionItem.swift +++ b/submodules/SettingsUI/Sources/Data and Storage/ProxySettingsActionItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import TelegramPresentationData import ItemListUI +import PresentationDataUtils enum ProxySettingsActionIcon { case none diff --git a/submodules/SettingsUI/Sources/Data and Storage/ProxySettingsServerItem.swift b/submodules/SettingsUI/Sources/Data and Storage/ProxySettingsServerItem.swift index 4dd939ade6..5682236200 100644 --- a/submodules/SettingsUI/Sources/Data and Storage/ProxySettingsServerItem.swift +++ b/submodules/SettingsUI/Sources/Data and Storage/ProxySettingsServerItem.swift @@ -7,6 +7,7 @@ import Postbox import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import ActivityIndicator private let activitySize = CGSize(width: 24.0, height: 24.0) diff --git a/submodules/SettingsUI/Sources/Data and Storage/SaveIncomingMediaController.swift b/submodules/SettingsUI/Sources/Data and Storage/SaveIncomingMediaController.swift index 9f9757c921..7ab84690e8 100644 --- a/submodules/SettingsUI/Sources/Data and Storage/SaveIncomingMediaController.swift +++ b/submodules/SettingsUI/Sources/Data and Storage/SaveIncomingMediaController.swift @@ -7,6 +7,7 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import AccountContext private enum PeerType { diff --git a/submodules/SettingsUI/Sources/Data and Storage/StorageUsageController.swift b/submodules/SettingsUI/Sources/Data and Storage/StorageUsageController.swift index 462f10ec6a..a0f408ac7b 100644 --- a/submodules/SettingsUI/Sources/Data and Storage/StorageUsageController.swift +++ b/submodules/SettingsUI/Sources/Data and Storage/StorageUsageController.swift @@ -7,6 +7,7 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import OverlayStatusController import AccountContext import ItemListPeerItem @@ -501,7 +502,7 @@ public func storageUsageController(context: AccountContext, isModal: Bool = fals var cancelImpl: (() -> Void)? let presentationData = context.sharedContext.currentPresentationData.with { $0 } let progressSignal = Signal { subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) presentControllerImpl?(controller) @@ -676,7 +677,7 @@ public func storageUsageController(context: AccountContext, isModal: Bool = fals var cancelImpl: (() -> Void)? let presentationData = context.sharedContext.currentPresentationData.with { $0 } let progressSignal = Signal { subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) presentControllerImpl?(controller) diff --git a/submodules/SettingsUI/Sources/Data and Storage/VoiceCallDataSavingController.swift b/submodules/SettingsUI/Sources/Data and Storage/VoiceCallDataSavingController.swift index 16598eb138..bd68ff4e66 100644 --- a/submodules/SettingsUI/Sources/Data and Storage/VoiceCallDataSavingController.swift +++ b/submodules/SettingsUI/Sources/Data and Storage/VoiceCallDataSavingController.swift @@ -7,6 +7,7 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import AccountContext private final class VoiceCallDataSavingControllerArguments { diff --git a/submodules/SettingsUI/Sources/DebugAccountsController.swift b/submodules/SettingsUI/Sources/DebugAccountsController.swift index 854d120840..067bcc95e4 100644 --- a/submodules/SettingsUI/Sources/DebugAccountsController.swift +++ b/submodules/SettingsUI/Sources/DebugAccountsController.swift @@ -6,6 +6,7 @@ import Postbox import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext private final class DebugAccountsControllerArguments { diff --git a/submodules/SettingsUI/Sources/DebugController.swift b/submodules/SettingsUI/Sources/DebugController.swift index 37a46d4f78..0145fb2954 100644 --- a/submodules/SettingsUI/Sources/DebugController.swift +++ b/submodules/SettingsUI/Sources/DebugController.swift @@ -13,6 +13,7 @@ import MessageUI import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import OverlayStatusController import AccountContext import WalletUI @@ -454,7 +455,7 @@ private enum DebugControllerEntry: ItemListNodeEntry { return } let presentationData = arguments.sharedContext.currentPresentationData.with { $0 } - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: nil)) + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) arguments.presentController(controller, nil) let _ = (context.account.postbox.transaction { transaction -> Void in transaction.addHolesEverywhere(peerNamespaces: [Namespaces.Peer.CloudUser, Namespaces.Peer.CloudGroup, Namespaces.Peer.CloudChannel], holeNamespace: Namespaces.Message.Cloud) @@ -475,13 +476,13 @@ private enum DebugControllerEntry: ItemListNodeEntry { return } let presentationData = arguments.sharedContext.currentPresentationData.with { $0 } - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: nil)) + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) arguments.presentController(controller, nil) let _ = (context.account.postbox.optimizeStorage() |> deliverOnMainQueue).start(completed: { controller.dismiss() - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .success) + let controller = OverlayStatusController(theme: presentationData.theme, type: .success) arguments.presentController(controller, nil) }) }) diff --git a/submodules/SettingsUI/Sources/EditSettingsController.swift b/submodules/SettingsUI/Sources/EditSettingsController.swift index a901ac805a..9ef3fbd6dc 100644 --- a/submodules/SettingsUI/Sources/EditSettingsController.swift +++ b/submodules/SettingsUI/Sources/EditSettingsController.swift @@ -8,6 +8,7 @@ import TelegramCore import LegacyComponents import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext import GalleryUI import LegacyUI diff --git a/submodules/SettingsUI/Sources/Language Selection/LocalizationListControllerNode.swift b/submodules/SettingsUI/Sources/Language Selection/LocalizationListControllerNode.swift index f4fa457f69..51e04c5344 100644 --- a/submodules/SettingsUI/Sources/Language Selection/LocalizationListControllerNode.swift +++ b/submodules/SettingsUI/Sources/Language Selection/LocalizationListControllerNode.swift @@ -8,6 +8,7 @@ import SwiftSignalKit import TelegramPresentationData import MergeLists import ItemListUI +import PresentationDataUtils import AccountContext import ShareController import SearchBarNode diff --git a/submodules/SettingsUI/Sources/Language Selection/LocalizationListItem.swift b/submodules/SettingsUI/Sources/Language Selection/LocalizationListItem.swift index fe67fa37cf..80da7638fe 100644 --- a/submodules/SettingsUI/Sources/Language Selection/LocalizationListItem.swift +++ b/submodules/SettingsUI/Sources/Language Selection/LocalizationListItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import TelegramPresentationData import ItemListUI +import PresentationDataUtils import ActivityIndicator import ChatListSearchItemNode diff --git a/submodules/SettingsUI/Sources/LogoutOptionsController.swift b/submodules/SettingsUI/Sources/LogoutOptionsController.swift index ee6837e224..c8d7bbf311 100644 --- a/submodules/SettingsUI/Sources/LogoutOptionsController.swift +++ b/submodules/SettingsUI/Sources/LogoutOptionsController.swift @@ -7,9 +7,11 @@ import TelegramCore import LegacyComponents import TelegramPresentationData import ItemListUI +import PresentationDataUtils import OverlayStatusController import AccountContext import AlertUI +import PresentationDataUtils import UrlHandling private struct LogoutOptionsItemArguments { @@ -172,7 +174,7 @@ func logoutOptionsController(context: AccountContext, navigationController: Navi let openFaq: (Promise) -> Void = { resolvedUrl in let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: nil)) + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) presentControllerImpl?(controller, nil) let _ = (resolvedUrl.get() |> take(1) diff --git a/submodules/SettingsUI/Sources/Notifications/Exceptions/NotificationExceptionControllerNode.swift b/submodules/SettingsUI/Sources/Notifications/Exceptions/NotificationExceptionControllerNode.swift index da68d00569..0e7221789b 100644 --- a/submodules/SettingsUI/Sources/Notifications/Exceptions/NotificationExceptionControllerNode.swift +++ b/submodules/SettingsUI/Sources/Notifications/Exceptions/NotificationExceptionControllerNode.swift @@ -8,6 +8,7 @@ import SwiftSignalKit import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import MergeLists import AccountContext import SearchBarNode diff --git a/submodules/SettingsUI/Sources/Notifications/Exceptions/NotificationExceptionSettingsController.swift b/submodules/SettingsUI/Sources/Notifications/Exceptions/NotificationExceptionSettingsController.swift index df50cd7b2b..63339371fe 100644 --- a/submodules/SettingsUI/Sources/Notifications/Exceptions/NotificationExceptionSettingsController.swift +++ b/submodules/SettingsUI/Sources/Notifications/Exceptions/NotificationExceptionSettingsController.swift @@ -7,6 +7,7 @@ import TelegramCore import SwiftSignalKit import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext import LocalizedPeerData import TelegramStringFormatting diff --git a/submodules/SettingsUI/Sources/Notifications/NotificationSearchItem.swift b/submodules/SettingsUI/Sources/Notifications/NotificationSearchItem.swift index 8044b888fa..7276c18065 100644 --- a/submodules/SettingsUI/Sources/Notifications/NotificationSearchItem.swift +++ b/submodules/SettingsUI/Sources/Notifications/NotificationSearchItem.swift @@ -6,6 +6,7 @@ import Display import SwiftSignalKit import TelegramPresentationData import ItemListUI +import PresentationDataUtils import SearchBarNode private let searchBarFont = Font.regular(14.0) diff --git a/submodules/SettingsUI/Sources/Notifications/NotificationsAndSounds.swift b/submodules/SettingsUI/Sources/Notifications/NotificationsAndSounds.swift index 78766952bb..d6ff6d86f9 100644 --- a/submodules/SettingsUI/Sources/Notifications/NotificationsAndSounds.swift +++ b/submodules/SettingsUI/Sources/Notifications/NotificationsAndSounds.swift @@ -8,8 +8,10 @@ import TelegramPresentationData import TelegramUIPreferences import DeviceAccess import ItemListUI +import PresentationDataUtils import AccountContext import AlertUI +import PresentationDataUtils import TelegramNotices import NotificationSoundSelectionUI import TelegramStringFormatting diff --git a/submodules/SettingsUI/Sources/OpenSettings.swift b/submodules/SettingsUI/Sources/OpenSettings.swift index 833459e1c2..d582d2ed37 100644 --- a/submodules/SettingsUI/Sources/OpenSettings.swift +++ b/submodules/SettingsUI/Sources/OpenSettings.swift @@ -13,7 +13,7 @@ func openEditSettings(context: AccountContext, accountsAndPeers: Signal<((Accoun var cancelImpl: (() -> Void)? let presentationData = context.sharedContext.currentPresentationData.with { $0 } let progressSignal = Signal { subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) presentController(controller, nil) diff --git a/submodules/SettingsUI/Sources/Privacy and Security/BlockedPeersController.swift b/submodules/SettingsUI/Sources/Privacy and Security/BlockedPeersController.swift index 2dc0cc1eb3..2b10cb8354 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/BlockedPeersController.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/BlockedPeersController.swift @@ -7,6 +7,7 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import AccountContext import ItemListPeerItem import ItemListPeerActionItem diff --git a/submodules/SettingsUI/Sources/Privacy and Security/ConfirmPhoneNumberController.swift b/submodules/SettingsUI/Sources/Privacy and Security/ConfirmPhoneNumberController.swift index 9a95de25f4..3d40e8bb27 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/ConfirmPhoneNumberController.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/ConfirmPhoneNumberController.swift @@ -6,8 +6,10 @@ import Postbox import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext import AlertUI +import PresentationDataUtils import AuthorizationUI private final class ConfirmPhoneNumberCodeControllerArguments { diff --git a/submodules/SettingsUI/Sources/Privacy and Security/CreatePasswordController.swift b/submodules/SettingsUI/Sources/Privacy and Security/CreatePasswordController.swift index 907cd2778c..253e5b50af 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/CreatePasswordController.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/CreatePasswordController.swift @@ -6,8 +6,10 @@ import Postbox import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext import AlertUI +import PresentationDataUtils private enum CreatePasswordField { case password diff --git a/submodules/SettingsUI/Sources/Privacy and Security/DataPrivacySettingsController.swift b/submodules/SettingsUI/Sources/Privacy and Security/DataPrivacySettingsController.swift index a32c07e346..81f05094c4 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/DataPrivacySettingsController.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/DataPrivacySettingsController.swift @@ -7,9 +7,11 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import OverlayStatusController import AccountContext import AlertUI +import PresentationDataUtils import TelegramNotices private final class DataPrivacyControllerArguments { @@ -365,7 +367,7 @@ public func dataPrivacyController(context: AccountContext) -> ViewController { return state } let presentationData = context.sharedContext.currentPresentationData.with { $0 } - presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .success)) + presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, type: .success)) })) } dismissAction() @@ -419,7 +421,7 @@ public func dataPrivacyController(context: AccountContext) -> ViewController { return state } let presentationData = context.sharedContext.currentPresentationData.with { $0 } - presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .success)) + presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, type: .success)) })) }), TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_Cancel, action: {})])) } @@ -475,7 +477,7 @@ public func dataPrivacyController(context: AccountContext) -> ViewController { return state } let presentationData = context.sharedContext.currentPresentationData.with { $0 } - presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .success)) + presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, type: .success)) })) } dismissAction() diff --git a/submodules/SettingsUI/Sources/Privacy and Security/ForwardPrivacyChatPreviewItem.swift b/submodules/SettingsUI/Sources/Privacy and Security/ForwardPrivacyChatPreviewItem.swift index 090195a21d..8729d0abf0 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/ForwardPrivacyChatPreviewItem.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/ForwardPrivacyChatPreviewItem.swift @@ -8,6 +8,7 @@ import Postbox import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import AccountContext class ForwardPrivacyChatPreviewItem: ListViewItem, ItemListItem { diff --git a/submodules/SettingsUI/Sources/Privacy and Security/PasscodeOptionsController.swift b/submodules/SettingsUI/Sources/Privacy and Security/PasscodeOptionsController.swift index f01063fc67..0f5a58b9ec 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/PasscodeOptionsController.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/PasscodeOptionsController.swift @@ -9,6 +9,7 @@ import LocalAuthentication import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import AccountContext import LocalAuth import PasscodeUI diff --git a/submodules/SettingsUI/Sources/Privacy and Security/PrivacyAndSecurityController.swift b/submodules/SettingsUI/Sources/Privacy and Security/PrivacyAndSecurityController.swift index 36827a4bbd..9729967dc7 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/PrivacyAndSecurityController.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/PrivacyAndSecurityController.swift @@ -8,6 +8,7 @@ import TelegramPresentationData import TelegramUIPreferences import TelegramCallsUI import ItemListUI +import PresentationDataUtils import AccountContext import TelegramNotices import LocalAuth diff --git a/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/ItemListRecentSessionItem.swift b/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/ItemListRecentSessionItem.swift index c3458b3236..f47a9bb7ac 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/ItemListRecentSessionItem.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/ItemListRecentSessionItem.swift @@ -7,6 +7,7 @@ import Postbox import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import TelegramStringFormatting struct ItemListRecentSessionItemEditing: Equatable { diff --git a/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/ItemListWebsiteItem.swift b/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/ItemListWebsiteItem.swift index 2eb87b87dc..5fa6f037e7 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/ItemListWebsiteItem.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/ItemListWebsiteItem.swift @@ -8,6 +8,7 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import AvatarNode import TelegramStringFormatting import LocalizedPeerData diff --git a/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/RecentSessionsController.swift b/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/RecentSessionsController.swift index 4ac75f487d..cb7423a2b5 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/RecentSessionsController.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/RecentSessionsController.swift @@ -7,6 +7,7 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import AccountContext private final class RecentSessionsControllerArguments { diff --git a/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/RecentSessionsEmptyStateItem.swift b/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/RecentSessionsEmptyStateItem.swift index a60b8858e3..1564ac61fd 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/RecentSessionsEmptyStateItem.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/Recent Sessions/RecentSessionsEmptyStateItem.swift @@ -4,6 +4,7 @@ import AsyncDisplayKit import Display import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AppBundle final class RecentSessionsEmptyStateItem: ItemListControllerEmptyStateItem { diff --git a/submodules/SettingsUI/Sources/Privacy and Security/SelectivePrivacySettingsController.swift b/submodules/SettingsUI/Sources/Privacy and Security/SelectivePrivacySettingsController.swift index 91647f85da..a4a3b212ab 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/SelectivePrivacySettingsController.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/SelectivePrivacySettingsController.swift @@ -7,6 +7,7 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import AccountContext enum SelectivePrivacySettingsKind { diff --git a/submodules/SettingsUI/Sources/Privacy and Security/SelectivePrivacySettingsPeersController.swift b/submodules/SettingsUI/Sources/Privacy and Security/SelectivePrivacySettingsPeersController.swift index 041e9c2531..a510364b42 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/SelectivePrivacySettingsPeersController.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/SelectivePrivacySettingsPeersController.swift @@ -7,6 +7,7 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import AccountContext import ItemListPeerItem import ItemListPeerActionItem diff --git a/submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationPasswordEntryController.swift b/submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationPasswordEntryController.swift index cf1b880b31..9bf85f2222 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationPasswordEntryController.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationPasswordEntryController.swift @@ -6,8 +6,10 @@ import Postbox import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext import AlertUI +import PresentationDataUtils private final class TwoStepVerificationPasswordEntryControllerArguments { let updateEntryText: (String) -> Void diff --git a/submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationResetController.swift b/submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationResetController.swift index 5ba7bd68ed..7e0ec4aaa6 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationResetController.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationResetController.swift @@ -6,9 +6,11 @@ import Postbox import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import TextFormat import AccountContext import AlertUI +import PresentationDataUtils private final class TwoStepVerificationResetControllerArguments { let updateEntryText: (String) -> Void diff --git a/submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationUnlockController.swift b/submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationUnlockController.swift index 97affadd28..0c4ff4afc1 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationUnlockController.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/TwoStepVerificationUnlockController.swift @@ -6,10 +6,12 @@ import Postbox import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import TextFormat import OverlayStatusController import AccountContext import AlertUI +import PresentationDataUtils import PasswordSetupUI private final class TwoStepVerificationUnlockSettingsControllerArguments { @@ -489,7 +491,7 @@ func twoStepVerificationUnlockSettingsController(context: AccountContext, mode: controller?.dismiss() let presentationData = context.sharedContext.currentPresentationData.with { $0 } - presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .genericSuccess(presentationData.strings.TwoStepAuth_DisableSuccess, false)), nil) + presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, type: .genericSuccess(presentationData.strings.TwoStepAuth_DisableSuccess, false)), nil) } presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) }, error: { _ in @@ -530,7 +532,7 @@ func twoStepVerificationUnlockSettingsController(context: AccountContext, mode: if let password = password { dataPromise.set(.single(.manage(password: password, emailSet: hasRecoveryEmail, pendingEmail: nil, hasSecureValues: hasSecureValues))) let presentationData = context.sharedContext.currentPresentationData.with { $0 } - presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .genericSuccess(presentationData.strings.TwoStepAuth_EnabledSuccess, false)), nil) + presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, type: .genericSuccess(presentationData.strings.TwoStepAuth_EnabledSuccess, false)), nil) } else { dataPromise.set(.single(.access(configuration: nil)) |> then(twoStepVerificationConfiguration(account: context.account) |> map { TwoStepVerificationUnlockSettingsControllerData.access(configuration: TwoStepVerificationAccessConfiguration(configuration: $0, password: password)) })) @@ -562,7 +564,7 @@ func twoStepVerificationUnlockSettingsController(context: AccountContext, mode: if let password = password { dataPromise.set(.single(.manage(password: password, emailSet: hasRecoveryEmail, pendingEmail: nil, hasSecureValues: hasSecureValues))) let presentationData = context.sharedContext.currentPresentationData.with { $0 } - presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .genericSuccess(presentationData.strings.TwoStepAuth_PasswordChangeSuccess, false)), nil) + presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, type: .genericSuccess(presentationData.strings.TwoStepAuth_PasswordChangeSuccess, false)), nil) } else { dataPromise.set(.single(.access(configuration: nil)) |> then(twoStepVerificationConfiguration(account: context.account) |> map { TwoStepVerificationUnlockSettingsControllerData.access(configuration: TwoStepVerificationAccessConfiguration(configuration: $0, password: password)) })) @@ -606,7 +608,7 @@ func twoStepVerificationUnlockSettingsController(context: AccountContext, mode: return .complete() case let .manage(password, _, _, _): let presentationData = context.sharedContext.currentPresentationData.with { $0 } - presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .genericSuccess(presentationData.strings.TwoStepAuth_DisableSuccess, false)), nil) + presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, type: .genericSuccess(presentationData.strings.TwoStepAuth_DisableSuccess, false)), nil) return updateTwoStepVerificationPassword(network: context.account.network, currentPassword: password, updatedPassword: .none) |> mapToSignal { _ -> Signal in return .complete() @@ -654,7 +656,7 @@ func twoStepVerificationUnlockSettingsController(context: AccountContext, mode: let data: TwoStepVerificationUnlockSettingsControllerData = .manage(password: password, emailSet: hasRecoveryEmail, pendingEmail: nil, hasSecureValues: hasSecureValues) dataPromise.set(.single(data)) let presentationData = context.sharedContext.currentPresentationData.with { $0 } - presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .genericSuccess(emailSet ? presentationData.strings.TwoStepAuth_EmailChangeSuccess : presentationData.strings.TwoStepAuth_EmailAddSuccess, false)), nil) + presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, type: .genericSuccess(emailSet ? presentationData.strings.TwoStepAuth_EmailChangeSuccess : presentationData.strings.TwoStepAuth_EmailAddSuccess, false)), nil) } else { dataPromise.set(.single(.access(configuration: nil)) |> then(twoStepVerificationConfiguration(account: context.account) |> map { TwoStepVerificationUnlockSettingsControllerData.access(configuration: TwoStepVerificationAccessConfiguration(configuration: $0, password: password)) })) @@ -738,7 +740,7 @@ func twoStepVerificationUnlockSettingsController(context: AccountContext, mode: dataPromise.set(.single(data)) case let .passwordSet(password, hasRecoveryEmail, hasSecureValues): let presentationData = context.sharedContext.currentPresentationData.with { $0 } - presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .genericSuccess(emailSet ? presentationData.strings.TwoStepAuth_EmailChangeSuccess : presentationData.strings.TwoStepAuth_EmailAddSuccess, false)), nil) + presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, type: .genericSuccess(emailSet ? presentationData.strings.TwoStepAuth_EmailChangeSuccess : presentationData.strings.TwoStepAuth_EmailAddSuccess, false)), nil) if let password = password { let data: TwoStepVerificationUnlockSettingsControllerData = .manage(password: password, emailSet: hasRecoveryEmail, pendingEmail: nil, hasSecureValues: hasSecureValues) dataPromise.set(.single(data)) diff --git a/submodules/SettingsUI/Sources/Search/SettingsSearchItem.swift b/submodules/SettingsUI/Sources/Search/SettingsSearchItem.swift index bb62fd895f..6d3ff1812a 100644 --- a/submodules/SettingsUI/Sources/Search/SettingsSearchItem.swift +++ b/submodules/SettingsUI/Sources/Search/SettingsSearchItem.swift @@ -8,6 +8,7 @@ import SwiftSignalKit import TelegramPresentationData import MergeLists import ItemListUI +import PresentationDataUtils import AccountContext import SearchBarNode import SearchUI diff --git a/submodules/SettingsUI/Sources/Search/SettingsSearchRecentItem.swift b/submodules/SettingsUI/Sources/Search/SettingsSearchRecentItem.swift index 4186991bfc..001a76624d 100644 --- a/submodules/SettingsUI/Sources/Search/SettingsSearchRecentItem.swift +++ b/submodules/SettingsUI/Sources/Search/SettingsSearchRecentItem.swift @@ -7,6 +7,7 @@ import SwiftSignalKit import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils private enum RevealOptionKey: Int32 { case delete diff --git a/submodules/SettingsUI/Sources/Search/SettingsSearchResultItem.swift b/submodules/SettingsUI/Sources/Search/SettingsSearchResultItem.swift index 565a2c0279..0e034ae597 100644 --- a/submodules/SettingsUI/Sources/Search/SettingsSearchResultItem.swift +++ b/submodules/SettingsUI/Sources/Search/SettingsSearchResultItem.swift @@ -5,6 +5,7 @@ import AsyncDisplayKit import SwiftSignalKit import TelegramPresentationData import ItemListUI +import PresentationDataUtils class SettingsSearchResultItem: ListViewItem, ItemListItem { let theme: PresentationTheme diff --git a/submodules/SettingsUI/Sources/Search/SettingsSearchableItems.swift b/submodules/SettingsUI/Sources/Search/SettingsSearchableItems.swift index 54bba59ccc..0e21a7ac45 100644 --- a/submodules/SettingsUI/Sources/Search/SettingsSearchableItems.swift +++ b/submodules/SettingsUI/Sources/Search/SettingsSearchableItems.swift @@ -12,6 +12,7 @@ import PassportUI import LocalAuth import CallListUI import NotificationSoundSelectionUI +import PresentationDataUtils private let maximumNumberOfAccounts = 3 @@ -708,7 +709,7 @@ private func languageSearchableItems(context: AccountContext, localizations: [Lo let applyLocalization: (AccountContext, @escaping (SettingsSearchableItemPresentation, ViewController?) -> Void, String) -> Void = { context, present, languageCode in let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: nil)) + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) present(.immediate, controller) let _ = (downloadAndApplyLocalization(accountManager: context.sharedContext.accountManager, postbox: context.account.postbox, network: context.account.network, languageCode: languageCode) diff --git a/submodules/SettingsUI/Sources/SettingsController.swift b/submodules/SettingsUI/Sources/SettingsController.swift index 73242cded6..94cb9cc264 100644 --- a/submodules/SettingsUI/Sources/SettingsController.swift +++ b/submodules/SettingsUI/Sources/SettingsController.swift @@ -15,10 +15,12 @@ import TelegramPresentationData import TelegramUIPreferences import DeviceAccess import ItemListUI +import PresentationDataUtils import AccountContext import OverlayStatusController import AvatarNode import AlertUI +import PresentationDataUtils import TelegramNotices import GalleryUI import LegacyUI @@ -782,7 +784,7 @@ public func settingsController(context: AccountContext, accountManager: AccountM |> deliverOnMainQueue |> take(1)).start(next: { context in let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: nil)) + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) presentControllerImpl?(controller, nil) let _ = (resolvedUrl.get() |> take(1) diff --git a/submodules/SettingsUI/Sources/Stickers/ArchivedStickerPacksController.swift b/submodules/SettingsUI/Sources/Stickers/ArchivedStickerPacksController.swift index 381065879e..d395626b62 100644 --- a/submodules/SettingsUI/Sources/Stickers/ArchivedStickerPacksController.swift +++ b/submodules/SettingsUI/Sources/Stickers/ArchivedStickerPacksController.swift @@ -7,6 +7,7 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import OverlayStatusController import AccountContext import StickerPackPreviewUI @@ -315,7 +316,7 @@ public func archivedStickerPacksController(context: AccountContext, mode: Archiv } |> deliverOnMainQueue).start(completed: { let presentationData = context.sharedContext.currentPresentationData.with { $0 } - presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .success), nil) + presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, type: .success), nil) let applyPacks: Signal = stickerPacks.get() |> filter { $0 != nil } diff --git a/submodules/SettingsUI/Sources/Stickers/FeaturedStickerPacksController.swift b/submodules/SettingsUI/Sources/Stickers/FeaturedStickerPacksController.swift index 0d1e66c198..902311f81b 100644 --- a/submodules/SettingsUI/Sources/Stickers/FeaturedStickerPacksController.swift +++ b/submodules/SettingsUI/Sources/Stickers/FeaturedStickerPacksController.swift @@ -7,6 +7,7 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import AccountContext import StickerPackPreviewUI import ItemListStickerPackItem diff --git a/submodules/SettingsUI/Sources/Stickers/InstalledStickerPacksController.swift b/submodules/SettingsUI/Sources/Stickers/InstalledStickerPacksController.swift index f145ad21cf..86b2922418 100644 --- a/submodules/SettingsUI/Sources/Stickers/InstalledStickerPacksController.swift +++ b/submodules/SettingsUI/Sources/Stickers/InstalledStickerPacksController.swift @@ -7,6 +7,7 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import TextFormat import AccountContext import StickerPackPreviewUI diff --git a/submodules/SettingsUI/Sources/Themes/EditThemeController.swift b/submodules/SettingsUI/Sources/Themes/EditThemeController.swift index 6ebc89cad5..f07a62fb26 100644 --- a/submodules/SettingsUI/Sources/Themes/EditThemeController.swift +++ b/submodules/SettingsUI/Sources/Themes/EditThemeController.swift @@ -7,7 +7,9 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import AlertUI +import PresentationDataUtils import LegacyMediaPickerUI import WallpaperResources import AccountContext diff --git a/submodules/SettingsUI/Sources/Themes/ThemeAutoNightSettingsController.swift b/submodules/SettingsUI/Sources/Themes/ThemeAutoNightSettingsController.swift index d788b46374..4466137a0e 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeAutoNightSettingsController.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeAutoNightSettingsController.swift @@ -7,6 +7,7 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import TelegramStringFormatting import AccountContext import DeviceLocationManager diff --git a/submodules/SettingsUI/Sources/Themes/ThemeColorsGridControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemeColorsGridControllerNode.swift index f4d26e7c72..a7ae32dd07 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeColorsGridControllerNode.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeColorsGridControllerNode.swift @@ -8,6 +8,7 @@ import SwiftSignalKit import TelegramPresentationData import MergeLists import ItemListUI +import PresentationDataUtils import AccountContext final class ThemeColorsGridControllerInteraction { diff --git a/submodules/SettingsUI/Sources/Themes/ThemeGridController.swift b/submodules/SettingsUI/Sources/Themes/ThemeGridController.swift index c5b352c669..6248bfdcfd 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeGridController.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeGridController.swift @@ -230,7 +230,7 @@ final class ThemeGridController: ViewController { if let strongSelf = self { strongSelf.scrollToTop?() - let controller = OverlayStatusController(theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, type: .loading(cancelled: nil)) + let controller = OverlayStatusController(theme: strongSelf.presentationData.theme, type: .loading(cancelled: nil)) strongSelf.present(controller, in: .window(.root)) let _ = resetWallpapers(account: strongSelf.context.account).start(completed: { [weak self, weak controller] in diff --git a/submodules/SettingsUI/Sources/Themes/ThemeGridControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemeGridControllerNode.swift index 28b425776b..25bb83b3e6 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeGridControllerNode.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeGridControllerNode.swift @@ -10,6 +10,7 @@ import TelegramPresentationData import TelegramUIPreferences import MergeLists import ItemListUI +import PresentationDataUtils import AccountContext import SearchBarNode import SearchUI diff --git a/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift b/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift index 1aac901abd..76b726eb91 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemePreviewController.swift @@ -13,6 +13,7 @@ import CounterContollerTitleView import WallpaperResources import OverlayStatusController import AppBundle +import PresentationDataUtils public enum ThemePreviewSource { case settings(PresentationThemeReference) @@ -304,7 +305,7 @@ public final class ThemePreviewController: ViewController { var cancelImpl: (() -> Void)? let progressSignal = Signal { [weak self] subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) self?.present(controller, in: .window(.root)) diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsAccentColorItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsAccentColorItem.swift index 553ae57e49..b2f9492568 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsAccentColorItem.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsAccentColorItem.swift @@ -7,6 +7,7 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils private func generateSwatchImage(theme: PresentationTheme, color: PresentationThemeAccentColor, selected: Bool) -> UIImage? { return generateImage(CGSize(width: 40.0, height: 40.0), rotatedContext: { size, context in diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsAppIconItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsAppIconItem.swift index 6e880168c6..72d9b7e786 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsAppIconItem.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsAppIconItem.swift @@ -6,6 +6,7 @@ import SwiftSignalKit import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AppBundle private func generateBorderImage(theme: PresentationTheme, bordered: Bool, selected: Bool) -> UIImage? { diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsBrightnessItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsBrightnessItem.swift index d6d392386b..774d83e30e 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsBrightnessItem.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsBrightnessItem.swift @@ -7,6 +7,7 @@ import TelegramCore import TelegramPresentationData import LegacyComponents import ItemListUI +import PresentationDataUtils import AppBundle class ThemeSettingsBrightnessItem: ListViewItem, ItemListItem { diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsChatPreviewItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsChatPreviewItem.swift index dc9a915dab..8ffa279900 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsChatPreviewItem.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsChatPreviewItem.swift @@ -8,6 +8,7 @@ import Postbox import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import AccountContext struct ChatPreviewMessageItem: Equatable { diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift index 065cc7be1e..c1acce31f4 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift @@ -7,7 +7,9 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import AlertUI +import PresentationDataUtils import WallpaperResources import ShareController import AccountContext diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsFontSizeItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsFontSizeItem.swift index 7c8b8bf0a0..421941940f 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsFontSizeItem.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsFontSizeItem.swift @@ -8,6 +8,7 @@ import TelegramPresentationData import TelegramUIPreferences import LegacyComponents import ItemListUI +import PresentationDataUtils import AppBundle class ThemeSettingsFontSizeItem: ListViewItem, ItemListItem { diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift index bf3d004858..895c93174c 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsThemeItem.swift @@ -8,6 +8,7 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import WallpaperResources import AccountContext import AppBundle diff --git a/submodules/SettingsUI/Sources/UsernameSetupController.swift b/submodules/SettingsUI/Sources/UsernameSetupController.swift index 36c43dd107..109d915f04 100644 --- a/submodules/SettingsUI/Sources/UsernameSetupController.swift +++ b/submodules/SettingsUI/Sources/UsernameSetupController.swift @@ -6,6 +6,7 @@ import Postbox import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext import ShareController diff --git a/submodules/SettingsUI/Sources/Watch/WatchSettingsController.swift b/submodules/SettingsUI/Sources/Watch/WatchSettingsController.swift index fdaa7a5fdb..51e5ac3161 100644 --- a/submodules/SettingsUI/Sources/Watch/WatchSettingsController.swift +++ b/submodules/SettingsUI/Sources/Watch/WatchSettingsController.swift @@ -7,6 +7,7 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import AccountContext private final class WatchSettingsControllerArguments { diff --git a/submodules/StickerPackPreviewUI/BUCK b/submodules/StickerPackPreviewUI/BUCK index a74f7bdfdb..5aa327252d 100644 --- a/submodules/StickerPackPreviewUI/BUCK +++ b/submodules/StickerPackPreviewUI/BUCK @@ -17,6 +17,7 @@ static_library( "//submodules/ShareController:ShareController", "//submodules/StickerResources:StickerResources", "//submodules/AlertUI:AlertUI", + "//submodules/PresentationDataUtils:PresentationDataUtils", "//submodules/TextFormat:TextFormat", "//submodules/MergeLists:MergeLists", "//submodules/ActivityIndicator:ActivityIndicator", diff --git a/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewController.swift b/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewController.swift index e1b2e70138..07a330de21 100644 --- a/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewController.swift +++ b/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewController.swift @@ -10,6 +10,7 @@ import AccountContext import ShareController import StickerResources import AlertUI +import PresentationDataUtils public enum StickerPackPreviewControllerMode { case `default` diff --git a/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewGridItem.swift b/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewGridItem.swift index 7aabf8e95b..18c14c4ecf 100644 --- a/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewGridItem.swift +++ b/submodules/StickerPackPreviewUI/Sources/StickerPackPreviewGridItem.swift @@ -108,7 +108,7 @@ final class StickerPackPreviewGridItemNode: GridItemNode { } } let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0)) - self.animationNode?.setup(account: account, resource: .resource(stickerItem.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) + self.animationNode?.setup(resource: .resource(account, stickerItem.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) self.animationNode?.visibility = self.isVisibleInGrid && self.interaction?.playAnimatedStickers ?? true self.stickerFetchedDisposable.set(freeMediaFileResourceInteractiveFetched(account: account, fileReference: stickerPackFileReference(stickerItem.file), resource: stickerItem.file.resource).start()) } else { diff --git a/submodules/StickerPackPreviewUI/Sources/StickerPreviewPeekContent.swift b/submodules/StickerPackPreviewUI/Sources/StickerPreviewPeekContent.swift index 9fc4f6d0e6..a075e54299 100644 --- a/submodules/StickerPackPreviewUI/Sources/StickerPreviewPeekContent.swift +++ b/submodules/StickerPackPreviewUI/Sources/StickerPreviewPeekContent.swift @@ -91,7 +91,7 @@ private final class StickerPreviewPeekContentNode: ASDisplayNode, PeekController let dimensions = item.file.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 400.0, height: 400.0)) - self.animationNode?.setup(account: account, resource: .resource(item.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .direct) + self.animationNode?.setup(resource: .resource(account, item.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .direct) self.animationNode?.visibility = true self.animationNode?.addSubnode(self.textNode) } else { diff --git a/submodules/StringPluralization/BUCK b/submodules/StringPluralization/BUCK new file mode 100644 index 0000000000..d6965f2c11 --- /dev/null +++ b/submodules/StringPluralization/BUCK @@ -0,0 +1,21 @@ +load("//Config:buck_rule_macros.bzl", "static_library") + +static_library( + name = "StringPluralization", + srcs = glob([ + "Sources/**/*.swift", + "Sources/**/*.m", + ]), + headers = glob([ + "Sources/*.h", + ]), + exported_headers = glob([ + "Sources/*.h", + ]), + deps = [ + "//submodules/AppBundle:AppBundle", + ], + frameworks = [ + "$SDKROOT/System/Library/Frameworks/Foundation.framework", + ], +) diff --git a/submodules/TelegramPresentationData/Sources/NumberPluralizationForm.h b/submodules/StringPluralization/Sources/NumberPluralizationForm.h similarity index 100% rename from submodules/TelegramPresentationData/Sources/NumberPluralizationForm.h rename to submodules/StringPluralization/Sources/NumberPluralizationForm.h diff --git a/submodules/TelegramPresentationData/Sources/NumberPluralizationForm.m b/submodules/StringPluralization/Sources/NumberPluralizationForm.m similarity index 100% rename from submodules/TelegramPresentationData/Sources/NumberPluralizationForm.m rename to submodules/StringPluralization/Sources/NumberPluralizationForm.m diff --git a/submodules/TelegramPresentationData/Sources/StringPluralization.swift b/submodules/StringPluralization/Sources/StringPluralization.swift similarity index 87% rename from submodules/TelegramPresentationData/Sources/StringPluralization.swift rename to submodules/StringPluralization/Sources/StringPluralization.swift index 8b4c8ad126..1df97f8ec7 100644 --- a/submodules/TelegramPresentationData/Sources/StringPluralization.swift +++ b/submodules/StringPluralization/Sources/StringPluralization.swift @@ -1,6 +1,6 @@ import Foundation -enum PluralizationForm: Int32 { +public enum PluralizationForm: Int32 { case zero = 0 case one = 1 case two = 2 @@ -26,7 +26,7 @@ enum PluralizationForm: Int32 { } } -func presentationStringsPluralizationForm(_ lc: UInt32, _ value: Int32) -> PluralizationForm { +public func getPluralizationForm(_ lc: UInt32, _ value: Int32) -> PluralizationForm { switch numberPluralizationForm(lc, value) { case .zero: return .zero diff --git a/submodules/TelegramBaseController/BUCK b/submodules/TelegramBaseController/BUCK index 770a057809..794ea2c3cc 100644 --- a/submodules/TelegramBaseController/BUCK +++ b/submodules/TelegramBaseController/BUCK @@ -17,6 +17,7 @@ static_library( "//submodules/AccountContext:AccountContext", "//submodules/LegacyComponents:LegacyComponents", "//submodules/OverlayStatusController:OverlayStatusController", + "//submodules/PresentationDataUtils:PresentationDataUtils", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/TelegramBaseController/Sources/TelegramBaseController.swift b/submodules/TelegramBaseController/Sources/TelegramBaseController.swift index eb7ef9ec7e..270817cccf 100644 --- a/submodules/TelegramBaseController/Sources/TelegramBaseController.swift +++ b/submodules/TelegramBaseController/Sources/TelegramBaseController.swift @@ -10,6 +10,7 @@ import TelegramUIPreferences import UniversalMediaPlayer import AccountContext import OverlayStatusController +import PresentationDataUtils public enum MediaAccessoryPanelVisibility { case none @@ -560,7 +561,7 @@ open class TelegramBaseController: ViewController, KeyShortcutResponder { var cancelImpl: (() -> Void)? let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 } let progressSignal = Signal { subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) self?.present(controller, in: .window(.root)) diff --git a/submodules/TelegramCallsUI/BUCK b/submodules/TelegramCallsUI/BUCK index 1d86a6b8f8..c9b6ee2eb8 100644 --- a/submodules/TelegramCallsUI/BUCK +++ b/submodules/TelegramCallsUI/BUCK @@ -26,6 +26,7 @@ static_library( "//submodules/ItemListUI:ItemListUI", "//submodules/OverlayStatusController:OverlayStatusController", "//submodules/AppBundle:AppBundle", + "//submodules/PresentationDataUtils:PresentationDataUtils", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/TelegramCallsUI/Sources/CallFeedbackController.swift b/submodules/TelegramCallsUI/Sources/CallFeedbackController.swift index 599a571163..ea63da505b 100644 --- a/submodules/TelegramCallsUI/Sources/CallFeedbackController.swift +++ b/submodules/TelegramCallsUI/Sources/CallFeedbackController.swift @@ -6,6 +6,7 @@ import Postbox import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import OverlayStatusController import AccountContext @@ -262,7 +263,7 @@ public func callFeedbackController(sharedContext: SharedAccountContext, account: let _ = rateCallAndSendLogs(account: account, callId: callId, starsCount: rating, comment: comment, userInitiated: userInitiated, includeLogs: state.includeLogs).start() dismissImpl?() - presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .starSuccess(presentationData.strings.CallFeedback_Success))) + presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, type: .starSuccess(presentationData.strings.CallFeedback_Success))) }) let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.CallFeedback_Title), leftNavigationButton: leftNavigationButton, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back)) diff --git a/submodules/TelegramPresentationData/BUCK b/submodules/TelegramPresentationData/BUCK index 898ef3644e..1e48e2b9e0 100644 --- a/submodules/TelegramPresentationData/BUCK +++ b/submodules/TelegramPresentationData/BUCK @@ -20,6 +20,7 @@ static_library( "//submodules/TelegramUIPreferences:TelegramUIPreferences", "//submodules/MediaResources:MediaResources", "//submodules/AppBundle:AppBundle", + "//submodules/StringPluralization:StringPluralization", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/TelegramPresentationData/Sources/PresentationData.swift b/submodules/TelegramPresentationData/Sources/PresentationData.swift index eeed5214aa..350da3c0e2 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationData.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationData.swift @@ -57,12 +57,6 @@ public enum PresentationDateFormat { case dayFirst } -extension PresentationStrings: Equatable { - public static func ==(lhs: PresentationStrings, rhs: PresentationStrings) -> Bool { - return lhs === rhs - } -} - public final class PresentationData: Equatable { public let strings: PresentationStrings public let theme: PresentationTheme diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index 9051bd79c4..6652bb17a8 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -1,5 +1,6 @@ import Foundation import AppBundle +import StringPluralization private let fallbackDict: [String: String] = { guard let mainPath = getAppBundle().path(forResource: "en", ofType: "lproj"), let bundle = Bundle(path: mainPath) else { @@ -175,7 +176,7 @@ private func loadMapping() -> ([Int], [String], [Int], [Int], [String]) { private let keyMapping: ([Int], [String], [Int], [Int], [String]) = loadMapping() -public final class PresentationStrings { +public final class PresentationStrings: Equatable { public let lc: UInt32 public let primaryComponent: PresentationStringsComponent @@ -190,4745 +191,4822 @@ public final class PresentationStrings { public var StickerPack_ShowStickers: String { return self._s[1]! } public var Map_PullUpForPlaces: String { return self._s[2]! } public var Channel_Status: String { return self._s[4]! } - public var TwoStepAuth_ChangePassword: String { return self._s[5]! } - public var Map_LiveLocationFor1Hour: String { return self._s[6]! } - public var CheckoutInfo_ShippingInfoAddress2Placeholder: String { return self._s[7]! } - public var Settings_AppleWatch: String { return self._s[8]! } - public var Login_InvalidCountryCode: String { return self._s[9]! } - public var WebSearch_RecentSectionTitle: String { return self._s[10]! } - public var UserInfo_DeleteContact: String { return self._s[11]! } - public var ShareFileTip_CloseTip: String { return self._s[12]! } - public var UserInfo_Invite: String { return self._s[13]! } - public var Passport_Identity_MiddleName: String { return self._s[14]! } - public var Passport_Identity_FrontSideHelp: String { return self._s[15]! } - public var Month_GenDecember: String { return self._s[17]! } - public var Common_Yes: String { return self._s[18]! } + public var Wallet_Updated_JustNow: String { return self._s[5]! } + public var TwoStepAuth_ChangePassword: String { return self._s[6]! } + public var Map_LiveLocationFor1Hour: String { return self._s[7]! } + public var CheckoutInfo_ShippingInfoAddress2Placeholder: String { return self._s[8]! } + public var Settings_AppleWatch: String { return self._s[9]! } + public var Login_InvalidCountryCode: String { return self._s[10]! } + public var WebSearch_RecentSectionTitle: String { return self._s[11]! } + public var UserInfo_DeleteContact: String { return self._s[12]! } + public var ShareFileTip_CloseTip: String { return self._s[13]! } + public var UserInfo_Invite: String { return self._s[14]! } + public var Passport_Identity_MiddleName: String { return self._s[15]! } + public var Passport_Identity_FrontSideHelp: String { return self._s[16]! } + public var Month_GenDecember: String { return self._s[18]! } + public var Common_Yes: String { return self._s[19]! } public func EncryptionKey_Description(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[19]!, self._r[19]!, [_1, _2]) + return formatWithArgumentRanges(self._s[20]!, self._r[20]!, [_1, _2]) } - public var Channel_AdminLogFilter_EventsLeaving: String { return self._s[20]! } - public var WallpaperPreview_PreviewBottomText: String { return self._s[21]! } + public var Channel_AdminLogFilter_EventsLeaving: String { return self._s[21]! } + public var WallpaperPreview_PreviewBottomText: String { return self._s[22]! } public func Notification_PinnedStickerMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[22]!, self._r[22]!, [_0]) + return formatWithArgumentRanges(self._s[23]!, self._r[23]!, [_0]) } - public var Passport_Address_ScansHelp: String { return self._s[23]! } - public var FastTwoStepSetup_PasswordHelp: String { return self._s[24]! } - public var SettingsSearch_Synonyms_Notifications_Title: String { return self._s[25]! } - public var StickerPacksSettings_AnimatedStickers: String { return self._s[26]! } - public var Wallet_WordCheck_IncorrectText: String { return self._s[27]! } + public var Passport_Address_ScansHelp: String { return self._s[24]! } + public var FastTwoStepSetup_PasswordHelp: String { return self._s[25]! } + public var SettingsSearch_Synonyms_Notifications_Title: String { return self._s[26]! } + public var StickerPacksSettings_AnimatedStickers: String { return self._s[27]! } + public var Wallet_WordCheck_IncorrectText: String { return self._s[28]! } public func Items_NOfM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[28]!, self._r[28]!, [_1, _2]) + return formatWithArgumentRanges(self._s[29]!, self._r[29]!, [_1, _2]) } - public var AutoDownloadSettings_Files: String { return self._s[29]! } - public var TextFormat_AddLinkPlaceholder: String { return self._s[30]! } - public var LastSeen_Lately: String { return self._s[35]! } + public var AutoDownloadSettings_Files: String { return self._s[30]! } + public var TextFormat_AddLinkPlaceholder: String { return self._s[31]! } + public var LastSeen_Lately: String { return self._s[36]! } public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[36]!, self._r[36]!, [_1, _2]) + return formatWithArgumentRanges(self._s[37]!, self._r[37]!, [_1, _2]) } - public var Camera_Discard: String { return self._s[37]! } - public var Channel_EditAdmin_PermissinAddAdminOff: String { return self._s[38]! } - public var Login_InvalidPhoneError: String { return self._s[40]! } - public var SettingsSearch_Synonyms_Privacy_AuthSessions: String { return self._s[41]! } - public var GroupInfo_LabelOwner: String { return self._s[42]! } - public var Conversation_Moderate_Delete: String { return self._s[43]! } - public var Conversation_DeleteMessagesForEveryone: String { return self._s[44]! } - public var WatchRemote_AlertOpen: String { return self._s[45]! } + public var Camera_Discard: String { return self._s[38]! } + public var Channel_EditAdmin_PermissinAddAdminOff: String { return self._s[39]! } + public var Login_InvalidPhoneError: String { return self._s[41]! } + public var SettingsSearch_Synonyms_Privacy_AuthSessions: String { return self._s[42]! } + public var GroupInfo_LabelOwner: String { return self._s[43]! } + public var Conversation_Moderate_Delete: String { return self._s[44]! } + public var Conversation_DeleteMessagesForEveryone: String { return self._s[45]! } + public var WatchRemote_AlertOpen: String { return self._s[46]! } public func MediaPicker_Nof(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[46]!, self._r[46]!, [_0]) + return formatWithArgumentRanges(self._s[47]!, self._r[47]!, [_0]) } - public var EditTheme_Expand_Preview_IncomingReplyName: String { return self._s[47]! } - public var AutoDownloadSettings_MediaTypes: String { return self._s[49]! } - public var Watch_GroupInfo_Title: String { return self._s[50]! } - public var Passport_Identity_AddPersonalDetails: String { return self._s[51]! } - public var Channel_Info_Members: String { return self._s[52]! } - public var LoginPassword_InvalidPasswordError: String { return self._s[54]! } - public var Conversation_LiveLocation: String { return self._s[55]! } - public var PrivacyLastSeenSettings_CustomShareSettingsHelp: String { return self._s[56]! } - public var NetworkUsageSettings_BytesReceived: String { return self._s[58]! } - public var Stickers_Search: String { return self._s[60]! } - public var NotificationsSound_Synth: String { return self._s[61]! } - public var LogoutOptions_LogOutInfo: String { return self._s[62]! } + public var EditTheme_Expand_Preview_IncomingReplyName: String { return self._s[48]! } + public var AutoDownloadSettings_MediaTypes: String { return self._s[50]! } + public var Watch_GroupInfo_Title: String { return self._s[51]! } + public var Passport_Identity_AddPersonalDetails: String { return self._s[52]! } + public var Channel_Info_Members: String { return self._s[53]! } + public var LoginPassword_InvalidPasswordError: String { return self._s[55]! } + public var Conversation_LiveLocation: String { return self._s[56]! } + public var Wallet_Month_ShortNovember: String { return self._s[57]! } + public var PrivacyLastSeenSettings_CustomShareSettingsHelp: String { return self._s[58]! } + public var NetworkUsageSettings_BytesReceived: String { return self._s[60]! } + public var Stickers_Search: String { return self._s[62]! } + public var NotificationsSound_Synth: String { return self._s[63]! } + public var LogoutOptions_LogOutInfo: String { return self._s[64]! } public func VoiceOver_Chat_ForwardedFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[64]!, self._r[64]!, [_0]) + return formatWithArgumentRanges(self._s[66]!, self._r[66]!, [_0]) } - public var NetworkUsageSettings_MediaAudioDataSection: String { return self._s[65]! } - public var ChatList_Context_HideArchive: String { return self._s[67]! } - public var AutoNightTheme_UseSunsetSunrise: String { return self._s[68]! } - public var FastTwoStepSetup_Title: String { return self._s[69]! } - public var EditTheme_Create_Preview_IncomingReplyText: String { return self._s[70]! } - public var Channel_Info_BlackList: String { return self._s[71]! } - public var Channel_AdminLog_InfoPanelTitle: String { return self._s[72]! } - public var Conversation_OpenFile: String { return self._s[73]! } - public var SecretTimer_ImageDescription: String { return self._s[74]! } - public var StickerSettings_ContextInfo: String { return self._s[75]! } - public var TwoStepAuth_GenericHelp: String { return self._s[77]! } - public var AutoDownloadSettings_Unlimited: String { return self._s[78]! } - public var PrivacyLastSeenSettings_NeverShareWith_Title: String { return self._s[79]! } - public var AutoDownloadSettings_DataUsageHigh: String { return self._s[80]! } + public var NetworkUsageSettings_MediaAudioDataSection: String { return self._s[67]! } + public var ChatList_Context_HideArchive: String { return self._s[69]! } + public var AutoNightTheme_UseSunsetSunrise: String { return self._s[70]! } + public var FastTwoStepSetup_Title: String { return self._s[71]! } + public var EditTheme_Create_Preview_IncomingReplyText: String { return self._s[72]! } + public var Channel_Info_BlackList: String { return self._s[73]! } + public var Channel_AdminLog_InfoPanelTitle: String { return self._s[74]! } + public var Conversation_OpenFile: String { return self._s[75]! } + public var SecretTimer_ImageDescription: String { return self._s[76]! } + public var StickerSettings_ContextInfo: String { return self._s[77]! } + public var TwoStepAuth_GenericHelp: String { return self._s[79]! } + public var AutoDownloadSettings_Unlimited: String { return self._s[80]! } + public var PrivacyLastSeenSettings_NeverShareWith_Title: String { return self._s[81]! } + public var AutoDownloadSettings_DataUsageHigh: String { return self._s[82]! } public func PUSH_CHAT_MESSAGE_VIDEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[81]!, self._r[81]!, [_1, _2]) + return formatWithArgumentRanges(self._s[83]!, self._r[83]!, [_1, _2]) } - public var Notifications_AddExceptionTitle: String { return self._s[82]! } - public var Watch_MessageView_Reply: String { return self._s[83]! } - public var Tour_Text6: String { return self._s[84]! } - public var TwoStepAuth_SetupPasswordEnterPasswordChange: String { return self._s[85]! } + public var Notifications_AddExceptionTitle: String { return self._s[84]! } + public var Watch_MessageView_Reply: String { return self._s[85]! } + public var Tour_Text6: String { return self._s[86]! } + public var TwoStepAuth_SetupPasswordEnterPasswordChange: String { return self._s[87]! } public func Notification_PinnedAnimationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[86]!, self._r[86]!, [_0]) + return formatWithArgumentRanges(self._s[88]!, self._r[88]!, [_0]) } public func ShareFileTip_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[87]!, self._r[87]!, [_0]) + return formatWithArgumentRanges(self._s[89]!, self._r[89]!, [_0]) } - public var AccessDenied_LocationDenied: String { return self._s[88]! } - public var CallSettings_RecentCalls: String { return self._s[89]! } - public var ConversationProfile_LeaveDeleteAndExit: String { return self._s[90]! } - public var Channel_Members_AddAdminErrorBlacklisted: String { return self._s[91]! } - public var Passport_Authorize: String { return self._s[92]! } - public var StickerPacksSettings_ArchivedMasks_Info: String { return self._s[93]! } - public var AutoDownloadSettings_Videos: String { return self._s[94]! } - public var TwoStepAuth_ReEnterPasswordTitle: String { return self._s[95]! } - public var Wallet_Info_Send: String { return self._s[96]! } - public var Wallet_TransactionInfo_SendGrams: String { return self._s[97]! } - public var Tour_StartButton: String { return self._s[98]! } - public var Watch_AppName: String { return self._s[100]! } - public var StickerPack_ErrorNotFound: String { return self._s[101]! } - public var Channel_Info_Subscribers: String { return self._s[102]! } + public var AccessDenied_LocationDenied: String { return self._s[90]! } + public var CallSettings_RecentCalls: String { return self._s[91]! } + public var ConversationProfile_LeaveDeleteAndExit: String { return self._s[92]! } + public var Channel_Members_AddAdminErrorBlacklisted: String { return self._s[93]! } + public var Passport_Authorize: String { return self._s[94]! } + public var StickerPacksSettings_ArchivedMasks_Info: String { return self._s[95]! } + public var AutoDownloadSettings_Videos: String { return self._s[96]! } + public var TwoStepAuth_ReEnterPasswordTitle: String { return self._s[97]! } + public var Wallet_Info_Send: String { return self._s[98]! } + public var Wallet_TransactionInfo_SendGrams: String { return self._s[99]! } + public var Tour_StartButton: String { return self._s[100]! } + public var Watch_AppName: String { return self._s[102]! } + public var StickerPack_ErrorNotFound: String { return self._s[103]! } + public var Channel_Info_Subscribers: String { return self._s[104]! } public func Channel_AdminLog_MessageGroupPreHistoryVisible(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[103]!, self._r[103]!, [_0]) + return formatWithArgumentRanges(self._s[105]!, self._r[105]!, [_0]) } public func DialogList_PinLimitError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[104]!, self._r[104]!, [_0]) - } - public var Appearance_RemoveTheme: String { return self._s[105]! } - public func Wallet_Info_TransactionBlockchainFee(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[106]!, self._r[106]!, [_0]) } - public var Conversation_StopLiveLocation: String { return self._s[108]! } - public var Channel_AdminLogFilter_EventsAll: String { return self._s[109]! } - public var GroupInfo_InviteLink_CopyAlert_Success: String { return self._s[111]! } - public var Username_LinkCopied: String { return self._s[113]! } - public var GroupRemoved_Title: String { return self._s[114]! } - public var SecretVideo_Title: String { return self._s[115]! } + public var Appearance_RemoveTheme: String { return self._s[107]! } + public func Wallet_Info_TransactionBlockchainFee(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[108]!, self._r[108]!, [_0]) + } + public var Conversation_StopLiveLocation: String { return self._s[110]! } + public var Channel_AdminLogFilter_EventsAll: String { return self._s[111]! } + public var GroupInfo_InviteLink_CopyAlert_Success: String { return self._s[113]! } + public var Username_LinkCopied: String { return self._s[115]! } + public var GroupRemoved_Title: String { return self._s[116]! } + public var SecretVideo_Title: String { return self._s[117]! } public func PUSH_PINNED_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[116]!, self._r[116]!, [_1]) + return formatWithArgumentRanges(self._s[118]!, self._r[118]!, [_1]) } - public var AccessDenied_PhotosAndVideos: String { return self._s[117]! } - public var Appearance_ThemePreview_Chat_1_Text: String { return self._s[118]! } + public var AccessDenied_PhotosAndVideos: String { return self._s[119]! } + public var Appearance_ThemePreview_Chat_1_Text: String { return self._s[120]! } public func PUSH_CHANNEL_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[120]!, self._r[120]!, [_1]) + return formatWithArgumentRanges(self._s[122]!, self._r[122]!, [_1]) } - public var Map_OpenInGoogleMaps: String { return self._s[121]! } + public var Map_OpenInGoogleMaps: String { return self._s[123]! } public func Time_PreciseDate_m12(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[122]!, self._r[122]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[124]!, self._r[124]!, [_1, _2, _3]) } public func Channel_AdminLog_MessageKickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[123]!, self._r[123]!, [_1, _2]) + return formatWithArgumentRanges(self._s[125]!, self._r[125]!, [_1, _2]) } - public var Call_StatusRinging: String { return self._s[124]! } - public var SettingsSearch_Synonyms_EditProfile_Username: String { return self._s[125]! } - public var Group_Username_InvalidStartsWithNumber: String { return self._s[126]! } - public var UserInfo_NotificationsEnabled: String { return self._s[127]! } - public var Map_Search: String { return self._s[128]! } - public var Login_TermsOfServiceHeader: String { return self._s[130]! } + public var Call_StatusRinging: String { return self._s[126]! } + public var SettingsSearch_Synonyms_EditProfile_Username: String { return self._s[127]! } + public var Group_Username_InvalidStartsWithNumber: String { return self._s[128]! } + public var UserInfo_NotificationsEnabled: String { return self._s[129]! } + public var Map_Search: String { return self._s[130]! } + public var Login_TermsOfServiceHeader: String { return self._s[132]! } public func Notification_PinnedVideoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[131]!, self._r[131]!, [_0]) + return formatWithArgumentRanges(self._s[133]!, self._r[133]!, [_0]) } public func Channel_AdminLog_MessageToggleSignaturesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[132]!, self._r[132]!, [_0]) + return formatWithArgumentRanges(self._s[134]!, self._r[134]!, [_0]) } - public var Wallet_Sent_Title: String { return self._s[133]! } - public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[134]! } - public var Weekday_Today: String { return self._s[135]! } + public var Wallet_Sent_Title: String { return self._s[135]! } + public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[136]! } + public var Weekday_Today: String { return self._s[137]! } public func InstantPage_AuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[137]!, self._r[137]!, [_1, _2]) + return formatWithArgumentRanges(self._s[139]!, self._r[139]!, [_1, _2]) } public func Conversation_MessageDialogRetryAll(_ _1: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[138]!, self._r[138]!, ["\(_1)"]) + return formatWithArgumentRanges(self._s[140]!, self._r[140]!, ["\(_1)"]) } - public var Notification_PassportValuePersonalDetails: String { return self._s[140]! } - public var Channel_AdminLog_MessagePreviousLink: String { return self._s[141]! } - public var ChangePhoneNumberNumber_NewNumber: String { return self._s[142]! } - public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[143]! } - public var TwoStepAuth_ChangePasswordDescription: String { return self._s[144]! } - public var PhotoEditor_BlurToolLinear: String { return self._s[145]! } - public var Contacts_PermissionsAllowInSettings: String { return self._s[146]! } - public var Weekday_ShortMonday: String { return self._s[147]! } - public var Cache_KeepMedia: String { return self._s[148]! } - public var Passport_FieldIdentitySelfieHelp: String { return self._s[149]! } + public var Notification_PassportValuePersonalDetails: String { return self._s[142]! } + public var Channel_AdminLog_MessagePreviousLink: String { return self._s[143]! } + public var ChangePhoneNumberNumber_NewNumber: String { return self._s[144]! } + public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[145]! } + public var TwoStepAuth_ChangePasswordDescription: String { return self._s[146]! } + public var PhotoEditor_BlurToolLinear: String { return self._s[147]! } + public var Contacts_PermissionsAllowInSettings: String { return self._s[148]! } + public var Weekday_ShortMonday: String { return self._s[149]! } + public var Cache_KeepMedia: String { return self._s[150]! } + public var Passport_FieldIdentitySelfieHelp: String { return self._s[151]! } public func PUSH_PINNED_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[150]!, self._r[150]!, [_1, _2]) + return formatWithArgumentRanges(self._s[152]!, self._r[152]!, [_1, _2]) } public func Chat_SlowmodeTooltip(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[151]!, self._r[151]!, [_0]) + return formatWithArgumentRanges(self._s[153]!, self._r[153]!, [_0]) } - public var Wallet_Receive_ShareUrlInfo: String { return self._s[152]! } - public var Conversation_ClousStorageInfo_Description4: String { return self._s[153]! } - public var Wallet_RestoreFailed_Title: String { return self._s[154]! } - public var Passport_Language_ru: String { return self._s[155]! } + public var Wallet_Receive_ShareUrlInfo: String { return self._s[154]! } + public var Conversation_ClousStorageInfo_Description4: String { return self._s[155]! } + public var Wallet_RestoreFailed_Title: String { return self._s[156]! } + public var Passport_Language_ru: String { return self._s[157]! } public func Notification_CreatedChatWithTitle(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[156]!, self._r[156]!, [_0, _1]) + return formatWithArgumentRanges(self._s[158]!, self._r[158]!, [_0, _1]) } - public var WallpaperPreview_PatternIntensity: String { return self._s[157]! } - public var TwoStepAuth_RecoveryUnavailable: String { return self._s[158]! } - public var EnterPasscode_TouchId: String { return self._s[159]! } - public var PhotoEditor_QualityVeryHigh: String { return self._s[162]! } - public var Checkout_NewCard_SaveInfo: String { return self._s[164]! } - public var Gif_NoGifsPlaceholder: String { return self._s[166]! } - public var Conversation_OpenBotLinkTitle: String { return self._s[168]! } - public var ChatSettings_AutoDownloadEnabled: String { return self._s[169]! } - public var NetworkUsageSettings_BytesSent: String { return self._s[170]! } - public var Checkout_PasswordEntry_Pay: String { return self._s[171]! } - public var AuthSessions_TerminateSession: String { return self._s[172]! } - public var Message_File: String { return self._s[173]! } - public var MediaPicker_VideoMuteDescription: String { return self._s[174]! } - public var SocksProxySetup_ProxyStatusConnected: String { return self._s[175]! } - public var TwoStepAuth_RecoveryCode: String { return self._s[176]! } - public var EnterPasscode_EnterCurrentPasscode: String { return self._s[177]! } + public var WallpaperPreview_PatternIntensity: String { return self._s[159]! } + public var TwoStepAuth_RecoveryUnavailable: String { return self._s[160]! } + public var EnterPasscode_TouchId: String { return self._s[161]! } + public var PhotoEditor_QualityVeryHigh: String { return self._s[164]! } + public var Checkout_NewCard_SaveInfo: String { return self._s[166]! } + public var Gif_NoGifsPlaceholder: String { return self._s[168]! } + public var Conversation_OpenBotLinkTitle: String { return self._s[170]! } + public var ChatSettings_AutoDownloadEnabled: String { return self._s[171]! } + public var NetworkUsageSettings_BytesSent: String { return self._s[172]! } + public var Checkout_PasswordEntry_Pay: String { return self._s[173]! } + public var AuthSessions_TerminateSession: String { return self._s[174]! } + public var Message_File: String { return self._s[175]! } + public var MediaPicker_VideoMuteDescription: String { return self._s[176]! } + public var SocksProxySetup_ProxyStatusConnected: String { return self._s[177]! } + public var TwoStepAuth_RecoveryCode: String { return self._s[178]! } + public var EnterPasscode_EnterCurrentPasscode: String { return self._s[179]! } public func TwoStepAuth_EnterPasswordHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[178]!, self._r[178]!, [_0]) + return formatWithArgumentRanges(self._s[180]!, self._r[180]!, [_0]) } - public var Conversation_Moderate_Report: String { return self._s[180]! } - public var TwoStepAuth_EmailInvalid: String { return self._s[181]! } - public var Passport_Language_ms: String { return self._s[182]! } - public var Channel_Edit_AboutItem: String { return self._s[184]! } - public var DialogList_SearchSectionGlobal: String { return self._s[188]! } - public var AttachmentMenu_WebSearch: String { return self._s[189]! } - public var PasscodeSettings_TurnPasscodeOn: String { return self._s[190]! } - public var Channel_BanUser_Title: String { return self._s[191]! } - public var WallpaperPreview_SwipeTopText: String { return self._s[192]! } - public var ArchivedChats_IntroText2: String { return self._s[193]! } - public var Notification_Exceptions_DeleteAll: String { return self._s[194]! } + public var Conversation_Moderate_Report: String { return self._s[182]! } + public var TwoStepAuth_EmailInvalid: String { return self._s[183]! } + public var Passport_Language_ms: String { return self._s[184]! } + public var Channel_Edit_AboutItem: String { return self._s[186]! } + public var DialogList_SearchSectionGlobal: String { return self._s[190]! } + public var AttachmentMenu_WebSearch: String { return self._s[191]! } + public var PasscodeSettings_TurnPasscodeOn: String { return self._s[192]! } + public var Channel_BanUser_Title: String { return self._s[193]! } + public var WallpaperPreview_SwipeTopText: String { return self._s[194]! } + public var ArchivedChats_IntroText2: String { return self._s[195]! } + public var Notification_Exceptions_DeleteAll: String { return self._s[196]! } public func Channel_AdminLog_MessageTransferedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[195]!, self._r[195]!, [_1, _2]) + return formatWithArgumentRanges(self._s[197]!, self._r[197]!, [_1, _2]) } - public var ChatSearch_SearchPlaceholder: String { return self._s[197]! } - public var Passport_FieldAddressTranslationHelp: String { return self._s[198]! } - public var NotificationsSound_Aurora: String { return self._s[199]! } + public var ChatSearch_SearchPlaceholder: String { return self._s[199]! } + public var Passport_FieldAddressTranslationHelp: String { return self._s[200]! } + public var NotificationsSound_Aurora: String { return self._s[201]! } public func FileSize_GB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[200]!, self._r[200]!, [_0]) + return formatWithArgumentRanges(self._s[202]!, self._r[202]!, [_0]) } - public var AuthSessions_LoggedInWithTelegram: String { return self._s[203]! } + public var AuthSessions_LoggedInWithTelegram: String { return self._s[205]! } public func Privacy_GroupsAndChannels_InviteToGroupError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[204]!, self._r[204]!, [_0, _1]) + return formatWithArgumentRanges(self._s[206]!, self._r[206]!, [_0, _1]) } - public var Passport_PasswordNext: String { return self._s[205]! } - public var Bot_GroupStatusReadsHistory: String { return self._s[206]! } - public var EmptyGroupInfo_Line2: String { return self._s[207]! } - public var VoiceOver_Chat_SeenByRecipients: String { return self._s[208]! } - public var Settings_FAQ_Intro: String { return self._s[210]! } - public var PrivacySettings_PasscodeAndTouchId: String { return self._s[212]! } - public var FeaturedStickerPacks_Title: String { return self._s[213]! } - public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[215]! } - public var Username_Title: String { return self._s[216]! } + public var Passport_PasswordNext: String { return self._s[207]! } + public var Bot_GroupStatusReadsHistory: String { return self._s[208]! } + public var EmptyGroupInfo_Line2: String { return self._s[209]! } + public var VoiceOver_Chat_SeenByRecipients: String { return self._s[210]! } + public var Settings_FAQ_Intro: String { return self._s[213]! } + public var PrivacySettings_PasscodeAndTouchId: String { return self._s[215]! } + public var FeaturedStickerPacks_Title: String { return self._s[216]! } + public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[218]! } + public var Username_Title: String { return self._s[219]! } public func Message_StickerText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[217]!, self._r[217]!, [_0]) + return formatWithArgumentRanges(self._s[220]!, self._r[220]!, [_0]) } - public var PasscodeSettings_AlphanumericCode: String { return self._s[218]! } - public var Localization_LanguageOther: String { return self._s[219]! } - public var Stickers_SuggestStickers: String { return self._s[220]! } + public var PasscodeSettings_AlphanumericCode: String { return self._s[221]! } + public var Localization_LanguageOther: String { return self._s[222]! } + public var Stickers_SuggestStickers: String { return self._s[223]! } public func Channel_AdminLog_MessageRemovedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[221]!, self._r[221]!, [_0]) + return formatWithArgumentRanges(self._s[224]!, self._r[224]!, [_0]) } - public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[222]! } - public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[223]! } - public var Conversation_DefaultRestrictedStickers: String { return self._s[224]! } + public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[225]! } + public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[226]! } + public var Conversation_DefaultRestrictedStickers: String { return self._s[227]! } public func Notification_PinnedDeletedMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[225]!, self._r[225]!, [_0]) + return formatWithArgumentRanges(self._s[228]!, self._r[228]!, [_0]) } - public var Wallet_TransactionInfo_CopyAddress: String { return self._s[227]! } - public var Group_UpgradeConfirmation: String { return self._s[228]! } - public var DialogList_Unpin: String { return self._s[229]! } - public var Passport_Identity_DateOfBirth: String { return self._s[230]! } - public var Month_ShortOctober: String { return self._s[231]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[232]! } - public var Notification_CallCanceledShort: String { return self._s[233]! } - public var Passport_Phone_Help: String { return self._s[234]! } - public var Passport_Language_az: String { return self._s[236]! } - public var CreatePoll_TextPlaceholder: String { return self._s[238]! } - public var VoiceOver_Chat_AnonymousPoll: String { return self._s[239]! } - public var Passport_Identity_DocumentNumber: String { return self._s[240]! } - public var PhotoEditor_CurvesRed: String { return self._s[241]! } - public var PhoneNumberHelp_Alert: String { return self._s[243]! } - public var SocksProxySetup_Port: String { return self._s[244]! } - public var Checkout_PayNone: String { return self._s[245]! } - public var AutoDownloadSettings_WiFi: String { return self._s[246]! } - public var GroupInfo_GroupType: String { return self._s[247]! } - public var StickerSettings_ContextHide: String { return self._s[248]! } - public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[249]! } - public var Group_Setup_HistoryTitle: String { return self._s[251]! } - public var Passport_Identity_FilesUploadNew: String { return self._s[252]! } - public var PasscodeSettings_AutoLock: String { return self._s[253]! } - public var Passport_Title: String { return self._s[254]! } - public var VoiceOver_Chat_ContactPhoneNumber: String { return self._s[255]! } - public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[256]! } - public var GroupPermission_NoSendGifs: String { return self._s[257]! } - public var PrivacySettings_PasscodeOn: String { return self._s[258]! } + public var Wallet_TransactionInfo_CopyAddress: String { return self._s[230]! } + public var Group_UpgradeConfirmation: String { return self._s[231]! } + public var DialogList_Unpin: String { return self._s[232]! } + public var Passport_Identity_DateOfBirth: String { return self._s[233]! } + public var Month_ShortOctober: String { return self._s[234]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[235]! } + public var Notification_CallCanceledShort: String { return self._s[236]! } + public var Passport_Phone_Help: String { return self._s[237]! } + public var Passport_Language_az: String { return self._s[239]! } + public var CreatePoll_TextPlaceholder: String { return self._s[241]! } + public var VoiceOver_Chat_AnonymousPoll: String { return self._s[242]! } + public var Passport_Identity_DocumentNumber: String { return self._s[243]! } + public var PhotoEditor_CurvesRed: String { return self._s[244]! } + public var PhoneNumberHelp_Alert: String { return self._s[246]! } + public var SocksProxySetup_Port: String { return self._s[247]! } + public var Checkout_PayNone: String { return self._s[248]! } + public var AutoDownloadSettings_WiFi: String { return self._s[249]! } + public var GroupInfo_GroupType: String { return self._s[250]! } + public var StickerSettings_ContextHide: String { return self._s[251]! } + public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[252]! } + public var Group_Setup_HistoryTitle: String { return self._s[254]! } + public var Passport_Identity_FilesUploadNew: String { return self._s[255]! } + public var PasscodeSettings_AutoLock: String { return self._s[256]! } + public var Passport_Title: String { return self._s[257]! } + public var VoiceOver_Chat_ContactPhoneNumber: String { return self._s[258]! } + public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[259]! } + public var GroupPermission_NoSendGifs: String { return self._s[260]! } + public var PrivacySettings_PasscodeOn: String { return self._s[261]! } public func Conversation_ScheduleMessage_SendTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[259]!, self._r[259]!, [_0]) + return formatWithArgumentRanges(self._s[262]!, self._r[262]!, [_0]) } - public var State_WaitingForNetwork: String { return self._s[261]! } + public var State_WaitingForNetwork: String { return self._s[264]! } public func Notification_Invited(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[262]!, self._r[262]!, [_0, _1]) + return formatWithArgumentRanges(self._s[265]!, self._r[265]!, [_0, _1]) } - public var Calls_NotNow: String { return self._s[264]! } + public var Calls_NotNow: String { return self._s[267]! } public func Channel_DiscussionGroup_HeaderSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[265]!, self._r[265]!, [_0]) + return formatWithArgumentRanges(self._s[268]!, self._r[268]!, [_0]) } - public var UserInfo_SendMessage: String { return self._s[266]! } - public var TwoStepAuth_PasswordSet: String { return self._s[267]! } - public var Passport_DeleteDocument: String { return self._s[268]! } - public var SocksProxySetup_AddProxyTitle: String { return self._s[269]! } + public var UserInfo_SendMessage: String { return self._s[269]! } + public var TwoStepAuth_PasswordSet: String { return self._s[270]! } + public var Passport_DeleteDocument: String { return self._s[271]! } + public var SocksProxySetup_AddProxyTitle: String { return self._s[272]! } public func PUSH_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[270]!, self._r[270]!, [_1]) + return formatWithArgumentRanges(self._s[273]!, self._r[273]!, [_1]) } - public var GroupRemoved_Remove: String { return self._s[271]! } - public var Passport_FieldIdentity: String { return self._s[272]! } - public var Group_Setup_TypePrivateHelp: String { return self._s[273]! } - public var Conversation_Processing: String { return self._s[276]! } - public var ChatSettings_AutoPlayAnimations: String { return self._s[278]! } - public var AuthSessions_LogOutApplicationsHelp: String { return self._s[281]! } - public var Month_GenFebruary: String { return self._s[282]! } - public var Wallet_Send_NetworkErrorTitle: String { return self._s[283]! } + public var GroupRemoved_Remove: String { return self._s[274]! } + public var Passport_FieldIdentity: String { return self._s[275]! } + public var Group_Setup_TypePrivateHelp: String { return self._s[276]! } + public var Conversation_Processing: String { return self._s[279]! } + public var ChatSettings_AutoPlayAnimations: String { return self._s[281]! } + public var AuthSessions_LogOutApplicationsHelp: String { return self._s[284]! } + public var Month_GenFebruary: String { return self._s[285]! } + public var Wallet_Send_NetworkErrorTitle: String { return self._s[286]! } public func Login_InvalidPhoneEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[285]!, self._r[285]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[288]!, self._r[288]!, [_1, _2, _3, _4, _5]) } - public var Passport_Identity_TypeIdentityCard: String { return self._s[286]! } - public var AutoDownloadSettings_DataUsageMedium: String { return self._s[288]! } - public var GroupInfo_AddParticipant: String { return self._s[289]! } - public var KeyCommand_SendMessage: String { return self._s[290]! } - public var VoiceOver_Chat_YourContact: String { return self._s[292]! } - public var Map_LiveLocationShowAll: String { return self._s[293]! } - public var WallpaperSearch_ColorOrange: String { return self._s[295]! } - public var Appearance_AppIconDefaultX: String { return self._s[296]! } - public var Checkout_Receipt_Title: String { return self._s[297]! } - public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[298]! } - public var WallpaperPreview_PreviewTopText: String { return self._s[299]! } - public var Message_Contact: String { return self._s[300]! } - public var Call_StatusIncoming: String { return self._s[301]! } - public var Wallet_TransactionInfo_StorageFeeInfo: String { return self._s[302]! } + public var Passport_Identity_TypeIdentityCard: String { return self._s[289]! } + public var Wallet_Month_ShortJune: String { return self._s[291]! } + public var AutoDownloadSettings_DataUsageMedium: String { return self._s[292]! } + public var GroupInfo_AddParticipant: String { return self._s[293]! } + public var KeyCommand_SendMessage: String { return self._s[294]! } + public var VoiceOver_Chat_YourContact: String { return self._s[296]! } + public var Map_LiveLocationShowAll: String { return self._s[297]! } + public var WallpaperSearch_ColorOrange: String { return self._s[299]! } + public var Appearance_AppIconDefaultX: String { return self._s[300]! } + public var Checkout_Receipt_Title: String { return self._s[301]! } + public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[302]! } + public var WallpaperPreview_PreviewTopText: String { return self._s[303]! } + public var Message_Contact: String { return self._s[304]! } + public var Call_StatusIncoming: String { return self._s[305]! } + public var Wallet_TransactionInfo_StorageFeeInfo: String { return self._s[306]! } public func Channel_AdminLog_MessageKickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[303]!, self._r[303]!, [_1]) + return formatWithArgumentRanges(self._s[307]!, self._r[307]!, [_1]) } public func PUSH_ENCRYPTED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[305]!, self._r[305]!, [_1]) + return formatWithArgumentRanges(self._s[309]!, self._r[309]!, [_1]) } - public var VoiceOver_Media_PlaybackRate: String { return self._s[306]! } - public var Passport_FieldIdentityDetailsHelp: String { return self._s[307]! } - public var Conversation_ViewChannel: String { return self._s[308]! } + public var VoiceOver_Media_PlaybackRate: String { return self._s[310]! } + public var Passport_FieldIdentityDetailsHelp: String { return self._s[311]! } + public var Conversation_ViewChannel: String { return self._s[312]! } public func Time_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[309]!, self._r[309]!, [_0]) - } - public var Passport_Language_nl: String { return self._s[311]! } - public var Camera_Retake: String { return self._s[312]! } - public func UserInfo_BlockActionTitle(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[313]!, self._r[313]!, [_0]) } - public var AuthSessions_LogOutApplications: String { return self._s[314]! } - public var ApplyLanguage_ApplySuccess: String { return self._s[315]! } - public var Tour_Title6: String { return self._s[316]! } - public var Map_ChooseAPlace: String { return self._s[317]! } - public var CallSettings_Never: String { return self._s[319]! } + public var Passport_Language_nl: String { return self._s[315]! } + public var Camera_Retake: String { return self._s[316]! } + public func UserInfo_BlockActionTitle(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[317]!, self._r[317]!, [_0]) + } + public var AuthSessions_LogOutApplications: String { return self._s[318]! } + public var ApplyLanguage_ApplySuccess: String { return self._s[319]! } + public var Tour_Title6: String { return self._s[320]! } + public var Map_ChooseAPlace: String { return self._s[321]! } + public var CallSettings_Never: String { return self._s[323]! } public func Notification_ChangedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[320]!, self._r[320]!, [_0]) - } - public var ChannelRemoved_RemoveInfo: String { return self._s[321]! } - public func AutoDownloadSettings_PreloadVideoInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[322]!, self._r[322]!, [_0]) - } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsExceptions: String { return self._s[323]! } - public func Conversation_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[324]!, self._r[324]!, [_0]) } - public var GroupInfo_InviteLink_Title: String { return self._s[325]! } - public func Channel_AdminLog_MessageUnkickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[326]!, self._r[326]!, [_1, _2]) + public var ChannelRemoved_RemoveInfo: String { return self._s[325]! } + public func AutoDownloadSettings_PreloadVideoInfo(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[326]!, self._r[326]!, [_0]) } - public var KeyCommand_ScrollUp: String { return self._s[327]! } - public var ContactInfo_URLLabelHomepage: String { return self._s[328]! } - public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[329]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsExceptions: String { return self._s[327]! } + public func Conversation_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[328]!, self._r[328]!, [_0]) + } + public var GroupInfo_InviteLink_Title: String { return self._s[329]! } + public func Channel_AdminLog_MessageUnkickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[330]!, self._r[330]!, [_1, _2]) + } + public var KeyCommand_ScrollUp: String { return self._s[331]! } + public var ContactInfo_URLLabelHomepage: String { return self._s[332]! } + public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[333]! } public func Channel_AdminLog_DisabledSlowmode(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[330]!, self._r[330]!, [_0]) + return formatWithArgumentRanges(self._s[334]!, self._r[334]!, [_0]) } public func Conversation_EncryptedPlaceholderTitleOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[331]!, self._r[331]!, [_0]) + return formatWithArgumentRanges(self._s[335]!, self._r[335]!, [_0]) } - public var CallFeedback_ReasonDistortedSpeech: String { return self._s[332]! } - public var Watch_LastSeen_WithinAWeek: String { return self._s[333]! } - public var ContactList_Context_SendMessage: String { return self._s[335]! } - public var Weekday_Tuesday: String { return self._s[336]! } - public var Wallet_Created_Title: String { return self._s[338]! } - public var ScheduledMessages_Delete: String { return self._s[339]! } - public var UserInfo_StartSecretChat: String { return self._s[340]! } - public var Passport_Identity_FilesTitle: String { return self._s[341]! } - public var Permissions_NotificationsAllow_v0: String { return self._s[342]! } - public var DialogList_DeleteConversationConfirmation: String { return self._s[344]! } - public var ChatList_UndoArchiveRevealedTitle: String { return self._s[345]! } - public var AuthSessions_Sessions: String { return self._s[346]! } + public var CallFeedback_ReasonDistortedSpeech: String { return self._s[336]! } + public var Watch_LastSeen_WithinAWeek: String { return self._s[337]! } + public var ContactList_Context_SendMessage: String { return self._s[339]! } + public var Weekday_Tuesday: String { return self._s[340]! } + public var Wallet_Created_Title: String { return self._s[342]! } + public var ScheduledMessages_Delete: String { return self._s[343]! } + public var UserInfo_StartSecretChat: String { return self._s[344]! } + public var Passport_Identity_FilesTitle: String { return self._s[345]! } + public var Permissions_NotificationsAllow_v0: String { return self._s[346]! } + public var DialogList_DeleteConversationConfirmation: String { return self._s[348]! } + public var ChatList_UndoArchiveRevealedTitle: String { return self._s[349]! } + public var AuthSessions_Sessions: String { return self._s[350]! } public func Settings_KeepPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[348]!, self._r[348]!, [_0]) + return formatWithArgumentRanges(self._s[352]!, self._r[352]!, [_0]) } - public var TwoStepAuth_RecoveryEmailChangeDescription: String { return self._s[349]! } - public var Call_StatusWaiting: String { return self._s[350]! } - public var CreateGroup_SoftUserLimitAlert: String { return self._s[351]! } - public var FastTwoStepSetup_HintHelp: String { return self._s[352]! } - public var WallpaperPreview_CustomColorBottomText: String { return self._s[353]! } - public var EditTheme_Expand_Preview_OutgoingText: String { return self._s[354]! } - public var LogoutOptions_AddAccountText: String { return self._s[355]! } - public var PasscodeSettings_6DigitCode: String { return self._s[356]! } - public var Settings_LogoutConfirmationText: String { return self._s[357]! } - public var Passport_Identity_TypePassport: String { return self._s[359]! } + public var TwoStepAuth_RecoveryEmailChangeDescription: String { return self._s[353]! } + public var Call_StatusWaiting: String { return self._s[354]! } + public var CreateGroup_SoftUserLimitAlert: String { return self._s[355]! } + public var FastTwoStepSetup_HintHelp: String { return self._s[356]! } + public var WallpaperPreview_CustomColorBottomText: String { return self._s[357]! } + public var EditTheme_Expand_Preview_OutgoingText: String { return self._s[358]! } + public var LogoutOptions_AddAccountText: String { return self._s[359]! } + public var PasscodeSettings_6DigitCode: String { return self._s[360]! } + public var Settings_LogoutConfirmationText: String { return self._s[361]! } + public var Passport_Identity_TypePassport: String { return self._s[363]! } public func PUSH_MESSAGE_VIDEOS(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[362]!, self._r[362]!, [_1, _2]) + return formatWithArgumentRanges(self._s[366]!, self._r[366]!, [_1, _2]) } - public var SocksProxySetup_SaveProxy: String { return self._s[363]! } - public var AccessDenied_SaveMedia: String { return self._s[364]! } - public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[366]! } - public var Settings_Title: String { return self._s[368]! } - public var VoiceOver_Chat_RecordModeVideoMessageInfo: String { return self._s[369]! } - public var Contacts_InviteSearchLabel: String { return self._s[371]! } - public var ConvertToSupergroup_Title: String { return self._s[372]! } + public var SocksProxySetup_SaveProxy: String { return self._s[367]! } + public var AccessDenied_SaveMedia: String { return self._s[368]! } + public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[370]! } + public var Settings_Title: String { return self._s[372]! } + public var VoiceOver_Chat_RecordModeVideoMessageInfo: String { return self._s[373]! } + public var Contacts_InviteSearchLabel: String { return self._s[375]! } + public var ConvertToSupergroup_Title: String { return self._s[376]! } public func Channel_AdminLog_CaptionEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[373]!, self._r[373]!, [_0]) + return formatWithArgumentRanges(self._s[377]!, self._r[377]!, [_0]) } - public var InfoPlist_NSSiriUsageDescription: String { return self._s[374]! } + public var InfoPlist_NSSiriUsageDescription: String { return self._s[378]! } public func PUSH_MESSAGE_CHANNEL_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[375]!, self._r[375]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[379]!, self._r[379]!, [_1, _2, _3]) } - public var ChatSettings_AutomaticPhotoDownload: String { return self._s[376]! } - public var UserInfo_BotHelp: String { return self._s[377]! } - public var PrivacySettings_LastSeenEverybody: String { return self._s[378]! } - public var Checkout_Name: String { return self._s[379]! } - public var AutoDownloadSettings_DataUsage: String { return self._s[380]! } - public var Channel_BanUser_BlockFor: String { return self._s[381]! } - public var Checkout_ShippingAddress: String { return self._s[382]! } - public var AutoDownloadSettings_MaxVideoSize: String { return self._s[383]! } - public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[384]! } - public var Privacy_Forwards: String { return self._s[385]! } - public var Channel_BanUser_PermissionSendPolls: String { return self._s[386]! } - public var Appearance_ThemeCarouselNewNight: String { return self._s[387]! } + public var ChatSettings_AutomaticPhotoDownload: String { return self._s[380]! } + public var UserInfo_BotHelp: String { return self._s[381]! } + public var PrivacySettings_LastSeenEverybody: String { return self._s[382]! } + public var Checkout_Name: String { return self._s[383]! } + public var AutoDownloadSettings_DataUsage: String { return self._s[384]! } + public var Channel_BanUser_BlockFor: String { return self._s[385]! } + public var Checkout_ShippingAddress: String { return self._s[386]! } + public var AutoDownloadSettings_MaxVideoSize: String { return self._s[387]! } + public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[388]! } + public var Privacy_Forwards: String { return self._s[389]! } + public var Channel_BanUser_PermissionSendPolls: String { return self._s[390]! } + public var Appearance_ThemeCarouselNewNight: String { return self._s[391]! } public func SecretVideo_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[390]!, self._r[390]!, [_0]) + return formatWithArgumentRanges(self._s[394]!, self._r[394]!, [_0]) } - public var Contacts_SortedByName: String { return self._s[391]! } - public var Group_OwnershipTransfer_Title: String { return self._s[392]! } - public var VoiceOver_Chat_OpenHint: String { return self._s[394]! } - public var Group_LeaveGroup: String { return self._s[395]! } - public var Settings_UsernameEmpty: String { return self._s[396]! } + public var Contacts_SortedByName: String { return self._s[395]! } + public var Group_OwnershipTransfer_Title: String { return self._s[396]! } + public var VoiceOver_Chat_OpenHint: String { return self._s[397]! } + public var Group_LeaveGroup: String { return self._s[398]! } + public var Settings_UsernameEmpty: String { return self._s[399]! } public func Notification_PinnedPollMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[397]!, self._r[397]!, [_0]) + return formatWithArgumentRanges(self._s[400]!, self._r[400]!, [_0]) } public func TwoStepAuth_ConfirmEmailDescription(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[398]!, self._r[398]!, [_1]) + return formatWithArgumentRanges(self._s[401]!, self._r[401]!, [_1]) } public func Channel_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[399]!, self._r[399]!, [_1, _2]) + return formatWithArgumentRanges(self._s[402]!, self._r[402]!, [_1, _2]) } - public var Message_ImageExpired: String { return self._s[400]! } - public var TwoStepAuth_RecoveryFailed: String { return self._s[402]! } - public var EditTheme_Edit_Preview_OutgoingText: String { return self._s[403]! } - public var UserInfo_AddToExisting: String { return self._s[404]! } - public var TwoStepAuth_EnabledSuccess: String { return self._s[405]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_SetColor: String { return self._s[406]! } + public var Message_ImageExpired: String { return self._s[403]! } + public var TwoStepAuth_RecoveryFailed: String { return self._s[405]! } + public var EditTheme_Edit_Preview_OutgoingText: String { return self._s[406]! } + public var UserInfo_AddToExisting: String { return self._s[407]! } + public var TwoStepAuth_EnabledSuccess: String { return self._s[408]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_SetColor: String { return self._s[409]! } public func PUSH_CHANNEL_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[407]!, self._r[407]!, [_1]) + return formatWithArgumentRanges(self._s[410]!, self._r[410]!, [_1]) } - public var Notifications_GroupNotificationsAlert: String { return self._s[408]! } - public var Passport_Language_km: String { return self._s[409]! } - public var SocksProxySetup_AdNoticeHelp: String { return self._s[411]! } - public var VoiceOver_Media_PlaybackPlay: String { return self._s[412]! } - public var Notification_CallMissedShort: String { return self._s[413]! } - public var Wallet_Info_YourBalance: String { return self._s[414]! } - public var ReportPeer_ReasonOther_Send: String { return self._s[416]! } - public var Watch_Compose_Send: String { return self._s[417]! } - public var Passport_Identity_TypeInternalPassportUploadScan: String { return self._s[420]! } - public var Conversation_HoldForVideo: String { return self._s[421]! } - public var Wallet_TransactionInfo_CommentHeader: String { return self._s[422]! } - public var CheckoutInfo_ErrorCityInvalid: String { return self._s[424]! } - public var Appearance_AutoNightThemeDisabled: String { return self._s[426]! } - public var Channel_LinkItem: String { return self._s[427]! } + public var Notifications_GroupNotificationsAlert: String { return self._s[411]! } + public var Passport_Language_km: String { return self._s[412]! } + public var SocksProxySetup_AdNoticeHelp: String { return self._s[414]! } + public var VoiceOver_Media_PlaybackPlay: String { return self._s[415]! } + public var Notification_CallMissedShort: String { return self._s[416]! } + public var Wallet_Info_YourBalance: String { return self._s[417]! } + public var ReportPeer_ReasonOther_Send: String { return self._s[418]! } + public var Watch_Compose_Send: String { return self._s[419]! } + public var Passport_Identity_TypeInternalPassportUploadScan: String { return self._s[422]! } + public var Conversation_HoldForVideo: String { return self._s[423]! } + public var Wallet_TransactionInfo_CommentHeader: String { return self._s[424]! } + public var CheckoutInfo_ErrorCityInvalid: String { return self._s[426]! } + public var Appearance_AutoNightThemeDisabled: String { return self._s[428]! } + public var Channel_LinkItem: String { return self._s[429]! } public func PrivacySettings_LastSeenContactsMinusPlus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[428]!, self._r[428]!, [_0, _1]) + return formatWithArgumentRanges(self._s[430]!, self._r[430]!, [_0, _1]) } public func Passport_Identity_NativeNameTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[431]!, self._r[431]!, [_0]) + return formatWithArgumentRanges(self._s[433]!, self._r[433]!, [_0]) } - public var VoiceOver_Recording_StopAndPreview: String { return self._s[432]! } - public var Passport_Language_dv: String { return self._s[433]! } - public var Undo_LeftChannel: String { return self._s[434]! } - public var Notifications_ExceptionsMuted: String { return self._s[435]! } - public var ChatList_UnhideAction: String { return self._s[436]! } - public var Conversation_ContextMenuShare: String { return self._s[437]! } - public var Conversation_ContextMenuStickerPackInfo: String { return self._s[438]! } - public var ShareFileTip_Title: String { return self._s[439]! } - public var NotificationsSound_Chord: String { return self._s[440]! } - public var Wallet_TransactionInfo_OtherFeeHeader: String { return self._s[441]! } + public var VoiceOver_Recording_StopAndPreview: String { return self._s[434]! } + public var Passport_Language_dv: String { return self._s[435]! } + public var Undo_LeftChannel: String { return self._s[436]! } + public var Notifications_ExceptionsMuted: String { return self._s[437]! } + public var ChatList_UnhideAction: String { return self._s[438]! } + public var Conversation_ContextMenuShare: String { return self._s[439]! } + public var Conversation_ContextMenuStickerPackInfo: String { return self._s[440]! } + public var ShareFileTip_Title: String { return self._s[441]! } + public var NotificationsSound_Chord: String { return self._s[442]! } + public var Wallet_TransactionInfo_OtherFeeHeader: String { return self._s[443]! } public func PUSH_CHAT_RETURNED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[442]!, self._r[442]!, [_1, _2]) + return formatWithArgumentRanges(self._s[444]!, self._r[444]!, [_1, _2]) } - public var Passport_Address_EditTemporaryRegistration: String { return self._s[443]! } + public var Passport_Address_EditTemporaryRegistration: String { return self._s[445]! } public func Notification_Joined(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[444]!, self._r[444]!, [_0]) + return formatWithArgumentRanges(self._s[446]!, self._r[446]!, [_0]) } - public var Wallpaper_ErrorNotFound: String { return self._s[445]! } - public var Notification_CallOutgoingShort: String { return self._s[447]! } - public var Wallet_WordImport_IncorrectText: String { return self._s[448]! } + public func Wallet_Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[447]!, self._r[447]!, [_1, _2, _3]) + } + public var Wallpaper_ErrorNotFound: String { return self._s[448]! } + public var Notification_CallOutgoingShort: String { return self._s[450]! } + public var Wallet_WordImport_IncorrectText: String { return self._s[451]! } public func Watch_Time_ShortFullAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[449]!, self._r[449]!, [_1, _2]) + return formatWithArgumentRanges(self._s[452]!, self._r[452]!, [_1, _2]) } - public var Passport_Address_TypeUtilityBill: String { return self._s[450]! } - public var Privacy_Forwards_LinkIfAllowed: String { return self._s[451]! } - public var ReportPeer_Report: String { return self._s[452]! } - public var SettingsSearch_Synonyms_Proxy_Title: String { return self._s[453]! } - public var GroupInfo_DeactivatedStatus: String { return self._s[454]! } + public var Passport_Address_TypeUtilityBill: String { return self._s[453]! } + public var Privacy_Forwards_LinkIfAllowed: String { return self._s[454]! } + public var ReportPeer_Report: String { return self._s[455]! } + public var SettingsSearch_Synonyms_Proxy_Title: String { return self._s[456]! } + public var GroupInfo_DeactivatedStatus: String { return self._s[457]! } public func VoiceOver_Chat_MusicTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[455]!, self._r[455]!, [_1, _2]) + return formatWithArgumentRanges(self._s[458]!, self._r[458]!, [_1, _2]) } - public var StickerPack_Send: String { return self._s[456]! } - public var Login_CodeSentInternal: String { return self._s[457]! } - public var GroupInfo_InviteLink_LinkSection: String { return self._s[458]! } + public var StickerPack_Send: String { return self._s[459]! } + public var Login_CodeSentInternal: String { return self._s[460]! } + public var Wallet_Month_GenJanuary: String { return self._s[461]! } + public var GroupInfo_InviteLink_LinkSection: String { return self._s[462]! } public func Channel_AdminLog_MessageDeleted(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[459]!, self._r[459]!, [_0]) + return formatWithArgumentRanges(self._s[463]!, self._r[463]!, [_0]) } public func Conversation_EncryptionWaiting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[461]!, self._r[461]!, [_0]) + return formatWithArgumentRanges(self._s[465]!, self._r[465]!, [_0]) } - public var Channel_BanUser_PermissionSendStickersAndGifs: String { return self._s[462]! } + public var Channel_BanUser_PermissionSendStickersAndGifs: String { return self._s[466]! } public func PUSH_PINNED_GAME(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[463]!, self._r[463]!, [_1]) + return formatWithArgumentRanges(self._s[467]!, self._r[467]!, [_1]) } - public var ReportPeer_ReasonViolence: String { return self._s[465]! } - public var Map_Locating: String { return self._s[466]! } + public var ReportPeer_ReasonViolence: String { return self._s[469]! } + public var Map_Locating: String { return self._s[470]! } public func VoiceOver_Chat_VideoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[467]!, self._r[467]!, [_0]) + return formatWithArgumentRanges(self._s[471]!, self._r[471]!, [_0]) } public func PUSH_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[468]!, self._r[468]!, [_1]) + return formatWithArgumentRanges(self._s[472]!, self._r[472]!, [_1]) } - public var AutoDownloadSettings_GroupChats: String { return self._s[470]! } - public var CheckoutInfo_SaveInfo: String { return self._s[471]! } - public var SharedMedia_EmptyLinksText: String { return self._s[473]! } - public var Passport_Address_CityPlaceholder: String { return self._s[474]! } - public var CheckoutInfo_ErrorStateInvalid: String { return self._s[475]! } - public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[476]! } - public var Channel_AdminLog_CanAddAdmins: String { return self._s[478]! } + public var AutoDownloadSettings_GroupChats: String { return self._s[474]! } + public var CheckoutInfo_SaveInfo: String { return self._s[475]! } + public var SharedMedia_EmptyLinksText: String { return self._s[477]! } + public var Passport_Address_CityPlaceholder: String { return self._s[478]! } + public var CheckoutInfo_ErrorStateInvalid: String { return self._s[479]! } + public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[480]! } + public var Channel_AdminLog_CanAddAdmins: String { return self._s[482]! } public func PUSH_CHANNEL_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[479]!, self._r[479]!, [_1]) + return formatWithArgumentRanges(self._s[483]!, self._r[483]!, [_1]) } public func Time_MonthOfYear_m8(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[480]!, self._r[480]!, [_0]) + return formatWithArgumentRanges(self._s[484]!, self._r[484]!, [_0]) } - public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[481]! } - public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[482]! } - public var ChangePhoneNumberCode_Code: String { return self._s[483]! } - public var Appearance_CreateTheme: String { return self._s[484]! } + public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[485]! } + public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[486]! } + public var ChangePhoneNumberCode_Code: String { return self._s[487]! } + public var Appearance_CreateTheme: String { return self._s[488]! } public func UserInfo_NotificationsDefaultSound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[485]!, self._r[485]!, [_0]) + return formatWithArgumentRanges(self._s[489]!, self._r[489]!, [_0]) } - public var TwoStepAuth_SetupEmail: String { return self._s[486]! } - public var HashtagSearch_AllChats: String { return self._s[487]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[489]! } + public var TwoStepAuth_SetupEmail: String { return self._s[490]! } + public var HashtagSearch_AllChats: String { return self._s[491]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[493]! } public func ChatList_DeleteForEveryone(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[490]!, self._r[490]!, [_0]) + return formatWithArgumentRanges(self._s[494]!, self._r[494]!, [_0]) } - public var PhotoEditor_QualityHigh: String { return self._s[492]! } + public var PhotoEditor_QualityHigh: String { return self._s[496]! } public func Passport_Phone_UseTelegramNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[493]!, self._r[493]!, [_0]) + return formatWithArgumentRanges(self._s[497]!, self._r[497]!, [_0]) } - public var ApplyLanguage_ApplyLanguageAction: String { return self._s[494]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[495]! } - public var Message_LiveLocation: String { return self._s[496]! } - public var Cache_LowDiskSpaceText: String { return self._s[497]! } - public var Wallet_Receive_ShareAddress: String { return self._s[498]! } - public var EditTheme_ErrorLinkTaken: String { return self._s[499]! } - public var Conversation_SendMessage: String { return self._s[500]! } - public var AuthSessions_EmptyTitle: String { return self._s[501]! } - public var Privacy_PhoneNumber: String { return self._s[502]! } - public var PeopleNearby_CreateGroup: String { return self._s[503]! } - public var CallSettings_UseLessData: String { return self._s[504]! } - public var NetworkUsageSettings_MediaDocumentDataSection: String { return self._s[505]! } - public var Stickers_AddToFavorites: String { return self._s[506]! } - public var Wallet_WordImport_Title: String { return self._s[507]! } - public var PhotoEditor_QualityLow: String { return self._s[508]! } - public var Watch_UserInfo_Unblock: String { return self._s[509]! } - public var Settings_Logout: String { return self._s[510]! } + public var ApplyLanguage_ApplyLanguageAction: String { return self._s[498]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[499]! } + public var Message_LiveLocation: String { return self._s[500]! } + public var Cache_LowDiskSpaceText: String { return self._s[501]! } + public var Wallet_Receive_ShareAddress: String { return self._s[502]! } + public var EditTheme_ErrorLinkTaken: String { return self._s[503]! } + public var Conversation_SendMessage: String { return self._s[504]! } + public var AuthSessions_EmptyTitle: String { return self._s[505]! } + public var Privacy_PhoneNumber: String { return self._s[506]! } + public var PeopleNearby_CreateGroup: String { return self._s[507]! } + public var CallSettings_UseLessData: String { return self._s[508]! } + public var NetworkUsageSettings_MediaDocumentDataSection: String { return self._s[509]! } + public var Stickers_AddToFavorites: String { return self._s[510]! } + public var Wallet_WordImport_Title: String { return self._s[511]! } + public var PhotoEditor_QualityLow: String { return self._s[512]! } + public var Watch_UserInfo_Unblock: String { return self._s[513]! } + public var Settings_Logout: String { return self._s[514]! } public func PUSH_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[511]!, self._r[511]!, [_1]) + return formatWithArgumentRanges(self._s[515]!, self._r[515]!, [_1]) } - public var ContactInfo_PhoneLabelWork: String { return self._s[512]! } - public var ChannelInfo_Stats: String { return self._s[513]! } - public var TextFormat_Link: String { return self._s[514]! } + public var ContactInfo_PhoneLabelWork: String { return self._s[516]! } + public var ChannelInfo_Stats: String { return self._s[517]! } + public var TextFormat_Link: String { return self._s[518]! } public func Date_ChatDateHeader(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[515]!, self._r[515]!, [_1, _2]) + return formatWithArgumentRanges(self._s[519]!, self._r[519]!, [_1, _2]) } - public var Wallet_TransactionInfo_Title: String { return self._s[516]! } + public var Wallet_TransactionInfo_Title: String { return self._s[520]! } public func Message_ForwardedMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[517]!, self._r[517]!, [_0]) + return formatWithArgumentRanges(self._s[521]!, self._r[521]!, [_0]) } - public var Watch_Notification_Joined: String { return self._s[518]! } - public var Group_Setup_TypePublicHelp: String { return self._s[519]! } - public var Passport_Scans_UploadNew: String { return self._s[520]! } - public var Checkout_LiabilityAlertTitle: String { return self._s[521]! } - public var DialogList_Title: String { return self._s[524]! } - public var NotificationSettings_ContactJoined: String { return self._s[525]! } - public var GroupInfo_LabelAdmin: String { return self._s[526]! } - public var KeyCommand_ChatInfo: String { return self._s[527]! } - public var Conversation_EditingCaptionPanelTitle: String { return self._s[528]! } - public var Call_ReportIncludeLog: String { return self._s[529]! } + public var Watch_Notification_Joined: String { return self._s[522]! } + public var Group_Setup_TypePublicHelp: String { return self._s[523]! } + public var Passport_Scans_UploadNew: String { return self._s[524]! } + public var Checkout_LiabilityAlertTitle: String { return self._s[525]! } + public var DialogList_Title: String { return self._s[528]! } + public var NotificationSettings_ContactJoined: String { return self._s[529]! } + public var GroupInfo_LabelAdmin: String { return self._s[530]! } + public var KeyCommand_ChatInfo: String { return self._s[531]! } + public var Conversation_EditingCaptionPanelTitle: String { return self._s[532]! } + public var Call_ReportIncludeLog: String { return self._s[533]! } public func Notifications_ExceptionsChangeSound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[532]!, self._r[532]!, [_0]) + return formatWithArgumentRanges(self._s[536]!, self._r[536]!, [_0]) } - public var LocalGroup_IrrelevantWarning: String { return self._s[533]! } - public var ChatAdmins_AllMembersAreAdmins: String { return self._s[534]! } - public var Conversation_DefaultRestrictedInline: String { return self._s[535]! } - public var Message_Sticker: String { return self._s[536]! } - public var LastSeen_JustNow: String { return self._s[538]! } - public var Passport_Email_EmailPlaceholder: String { return self._s[540]! } - public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[541]! } - public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[542]! } - public var Channel_EditAdmin_PermissionsHeader: String { return self._s[543]! } - public var TwoStepAuth_Email: String { return self._s[544]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsSound: String { return self._s[545]! } - public var PhotoEditor_BlurToolOff: String { return self._s[546]! } - public var Message_PinnedStickerMessage: String { return self._s[547]! } - public var ContactInfo_PhoneLabelPager: String { return self._s[548]! } - public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[549]! } - public var Passport_DiscardMessageTitle: String { return self._s[550]! } - public var Privacy_PaymentsTitle: String { return self._s[551]! } - public var EditTheme_Edit_Preview_IncomingReplyName: String { return self._s[552]! } - public var Channel_DiscussionGroup_Header: String { return self._s[554]! } - public var VoiceOver_Chat_OptionSelected: String { return self._s[555]! } - public var Appearance_ColorTheme: String { return self._s[556]! } - public var UserInfo_ShareContact: String { return self._s[557]! } - public var Passport_Address_TypePassportRegistration: String { return self._s[558]! } - public var Common_More: String { return self._s[559]! } - public var Watch_Message_Call: String { return self._s[560]! } - public var Profile_EncryptionKey: String { return self._s[563]! } - public var Privacy_TopPeers: String { return self._s[564]! } - public var Conversation_StopPollConfirmation: String { return self._s[565]! } - public var Wallet_Words_NotDoneText: String { return self._s[566]! } - public var Privacy_TopPeersWarning: String { return self._s[568]! } - public var SettingsSearch_Synonyms_Data_DownloadInBackground: String { return self._s[569]! } - public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[570]! } - public var Wallet_RestoreFailed_EnterWords: String { return self._s[573]! } - public var DialogList_SearchSectionMessages: String { return self._s[574]! } - public var Notifications_ChannelNotifications: String { return self._s[575]! } - public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[576]! } - public var Passport_Language_sk: String { return self._s[577]! } - public var Notification_MessageLifetime1h: String { return self._s[578]! } - public var Wallpaper_ResetWallpapersInfo: String { return self._s[579]! } - public var Call_ReportSkip: String { return self._s[581]! } - public var Cache_ServiceFiles: String { return self._s[582]! } - public var Group_ErrorAddTooMuchAdmins: String { return self._s[583]! } - public var VoiceOver_Chat_YourFile: String { return self._s[584]! } - public var Map_Hybrid: String { return self._s[585]! } - public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[587]! } - public var ChatSettings_AutoDownloadVideos: String { return self._s[589]! } - public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[590]! } - public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[591]! } - public var SocksProxySetup_ProxyTelegram: String { return self._s[594]! } + public var LocalGroup_IrrelevantWarning: String { return self._s[537]! } + public var ChatAdmins_AllMembersAreAdmins: String { return self._s[538]! } + public var Conversation_DefaultRestrictedInline: String { return self._s[539]! } + public var Message_Sticker: String { return self._s[540]! } + public var LastSeen_JustNow: String { return self._s[542]! } + public var Passport_Email_EmailPlaceholder: String { return self._s[544]! } + public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[545]! } + public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[546]! } + public var Channel_EditAdmin_PermissionsHeader: String { return self._s[547]! } + public var TwoStepAuth_Email: String { return self._s[548]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsSound: String { return self._s[549]! } + public var PhotoEditor_BlurToolOff: String { return self._s[550]! } + public var Message_PinnedStickerMessage: String { return self._s[551]! } + public var ContactInfo_PhoneLabelPager: String { return self._s[552]! } + public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[553]! } + public var Passport_DiscardMessageTitle: String { return self._s[554]! } + public var Privacy_PaymentsTitle: String { return self._s[555]! } + public var EditTheme_Edit_Preview_IncomingReplyName: String { return self._s[556]! } + public var Channel_DiscussionGroup_Header: String { return self._s[558]! } + public var VoiceOver_Chat_OptionSelected: String { return self._s[559]! } + public var Appearance_ColorTheme: String { return self._s[560]! } + public var UserInfo_ShareContact: String { return self._s[561]! } + public var Passport_Address_TypePassportRegistration: String { return self._s[562]! } + public var Common_More: String { return self._s[563]! } + public var Watch_Message_Call: String { return self._s[564]! } + public var Profile_EncryptionKey: String { return self._s[567]! } + public var Privacy_TopPeers: String { return self._s[568]! } + public var Conversation_StopPollConfirmation: String { return self._s[569]! } + public var Wallet_Words_NotDoneText: String { return self._s[571]! } + public var Privacy_TopPeersWarning: String { return self._s[573]! } + public var SettingsSearch_Synonyms_Data_DownloadInBackground: String { return self._s[574]! } + public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[575]! } + public var Wallet_RestoreFailed_EnterWords: String { return self._s[578]! } + public var DialogList_SearchSectionMessages: String { return self._s[579]! } + public var Notifications_ChannelNotifications: String { return self._s[580]! } + public var CheckoutInfo_ShippingInfoAddress1Placeholder: String { return self._s[581]! } + public var Passport_Language_sk: String { return self._s[582]! } + public var Notification_MessageLifetime1h: String { return self._s[583]! } + public var Wallpaper_ResetWallpapersInfo: String { return self._s[584]! } + public var Call_ReportSkip: String { return self._s[586]! } + public var Cache_ServiceFiles: String { return self._s[587]! } + public var Group_ErrorAddTooMuchAdmins: String { return self._s[588]! } + public var VoiceOver_Chat_YourFile: String { return self._s[589]! } + public var Map_Hybrid: String { return self._s[590]! } + public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[592]! } + public var ChatSettings_AutoDownloadVideos: String { return self._s[594]! } + public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[595]! } + public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[596]! } + public var SocksProxySetup_ProxyTelegram: String { return self._s[599]! } public func PUSH_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[595]!, self._r[595]!, [_1]) + return formatWithArgumentRanges(self._s[600]!, self._r[600]!, [_1]) } - public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[597]! } - public var ScheduledMessages_ScheduledToday: String { return self._s[598]! } + public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[602]! } + public var ScheduledMessages_ScheduledToday: String { return self._s[603]! } public func PUSH_CHAT_TITLE_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[599]!, self._r[599]!, [_1, _2]) + return formatWithArgumentRanges(self._s[604]!, self._r[604]!, [_1, _2]) } - public var Conversation_LiveLocationYou: String { return self._s[600]! } - public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[601]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[602]! } - public var UserInfo_ShareBot: String { return self._s[605]! } + public var Conversation_LiveLocationYou: String { return self._s[605]! } + public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[606]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[607]! } + public var UserInfo_ShareBot: String { return self._s[610]! } public func PUSH_AUTH_REGION(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[606]!, self._r[606]!, [_1, _2]) + return formatWithArgumentRanges(self._s[611]!, self._r[611]!, [_1, _2]) } - public var PhotoEditor_ShadowsTint: String { return self._s[607]! } - public var Message_Audio: String { return self._s[608]! } - public var Passport_Language_lt: String { return self._s[609]! } + public var PhotoEditor_ShadowsTint: String { return self._s[612]! } + public var Message_Audio: String { return self._s[613]! } + public var Passport_Language_lt: String { return self._s[614]! } public func Message_PinnedTextMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[610]!, self._r[610]!, [_0]) + return formatWithArgumentRanges(self._s[615]!, self._r[615]!, [_0]) } - public var Permissions_SiriText_v0: String { return self._s[611]! } - public var Conversation_FileICloudDrive: String { return self._s[612]! } - public var Notifications_Badge_IncludeMutedChats: String { return self._s[613]! } + public var Permissions_SiriText_v0: String { return self._s[616]! } + public var Conversation_FileICloudDrive: String { return self._s[617]! } + public var Notifications_Badge_IncludeMutedChats: String { return self._s[618]! } public func Notification_NewAuthDetected(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[614]!, self._r[614]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[619]!, self._r[619]!, [_1, _2, _3, _4, _5, _6]) } - public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[615]! } + public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[620]! } public func Time_MonthOfYear_m5(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[616]!, self._r[616]!, [_0]) + return formatWithArgumentRanges(self._s[621]!, self._r[621]!, [_0]) } - public var Channel_SignMessages: String { return self._s[617]! } + public var Channel_SignMessages: String { return self._s[622]! } public func PUSH_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[618]!, self._r[618]!, [_1]) + return formatWithArgumentRanges(self._s[623]!, self._r[623]!, [_1]) } - public var Compose_ChannelTokenListPlaceholder: String { return self._s[619]! } - public var Passport_ScanPassport: String { return self._s[620]! } - public var Watch_Suggestion_Thanks: String { return self._s[621]! } - public var BlockedUsers_AddNew: String { return self._s[622]! } + public var Compose_ChannelTokenListPlaceholder: String { return self._s[624]! } + public var Passport_ScanPassport: String { return self._s[625]! } + public var Watch_Suggestion_Thanks: String { return self._s[626]! } + public var BlockedUsers_AddNew: String { return self._s[627]! } public func PUSH_CHAT_MESSAGE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[623]!, self._r[623]!, [_1, _2]) + return formatWithArgumentRanges(self._s[628]!, self._r[628]!, [_1, _2]) } - public var Watch_Message_Invoice: String { return self._s[624]! } - public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[625]! } - public var Month_GenJuly: String { return self._s[626]! } - public var SocksProxySetup_ProxySocks5: String { return self._s[627]! } - public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[629]! } - public var Notification_ChannelInviterSelf: String { return self._s[630]! } - public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[631]! } + public var Watch_Message_Invoice: String { return self._s[629]! } + public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[630]! } + public var Month_GenJuly: String { return self._s[631]! } + public var SocksProxySetup_ProxySocks5: String { return self._s[632]! } + public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[634]! } + public var Notification_ChannelInviterSelf: String { return self._s[635]! } + public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[636]! } public func ApplyLanguage_ChangeLanguageUnofficialText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[632]!, self._r[632]!, [_1, _2]) + return formatWithArgumentRanges(self._s[637]!, self._r[637]!, [_1, _2]) } - public var CheckoutInfo_Title: String { return self._s[633]! } - public var Watch_Stickers_RecentPlaceholder: String { return self._s[634]! } + public var CheckoutInfo_Title: String { return self._s[638]! } + public var Watch_Stickers_RecentPlaceholder: String { return self._s[639]! } public func Map_DistanceAway(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[635]!, self._r[635]!, [_0]) + return formatWithArgumentRanges(self._s[640]!, self._r[640]!, [_0]) } - public var Passport_Identity_MainPage: String { return self._s[636]! } - public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[637]! } - public var Passport_Language_de: String { return self._s[638]! } - public var Update_Title: String { return self._s[639]! } - public var ContactInfo_PhoneLabelWorkFax: String { return self._s[640]! } - public var Channel_AdminLog_BanEmbedLinks: String { return self._s[641]! } - public var Passport_Email_UseTelegramEmailHelp: String { return self._s[642]! } - public var Notifications_ChannelNotificationsPreview: String { return self._s[643]! } - public var NotificationsSound_Telegraph: String { return self._s[644]! } - public var Watch_LastSeen_ALongTimeAgo: String { return self._s[645]! } - public var ChannelMembers_WhoCanAddMembers: String { return self._s[646]! } + public var Passport_Identity_MainPage: String { return self._s[641]! } + public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[642]! } + public var Passport_Language_de: String { return self._s[643]! } + public var Update_Title: String { return self._s[644]! } + public var ContactInfo_PhoneLabelWorkFax: String { return self._s[645]! } + public var Channel_AdminLog_BanEmbedLinks: String { return self._s[646]! } + public var Passport_Email_UseTelegramEmailHelp: String { return self._s[647]! } + public var Notifications_ChannelNotificationsPreview: String { return self._s[648]! } + public var NotificationsSound_Telegraph: String { return self._s[649]! } + public var Watch_LastSeen_ALongTimeAgo: String { return self._s[650]! } + public var ChannelMembers_WhoCanAddMembers: String { return self._s[651]! } public func AutoDownloadSettings_UpTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[647]!, self._r[647]!, [_0]) + return formatWithArgumentRanges(self._s[652]!, self._r[652]!, [_0]) } - public var Stickers_SuggestAll: String { return self._s[648]! } - public var Conversation_ForwardTitle: String { return self._s[649]! } - public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[650]! } + public var Stickers_SuggestAll: String { return self._s[653]! } + public var Conversation_ForwardTitle: String { return self._s[654]! } + public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[655]! } public func Notification_JoinedChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[651]!, self._r[651]!, [_0]) + return formatWithArgumentRanges(self._s[656]!, self._r[656]!, [_0]) } - public var Calls_NewCall: String { return self._s[652]! } - public var Call_StatusEnded: String { return self._s[653]! } - public var AutoDownloadSettings_DataUsageLow: String { return self._s[654]! } - public var Settings_ProxyConnected: String { return self._s[655]! } - public var Channel_AdminLogFilter_EventsPinned: String { return self._s[656]! } - public var PhotoEditor_QualityVeryLow: String { return self._s[657]! } - public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[658]! } - public var Passport_PasswordPlaceholder: String { return self._s[659]! } - public var Message_PinnedInvoice: String { return self._s[660]! } - public var Passport_Identity_IssueDate: String { return self._s[661]! } - public var Passport_Language_pl: String { return self._s[662]! } + public var Calls_NewCall: String { return self._s[657]! } + public var Call_StatusEnded: String { return self._s[658]! } + public var AutoDownloadSettings_DataUsageLow: String { return self._s[659]! } + public var Settings_ProxyConnected: String { return self._s[660]! } + public var Channel_AdminLogFilter_EventsPinned: String { return self._s[661]! } + public var PhotoEditor_QualityVeryLow: String { return self._s[662]! } + public var Channel_AdminLogFilter_EventsDeletedMessages: String { return self._s[663]! } + public var Passport_PasswordPlaceholder: String { return self._s[664]! } + public var Message_PinnedInvoice: String { return self._s[665]! } + public var Passport_Identity_IssueDate: String { return self._s[666]! } + public var Passport_Language_pl: String { return self._s[667]! } public func ChannelInfo_ChannelForbidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[663]!, self._r[663]!, [_0]) + return formatWithArgumentRanges(self._s[668]!, self._r[668]!, [_0]) } - public var SocksProxySetup_PasteFromClipboard: String { return self._s[664]! } - public var Call_StatusConnecting: String { return self._s[665]! } + public var SocksProxySetup_PasteFromClipboard: String { return self._s[669]! } + public var Call_StatusConnecting: String { return self._s[670]! } public func Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[666]!, self._r[666]!, [_0]) - } - public var ChatSettings_ConnectionType_UseProxy: String { return self._s[668]! } - public var Common_Edit: String { return self._s[669]! } - public var PrivacySettings_LastSeenNobody: String { return self._s[670]! } - public func Notification_LeftChat(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[671]!, self._r[671]!, [_0]) } - public var GroupInfo_ChatAdmins: String { return self._s[672]! } - public var PrivateDataSettings_Title: String { return self._s[673]! } - public var Login_CancelPhoneVerificationStop: String { return self._s[674]! } - public var ChatList_Read: String { return self._s[675]! } - public var Wallet_WordImport_Text: String { return self._s[676]! } - public var Undo_ChatClearedForBothSides: String { return self._s[677]! } - public var GroupPermission_SectionTitle: String { return self._s[678]! } + public var ChatSettings_ConnectionType_UseProxy: String { return self._s[673]! } + public var Common_Edit: String { return self._s[674]! } + public var PrivacySettings_LastSeenNobody: String { return self._s[675]! } + public func Notification_LeftChat(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[676]!, self._r[676]!, [_0]) + } + public var GroupInfo_ChatAdmins: String { return self._s[677]! } + public var PrivateDataSettings_Title: String { return self._s[678]! } + public var Login_CancelPhoneVerificationStop: String { return self._s[679]! } + public var ChatList_Read: String { return self._s[680]! } + public var Wallet_WordImport_Text: String { return self._s[681]! } + public var Undo_ChatClearedForBothSides: String { return self._s[682]! } + public var GroupPermission_SectionTitle: String { return self._s[683]! } public func PUSH_CHAT_LEFT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[680]!, self._r[680]!, [_1, _2]) + return formatWithArgumentRanges(self._s[685]!, self._r[685]!, [_1, _2]) } - public var Checkout_ErrorPaymentFailed: String { return self._s[681]! } - public var Update_UpdateApp: String { return self._s[682]! } - public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[683]! } - public var Settings_Appearance: String { return self._s[684]! } - public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[687]! } - public var Watch_Location_Access: String { return self._s[688]! } - public var ShareMenu_CopyShareLink: String { return self._s[690]! } - public var TwoStepAuth_SetupHintTitle: String { return self._s[691]! } - public var Conversation_Theme: String { return self._s[693]! } + public var Checkout_ErrorPaymentFailed: String { return self._s[686]! } + public var Update_UpdateApp: String { return self._s[687]! } + public var Group_Username_RevokeExistingUsernamesInfo: String { return self._s[688]! } + public var Settings_Appearance: String { return self._s[689]! } + public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[693]! } + public var Watch_Location_Access: String { return self._s[694]! } + public var ShareMenu_CopyShareLink: String { return self._s[696]! } + public var TwoStepAuth_SetupHintTitle: String { return self._s[697]! } + public var Conversation_Theme: String { return self._s[699]! } public func DialogList_SingleRecordingVideoMessageSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[694]!, self._r[694]!, [_0]) + return formatWithArgumentRanges(self._s[700]!, self._r[700]!, [_0]) } - public var Notifications_ClassicTones: String { return self._s[695]! } - public var Weekday_ShortWednesday: String { return self._s[696]! } - public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[697]! } - public var Undo_LeftGroup: String { return self._s[700]! } - public var Wallet_RestoreFailed_Text: String { return self._s[701]! } - public var Conversation_LinkDialogCopy: String { return self._s[702]! } - public var Wallet_TransactionInfo_NoAddress: String { return self._s[704]! } - public var KeyCommand_FocusOnInputField: String { return self._s[705]! } - public var Contacts_SelectAll: String { return self._s[706]! } - public var Preview_SaveToCameraRoll: String { return self._s[707]! } - public var PrivacySettings_PasscodeOff: String { return self._s[708]! } - public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[709]! } - public var Wallpaper_Title: String { return self._s[710]! } - public var Conversation_FilePhotoOrVideo: String { return self._s[711]! } - public var AccessDenied_Camera: String { return self._s[712]! } - public var Watch_Compose_CurrentLocation: String { return self._s[713]! } - public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[715]! } + public var Notifications_ClassicTones: String { return self._s[701]! } + public var Weekday_ShortWednesday: String { return self._s[702]! } + public var WallpaperPreview_SwipeColorsBottomText: String { return self._s[703]! } + public var Undo_LeftGroup: String { return self._s[706]! } + public var Wallet_RestoreFailed_Text: String { return self._s[707]! } + public var Conversation_LinkDialogCopy: String { return self._s[708]! } + public var Wallet_TransactionInfo_NoAddress: String { return self._s[710]! } + public var Wallet_Navigation_Back: String { return self._s[711]! } + public var KeyCommand_FocusOnInputField: String { return self._s[712]! } + public var Contacts_SelectAll: String { return self._s[713]! } + public var Preview_SaveToCameraRoll: String { return self._s[714]! } + public var PrivacySettings_PasscodeOff: String { return self._s[715]! } + public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[716]! } + public var Wallpaper_Title: String { return self._s[717]! } + public var Conversation_FilePhotoOrVideo: String { return self._s[718]! } + public var AccessDenied_Camera: String { return self._s[719]! } + public var Watch_Compose_CurrentLocation: String { return self._s[720]! } + public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[722]! } public func SecretImage_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[716]!, self._r[716]!, [_0]) + return formatWithArgumentRanges(self._s[723]!, self._r[723]!, [_0]) } - public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[717]! } - public var Passport_Language_ro: String { return self._s[718]! } - public var EditTheme_UploadNewTheme: String { return self._s[719]! } - public var CheckoutInfo_SaveInfoHelp: String { return self._s[720]! } - public var Wallet_Intro_Terms: String { return self._s[721]! } + public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[724]! } + public var Passport_Language_ro: String { return self._s[725]! } + public var EditTheme_UploadNewTheme: String { return self._s[726]! } + public var CheckoutInfo_SaveInfoHelp: String { return self._s[727]! } + public var Wallet_Intro_Terms: String { return self._s[728]! } public func Notification_SecretChatMessageScreenshot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[722]!, self._r[722]!, [_0]) - } - public var Login_CancelPhoneVerification: String { return self._s[723]! } - public var State_ConnectingToProxy: String { return self._s[724]! } - public var Calls_RatingTitle: String { return self._s[725]! } - public var Generic_ErrorMoreInfo: String { return self._s[726]! } - public var Appearance_PreviewReplyText: String { return self._s[727]! } - public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[728]! } - public func Wallet_Send_Balance(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[729]!, self._r[729]!, [_0]) } - public var SharedMedia_CategoryLinks: String { return self._s[730]! } - public var Calls_Missed: String { return self._s[731]! } - public var Cache_Photos: String { return self._s[735]! } - public var GroupPermission_NoAddMembers: String { return self._s[736]! } - public var ScheduledMessages_Title: String { return self._s[737]! } - public func Channel_AdminLog_MessageUnpinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[738]!, self._r[738]!, [_0]) + public var Login_CancelPhoneVerification: String { return self._s[730]! } + public var State_ConnectingToProxy: String { return self._s[731]! } + public var Calls_RatingTitle: String { return self._s[732]! } + public var Generic_ErrorMoreInfo: String { return self._s[733]! } + public var Appearance_PreviewReplyText: String { return self._s[734]! } + public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[735]! } + public func Wallet_Send_Balance(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[736]!, self._r[736]!, [_0]) } - public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[739]! } - public var Settings_ProxyDisabled: String { return self._s[740]! } + public var SharedMedia_CategoryLinks: String { return self._s[737]! } + public var Calls_Missed: String { return self._s[738]! } + public var Cache_Photos: String { return self._s[742]! } + public var GroupPermission_NoAddMembers: String { return self._s[743]! } + public var ScheduledMessages_Title: String { return self._s[744]! } + public func Channel_AdminLog_MessageUnpinned(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[745]!, self._r[745]!, [_0]) + } + public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[746]! } + public var Settings_ProxyDisabled: String { return self._s[747]! } public func Settings_ApplyProxyAlertCredentials(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[741]!, self._r[741]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[748]!, self._r[748]!, [_1, _2, _3, _4]) } public func Conversation_RestrictedMediaTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[742]!, self._r[742]!, [_0]) + return formatWithArgumentRanges(self._s[749]!, self._r[749]!, [_0]) } - public var ChatList_Context_RemoveFromRecents: String { return self._s[744]! } - public var Appearance_Title: String { return self._s[745]! } + public var ChatList_Context_RemoveFromRecents: String { return self._s[751]! } + public var Appearance_Title: String { return self._s[752]! } public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[747]!, self._r[747]!, [_0]) + return formatWithArgumentRanges(self._s[754]!, self._r[754]!, [_0]) } - public var Conversation_WalletRequiredText: String { return self._s[748]! } - public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[749]! } - public var Channel_EditMessageErrorGeneric: String { return self._s[750]! } - public var Privacy_Calls_IntegrationHelp: String { return self._s[751]! } - public var Preview_DeletePhoto: String { return self._s[752]! } - public var Appearance_AppIconFilledX: String { return self._s[753]! } - public var PrivacySettings_PrivacyTitle: String { return self._s[754]! } + public var Conversation_WalletRequiredText: String { return self._s[755]! } + public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[756]! } + public var Channel_EditMessageErrorGeneric: String { return self._s[757]! } + public var Privacy_Calls_IntegrationHelp: String { return self._s[758]! } + public var Preview_DeletePhoto: String { return self._s[759]! } + public var Appearance_AppIconFilledX: String { return self._s[760]! } + public var PrivacySettings_PrivacyTitle: String { return self._s[761]! } public func Conversation_BotInteractiveUrlAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[755]!, self._r[755]!, [_0]) + return formatWithArgumentRanges(self._s[762]!, self._r[762]!, [_0]) } - public var Coub_TapForSound: String { return self._s[757]! } - public var Map_LocatingError: String { return self._s[758]! } - public var TwoStepAuth_EmailChangeSuccess: String { return self._s[760]! } - public var Conversation_SendMessage_SendSilently: String { return self._s[761]! } - public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[762]! } - public var Passport_ForgottenPassword: String { return self._s[763]! } - public var GroupInfo_InviteLink_RevokeLink: String { return self._s[764]! } - public var StickerPacksSettings_ArchivedPacks: String { return self._s[765]! } - public var Login_TermsOfServiceSignupDecline: String { return self._s[767]! } - public var Channel_Moderator_AccessLevelRevoke: String { return self._s[768]! } - public var Message_Location: String { return self._s[769]! } - public var Passport_Identity_NamePlaceholder: String { return self._s[770]! } - public var Channel_Management_Title: String { return self._s[771]! } - public var DialogList_SearchSectionDialogs: String { return self._s[773]! } - public var Compose_NewChannel_Members: String { return self._s[774]! } + public var Coub_TapForSound: String { return self._s[764]! } + public var Map_LocatingError: String { return self._s[765]! } + public var TwoStepAuth_EmailChangeSuccess: String { return self._s[767]! } + public var Conversation_SendMessage_SendSilently: String { return self._s[768]! } + public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[769]! } + public func Wallet_Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[770]!, self._r[770]!, [_1, _2, _3]) + } + public var Passport_ForgottenPassword: String { return self._s[771]! } + public var GroupInfo_InviteLink_RevokeLink: String { return self._s[772]! } + public var StickerPacksSettings_ArchivedPacks: String { return self._s[773]! } + public var Login_TermsOfServiceSignupDecline: String { return self._s[775]! } + public var Channel_Moderator_AccessLevelRevoke: String { return self._s[776]! } + public var Message_Location: String { return self._s[777]! } + public var Passport_Identity_NamePlaceholder: String { return self._s[778]! } + public var Channel_Management_Title: String { return self._s[779]! } + public var DialogList_SearchSectionDialogs: String { return self._s[781]! } + public var Compose_NewChannel_Members: String { return self._s[782]! } public func DialogList_SingleUploadingFileSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[775]!, self._r[775]!, [_0]) + return formatWithArgumentRanges(self._s[783]!, self._r[783]!, [_0]) } - public var GroupInfo_Location: String { return self._s[776]! } - public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[777]! } - public var AutoNightTheme_ScheduledFrom: String { return self._s[778]! } - public var PhotoEditor_WarmthTool: String { return self._s[779]! } - public var Passport_Language_tr: String { return self._s[780]! } + public var GroupInfo_Location: String { return self._s[784]! } + public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[785]! } + public var AutoNightTheme_ScheduledFrom: String { return self._s[786]! } + public var PhotoEditor_WarmthTool: String { return self._s[787]! } + public var Passport_Language_tr: String { return self._s[788]! } public func PUSH_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[781]!, self._r[781]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[789]!, self._r[789]!, [_1, _2, _3]) } - public var Login_ResetAccountProtected_Reset: String { return self._s[783]! } - public var Watch_PhotoView_Title: String { return self._s[784]! } - public var Passport_Phone_Delete: String { return self._s[785]! } - public var Undo_ChatDeletedForBothSides: String { return self._s[786]! } - public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[787]! } - public var GroupInfo_Permissions: String { return self._s[788]! } - public var PasscodeSettings_TurnPasscodeOff: String { return self._s[789]! } - public var Profile_ShareContactButton: String { return self._s[790]! } - public var ChatSettings_Other: String { return self._s[791]! } - public var UserInfo_NotificationsDisabled: String { return self._s[792]! } - public var CheckoutInfo_ShippingInfoCity: String { return self._s[793]! } - public var LastSeen_WithinAMonth: String { return self._s[794]! } - public var VoiceOver_Chat_PlayHint: String { return self._s[795]! } - public var Conversation_ReportGroupLocation: String { return self._s[796]! } - public var Conversation_EncryptionCanceled: String { return self._s[797]! } - public var MediaPicker_GroupDescription: String { return self._s[798]! } - public var WebSearch_Images: String { return self._s[799]! } + public var Login_ResetAccountProtected_Reset: String { return self._s[791]! } + public var Watch_PhotoView_Title: String { return self._s[792]! } + public var Passport_Phone_Delete: String { return self._s[793]! } + public var Undo_ChatDeletedForBothSides: String { return self._s[794]! } + public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[795]! } + public var GroupInfo_Permissions: String { return self._s[796]! } + public var PasscodeSettings_TurnPasscodeOff: String { return self._s[797]! } + public var Profile_ShareContactButton: String { return self._s[798]! } + public var ChatSettings_Other: String { return self._s[799]! } + public var UserInfo_NotificationsDisabled: String { return self._s[800]! } + public var CheckoutInfo_ShippingInfoCity: String { return self._s[801]! } + public var LastSeen_WithinAMonth: String { return self._s[802]! } + public var VoiceOver_Chat_PlayHint: String { return self._s[803]! } + public var Conversation_ReportGroupLocation: String { return self._s[804]! } + public var Conversation_EncryptionCanceled: String { return self._s[805]! } + public var MediaPicker_GroupDescription: String { return self._s[806]! } + public var WebSearch_Images: String { return self._s[807]! } public func Channel_Management_PromotedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[800]!, self._r[800]!, [_0]) + return formatWithArgumentRanges(self._s[808]!, self._r[808]!, [_0]) } - public var Message_Photo: String { return self._s[801]! } - public var PasscodeSettings_HelpBottom: String { return self._s[802]! } - public var AutoDownloadSettings_VideosTitle: String { return self._s[803]! } - public var VoiceOver_Media_PlaybackRateChange: String { return self._s[804]! } - public var Passport_Identity_AddDriversLicense: String { return self._s[805]! } - public var TwoStepAuth_EnterPasswordPassword: String { return self._s[806]! } - public var NotificationsSound_Calypso: String { return self._s[807]! } - public var Map_Map: String { return self._s[808]! } - public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[810]! } - public var ChatSettings_TextSizeUnits: String { return self._s[811]! } + public var Message_Photo: String { return self._s[809]! } + public var PasscodeSettings_HelpBottom: String { return self._s[810]! } + public var AutoDownloadSettings_VideosTitle: String { return self._s[811]! } + public var VoiceOver_Media_PlaybackRateChange: String { return self._s[812]! } + public var Passport_Identity_AddDriversLicense: String { return self._s[813]! } + public var TwoStepAuth_EnterPasswordPassword: String { return self._s[814]! } + public var NotificationsSound_Calypso: String { return self._s[815]! } + public var Map_Map: String { return self._s[816]! } + public var CheckoutInfo_ReceiverInfoTitle: String { return self._s[818]! } + public var ChatSettings_TextSizeUnits: String { return self._s[819]! } public func VoiceOver_Chat_FileFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[812]!, self._r[812]!, [_0]) + return formatWithArgumentRanges(self._s[820]!, self._r[820]!, [_0]) } - public var Common_of: String { return self._s[813]! } - public var Conversation_ForwardContacts: String { return self._s[816]! } + public var Common_of: String { return self._s[821]! } + public var Conversation_ForwardContacts: String { return self._s[824]! } public func Call_AnsweringWithAccount(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[818]!, self._r[818]!, [_0]) + return formatWithArgumentRanges(self._s[826]!, self._r[826]!, [_0]) } - public var Passport_Language_hy: String { return self._s[819]! } - public var Notifications_MessageNotificationsHelp: String { return self._s[820]! } - public var AutoDownloadSettings_Reset: String { return self._s[821]! } - public var Wallet_TransactionInfo_AddressCopied: String { return self._s[822]! } - public var Paint_ClearConfirm: String { return self._s[823]! } - public var Camera_VideoMode: String { return self._s[824]! } + public var Passport_Language_hy: String { return self._s[827]! } + public var Notifications_MessageNotificationsHelp: String { return self._s[828]! } + public var AutoDownloadSettings_Reset: String { return self._s[829]! } + public var Wallet_TransactionInfo_AddressCopied: String { return self._s[830]! } + public var Paint_ClearConfirm: String { return self._s[831]! } + public var Camera_VideoMode: String { return self._s[832]! } public func Conversation_RestrictedStickersTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[825]!, self._r[825]!, [_0]) + return formatWithArgumentRanges(self._s[833]!, self._r[833]!, [_0]) } - public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[826]! } - public var Conversation_ViewBackground: String { return self._s[827]! } - public var Passport_Language_el: String { return self._s[828]! } - public var PhotoEditor_Original: String { return self._s[829]! } - public var Settings_FAQ_Button: String { return self._s[831]! } - public var Channel_Setup_PublicNoLink: String { return self._s[833]! } - public var Conversation_UnsupportedMedia: String { return self._s[834]! } - public var Conversation_SlideToCancel: String { return self._s[835]! } - public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[836]! } - public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[837]! } - public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[838]! } - public var Conversation_ReportSpamChannelConfirmation: String { return self._s[839]! } - public var AutoNightTheme_NotAvailable: String { return self._s[840]! } - public var Conversation_Owner: String { return self._s[841]! } - public var Common_Create: String { return self._s[842]! } - public var Settings_ApplyProxyAlertEnable: String { return self._s[843]! } - public var ContactList_Context_Call: String { return self._s[844]! } - public var Localization_ChooseLanguage: String { return self._s[846]! } - public var ChatList_Context_AddToContacts: String { return self._s[848]! } - public var Settings_Proxy: String { return self._s[850]! } - public var Privacy_TopPeersHelp: String { return self._s[851]! } - public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[852]! } - public var Chat_UnsendMyMessages: String { return self._s[853]! } + public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[834]! } + public var Conversation_ViewBackground: String { return self._s[835]! } + public func Wallet_Info_TransactionDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[836]!, self._r[836]!, [_1, _2, _3]) + } + public var Passport_Language_el: String { return self._s[837]! } + public var PhotoEditor_Original: String { return self._s[838]! } + public var Settings_FAQ_Button: String { return self._s[840]! } + public var Channel_Setup_PublicNoLink: String { return self._s[842]! } + public var Conversation_UnsupportedMedia: String { return self._s[843]! } + public var Conversation_SlideToCancel: String { return self._s[844]! } + public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[845]! } + public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[846]! } + public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[847]! } + public var Conversation_ReportSpamChannelConfirmation: String { return self._s[848]! } + public var AutoNightTheme_NotAvailable: String { return self._s[849]! } + public var Conversation_Owner: String { return self._s[850]! } + public var Common_Create: String { return self._s[851]! } + public var Settings_ApplyProxyAlertEnable: String { return self._s[852]! } + public var ContactList_Context_Call: String { return self._s[853]! } + public var Localization_ChooseLanguage: String { return self._s[855]! } + public var ChatList_Context_AddToContacts: String { return self._s[857]! } + public var Settings_Proxy: String { return self._s[859]! } + public var Privacy_TopPeersHelp: String { return self._s[860]! } + public var CheckoutInfo_ShippingInfoCountryPlaceholder: String { return self._s[861]! } + public var Chat_UnsendMyMessages: String { return self._s[862]! } public func VoiceOver_Chat_Duration(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[854]!, self._r[854]!, [_0]) + return formatWithArgumentRanges(self._s[863]!, self._r[863]!, [_0]) } - public var TwoStepAuth_ConfirmationAbort: String { return self._s[855]! } + public var TwoStepAuth_ConfirmationAbort: String { return self._s[864]! } public func Contacts_AccessDeniedHelpPortrait(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[857]!, self._r[857]!, [_0]) + return formatWithArgumentRanges(self._s[866]!, self._r[866]!, [_0]) } - public var Contacts_SortedByPresence: String { return self._s[858]! } - public var Passport_Identity_SurnamePlaceholder: String { return self._s[859]! } - public var Cache_Title: String { return self._s[860]! } + public var Contacts_SortedByPresence: String { return self._s[867]! } + public var Passport_Identity_SurnamePlaceholder: String { return self._s[868]! } + public var Cache_Title: String { return self._s[869]! } public func Login_PhoneBannedEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[861]!, self._r[861]!, [_0]) + return formatWithArgumentRanges(self._s[870]!, self._r[870]!, [_0]) } - public var TwoStepAuth_EmailCodeExpired: String { return self._s[862]! } - public var Channel_Moderator_Title: String { return self._s[863]! } - public var InstantPage_AutoNightTheme: String { return self._s[865]! } + public var TwoStepAuth_EmailCodeExpired: String { return self._s[871]! } + public var Channel_Moderator_Title: String { return self._s[872]! } + public var InstantPage_AutoNightTheme: String { return self._s[874]! } public func PUSH_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[868]!, self._r[868]!, [_1]) + return formatWithArgumentRanges(self._s[877]!, self._r[877]!, [_1]) } - public var Passport_Scans_Upload: String { return self._s[869]! } - public var Undo_Undo: String { return self._s[871]! } - public var Contacts_AccessDeniedHelpON: String { return self._s[872]! } - public var TwoStepAuth_RemovePassword: String { return self._s[873]! } - public var Common_Delete: String { return self._s[874]! } - public var Contacts_AddPeopleNearby: String { return self._s[876]! } - public var Conversation_ContextMenuDelete: String { return self._s[877]! } - public var SocksProxySetup_Credentials: String { return self._s[878]! } - public var Appearance_EditTheme: String { return self._s[880]! } - public var PasscodeSettings_AutoLock_Disabled: String { return self._s[881]! } - public var Wallet_Send_NetworkErrorText: String { return self._s[882]! } - public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[885]! } - public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[886]! } - public var Passport_Language_id: String { return self._s[888]! } - public var WallpaperSearch_ColorTeal: String { return self._s[889]! } - public var ChannelIntro_Title: String { return self._s[890]! } + public var Passport_Scans_Upload: String { return self._s[878]! } + public var Undo_Undo: String { return self._s[880]! } + public var Contacts_AccessDeniedHelpON: String { return self._s[881]! } + public var TwoStepAuth_RemovePassword: String { return self._s[882]! } + public var Common_Delete: String { return self._s[883]! } + public var Contacts_AddPeopleNearby: String { return self._s[885]! } + public var Conversation_ContextMenuDelete: String { return self._s[886]! } + public var SocksProxySetup_Credentials: String { return self._s[887]! } + public var Appearance_EditTheme: String { return self._s[889]! } + public var PasscodeSettings_AutoLock_Disabled: String { return self._s[890]! } + public var Wallet_Send_NetworkErrorText: String { return self._s[891]! } + public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[894]! } + public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[895]! } + public var Passport_Language_id: String { return self._s[897]! } + public var WallpaperSearch_ColorTeal: String { return self._s[898]! } + public var ChannelIntro_Title: String { return self._s[899]! } public func Channel_AdminLog_MessageToggleSignaturesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[891]!, self._r[891]!, [_0]) + return formatWithArgumentRanges(self._s[900]!, self._r[900]!, [_0]) } - public var VoiceOver_Chat_OpenLinkHint: String { return self._s[893]! } - public var VoiceOver_Chat_Reply: String { return self._s[894]! } - public var ScheduledMessages_BotActionUnavailable: String { return self._s[895]! } - public var Channel_Info_Description: String { return self._s[896]! } - public var Stickers_FavoriteStickers: String { return self._s[897]! } - public var Channel_BanUser_PermissionAddMembers: String { return self._s[898]! } - public var Notifications_DisplayNamesOnLockScreen: String { return self._s[899]! } - public var ChatSearch_ResultsTooltip: String { return self._s[900]! } - public var Calls_NoMissedCallsPlacehoder: String { return self._s[901]! } - public var Group_PublicLink_Placeholder: String { return self._s[902]! } - public var Notifications_ExceptionsDefaultSound: String { return self._s[903]! } + public var VoiceOver_Chat_OpenLinkHint: String { return self._s[902]! } + public var VoiceOver_Chat_Reply: String { return self._s[903]! } + public var ScheduledMessages_BotActionUnavailable: String { return self._s[904]! } + public var Channel_Info_Description: String { return self._s[905]! } + public var Stickers_FavoriteStickers: String { return self._s[906]! } + public var Channel_BanUser_PermissionAddMembers: String { return self._s[907]! } + public var Notifications_DisplayNamesOnLockScreen: String { return self._s[908]! } + public var ChatSearch_ResultsTooltip: String { return self._s[909]! } + public var Wallet_VoiceOver_Editing_ClearText: String { return self._s[910]! } + public var Calls_NoMissedCallsPlacehoder: String { return self._s[911]! } + public var Group_PublicLink_Placeholder: String { return self._s[912]! } + public var Notifications_ExceptionsDefaultSound: String { return self._s[913]! } public func PUSH_CHANNEL_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[904]!, self._r[904]!, [_1]) + return formatWithArgumentRanges(self._s[914]!, self._r[914]!, [_1]) } - public var TextFormat_Underline: String { return self._s[905]! } + public var TextFormat_Underline: String { return self._s[915]! } public func DialogList_SearchSubtitleFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[906]!, self._r[906]!, [_1, _2]) - } - public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[907]!, self._r[907]!, [_0]) - } - public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[908]! } - public func Channel_OwnershipTransfer_TransferCompleted(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[909]!, self._r[909]!, [_1, _2]) - } - public var Wallet_Intro_ImportExisting: String { return self._s[910]! } - public var GroupPermission_Delete: String { return self._s[911]! } - public var Passport_Language_uk: String { return self._s[912]! } - public var StickerPack_HideStickers: String { return self._s[914]! } - public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[915]! } - public func PUSH_CHAT_MESSAGE_PHOTO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[916]!, self._r[916]!, [_1, _2]) } - public var Activity_UploadingVideoMessage: String { return self._s[917]! } + public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[917]!, self._r[917]!, [_0]) + } + public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[918]! } + public func Channel_OwnershipTransfer_TransferCompleted(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[919]!, self._r[919]!, [_1, _2]) + } + public var Wallet_Intro_ImportExisting: String { return self._s[920]! } + public var GroupPermission_Delete: String { return self._s[921]! } + public var Passport_Language_uk: String { return self._s[922]! } + public var StickerPack_HideStickers: String { return self._s[924]! } + public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[925]! } + public func PUSH_CHAT_MESSAGE_PHOTO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[926]!, self._r[926]!, [_1, _2]) + } + public var Activity_UploadingVideoMessage: String { return self._s[927]! } public func GroupPermission_ApplyAlertText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[918]!, self._r[918]!, [_0]) + return formatWithArgumentRanges(self._s[928]!, self._r[928]!, [_0]) } - public var Channel_TitleInfo: String { return self._s[919]! } - public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[920]! } - public var Settings_CallSettings: String { return self._s[921]! } - public var Camera_SquareMode: String { return self._s[922]! } - public var Conversation_SendMessage_ScheduleMessage: String { return self._s[923]! } - public var GroupInfo_SharedMediaNone: String { return self._s[924]! } + public var Channel_TitleInfo: String { return self._s[929]! } + public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[930]! } + public var Settings_CallSettings: String { return self._s[931]! } + public var Camera_SquareMode: String { return self._s[932]! } + public var Conversation_SendMessage_ScheduleMessage: String { return self._s[933]! } + public var GroupInfo_SharedMediaNone: String { return self._s[934]! } public func PUSH_MESSAGE_VIDEO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[925]!, self._r[925]!, [_1]) + return formatWithArgumentRanges(self._s[935]!, self._r[935]!, [_1]) } - public var Bot_GenericBotStatus: String { return self._s[926]! } - public var Application_Update: String { return self._s[928]! } - public var Month_ShortJanuary: String { return self._s[929]! } - public var Contacts_PermissionsKeepDisabled: String { return self._s[930]! } - public var Channel_AdminLog_BanReadMessages: String { return self._s[931]! } - public var Settings_AppLanguage_Unofficial: String { return self._s[932]! } - public var Passport_Address_Street2Placeholder: String { return self._s[933]! } + public var Bot_GenericBotStatus: String { return self._s[936]! } + public var Application_Update: String { return self._s[938]! } + public var Month_ShortJanuary: String { return self._s[939]! } + public var Contacts_PermissionsKeepDisabled: String { return self._s[940]! } + public var Channel_AdminLog_BanReadMessages: String { return self._s[941]! } + public var Settings_AppLanguage_Unofficial: String { return self._s[942]! } + public var Passport_Address_Street2Placeholder: String { return self._s[943]! } public func Map_LiveLocationShortHour(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[934]!, self._r[934]!, [_0]) + return formatWithArgumentRanges(self._s[944]!, self._r[944]!, [_0]) } - public var NetworkUsageSettings_Cellular: String { return self._s[935]! } - public var Appearance_PreviewOutgoingText: String { return self._s[936]! } - public var Notifications_PermissionsAllowInSettings: String { return self._s[937]! } - public var AutoDownloadSettings_OnForAll: String { return self._s[939]! } - public var Map_Directions: String { return self._s[940]! } - public var Passport_FieldIdentityTranslationHelp: String { return self._s[942]! } - public var Appearance_ThemeDay: String { return self._s[943]! } - public var LogoutOptions_LogOut: String { return self._s[944]! } - public var Group_PublicLink_Title: String { return self._s[946]! } - public var Channel_AddBotErrorNoRights: String { return self._s[947]! } - public var Passport_Identity_AddPassport: String { return self._s[948]! } - public var LocalGroup_ButtonTitle: String { return self._s[949]! } - public var Call_Message: String { return self._s[950]! } - public var PhotoEditor_ExposureTool: String { return self._s[951]! } - public var Wallet_Receive_CommentInfo: String { return self._s[953]! } - public var Passport_FieldOneOf_Delimeter: String { return self._s[954]! } - public var Channel_AdminLog_CanBanUsers: String { return self._s[956]! } - public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[957]! } - public var Appearance_Preview: String { return self._s[958]! } - public var Compose_ChannelMembers: String { return self._s[959]! } - public var Conversation_DeleteManyMessages: String { return self._s[960]! } - public var ReportPeer_ReasonOther_Title: String { return self._s[961]! } - public var Checkout_ErrorProviderAccountTimeout: String { return self._s[962]! } - public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[963]! } - public var Channel_Stickers_CreateYourOwn: String { return self._s[966]! } - public var Conversation_UpdateTelegram: String { return self._s[967]! } - public var EditTheme_Create_TopInfo: String { return self._s[968]! } + public var NetworkUsageSettings_Cellular: String { return self._s[945]! } + public var Appearance_PreviewOutgoingText: String { return self._s[946]! } + public var Notifications_PermissionsAllowInSettings: String { return self._s[947]! } + public var AutoDownloadSettings_OnForAll: String { return self._s[949]! } + public var Map_Directions: String { return self._s[950]! } + public var Passport_FieldIdentityTranslationHelp: String { return self._s[952]! } + public var Appearance_ThemeDay: String { return self._s[953]! } + public var LogoutOptions_LogOut: String { return self._s[954]! } + public var Group_PublicLink_Title: String { return self._s[956]! } + public var Channel_AddBotErrorNoRights: String { return self._s[957]! } + public var Passport_Identity_AddPassport: String { return self._s[958]! } + public var LocalGroup_ButtonTitle: String { return self._s[959]! } + public var Call_Message: String { return self._s[960]! } + public var PhotoEditor_ExposureTool: String { return self._s[961]! } + public var Wallet_Receive_CommentInfo: String { return self._s[963]! } + public var Passport_FieldOneOf_Delimeter: String { return self._s[964]! } + public var Channel_AdminLog_CanBanUsers: String { return self._s[966]! } + public var Appearance_ThemePreview_ChatList_2_Name: String { return self._s[967]! } + public var Appearance_Preview: String { return self._s[968]! } + public var Compose_ChannelMembers: String { return self._s[969]! } + public var Conversation_DeleteManyMessages: String { return self._s[970]! } + public var ReportPeer_ReasonOther_Title: String { return self._s[971]! } + public var Checkout_ErrorProviderAccountTimeout: String { return self._s[972]! } + public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[973]! } + public var Channel_Stickers_CreateYourOwn: String { return self._s[976]! } + public var Conversation_UpdateTelegram: String { return self._s[977]! } + public var EditTheme_Create_TopInfo: String { return self._s[978]! } public func Notification_PinnedPhotoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[969]!, self._r[969]!, [_0]) + return formatWithArgumentRanges(self._s[979]!, self._r[979]!, [_0]) } - public var Wallet_WordCheck_Continue: String { return self._s[970]! } + public var Wallet_WordCheck_Continue: String { return self._s[980]! } public func PUSH_PINNED_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[971]!, self._r[971]!, [_1]) + return formatWithArgumentRanges(self._s[981]!, self._r[981]!, [_1]) } - public var GroupInfo_Administrators_Title: String { return self._s[972]! } - public var Privacy_Forwards_PreviewMessageText: String { return self._s[973]! } + public var GroupInfo_Administrators_Title: String { return self._s[982]! } + public var Privacy_Forwards_PreviewMessageText: String { return self._s[983]! } public func PrivacySettings_LastSeenNobodyPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[974]!, self._r[974]!, [_0]) + return formatWithArgumentRanges(self._s[984]!, self._r[984]!, [_0]) } - public var Tour_Title3: String { return self._s[975]! } - public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[976]! } - public var Clipboard_SendPhoto: String { return self._s[980]! } - public var MediaPicker_Videos: String { return self._s[981]! } - public var Passport_Email_Title: String { return self._s[982]! } + public var Tour_Title3: String { return self._s[985]! } + public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[986]! } + public var Clipboard_SendPhoto: String { return self._s[990]! } + public var MediaPicker_Videos: String { return self._s[991]! } + public var Passport_Email_Title: String { return self._s[992]! } public func PrivacySettings_LastSeenEverybodyMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[983]!, self._r[983]!, [_0]) + return formatWithArgumentRanges(self._s[993]!, self._r[993]!, [_0]) } - public var StickerPacksSettings_Title: String { return self._s[984]! } - public var Conversation_MessageDialogDelete: String { return self._s[985]! } - public var Privacy_Calls_CustomHelp: String { return self._s[987]! } - public var Message_Wallpaper: String { return self._s[988]! } - public var MemberSearch_BotSection: String { return self._s[989]! } - public var GroupInfo_SetSound: String { return self._s[990]! } - public var Core_ServiceUserStatus: String { return self._s[991]! } - public var LiveLocationUpdated_JustNow: String { return self._s[992]! } - public var Call_StatusFailed: String { return self._s[993]! } - public var TwoStepAuth_SetupPasswordDescription: String { return self._s[994]! } - public var TwoStepAuth_SetPassword: String { return self._s[995]! } - public var Permissions_PeopleNearbyText_v0: String { return self._s[996]! } + public var StickerPacksSettings_Title: String { return self._s[994]! } + public var Conversation_MessageDialogDelete: String { return self._s[995]! } + public var Privacy_Calls_CustomHelp: String { return self._s[997]! } + public var Message_Wallpaper: String { return self._s[998]! } + public var MemberSearch_BotSection: String { return self._s[999]! } + public var GroupInfo_SetSound: String { return self._s[1000]! } + public var Core_ServiceUserStatus: String { return self._s[1001]! } + public var LiveLocationUpdated_JustNow: String { return self._s[1002]! } + public var Call_StatusFailed: String { return self._s[1003]! } + public var TwoStepAuth_SetupPasswordDescription: String { return self._s[1004]! } + public var TwoStepAuth_SetPassword: String { return self._s[1005]! } + public var Permissions_PeopleNearbyText_v0: String { return self._s[1006]! } public func SocksProxySetup_ProxyStatusPing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[998]!, self._r[998]!, [_0]) + return formatWithArgumentRanges(self._s[1008]!, self._r[1008]!, [_0]) } - public var Calls_SubmitRating: String { return self._s[999]! } - public var Profile_Username: String { return self._s[1000]! } - public var Bot_DescriptionTitle: String { return self._s[1001]! } - public var MaskStickerSettings_Title: String { return self._s[1002]! } - public var SharedMedia_CategoryOther: String { return self._s[1003]! } - public var GroupInfo_SetGroupPhoto: String { return self._s[1004]! } - public var Common_NotNow: String { return self._s[1005]! } - public var CallFeedback_IncludeLogsInfo: String { return self._s[1006]! } - public var Conversation_ShareMyPhoneNumber: String { return self._s[1007]! } - public var Map_Location: String { return self._s[1008]! } - public var Invitation_JoinGroup: String { return self._s[1009]! } - public var AutoDownloadSettings_Title: String { return self._s[1011]! } - public var Conversation_DiscardVoiceMessageDescription: String { return self._s[1012]! } - public var Channel_ErrorAddBlocked: String { return self._s[1013]! } - public var Conversation_UnblockUser: String { return self._s[1014]! } - public var EditTheme_Edit_TopInfo: String { return self._s[1015]! } - public var Watch_Bot_Restart: String { return self._s[1016]! } - public var TwoStepAuth_Title: String { return self._s[1017]! } - public var Channel_AdminLog_BanSendMessages: String { return self._s[1018]! } - public var Checkout_ShippingMethod: String { return self._s[1019]! } - public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[1020]! } + public var Calls_SubmitRating: String { return self._s[1009]! } + public var Profile_Username: String { return self._s[1010]! } + public var Bot_DescriptionTitle: String { return self._s[1011]! } + public var MaskStickerSettings_Title: String { return self._s[1012]! } + public var SharedMedia_CategoryOther: String { return self._s[1013]! } + public var GroupInfo_SetGroupPhoto: String { return self._s[1014]! } + public var Common_NotNow: String { return self._s[1015]! } + public var CallFeedback_IncludeLogsInfo: String { return self._s[1016]! } + public var Conversation_ShareMyPhoneNumber: String { return self._s[1017]! } + public var Map_Location: String { return self._s[1018]! } + public var Invitation_JoinGroup: String { return self._s[1019]! } + public var AutoDownloadSettings_Title: String { return self._s[1021]! } + public var Conversation_DiscardVoiceMessageDescription: String { return self._s[1022]! } + public var Channel_ErrorAddBlocked: String { return self._s[1023]! } + public var Conversation_UnblockUser: String { return self._s[1024]! } + public var EditTheme_Edit_TopInfo: String { return self._s[1025]! } + public var Watch_Bot_Restart: String { return self._s[1026]! } + public var TwoStepAuth_Title: String { return self._s[1027]! } + public var Channel_AdminLog_BanSendMessages: String { return self._s[1028]! } + public var Checkout_ShippingMethod: String { return self._s[1029]! } + public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[1030]! } public func PUSH_CHAT_MESSAGE_STICKER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1021]!, self._r[1021]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1031]!, self._r[1031]!, [_1, _2, _3]) } public func Chat_UnsendMyMessagesAlertTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1023]!, self._r[1023]!, [_0]) + return formatWithArgumentRanges(self._s[1033]!, self._r[1033]!, [_0]) } public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1024]!, self._r[1024]!, [_0]) + return formatWithArgumentRanges(self._s[1034]!, self._r[1034]!, [_0]) } - public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[1025]! } - public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[1026]! } - public var AuthSessions_TerminateOtherSessions: String { return self._s[1027]! } - public var Contacts_FailedToSendInvitesMessage: String { return self._s[1028]! } - public var PrivacySettings_TwoStepAuth: String { return self._s[1029]! } - public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[1030]! } - public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[1031]! } - public var Conversation_EditingMessagePanelMedia: String { return self._s[1032]! } - public var Checkout_PaymentMethod_Title: String { return self._s[1033]! } - public var SocksProxySetup_Connection: String { return self._s[1034]! } - public var Group_MessagePhotoRemoved: String { return self._s[1035]! } - public var Channel_Stickers_NotFound: String { return self._s[1038]! } - public var Group_About_Help: String { return self._s[1039]! } - public var Notification_PassportValueProofOfIdentity: String { return self._s[1040]! } - public var PeopleNearby_Title: String { return self._s[1042]! } + public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[1035]! } + public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[1036]! } + public var AuthSessions_TerminateOtherSessions: String { return self._s[1037]! } + public var Contacts_FailedToSendInvitesMessage: String { return self._s[1038]! } + public var PrivacySettings_TwoStepAuth: String { return self._s[1039]! } + public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[1040]! } + public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[1041]! } + public var Conversation_EditingMessagePanelMedia: String { return self._s[1042]! } + public var Checkout_PaymentMethod_Title: String { return self._s[1043]! } + public var SocksProxySetup_Connection: String { return self._s[1044]! } + public var Group_MessagePhotoRemoved: String { return self._s[1045]! } + public var Channel_Stickers_NotFound: String { return self._s[1048]! } + public var Group_About_Help: String { return self._s[1049]! } + public var Notification_PassportValueProofOfIdentity: String { return self._s[1050]! } + public var PeopleNearby_Title: String { return self._s[1052]! } public func ApplyLanguage_ChangeLanguageOfficialText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1043]!, self._r[1043]!, [_1]) + return formatWithArgumentRanges(self._s[1053]!, self._r[1053]!, [_1]) } - public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[1045]! } - public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[1046]! } - public var SocksProxySetup_Password: String { return self._s[1047]! } - public var Notifications_PermissionsEnable: String { return self._s[1048]! } - public var TwoStepAuth_ChangeEmail: String { return self._s[1050]! } + public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[1055]! } + public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[1056]! } + public var SocksProxySetup_Password: String { return self._s[1057]! } + public var Notifications_PermissionsEnable: String { return self._s[1058]! } + public var TwoStepAuth_ChangeEmail: String { return self._s[1060]! } public func Channel_AdminLog_MessageInvitedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1051]!, self._r[1051]!, [_1]) + return formatWithArgumentRanges(self._s[1061]!, self._r[1061]!, [_1]) } public func Time_MonthOfYear_m10(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1053]!, self._r[1053]!, [_0]) + return formatWithArgumentRanges(self._s[1063]!, self._r[1063]!, [_0]) } - public var Passport_Identity_TypeDriversLicense: String { return self._s[1054]! } - public var ArchivedPacksAlert_Title: String { return self._s[1055]! } - public var Wallet_Receive_InvoiceUrlCopied: String { return self._s[1056]! } + public var Passport_Identity_TypeDriversLicense: String { return self._s[1064]! } + public var ArchivedPacksAlert_Title: String { return self._s[1065]! } + public var Wallet_Receive_InvoiceUrlCopied: String { return self._s[1066]! } public func Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1057]!, self._r[1057]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1067]!, self._r[1067]!, [_1, _2, _3]) } - public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1058]! } - public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1060]! } - public var Conversation_StatusTyping: String { return self._s[1061]! } - public var Broadcast_AdminLog_EmptyText: String { return self._s[1062]! } - public var Notification_PassportValueProofOfAddress: String { return self._s[1063]! } - public var UserInfo_CreateNewContact: String { return self._s[1064]! } - public var Passport_Identity_FrontSide: String { return self._s[1065]! } - public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1066]! } - public var Calls_CallTabTitle: String { return self._s[1067]! } - public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1068]! } + public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[1068]! } + public var Privacy_Calls_NeverAllow_Placeholder: String { return self._s[1070]! } + public var Conversation_StatusTyping: String { return self._s[1071]! } + public var Broadcast_AdminLog_EmptyText: String { return self._s[1072]! } + public var Notification_PassportValueProofOfAddress: String { return self._s[1073]! } + public var UserInfo_CreateNewContact: String { return self._s[1074]! } + public var Passport_Identity_FrontSide: String { return self._s[1075]! } + public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[1076]! } + public var Calls_CallTabTitle: String { return self._s[1077]! } + public var Channel_AdminLog_ChannelEmptyText: String { return self._s[1078]! } public func Login_BannedPhoneBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1070]!, self._r[1070]!, [_0]) + return formatWithArgumentRanges(self._s[1080]!, self._r[1080]!, [_0]) } - public var Watch_UserInfo_MuteTitle: String { return self._s[1071]! } - public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1072]! } - public var SharedMedia_EmptyMusicText: String { return self._s[1073]! } - public var Wallet_Completed_Text: String { return self._s[1074]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1075]! } - public var Paint_Stickers: String { return self._s[1076]! } - public var Privacy_GroupsAndChannels: String { return self._s[1077]! } - public var ChatList_Context_Delete: String { return self._s[1079]! } - public var UserInfo_AddContact: String { return self._s[1080]! } + public var Watch_UserInfo_MuteTitle: String { return self._s[1081]! } + public var Group_EditAdmin_RankAdminPlaceholder: String { return self._s[1082]! } + public var SharedMedia_EmptyMusicText: String { return self._s[1083]! } + public var Wallet_Completed_Text: String { return self._s[1084]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[1085]! } + public var Paint_Stickers: String { return self._s[1086]! } + public var Privacy_GroupsAndChannels: String { return self._s[1087]! } + public var ChatList_Context_Delete: String { return self._s[1089]! } + public var UserInfo_AddContact: String { return self._s[1090]! } public func Conversation_MessageViaUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1081]!, self._r[1081]!, [_0]) + return formatWithArgumentRanges(self._s[1091]!, self._r[1091]!, [_0]) } - public var PhoneNumberHelp_ChangeNumber: String { return self._s[1083]! } + public var PhoneNumberHelp_ChangeNumber: String { return self._s[1093]! } public func ChatList_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1085]!, self._r[1085]!, [_0]) + return formatWithArgumentRanges(self._s[1095]!, self._r[1095]!, [_0]) } - public var DialogList_NoMessagesTitle: String { return self._s[1086]! } - public var EditProfile_NameAndPhotoHelp: String { return self._s[1087]! } - public var BlockedUsers_BlockUser: String { return self._s[1088]! } - public var Notifications_PermissionsOpenSettings: String { return self._s[1089]! } - public var MediaPicker_UngroupDescription: String { return self._s[1090]! } - public var Watch_NoConnection: String { return self._s[1091]! } - public var Month_GenSeptember: String { return self._s[1092]! } - public var Conversation_ViewGroup: String { return self._s[1093]! } - public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1096]! } - public var Privacy_Forwards_AlwaysLink: String { return self._s[1097]! } - public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1098]! } - public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1099]! } - public var Wallet_WordCheck_IncorrectHeader: String { return self._s[1100]! } - public var MediaPicker_CameraRoll: String { return self._s[1102]! } - public var Month_GenAugust: String { return self._s[1103]! } - public var AccessDenied_VideoMessageMicrophone: String { return self._s[1104]! } - public var SharedMedia_EmptyText: String { return self._s[1105]! } - public var Map_ShareLiveLocation: String { return self._s[1106]! } - public var Calls_All: String { return self._s[1107]! } - public var Appearance_ThemeNight: String { return self._s[1110]! } - public var Conversation_HoldForAudio: String { return self._s[1111]! } - public var SettingsSearch_Synonyms_Support: String { return self._s[1114]! } - public var GroupInfo_GroupHistoryHidden: String { return self._s[1115]! } - public var SocksProxySetup_Secret: String { return self._s[1116]! } + public var DialogList_NoMessagesTitle: String { return self._s[1096]! } + public var EditProfile_NameAndPhotoHelp: String { return self._s[1097]! } + public var BlockedUsers_BlockUser: String { return self._s[1098]! } + public var Notifications_PermissionsOpenSettings: String { return self._s[1099]! } + public var MediaPicker_UngroupDescription: String { return self._s[1100]! } + public var Watch_NoConnection: String { return self._s[1101]! } + public var Month_GenSeptember: String { return self._s[1102]! } + public var Conversation_ViewGroup: String { return self._s[1104]! } + public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[1107]! } + public var Privacy_Forwards_AlwaysLink: String { return self._s[1108]! } + public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1109]! } + public var Passport_FieldOneOf_FinalDelimeter: String { return self._s[1110]! } + public var Wallet_WordCheck_IncorrectHeader: String { return self._s[1111]! } + public var MediaPicker_CameraRoll: String { return self._s[1113]! } + public var Month_GenAugust: String { return self._s[1114]! } + public var AccessDenied_VideoMessageMicrophone: String { return self._s[1115]! } + public var SharedMedia_EmptyText: String { return self._s[1116]! } + public var Map_ShareLiveLocation: String { return self._s[1117]! } + public var Calls_All: String { return self._s[1118]! } + public var Appearance_ThemeNight: String { return self._s[1121]! } + public var Conversation_HoldForAudio: String { return self._s[1122]! } + public var SettingsSearch_Synonyms_Support: String { return self._s[1125]! } + public var GroupInfo_GroupHistoryHidden: String { return self._s[1126]! } + public var SocksProxySetup_Secret: String { return self._s[1127]! } public func Activity_RemindAboutChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1117]!, self._r[1117]!, [_0]) + return formatWithArgumentRanges(self._s[1128]!, self._r[1128]!, [_0]) } - public var Channel_BanList_RestrictedTitle: String { return self._s[1119]! } - public var Conversation_Location: String { return self._s[1120]! } + public var Channel_BanList_RestrictedTitle: String { return self._s[1130]! } + public var Conversation_Location: String { return self._s[1131]! } public func AutoDownloadSettings_UpToFor(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1121]!, self._r[1121]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1132]!, self._r[1132]!, [_1, _2]) } - public var ChatSettings_AutoDownloadPhotos: String { return self._s[1123]! } - public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1124]! } - public var Notifications_PermissionsText: String { return self._s[1125]! } - public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1126]! } - public var Call_Flip: String { return self._s[1127]! } - public var Channel_AdminLog_CanDeleteMessagesOfOthers: String { return self._s[1129]! } - public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1130]! } - public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[1131]! } - public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1133]! } - public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1135]! } - public var Channel_TooMuchBots: String { return self._s[1137]! } - public var Passport_DeletePassportConfirmation: String { return self._s[1138]! } - public var Login_InvalidCodeError: String { return self._s[1139]! } - public var StickerPacksSettings_FeaturedPacks: String { return self._s[1140]! } + public var ChatSettings_AutoDownloadPhotos: String { return self._s[1134]! } + public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[1135]! } + public var Notifications_PermissionsText: String { return self._s[1136]! } + public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[1137]! } + public var Call_Flip: String { return self._s[1138]! } + public var Channel_AdminLog_CanDeleteMessagesOfOthers: String { return self._s[1140]! } + public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1141]! } + public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[1142]! } + public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[1144]! } + public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[1146]! } + public var Channel_TooMuchBots: String { return self._s[1148]! } + public var Passport_DeletePassportConfirmation: String { return self._s[1149]! } + public var Login_InvalidCodeError: String { return self._s[1150]! } + public var StickerPacksSettings_FeaturedPacks: String { return self._s[1151]! } public func ChatList_DeleteSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1141]!, self._r[1141]!, [_0]) + return formatWithArgumentRanges(self._s[1152]!, self._r[1152]!, [_0]) } public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1142]!, self._r[1142]!, [_0]) + return formatWithArgumentRanges(self._s[1153]!, self._r[1153]!, [_0]) } - public var VoiceOver_Navigation_ProxySettings: String { return self._s[1143]! } - public var Call_CallInProgressTitle: String { return self._s[1144]! } - public var Month_ShortSeptember: String { return self._s[1145]! } - public var Watch_ChannelInfo_Title: String { return self._s[1146]! } - public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1149]! } - public var DialogList_PasscodeLockHelp: String { return self._s[1150]! } - public var Chat_MultipleTextMessagesDisabled: String { return self._s[1151]! } - public var Wallet_Receive_Title: String { return self._s[1152]! } - public var Notifications_Badge_IncludePublicGroups: String { return self._s[1153]! } - public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1154]! } - public var PhotoEditor_CropReset: String { return self._s[1155]! } - public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1157]! } - public var Channel_Management_LabelEditor: String { return self._s[1158]! } - public var Passport_Identity_LatinNameHelp: String { return self._s[1160]! } - public var PhotoEditor_HighlightsTool: String { return self._s[1161]! } - public var Wallet_Info_WalletCreated: String { return self._s[1162]! } - public var UserInfo_Title: String { return self._s[1163]! } - public var ChatList_HideAction: String { return self._s[1164]! } - public var AccessDenied_Title: String { return self._s[1165]! } - public var DialogList_SearchLabel: String { return self._s[1166]! } - public var Group_Setup_HistoryHidden: String { return self._s[1167]! } - public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1168]! } - public var State_Updating: String { return self._s[1170]! } - public var Contacts_TabTitle: String { return self._s[1171]! } - public var Notifications_Badge_CountUnreadMessages: String { return self._s[1173]! } - public var GroupInfo_GroupHistory: String { return self._s[1174]! } - public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1175]! } - public var Wallpaper_SetColor: String { return self._s[1176]! } - public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1177]! } - public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1178]! } - public var Chat_AttachmentLimitReached: String { return self._s[1179]! } - public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1180]! } - public var Contacts_NotRegisteredSection: String { return self._s[1181]! } + public var VoiceOver_Navigation_ProxySettings: String { return self._s[1154]! } + public var Call_CallInProgressTitle: String { return self._s[1155]! } + public var Month_ShortSeptember: String { return self._s[1156]! } + public var Watch_ChannelInfo_Title: String { return self._s[1157]! } + public var ChatList_DeleteSavedMessagesConfirmation: String { return self._s[1160]! } + public var DialogList_PasscodeLockHelp: String { return self._s[1161]! } + public var Chat_MultipleTextMessagesDisabled: String { return self._s[1162]! } + public var Wallet_Receive_Title: String { return self._s[1163]! } + public var Notifications_Badge_IncludePublicGroups: String { return self._s[1164]! } + public var Channel_AdminLogFilter_EventsTitle: String { return self._s[1165]! } + public var PhotoEditor_CropReset: String { return self._s[1166]! } + public var Group_Username_CreatePrivateLinkHelp: String { return self._s[1168]! } + public var Channel_Management_LabelEditor: String { return self._s[1169]! } + public var Passport_Identity_LatinNameHelp: String { return self._s[1171]! } + public var PhotoEditor_HighlightsTool: String { return self._s[1172]! } + public var Wallet_Info_WalletCreated: String { return self._s[1173]! } + public var UserInfo_Title: String { return self._s[1174]! } + public var ChatList_HideAction: String { return self._s[1175]! } + public var AccessDenied_Title: String { return self._s[1176]! } + public var DialogList_SearchLabel: String { return self._s[1177]! } + public var Group_Setup_HistoryHidden: String { return self._s[1178]! } + public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[1179]! } + public var State_Updating: String { return self._s[1181]! } + public var Contacts_TabTitle: String { return self._s[1182]! } + public var Notifications_Badge_CountUnreadMessages: String { return self._s[1184]! } + public var GroupInfo_GroupHistory: String { return self._s[1185]! } + public var Conversation_UnsupportedMediaPlaceholder: String { return self._s[1186]! } + public var Wallpaper_SetColor: String { return self._s[1187]! } + public var CheckoutInfo_ShippingInfoCountry: String { return self._s[1188]! } + public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1189]! } + public var Chat_AttachmentLimitReached: String { return self._s[1190]! } + public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[1191]! } + public var Contacts_NotRegisteredSection: String { return self._s[1192]! } public func Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1182]!, self._r[1182]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1193]!, self._r[1193]!, [_1, _2, _3]) } - public var Paint_Clear: String { return self._s[1183]! } - public var StickerPacksSettings_ArchivedMasks: String { return self._s[1184]! } - public var SocksProxySetup_Connecting: String { return self._s[1185]! } - public var ExplicitContent_AlertChannel: String { return self._s[1186]! } - public var CreatePoll_AllOptionsAdded: String { return self._s[1187]! } - public var Conversation_Contact: String { return self._s[1188]! } - public var Login_CodeExpired: String { return self._s[1189]! } - public var Passport_DiscardMessageAction: String { return self._s[1190]! } - public var ChatList_Context_Unpin: String { return self._s[1191]! } - public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1192]! } + public var Paint_Clear: String { return self._s[1194]! } + public var StickerPacksSettings_ArchivedMasks: String { return self._s[1195]! } + public var SocksProxySetup_Connecting: String { return self._s[1196]! } + public var ExplicitContent_AlertChannel: String { return self._s[1197]! } + public var CreatePoll_AllOptionsAdded: String { return self._s[1198]! } + public var Conversation_Contact: String { return self._s[1199]! } + public var Login_CodeExpired: String { return self._s[1200]! } + public var Passport_DiscardMessageAction: String { return self._s[1201]! } + public var ChatList_Context_Unpin: String { return self._s[1202]! } + public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1203]! } public func VoiceOver_Chat_MusicFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1193]!, self._r[1193]!, [_0]) + return formatWithArgumentRanges(self._s[1204]!, self._r[1204]!, [_0]) } - public var Channel_AdminLog_EmptyMessageText: String { return self._s[1194]! } - public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1195]! } + public var Channel_AdminLog_EmptyMessageText: String { return self._s[1205]! } + public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[1206]! } public func Group_EditAdmin_RankInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1196]!, self._r[1196]!, [_0]) + return formatWithArgumentRanges(self._s[1207]!, self._r[1207]!, [_0]) } - public var Month_ShortApril: String { return self._s[1197]! } - public var AuthSessions_CurrentSession: String { return self._s[1198]! } - public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1201]! } - public var WallpaperPreview_CropTopText: String { return self._s[1203]! } - public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1204]! } - public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1205]! } + public var Month_ShortApril: String { return self._s[1208]! } + public var AuthSessions_CurrentSession: String { return self._s[1209]! } + public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1212]! } + public var Wallet_Navigation_Cancel: String { return self._s[1214]! } + public var WallpaperPreview_CropTopText: String { return self._s[1215]! } + public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1216]! } + public var CheckoutInfo_ShippingInfoTitle: String { return self._s[1217]! } public func Conversation_ScheduleMessage_SendOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1206]!, self._r[1206]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1218]!, self._r[1218]!, [_0, _1]) } - public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1207]! } - public var Channel_Setup_TypePrivate: String { return self._s[1209]! } - public var Forward_ChannelReadOnly: String { return self._s[1212]! } - public var PhotoEditor_CurvesBlue: String { return self._s[1213]! } - public var AddContact_SharedContactException: String { return self._s[1214]! } - public var UserInfo_BotPrivacy: String { return self._s[1216]! } - public var Wallet_CreateInvoice_Title: String { return self._s[1217]! } - public var Notification_PassportValueEmail: String { return self._s[1218]! } - public var EmptyGroupInfo_Subtitle: String { return self._s[1219]! } - public var GroupPermission_NewTitle: String { return self._s[1220]! } - public var CallFeedback_ReasonDropped: String { return self._s[1221]! } - public var GroupInfo_Permissions_AddException: String { return self._s[1222]! } - public var Channel_SignMessages_Help: String { return self._s[1224]! } - public var Undo_ChatDeleted: String { return self._s[1226]! } - public var Conversation_ChatBackground: String { return self._s[1227]! } + public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1219]! } + public var Channel_Setup_TypePrivate: String { return self._s[1221]! } + public var Forward_ChannelReadOnly: String { return self._s[1224]! } + public var PhotoEditor_CurvesBlue: String { return self._s[1225]! } + public var AddContact_SharedContactException: String { return self._s[1226]! } + public var UserInfo_BotPrivacy: String { return self._s[1228]! } + public var Wallet_CreateInvoice_Title: String { return self._s[1229]! } + public var Notification_PassportValueEmail: String { return self._s[1230]! } + public var EmptyGroupInfo_Subtitle: String { return self._s[1231]! } + public var GroupPermission_NewTitle: String { return self._s[1232]! } + public var CallFeedback_ReasonDropped: String { return self._s[1233]! } + public var GroupInfo_Permissions_AddException: String { return self._s[1234]! } + public var Channel_SignMessages_Help: String { return self._s[1236]! } + public var Undo_ChatDeleted: String { return self._s[1238]! } + public var Conversation_ChatBackground: String { return self._s[1239]! } public func Wallet_WordCheck_Text(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1228]!, self._r[1228]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1240]!, self._r[1240]!, [_1, _2, _3]) } - public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1229]! } - public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1230]! } - public var Passport_Language_pt: String { return self._s[1231]! } - public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1232]! } - public var NotificationsSound_Popcorn: String { return self._s[1235]! } - public var AutoNightTheme_Disabled: String { return self._s[1236]! } - public var BlockedUsers_LeavePrefix: String { return self._s[1237]! } - public var WallpaperPreview_CustomColorTopText: String { return self._s[1238]! } - public var Contacts_PermissionsSuppressWarningText: String { return self._s[1239]! } - public var WallpaperSearch_ColorBlue: String { return self._s[1240]! } + public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[1241]! } + public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[1242]! } + public var Passport_Language_pt: String { return self._s[1243]! } + public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[1244]! } + public var NotificationsSound_Popcorn: String { return self._s[1247]! } + public var AutoNightTheme_Disabled: String { return self._s[1248]! } + public var BlockedUsers_LeavePrefix: String { return self._s[1249]! } + public var WallpaperPreview_CustomColorTopText: String { return self._s[1250]! } + public var Contacts_PermissionsSuppressWarningText: String { return self._s[1251]! } + public var WallpaperSearch_ColorBlue: String { return self._s[1252]! } public func CancelResetAccount_TextSMS(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1241]!, self._r[1241]!, [_0]) + return formatWithArgumentRanges(self._s[1253]!, self._r[1253]!, [_0]) } - public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1242]! } - public var SocksProxySetup_UseForCalls: String { return self._s[1243]! } - public var Passport_DeleteDocumentConfirmation: String { return self._s[1245]! } + public var CheckoutInfo_ErrorNameInvalid: String { return self._s[1254]! } + public var SocksProxySetup_UseForCalls: String { return self._s[1255]! } + public var Passport_DeleteDocumentConfirmation: String { return self._s[1257]! } public func Conversation_Megabytes(_ _0: Float) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1246]!, self._r[1246]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1258]!, self._r[1258]!, ["\(_0)"]) } - public var SocksProxySetup_Hostname: String { return self._s[1249]! } - public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1250]! } - public var Compose_NewEncryptedChat: String { return self._s[1251]! } - public var Login_CodeFloodError: String { return self._s[1252]! } - public var Calls_TabTitle: String { return self._s[1253]! } - public var Privacy_ProfilePhoto: String { return self._s[1254]! } - public var Passport_Language_he: String { return self._s[1255]! } + public var SocksProxySetup_Hostname: String { return self._s[1261]! } + public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1262]! } + public var Compose_NewEncryptedChat: String { return self._s[1263]! } + public var Login_CodeFloodError: String { return self._s[1264]! } + public var Calls_TabTitle: String { return self._s[1265]! } + public var Privacy_ProfilePhoto: String { return self._s[1266]! } + public var Passport_Language_he: String { return self._s[1267]! } public func Conversation_SetReminder_RemindToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1256]!, self._r[1256]!, [_0]) + return formatWithArgumentRanges(self._s[1268]!, self._r[1268]!, [_0]) } - public var GroupPermission_Title: String { return self._s[1257]! } + public var GroupPermission_Title: String { return self._s[1269]! } public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1258]!, self._r[1258]!, [_0]) + return formatWithArgumentRanges(self._s[1270]!, self._r[1270]!, [_0]) } - public var Wallet_TransactionInfo_SenderHeader: String { return self._s[1259]! } - public var GroupPermission_NoChangeInfo: String { return self._s[1260]! } - public var ChatList_DeleteForCurrentUser: String { return self._s[1261]! } - public var Tour_Text1: String { return self._s[1262]! } - public var Channel_EditAdmin_TransferOwnership: String { return self._s[1263]! } - public var Month_ShortFebruary: String { return self._s[1264]! } - public var TwoStepAuth_EmailSkip: String { return self._s[1265]! } - public var NotificationsSound_Glass: String { return self._s[1266]! } - public var Appearance_ThemeNightBlue: String { return self._s[1267]! } - public var CheckoutInfo_Pay: String { return self._s[1268]! } - public var Invite_LargeRecipientsCountWarning: String { return self._s[1270]! } - public var Call_CallAgain: String { return self._s[1272]! } - public var AttachmentMenu_SendAsFile: String { return self._s[1273]! } - public var AccessDenied_MicrophoneRestricted: String { return self._s[1274]! } - public var Passport_InvalidPasswordError: String { return self._s[1275]! } - public var Watch_Message_Game: String { return self._s[1276]! } - public var Stickers_Install: String { return self._s[1277]! } - public var VoiceOver_Chat_Message: String { return self._s[1278]! } - public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1279]! } - public var Passport_Identity_ResidenceCountry: String { return self._s[1281]! } - public var Notifications_GroupNotificationsHelp: String { return self._s[1282]! } - public var AuthSessions_OtherSessions: String { return self._s[1283]! } - public var Channel_Username_Help: String { return self._s[1284]! } - public var Camera_Title: String { return self._s[1285]! } - public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1287]! } - public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1288]! } - public var Channel_AdminLog_SendPolls: String { return self._s[1289]! } - public var Channel_AdminLog_TitleAllEvents: String { return self._s[1290]! } - public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1291]! } - public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1292]! } - public var ScheduledMessages_DeleteMany: String { return self._s[1293]! } - public var Conversation_RestrictedStickers: String { return self._s[1294]! } - public var Notifications_ExceptionsResetToDefaults: String { return self._s[1296]! } - public var UserInfo_TelegramCall: String { return self._s[1298]! } - public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1299]! } - public var CreatePoll_OptionsHeader: String { return self._s[1300]! } - public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1301]! } - public var ArchivedChats_IntroTitle1: String { return self._s[1302]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1303]! } - public var Passport_Identity_EditPersonalDetails: String { return self._s[1304]! } + public var Wallet_TransactionInfo_SenderHeader: String { return self._s[1271]! } + public var GroupPermission_NoChangeInfo: String { return self._s[1272]! } + public var ChatList_DeleteForCurrentUser: String { return self._s[1273]! } + public var Tour_Text1: String { return self._s[1274]! } + public var Channel_EditAdmin_TransferOwnership: String { return self._s[1275]! } + public var Month_ShortFebruary: String { return self._s[1276]! } + public var TwoStepAuth_EmailSkip: String { return self._s[1277]! } + public func Wallet_Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1278]!, self._r[1278]!, [_1, _2, _3]) + } + public var NotificationsSound_Glass: String { return self._s[1279]! } + public var Appearance_ThemeNightBlue: String { return self._s[1280]! } + public var CheckoutInfo_Pay: String { return self._s[1281]! } + public var Invite_LargeRecipientsCountWarning: String { return self._s[1283]! } + public var Call_CallAgain: String { return self._s[1285]! } + public var AttachmentMenu_SendAsFile: String { return self._s[1286]! } + public var AccessDenied_MicrophoneRestricted: String { return self._s[1287]! } + public var Passport_InvalidPasswordError: String { return self._s[1288]! } + public var Watch_Message_Game: String { return self._s[1289]! } + public var Stickers_Install: String { return self._s[1290]! } + public var VoiceOver_Chat_Message: String { return self._s[1291]! } + public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1292]! } + public var Passport_Identity_ResidenceCountry: String { return self._s[1294]! } + public var Notifications_GroupNotificationsHelp: String { return self._s[1295]! } + public var AuthSessions_OtherSessions: String { return self._s[1296]! } + public var Channel_Username_Help: String { return self._s[1297]! } + public var Camera_Title: String { return self._s[1298]! } + public var GroupInfo_SetGroupPhotoDelete: String { return self._s[1300]! } + public var Privacy_ProfilePhoto_NeverShareWith_Title: String { return self._s[1301]! } + public var Channel_AdminLog_SendPolls: String { return self._s[1302]! } + public var Channel_AdminLog_TitleAllEvents: String { return self._s[1303]! } + public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[1304]! } + public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[1305]! } + public var ScheduledMessages_DeleteMany: String { return self._s[1306]! } + public var Conversation_RestrictedStickers: String { return self._s[1307]! } + public var Notifications_ExceptionsResetToDefaults: String { return self._s[1309]! } + public var UserInfo_TelegramCall: String { return self._s[1311]! } + public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1312]! } + public var CreatePoll_OptionsHeader: String { return self._s[1313]! } + public var SettingsSearch_Synonyms_Data_CallsUseLessData: String { return self._s[1314]! } + public var ArchivedChats_IntroTitle1: String { return self._s[1315]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[1316]! } + public var Passport_Identity_EditPersonalDetails: String { return self._s[1317]! } public func Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1305]!, self._r[1305]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1318]!, self._r[1318]!, [_1, _2, _3]) } - public var Settings_SaveEditedPhotos: String { return self._s[1306]! } - public var TwoStepAuth_ConfirmationTitle: String { return self._s[1307]! } - public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1308]! } - public var Conversation_MessageDialogRetry: String { return self._s[1309]! } - public var ChatList_Context_MarkAsUnread: String { return self._s[1310]! } - public var Conversation_DiscardVoiceMessageAction: String { return self._s[1311]! } - public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1312]! } - public var Group_Setup_TypeHeader: String { return self._s[1313]! } - public var Paint_RecentStickers: String { return self._s[1314]! } - public var PhotoEditor_GrainTool: String { return self._s[1315]! } - public var CheckoutInfo_ShippingInfoState: String { return self._s[1316]! } - public var EmptyGroupInfo_Line4: String { return self._s[1317]! } - public var Watch_AuthRequired: String { return self._s[1319]! } + public var Wallet_Month_GenAugust: String { return self._s[1319]! } + public var Settings_SaveEditedPhotos: String { return self._s[1320]! } + public var TwoStepAuth_ConfirmationTitle: String { return self._s[1321]! } + public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[1322]! } + public var Conversation_MessageDialogRetry: String { return self._s[1323]! } + public var ChatList_Context_MarkAsUnread: String { return self._s[1324]! } + public var Conversation_DiscardVoiceMessageAction: String { return self._s[1325]! } + public var Permissions_PeopleNearbyTitle_v0: String { return self._s[1326]! } + public var Group_Setup_TypeHeader: String { return self._s[1327]! } + public var Paint_RecentStickers: String { return self._s[1328]! } + public var PhotoEditor_GrainTool: String { return self._s[1329]! } + public var CheckoutInfo_ShippingInfoState: String { return self._s[1330]! } + public var EmptyGroupInfo_Line4: String { return self._s[1331]! } + public var Watch_AuthRequired: String { return self._s[1333]! } public func Passport_Email_UseTelegramEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1320]!, self._r[1320]!, [_0]) + return formatWithArgumentRanges(self._s[1334]!, self._r[1334]!, [_0]) } - public var Conversation_EncryptedDescriptionTitle: String { return self._s[1321]! } - public var ChannelIntro_Text: String { return self._s[1322]! } - public var DialogList_DeleteBotConfirmation: String { return self._s[1323]! } - public var GroupPermission_NoSendMedia: String { return self._s[1324]! } - public var Calls_AddTab: String { return self._s[1325]! } - public var Message_ReplyActionButtonShowReceipt: String { return self._s[1326]! } - public var Channel_AdminLog_EmptyFilterText: String { return self._s[1327]! } - public var Conversation_WalletRequiredSetup: String { return self._s[1328]! } - public var Notification_MessageLifetime1d: String { return self._s[1329]! } - public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1330]! } - public var Channel_BanUser_PermissionsHeader: String { return self._s[1331]! } - public var Passport_Identity_GenderFemale: String { return self._s[1332]! } - public var BlockedUsers_BlockTitle: String { return self._s[1333]! } + public var Conversation_EncryptedDescriptionTitle: String { return self._s[1335]! } + public var ChannelIntro_Text: String { return self._s[1336]! } + public var DialogList_DeleteBotConfirmation: String { return self._s[1337]! } + public var GroupPermission_NoSendMedia: String { return self._s[1338]! } + public var Calls_AddTab: String { return self._s[1339]! } + public var Message_ReplyActionButtonShowReceipt: String { return self._s[1340]! } + public var Channel_AdminLog_EmptyFilterText: String { return self._s[1341]! } + public var Conversation_WalletRequiredSetup: String { return self._s[1342]! } + public var Notification_MessageLifetime1d: String { return self._s[1343]! } + public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[1344]! } + public var Channel_BanUser_PermissionsHeader: String { return self._s[1345]! } + public var Passport_Identity_GenderFemale: String { return self._s[1346]! } + public var BlockedUsers_BlockTitle: String { return self._s[1347]! } public func PUSH_CHANNEL_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1334]!, self._r[1334]!, [_1]) + return formatWithArgumentRanges(self._s[1348]!, self._r[1348]!, [_1]) } - public var Weekday_Yesterday: String { return self._s[1335]! } - public var WallpaperSearch_ColorBlack: String { return self._s[1336]! } - public var Settings_Context_Logout: String { return self._s[1337]! } - public var Wallet_Info_UnknownTransaction: String { return self._s[1338]! } - public var ChatList_ArchiveAction: String { return self._s[1339]! } - public var AutoNightTheme_Scheduled: String { return self._s[1340]! } + public var Weekday_Yesterday: String { return self._s[1349]! } + public var WallpaperSearch_ColorBlack: String { return self._s[1350]! } + public var Settings_Context_Logout: String { return self._s[1351]! } + public var Wallet_Info_UnknownTransaction: String { return self._s[1352]! } + public var ChatList_ArchiveAction: String { return self._s[1353]! } + public var AutoNightTheme_Scheduled: String { return self._s[1354]! } public func Login_PhoneGenericEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1341]!, self._r[1341]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[1355]!, self._r[1355]!, [_1, _2, _3, _4, _5, _6]) } - public var EditTheme_ThemeTemplateAlertTitle: String { return self._s[1342]! } - public var Wallet_Receive_CreateInvoice: String { return self._s[1343]! } - public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1344]! } + public var EditTheme_ThemeTemplateAlertTitle: String { return self._s[1356]! } + public var Wallet_Receive_CreateInvoice: String { return self._s[1357]! } + public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[1358]! } public func PUSH_CHAT_JOINED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1345]!, self._r[1345]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1359]!, self._r[1359]!, [_1, _2]) } - public var CreatePoll_Create: String { return self._s[1346]! } - public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1347]! } + public var CreatePoll_Create: String { return self._s[1360]! } + public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1361]! } public func Notification_CallFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1348]!, self._r[1348]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1362]!, self._r[1362]!, [_1, _2]) } - public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1349]! } - public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1350]! } - public var Notifications_InAppNotificationsSounds: String { return self._s[1352]! } + public var ScheduledMessages_ClearAllConfirmation: String { return self._s[1363]! } + public var Checkout_ErrorProviderAccountInvalid: String { return self._s[1364]! } + public var Notifications_InAppNotificationsSounds: String { return self._s[1366]! } public func PUSH_PINNED_GAME_SCORE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1353]!, self._r[1353]!, [_1]) + return formatWithArgumentRanges(self._s[1367]!, self._r[1367]!, [_1]) } - public var Preview_OpenInInstagram: String { return self._s[1354]! } - public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1355]! } + public var Preview_OpenInInstagram: String { return self._s[1368]! } + public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[1369]! } public func PUSH_CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1356]!, self._r[1356]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1370]!, self._r[1370]!, [_1, _2, _3]) } public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1357]!, self._r[1357]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1371]!, self._r[1371]!, [_1, _2]) } - public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1358]! } - public var ArchivedChats_IntroText3: String { return self._s[1359]! } - public var ChatList_UndoArchiveHiddenText: String { return self._s[1360]! } - public var NetworkUsageSettings_TotalSection: String { return self._s[1361]! } - public var Channel_Setup_TypePrivateHelp: String { return self._s[1362]! } + public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[1372]! } + public var ArchivedChats_IntroText3: String { return self._s[1373]! } + public var ChatList_UndoArchiveHiddenText: String { return self._s[1374]! } + public var NetworkUsageSettings_TotalSection: String { return self._s[1375]! } + public var Wallet_Month_GenSeptember: String { return self._s[1376]! } + public var Channel_Setup_TypePrivateHelp: String { return self._s[1377]! } public func PUSH_CHAT_MESSAGE_POLL(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1363]!, self._r[1363]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1378]!, self._r[1378]!, [_1, _2, _3]) } - public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1365]! } - public var FastTwoStepSetup_HintSection: String { return self._s[1366]! } - public var Wallpaper_PhotoLibrary: String { return self._s[1367]! } - public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1368]! } - public var Gif_NoGifsFound: String { return self._s[1369]! } - public var Watch_LastSeen_WithinAMonth: String { return self._s[1370]! } - public var VoiceOver_MessageContextDelete: String { return self._s[1371]! } - public var EditTheme_Preview: String { return self._s[1372]! } - public var GroupInfo_ActionPromote: String { return self._s[1373]! } - public var PasscodeSettings_SimplePasscode: String { return self._s[1374]! } - public var GroupInfo_Permissions_Title: String { return self._s[1375]! } - public var Permissions_ContactsText_v0: String { return self._s[1376]! } - public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[1377]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1378]! } - public var PrivacySettings_DataSettingsHelp: String { return self._s[1381]! } - public var Passport_FieldEmailHelp: String { return self._s[1382]! } + public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[1380]! } + public var FastTwoStepSetup_HintSection: String { return self._s[1381]! } + public var Wallpaper_PhotoLibrary: String { return self._s[1382]! } + public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[1383]! } + public var Gif_NoGifsFound: String { return self._s[1384]! } + public var Watch_LastSeen_WithinAMonth: String { return self._s[1385]! } + public var VoiceOver_MessageContextDelete: String { return self._s[1386]! } + public var EditTheme_Preview: String { return self._s[1387]! } + public var GroupInfo_ActionPromote: String { return self._s[1388]! } + public var PasscodeSettings_SimplePasscode: String { return self._s[1389]! } + public var GroupInfo_Permissions_Title: String { return self._s[1390]! } + public var Permissions_ContactsText_v0: String { return self._s[1391]! } + public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[1392]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[1393]! } + public var PrivacySettings_DataSettingsHelp: String { return self._s[1396]! } + public var Passport_FieldEmailHelp: String { return self._s[1397]! } public func Activity_RemindAboutUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1383]!, self._r[1383]!, [_0]) + return formatWithArgumentRanges(self._s[1398]!, self._r[1398]!, [_0]) } - public var Passport_Identity_GenderPlaceholder: String { return self._s[1384]! } - public var Weekday_ShortSaturday: String { return self._s[1385]! } - public var ContactInfo_PhoneLabelMain: String { return self._s[1386]! } - public var Watch_Conversation_UserInfo: String { return self._s[1387]! } - public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1388]! } - public var PrivacyLastSeenSettings_Title: String { return self._s[1389]! } - public var Conversation_ShareBotLocationConfirmation: String { return self._s[1390]! } - public var PhotoEditor_VignetteTool: String { return self._s[1391]! } - public var Passport_Address_Street1Placeholder: String { return self._s[1392]! } - public var Passport_Language_et: String { return self._s[1393]! } - public var AppUpgrade_Running: String { return self._s[1394]! } - public var Channel_DiscussionGroup_Info: String { return self._s[1396]! } - public var EditTheme_Create_Preview_IncomingReplyName: String { return self._s[1397]! } - public var Passport_Language_bg: String { return self._s[1398]! } - public var Stickers_NoStickersFound: String { return self._s[1400]! } + public var Passport_Identity_GenderPlaceholder: String { return self._s[1399]! } + public var Weekday_ShortSaturday: String { return self._s[1400]! } + public var ContactInfo_PhoneLabelMain: String { return self._s[1401]! } + public var Watch_Conversation_UserInfo: String { return self._s[1402]! } + public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[1403]! } + public var PrivacyLastSeenSettings_Title: String { return self._s[1404]! } + public var Conversation_ShareBotLocationConfirmation: String { return self._s[1405]! } + public var PhotoEditor_VignetteTool: String { return self._s[1406]! } + public var Passport_Address_Street1Placeholder: String { return self._s[1407]! } + public var Passport_Language_et: String { return self._s[1408]! } + public var AppUpgrade_Running: String { return self._s[1409]! } + public var Channel_DiscussionGroup_Info: String { return self._s[1411]! } + public var EditTheme_Create_Preview_IncomingReplyName: String { return self._s[1412]! } + public var Passport_Language_bg: String { return self._s[1413]! } + public var Stickers_NoStickersFound: String { return self._s[1415]! } public func PUSH_CHANNEL_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1402]!, self._r[1402]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1417]!, self._r[1417]!, [_1, _2]) } public func VoiceOver_Chat_ContactFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1403]!, self._r[1403]!, [_0]) + return formatWithArgumentRanges(self._s[1418]!, self._r[1418]!, [_0]) } - public var Wallet_Receive_AddressHeader: String { return self._s[1404]! } - public var Wallet_Send_AmountText: String { return self._s[1405]! } - public var Settings_About: String { return self._s[1406]! } + public var Wallet_Month_GenJuly: String { return self._s[1419]! } + public var Wallet_Receive_AddressHeader: String { return self._s[1420]! } + public var Wallet_Send_AmountText: String { return self._s[1421]! } + public var Settings_About: String { return self._s[1422]! } public func Channel_AdminLog_MessageRestricted(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1407]!, self._r[1407]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1423]!, self._r[1423]!, [_0, _1, _2]) } - public var ChatList_Context_MarkAsRead: String { return self._s[1409]! } - public var KeyCommand_NewMessage: String { return self._s[1410]! } - public var Group_ErrorAddBlocked: String { return self._s[1411]! } + public var ChatList_Context_MarkAsRead: String { return self._s[1425]! } + public var KeyCommand_NewMessage: String { return self._s[1426]! } + public var Group_ErrorAddBlocked: String { return self._s[1427]! } public func Message_PaymentSent(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1412]!, self._r[1412]!, [_0]) + return formatWithArgumentRanges(self._s[1428]!, self._r[1428]!, [_0]) } - public var Map_LocationTitle: String { return self._s[1413]! } - public var ReportGroupLocation_Title: String { return self._s[1414]! } - public var CallSettings_UseLessDataLongDescription: String { return self._s[1415]! } - public var Cache_ClearProgress: String { return self._s[1416]! } + public var Map_LocationTitle: String { return self._s[1429]! } + public var ReportGroupLocation_Title: String { return self._s[1430]! } + public var CallSettings_UseLessDataLongDescription: String { return self._s[1431]! } + public var Cache_ClearProgress: String { return self._s[1432]! } public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1417]!, self._r[1417]!, [_0]) + return formatWithArgumentRanges(self._s[1433]!, self._r[1433]!, [_0]) } - public var GroupRemoved_AddToGroup: String { return self._s[1418]! } - public var Passport_UpdateRequiredError: String { return self._s[1419]! } - public var Wallet_SecureStorageNotAvailable_Text: String { return self._s[1420]! } + public var GroupRemoved_AddToGroup: String { return self._s[1434]! } + public var Passport_UpdateRequiredError: String { return self._s[1435]! } + public var Wallet_SecureStorageNotAvailable_Text: String { return self._s[1436]! } public func PUSH_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1421]!, self._r[1421]!, [_1]) + return formatWithArgumentRanges(self._s[1437]!, self._r[1437]!, [_1]) } - public var Notifications_PermissionsSuppressWarningText: String { return self._s[1423]! } - public var Passport_Identity_MainPageHelp: String { return self._s[1424]! } - public var Conversation_StatusKickedFromGroup: String { return self._s[1425]! } - public var Passport_Language_ka: String { return self._s[1426]! } - public var Call_Decline: String { return self._s[1427]! } - public var SocksProxySetup_ProxyEnabled: String { return self._s[1428]! } + public var Notifications_PermissionsSuppressWarningText: String { return self._s[1439]! } + public var Passport_Identity_MainPageHelp: String { return self._s[1440]! } + public var Conversation_StatusKickedFromGroup: String { return self._s[1441]! } + public var Passport_Language_ka: String { return self._s[1442]! } + public func Wallet_Time_PreciseDate_m12(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1443]!, self._r[1443]!, [_1, _2, _3]) + } + public var Call_Decline: String { return self._s[1444]! } + public var SocksProxySetup_ProxyEnabled: String { return self._s[1445]! } public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1431]!, self._r[1431]!, [_0]) + return formatWithArgumentRanges(self._s[1448]!, self._r[1448]!, [_0]) } - public var CallFeedback_Send: String { return self._s[1432]! } - public var EditTheme_EditTitle: String { return self._s[1433]! } + public var CallFeedback_Send: String { return self._s[1449]! } + public var EditTheme_EditTitle: String { return self._s[1450]! } public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1434]!, self._r[1434]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1451]!, self._r[1451]!, [_1, _2]) } - public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1435]! } - public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1438]! } - public var Passport_DeletePassport: String { return self._s[1439]! } - public var Appearance_AppIconFilled: String { return self._s[1440]! } - public var Privacy_Calls_P2PAlways: String { return self._s[1441]! } - public var Month_ShortDecember: String { return self._s[1442]! } - public var Channel_AdminLog_CanEditMessages: String { return self._s[1444]! } + public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1452]! } + public func Wallet_Updated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1454]!, self._r[1454]!, [_0]) + } + public var SettingsSearch_Synonyms_Data_Title: String { return self._s[1455]! } + public var Passport_DeletePassport: String { return self._s[1456]! } + public var Appearance_AppIconFilled: String { return self._s[1457]! } + public var Privacy_Calls_P2PAlways: String { return self._s[1458]! } + public var Month_ShortDecember: String { return self._s[1459]! } + public var Channel_AdminLog_CanEditMessages: String { return self._s[1461]! } public func Contacts_AccessDeniedHelpLandscape(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1445]!, self._r[1445]!, [_0]) + return formatWithArgumentRanges(self._s[1462]!, self._r[1462]!, [_0]) } - public var Channel_Stickers_Searching: String { return self._s[1446]! } - public var Conversation_EncryptedDescription1: String { return self._s[1447]! } - public var Conversation_EncryptedDescription2: String { return self._s[1448]! } - public var PasscodeSettings_PasscodeOptions: String { return self._s[1449]! } - public var Conversation_EncryptedDescription3: String { return self._s[1450]! } - public var PhotoEditor_SharpenTool: String { return self._s[1451]! } + public var Channel_Stickers_Searching: String { return self._s[1463]! } + public var Conversation_EncryptedDescription1: String { return self._s[1464]! } + public var Conversation_EncryptedDescription2: String { return self._s[1465]! } + public var PasscodeSettings_PasscodeOptions: String { return self._s[1466]! } + public var Conversation_EncryptedDescription3: String { return self._s[1468]! } + public var PhotoEditor_SharpenTool: String { return self._s[1469]! } public func Conversation_AddNameToContacts(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1452]!, self._r[1452]!, [_0]) + return formatWithArgumentRanges(self._s[1470]!, self._r[1470]!, [_0]) } - public var Conversation_EncryptedDescription4: String { return self._s[1454]! } - public var Channel_Members_AddMembers: String { return self._s[1455]! } - public var Wallpaper_Search: String { return self._s[1456]! } - public var Weekday_Friday: String { return self._s[1457]! } - public var Privacy_ContactsSync: String { return self._s[1458]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1459]! } - public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1460]! } + public var Conversation_EncryptedDescription4: String { return self._s[1472]! } + public var Channel_Members_AddMembers: String { return self._s[1473]! } + public var Wallpaper_Search: String { return self._s[1474]! } + public var Weekday_Friday: String { return self._s[1475]! } + public var Privacy_ContactsSync: String { return self._s[1476]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[1477]! } + public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1478]! } public func Channel_Management_RestrictedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1461]!, self._r[1461]!, [_0]) + return formatWithArgumentRanges(self._s[1479]!, self._r[1479]!, [_0]) } - public var GroupInfo_Permissions_Removed: String { return self._s[1462]! } - public var Passport_Identity_GenderMale: String { return self._s[1463]! } + public var GroupInfo_Permissions_Removed: String { return self._s[1480]! } + public var Passport_Identity_GenderMale: String { return self._s[1481]! } public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1464]!, self._r[1464]!, [_0]) + return formatWithArgumentRanges(self._s[1482]!, self._r[1482]!, [_0]) } - public var Updated_JustNow: String { return self._s[1465]! } - public var Notifications_PermissionsKeepDisabled: String { return self._s[1466]! } - public var Conversation_JumpToDate: String { return self._s[1467]! } - public var Contacts_GlobalSearch: String { return self._s[1468]! } - public var AutoDownloadSettings_ResetHelp: String { return self._s[1469]! } - public var SettingsSearch_Synonyms_FAQ: String { return self._s[1470]! } - public var Profile_MessageLifetime1d: String { return self._s[1471]! } + public var Notifications_PermissionsKeepDisabled: String { return self._s[1483]! } + public var Conversation_JumpToDate: String { return self._s[1484]! } + public var Contacts_GlobalSearch: String { return self._s[1485]! } + public var AutoDownloadSettings_ResetHelp: String { return self._s[1486]! } + public var SettingsSearch_Synonyms_FAQ: String { return self._s[1487]! } + public var Profile_MessageLifetime1d: String { return self._s[1488]! } public func MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1472]!, self._r[1472]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1489]!, self._r[1489]!, [_1, _2]) } - public var StickerPack_BuiltinPackName: String { return self._s[1475]! } + public var StickerPack_BuiltinPackName: String { return self._s[1492]! } public func PUSH_CHAT_MESSAGE_AUDIO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1476]!, self._r[1476]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1493]!, self._r[1493]!, [_1, _2]) } - public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1477]! } - public var Passport_InfoTitle: String { return self._s[1479]! } - public var Notifications_PermissionsUnreachableText: String { return self._s[1480]! } + public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[1494]! } + public var Passport_InfoTitle: String { return self._s[1496]! } + public var Notifications_PermissionsUnreachableText: String { return self._s[1497]! } public func NetworkUsageSettings_CellularUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1484]!, self._r[1484]!, [_0]) - } - public func PUSH_CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1485]!, self._r[1485]!, [_1, _2]) - } - public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1486]! } - public var Profile_BotInfo: String { return self._s[1487]! } - public var Watch_Compose_CreateMessage: String { return self._s[1488]! } - public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1489]! } - public var Month_ShortNovember: String { return self._s[1490]! } - public var Conversation_ScamWarning: String { return self._s[1491]! } - public var Wallpaper_SetCustomBackground: String { return self._s[1492]! } - public var Passport_Identity_TranslationsHelp: String { return self._s[1493]! } - public var NotificationsSound_Chime: String { return self._s[1494]! } - public var Passport_Language_ko: String { return self._s[1496]! } - public var InviteText_URL: String { return self._s[1497]! } - public var TextFormat_Monospace: String { return self._s[1498]! } - public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1499]!, self._r[1499]!, [_1, _2, _3]) - } - public var EditTheme_Edit_BottomInfo: String { return self._s[1500]! } - public func Login_WillSendSms(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1501]!, self._r[1501]!, [_0]) } - public func Watch_Time_ShortWeekdayAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + public func PUSH_CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1502]!, self._r[1502]!, [_1, _2]) } - public var Wallet_Words_Title: String { return self._s[1504]! } - public var EditTheme_CreateTitle: String { return self._s[1506]! } - public var Passport_InfoLearnMore: String { return self._s[1507]! } - public var TwoStepAuth_EmailPlaceholder: String { return self._s[1508]! } - public var Passport_Identity_AddIdentityCard: String { return self._s[1509]! } - public var Your_card_has_expired: String { return self._s[1510]! } - public var StickerPacksSettings_StickerPacksSection: String { return self._s[1511]! } - public var GroupInfo_InviteLink_Help: String { return self._s[1512]! } - public var Conversation_Report: String { return self._s[1516]! } - public var Notifications_MessageNotificationsSound: String { return self._s[1517]! } - public var Notification_MessageLifetime1m: String { return self._s[1518]! } - public var Privacy_ContactsTitle: String { return self._s[1519]! } - public var Conversation_ShareMyContactInfo: String { return self._s[1520]! } - public var Wallet_WordCheck_Title: String { return self._s[1521]! } - public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1522]! } - public var Channel_Members_Title: String { return self._s[1523]! } - public var Map_OpenInWaze: String { return self._s[1524]! } - public var Login_PhoneBannedError: String { return self._s[1525]! } - public func LiveLocationUpdated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1526]!, self._r[1526]!, [_0]) + public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[1503]! } + public var Profile_BotInfo: String { return self._s[1504]! } + public var Watch_Compose_CreateMessage: String { return self._s[1505]! } + public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[1506]! } + public var Month_ShortNovember: String { return self._s[1507]! } + public var Conversation_ScamWarning: String { return self._s[1508]! } + public var Wallpaper_SetCustomBackground: String { return self._s[1509]! } + public var Passport_Identity_TranslationsHelp: String { return self._s[1510]! } + public var NotificationsSound_Chime: String { return self._s[1511]! } + public var Passport_Language_ko: String { return self._s[1513]! } + public var InviteText_URL: String { return self._s[1514]! } + public var TextFormat_Monospace: String { return self._s[1515]! } + public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1516]!, self._r[1516]!, [_1, _2, _3]) } - public var Group_Management_AddModeratorHelp: String { return self._s[1527]! } - public var AutoDownloadSettings_WifiTitle: String { return self._s[1528]! } - public var Common_OK: String { return self._s[1529]! } - public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1530]! } - public var Wallet_Words_NotDoneResponse: String { return self._s[1531]! } - public var Cache_Music: String { return self._s[1532]! } - public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1533]! } - public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1534]! } - public var TwoStepAuth_HintPlaceholder: String { return self._s[1535]! } + public var EditTheme_Edit_BottomInfo: String { return self._s[1517]! } + public func Login_WillSendSms(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1518]!, self._r[1518]!, [_0]) + } + public func Watch_Time_ShortWeekdayAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1519]!, self._r[1519]!, [_1, _2]) + } + public var Wallet_Words_Title: String { return self._s[1520]! } + public var Wallet_Month_ShortMay: String { return self._s[1521]! } + public var EditTheme_CreateTitle: String { return self._s[1523]! } + public var Passport_InfoLearnMore: String { return self._s[1524]! } + public var TwoStepAuth_EmailPlaceholder: String { return self._s[1525]! } + public var Passport_Identity_AddIdentityCard: String { return self._s[1526]! } + public var Your_card_has_expired: String { return self._s[1527]! } + public var StickerPacksSettings_StickerPacksSection: String { return self._s[1528]! } + public var GroupInfo_InviteLink_Help: String { return self._s[1529]! } + public var Conversation_Report: String { return self._s[1533]! } + public var Notifications_MessageNotificationsSound: String { return self._s[1534]! } + public var Notification_MessageLifetime1m: String { return self._s[1535]! } + public var Privacy_ContactsTitle: String { return self._s[1536]! } + public var Conversation_ShareMyContactInfo: String { return self._s[1537]! } + public var Wallet_WordCheck_Title: String { return self._s[1538]! } + public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[1539]! } + public var Channel_Members_Title: String { return self._s[1540]! } + public var Map_OpenInWaze: String { return self._s[1541]! } + public var Login_PhoneBannedError: String { return self._s[1542]! } + public func LiveLocationUpdated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1543]!, self._r[1543]!, [_0]) + } + public var Group_Management_AddModeratorHelp: String { return self._s[1544]! } + public var AutoDownloadSettings_WifiTitle: String { return self._s[1545]! } + public var Common_OK: String { return self._s[1546]! } + public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[1547]! } + public var Wallet_Words_NotDoneResponse: String { return self._s[1548]! } + public var Cache_Music: String { return self._s[1549]! } + public var SettingsSearch_Synonyms_EditProfile_PhoneNumber: String { return self._s[1550]! } + public var PasscodeSettings_UnlockWithTouchId: String { return self._s[1551]! } + public var TwoStepAuth_HintPlaceholder: String { return self._s[1552]! } public func PUSH_PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1536]!, self._r[1536]!, [_1]) + return formatWithArgumentRanges(self._s[1553]!, self._r[1553]!, [_1]) } public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1537]!, self._r[1537]!, [_0]) + return formatWithArgumentRanges(self._s[1554]!, self._r[1554]!, [_0]) } public func VoiceOver_Chat_ContactOrganization(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1538]!, self._r[1538]!, [_0]) + return formatWithArgumentRanges(self._s[1555]!, self._r[1555]!, [_0]) } - public var Wallet_Send_ErrorNotEnoughFundsText: String { return self._s[1539]! } - public var Watch_MessageView_ViewOnPhone: String { return self._s[1541]! } - public var Privacy_Calls_CustomShareHelp: String { return self._s[1542]! } - public var Wallet_Receive_CreateInvoiceInfo: String { return self._s[1544]! } - public var ChangePhoneNumberNumber_Title: String { return self._s[1545]! } - public var State_ConnectingToProxyInfo: String { return self._s[1546]! } - public var Message_VideoMessage: String { return self._s[1548]! } - public var ChannelInfo_DeleteChannel: String { return self._s[1549]! } - public var ContactInfo_PhoneLabelOther: String { return self._s[1550]! } - public var Channel_EditAdmin_CannotEdit: String { return self._s[1551]! } - public var Passport_DeleteAddressConfirmation: String { return self._s[1552]! } - public var WallpaperPreview_SwipeBottomText: String { return self._s[1553]! } - public var Activity_RecordingAudio: String { return self._s[1554]! } - public var SettingsSearch_Synonyms_Watch: String { return self._s[1555]! } - public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1556]! } - public var Wallet_Info_Address: String { return self._s[1557]! } + public var Wallet_Send_ErrorNotEnoughFundsText: String { return self._s[1556]! } + public var Watch_MessageView_ViewOnPhone: String { return self._s[1558]! } + public var Privacy_Calls_CustomShareHelp: String { return self._s[1559]! } + public var Wallet_Receive_CreateInvoiceInfo: String { return self._s[1561]! } + public var ChangePhoneNumberNumber_Title: String { return self._s[1562]! } + public var State_ConnectingToProxyInfo: String { return self._s[1563]! } + public var Message_VideoMessage: String { return self._s[1565]! } + public var ChannelInfo_DeleteChannel: String { return self._s[1566]! } + public var ContactInfo_PhoneLabelOther: String { return self._s[1567]! } + public var Channel_EditAdmin_CannotEdit: String { return self._s[1568]! } + public var Passport_DeleteAddressConfirmation: String { return self._s[1569]! } + public func Wallet_Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1570]!, self._r[1570]!, [_1, _2, _3]) + } + public var WallpaperPreview_SwipeBottomText: String { return self._s[1571]! } + public var Activity_RecordingAudio: String { return self._s[1572]! } + public var SettingsSearch_Synonyms_Watch: String { return self._s[1573]! } + public var PasscodeSettings_TryAgainIn1Minute: String { return self._s[1574]! } + public var Wallet_Info_Address: String { return self._s[1575]! } public func Notification_ChangedGroupName(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1559]!, self._r[1559]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1577]!, self._r[1577]!, [_0, _1]) } public func EmptyGroupInfo_Line1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1563]!, self._r[1563]!, [_0]) + return formatWithArgumentRanges(self._s[1581]!, self._r[1581]!, [_0]) } - public var Conversation_ApplyLocalization: String { return self._s[1564]! } - public var UserInfo_AddPhone: String { return self._s[1565]! } - public var Map_ShareLiveLocationHelp: String { return self._s[1566]! } + public var Conversation_ApplyLocalization: String { return self._s[1582]! } + public var UserInfo_AddPhone: String { return self._s[1583]! } + public var Map_ShareLiveLocationHelp: String { return self._s[1584]! } public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1567]!, self._r[1567]!, [_0]) + return formatWithArgumentRanges(self._s[1585]!, self._r[1585]!, [_0]) } - public var Passport_Scans: String { return self._s[1569]! } - public var BlockedUsers_Unblock: String { return self._s[1570]! } + public var Passport_Scans: String { return self._s[1587]! } + public var BlockedUsers_Unblock: String { return self._s[1588]! } public func PUSH_ENCRYPTION_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1571]!, self._r[1571]!, [_1]) + return formatWithArgumentRanges(self._s[1589]!, self._r[1589]!, [_1]) } - public var Channel_Management_LabelCreator: String { return self._s[1572]! } - public var Conversation_ReportSpamAndLeave: String { return self._s[1573]! } - public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1574]! } - public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1575]! } - public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1576]! } + public var Channel_Management_LabelCreator: String { return self._s[1590]! } + public var Conversation_ReportSpamAndLeave: String { return self._s[1591]! } + public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[1592]! } + public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1593]! } + public var Passport_Identity_NativeNameGenericTitle: String { return self._s[1594]! } public func Login_EmailPhoneBody(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1577]!, self._r[1577]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[1595]!, self._r[1595]!, [_0, _1, _2]) } - public var Login_PhoneNumberHelp: String { return self._s[1578]! } - public var LastSeen_ALongTimeAgo: String { return self._s[1579]! } - public var Channel_AdminLog_CanPinMessages: String { return self._s[1580]! } - public var ChannelIntro_CreateChannel: String { return self._s[1581]! } - public var Conversation_UnreadMessages: String { return self._s[1582]! } - public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1583]! } - public var Channel_AdminLog_EmptyText: String { return self._s[1584]! } - public var Theme_Context_Apply: String { return self._s[1585]! } - public var Notification_GroupActivated: String { return self._s[1586]! } - public var NotificationSettings_ContactJoinedInfo: String { return self._s[1587]! } - public var Wallet_Intro_CreateWallet: String { return self._s[1588]! } + public var Login_PhoneNumberHelp: String { return self._s[1596]! } + public var LastSeen_ALongTimeAgo: String { return self._s[1597]! } + public var Channel_AdminLog_CanPinMessages: String { return self._s[1598]! } + public var ChannelIntro_CreateChannel: String { return self._s[1599]! } + public var Conversation_UnreadMessages: String { return self._s[1600]! } + public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1601]! } + public var Channel_AdminLog_EmptyText: String { return self._s[1602]! } + public var Theme_Context_Apply: String { return self._s[1603]! } + public var Notification_GroupActivated: String { return self._s[1604]! } + public var NotificationSettings_ContactJoinedInfo: String { return self._s[1605]! } + public var Wallet_Intro_CreateWallet: String { return self._s[1606]! } public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1589]!, self._r[1589]!, [_0]) + return formatWithArgumentRanges(self._s[1607]!, self._r[1607]!, [_0]) } public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1590]!, self._r[1590]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1608]!, self._r[1608]!, [_0, _1]) } - public var GroupInfo_ConvertToSupergroup: String { return self._s[1592]! } + public var GroupInfo_ConvertToSupergroup: String { return self._s[1610]! } public func PrivacyPolicy_AgeVerificationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1593]!, self._r[1593]!, [_0]) + return formatWithArgumentRanges(self._s[1611]!, self._r[1611]!, [_0]) } - public var Undo_DeletedChannel: String { return self._s[1594]! } - public var CallFeedback_AddComment: String { return self._s[1595]! } + public var Undo_DeletedChannel: String { return self._s[1612]! } + public var CallFeedback_AddComment: String { return self._s[1613]! } public func Conversation_OpenBotLinkAllowMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1596]!, self._r[1596]!, [_0]) + return formatWithArgumentRanges(self._s[1614]!, self._r[1614]!, [_0]) } - public var Document_TargetConfirmationFormat: String { return self._s[1597]! } + public var Document_TargetConfirmationFormat: String { return self._s[1615]! } public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1598]!, self._r[1598]!, [_0]) + return formatWithArgumentRanges(self._s[1616]!, self._r[1616]!, [_0]) } - public var LogoutOptions_SetPasscodeTitle: String { return self._s[1599]! } + public var LogoutOptions_SetPasscodeTitle: String { return self._s[1617]! } public func PUSH_CHAT_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1600]!, self._r[1600]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[1618]!, self._r[1618]!, [_1, _2, _3, _4]) } - public var Wallet_SecureStorageChanged_PasscodeText: String { return self._s[1601]! } - public var Theme_ErrorNotFound: String { return self._s[1602]! } - public var Contacts_SortByName: String { return self._s[1603]! } - public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1604]! } + public var Wallet_SecureStorageChanged_PasscodeText: String { return self._s[1619]! } + public var Theme_ErrorNotFound: String { return self._s[1620]! } + public var Contacts_SortByName: String { return self._s[1621]! } + public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[1622]! } public func CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1606]!, self._r[1606]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1624]!, self._r[1624]!, [_1, _2, _3]) } - public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1607]! } - public var ScheduledMessages_EditTime: String { return self._s[1608]! } - public var Conversation_ClearSelfHistory: String { return self._s[1609]! } - public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1610]! } - public var PasscodeSettings_DoNotMatch: String { return self._s[1611]! } - public var Stickers_SuggestNone: String { return self._s[1612]! } - public var ChatSettings_Cache: String { return self._s[1613]! } - public var Settings_SaveIncomingPhotos: String { return self._s[1614]! } - public var Media_ShareThisPhoto: String { return self._s[1615]! } - public var Chat_SlowmodeTooltipPending: String { return self._s[1616]! } - public var InfoPlist_NSContactsUsageDescription: String { return self._s[1617]! } - public var Conversation_ContextMenuCopyLink: String { return self._s[1618]! } - public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1619]! } - public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1620]! } - public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1621]! } + public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1625]! } + public var ScheduledMessages_EditTime: String { return self._s[1626]! } + public var Conversation_ClearSelfHistory: String { return self._s[1627]! } + public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[1628]! } + public var PasscodeSettings_DoNotMatch: String { return self._s[1629]! } + public var Stickers_SuggestNone: String { return self._s[1630]! } + public var ChatSettings_Cache: String { return self._s[1631]! } + public var Settings_SaveIncomingPhotos: String { return self._s[1632]! } + public var Media_ShareThisPhoto: String { return self._s[1633]! } + public var Chat_SlowmodeTooltipPending: String { return self._s[1634]! } + public var InfoPlist_NSContactsUsageDescription: String { return self._s[1635]! } + public var Conversation_ContextMenuCopyLink: String { return self._s[1636]! } + public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[1637]! } + public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1638]! } + public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[1639]! } public func Wallet_SecureStorageReset_BiometryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1622]!, self._r[1622]!, [_0]) + return formatWithArgumentRanges(self._s[1640]!, self._r[1640]!, [_0]) } - public var Permissions_CellularDataTitle_v0: String { return self._s[1623]! } - public var WallpaperSearch_ColorWhite: String { return self._s[1625]! } - public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1626]! } - public var Conversation_ErrorInaccessibleMessage: String { return self._s[1627]! } - public var Map_OpenIn: String { return self._s[1628]! } + public var Permissions_CellularDataTitle_v0: String { return self._s[1641]! } + public var WallpaperSearch_ColorWhite: String { return self._s[1643]! } + public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[1644]! } + public var Conversation_ErrorInaccessibleMessage: String { return self._s[1645]! } + public var Map_OpenIn: String { return self._s[1646]! } public func PUSH_PHONE_CALL_MISSED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1631]!, self._r[1631]!, [_1]) + return formatWithArgumentRanges(self._s[1649]!, self._r[1649]!, [_1]) } public func ChannelInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1632]!, self._r[1632]!, [_0]) + return formatWithArgumentRanges(self._s[1650]!, self._r[1650]!, [_0]) } - public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1633]! } - public var MessagePoll_LabelClosed: String { return self._s[1634]! } - public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1636]! } - public var Wallet_Send_SendAnyway: String { return self._s[1637]! } - public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1638]! } - public var UserInfo_FirstNamePlaceholder: String { return self._s[1639]! } - public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1640]! } - public var Login_SelectCountry_Title: String { return self._s[1642]! } - public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1643]! } + public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1651]! } + public var MessagePoll_LabelClosed: String { return self._s[1652]! } + public var GroupPermission_PermissionGloballyDisabled: String { return self._s[1654]! } + public var Wallet_Send_SendAnyway: String { return self._s[1655]! } + public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[1656]! } + public var UserInfo_FirstNamePlaceholder: String { return self._s[1657]! } + public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[1658]! } + public var Login_SelectCountry_Title: String { return self._s[1659]! } + public var Channel_EditAdmin_PermissionBanUsers: String { return self._s[1660]! } public func Conversation_OpenBotLinkLogin(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1644]!, self._r[1644]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1661]!, self._r[1661]!, [_1, _2]) } - public var Channel_AdminLog_ChangeInfo: String { return self._s[1645]! } - public var Watch_Suggestion_BRB: String { return self._s[1646]! } - public var Passport_Identity_EditIdentityCard: String { return self._s[1647]! } - public var Contacts_PermissionsTitle: String { return self._s[1648]! } - public var Conversation_RestrictedInline: String { return self._s[1649]! } - public var StickerPack_ViewPack: String { return self._s[1651]! } + public var Channel_AdminLog_ChangeInfo: String { return self._s[1662]! } + public var Watch_Suggestion_BRB: String { return self._s[1663]! } + public var Passport_Identity_EditIdentityCard: String { return self._s[1664]! } + public var Contacts_PermissionsTitle: String { return self._s[1665]! } + public var Conversation_RestrictedInline: String { return self._s[1666]! } + public var StickerPack_ViewPack: String { return self._s[1668]! } + public var Wallet_UnknownError: String { return self._s[1669]! } public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1652]!, self._r[1652]!, [_0]) + return formatWithArgumentRanges(self._s[1670]!, self._r[1670]!, [_0]) } - public var Compose_NewChannel: String { return self._s[1654]! } - public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1657]! } - public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1659]! } - public var Channel_Info_Stickers: String { return self._s[1660]! } - public var AutoNightTheme_PreferredTheme: String { return self._s[1661]! } - public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1662]! } - public var Passport_DeletePersonalDetails: String { return self._s[1663]! } - public var LogoutOptions_AddAccountTitle: String { return self._s[1664]! } - public var Channel_DiscussionGroupInfo: String { return self._s[1665]! } - public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1666]! } - public var Conversation_SearchNoResults: String { return self._s[1668]! } - public var MessagePoll_LabelAnonymous: String { return self._s[1669]! } - public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1670]! } - public var Login_Code: String { return self._s[1671]! } - public var EditTheme_Create_BottomInfo: String { return self._s[1672]! } - public var Watch_Suggestion_WhatsUp: String { return self._s[1673]! } - public var Weekday_ShortThursday: String { return self._s[1674]! } - public var Resolve_ErrorNotFound: String { return self._s[1676]! } - public var LastSeen_Offline: String { return self._s[1678]! } - public var PeopleNearby_NoMembers: String { return self._s[1679]! } - public var GroupPermission_AddMembersNotAvailable: String { return self._s[1680]! } - public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1681]! } - public var GroupInfo_Title: String { return self._s[1683]! } - public var NotificationsSound_Note: String { return self._s[1684]! } - public var Conversation_EditingMessagePanelTitle: String { return self._s[1685]! } - public var Watch_Message_Poll: String { return self._s[1687]! } - public var Privacy_Calls: String { return self._s[1688]! } + public var Compose_NewChannel: String { return self._s[1672]! } + public var ChatSettings_AutoDownloadSettings_TypePhoto: String { return self._s[1675]! } + public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1677]! } + public var Channel_Info_Stickers: String { return self._s[1678]! } + public var AutoNightTheme_PreferredTheme: String { return self._s[1679]! } + public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[1680]! } + public var Passport_DeletePersonalDetails: String { return self._s[1681]! } + public var LogoutOptions_AddAccountTitle: String { return self._s[1682]! } + public var Channel_DiscussionGroupInfo: String { return self._s[1683]! } + public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[1684]! } + public var Conversation_SearchNoResults: String { return self._s[1686]! } + public var MessagePoll_LabelAnonymous: String { return self._s[1687]! } + public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[1688]! } + public var Login_Code: String { return self._s[1689]! } + public var EditTheme_Create_BottomInfo: String { return self._s[1690]! } + public var Watch_Suggestion_WhatsUp: String { return self._s[1691]! } + public var Weekday_ShortThursday: String { return self._s[1692]! } + public var Resolve_ErrorNotFound: String { return self._s[1694]! } + public var LastSeen_Offline: String { return self._s[1695]! } + public var PeopleNearby_NoMembers: String { return self._s[1696]! } + public var GroupPermission_AddMembersNotAvailable: String { return self._s[1697]! } + public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[1698]! } + public var GroupInfo_Title: String { return self._s[1700]! } + public var NotificationsSound_Note: String { return self._s[1701]! } + public var Conversation_EditingMessagePanelTitle: String { return self._s[1702]! } + public var Watch_Message_Poll: String { return self._s[1703]! } + public var Privacy_Calls: String { return self._s[1704]! } public func Channel_AdminLog_MessageRankUsername(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1689]!, self._r[1689]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1705]!, self._r[1705]!, [_1, _2, _3]) } - public var Month_ShortAugust: String { return self._s[1690]! } - public var TwoStepAuth_SetPasswordHelp: String { return self._s[1691]! } - public var Notifications_Reset: String { return self._s[1692]! } - public var Conversation_Pin: String { return self._s[1693]! } - public var Passport_Language_lv: String { return self._s[1694]! } - public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1695]! } - public var BlockedUsers_Info: String { return self._s[1696]! } - public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1698]! } - public var Watch_Conversation_Unblock: String { return self._s[1700]! } + public var Month_ShortAugust: String { return self._s[1706]! } + public var TwoStepAuth_SetPasswordHelp: String { return self._s[1707]! } + public var Notifications_Reset: String { return self._s[1708]! } + public var Conversation_Pin: String { return self._s[1709]! } + public var Passport_Language_lv: String { return self._s[1710]! } + public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1711]! } + public var BlockedUsers_Info: String { return self._s[1712]! } + public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[1714]! } + public var Watch_Conversation_Unblock: String { return self._s[1716]! } public func Time_MonthOfYear_m9(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1701]!, self._r[1701]!, [_0]) + return formatWithArgumentRanges(self._s[1717]!, self._r[1717]!, [_0]) } - public var CloudStorage_Title: String { return self._s[1702]! } - public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1703]! } + public var CloudStorage_Title: String { return self._s[1718]! } + public var GroupInfo_DeleteAndExitConfirmation: String { return self._s[1719]! } public func NetworkUsageSettings_WifiUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1704]!, self._r[1704]!, [_0]) + return formatWithArgumentRanges(self._s[1720]!, self._r[1720]!, [_0]) } - public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1705]! } - public var Watch_Suggestion_OnMyWay: String { return self._s[1706]! } - public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1707]! } - public var Passport_Address_EditBankStatement: String { return self._s[1708]! } + public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[1721]! } + public var Watch_Suggestion_OnMyWay: String { return self._s[1722]! } + public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[1723]! } + public var Passport_Address_EditBankStatement: String { return self._s[1724]! } public func Channel_AdminLog_MessageChangedUnlinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1709]!, self._r[1709]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1725]!, self._r[1725]!, [_1, _2]) } - public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1710]! } - public var ShareMenu_Comment: String { return self._s[1711]! } - public var Permissions_ContactsTitle_v0: String { return self._s[1712]! } - public var Notifications_PermissionsTitle: String { return self._s[1713]! } - public var GroupPermission_NoSendLinks: String { return self._s[1714]! } - public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1715]! } - public var Wallet_SecureStorageChanged_ImportWallet: String { return self._s[1716]! } - public var Settings_Support: String { return self._s[1717]! } - public var Notifications_ChannelNotificationsSound: String { return self._s[1718]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1719]! } - public var Privacy_Forwards_Preview: String { return self._s[1720]! } - public var GroupPermission_ApplyAlertAction: String { return self._s[1721]! } - public var Watch_Stickers_StickerPacks: String { return self._s[1722]! } - public var Common_Select: String { return self._s[1724]! } - public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1725]! } - public var WallpaperSearch_ColorGray: String { return self._s[1727]! } - public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1728]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1729]! } - public var Appearance_PreviewReplyAuthor: String { return self._s[1730]! } - public var TwoStepAuth_RecoveryTitle: String { return self._s[1731]! } - public var Widget_AuthRequired: String { return self._s[1732]! } - public var Camera_FlashOn: String { return self._s[1733]! } - public var Conversation_ContextMenuLookUp: String { return self._s[1734]! } - public var Channel_Stickers_NotFoundHelp: String { return self._s[1735]! } - public var Watch_Suggestion_OK: String { return self._s[1736]! } + public var ChatSettings_DownloadInBackgroundInfo: String { return self._s[1726]! } + public var ShareMenu_Comment: String { return self._s[1727]! } + public var Permissions_ContactsTitle_v0: String { return self._s[1728]! } + public var Notifications_PermissionsTitle: String { return self._s[1729]! } + public var GroupPermission_NoSendLinks: String { return self._s[1730]! } + public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1731]! } + public var Wallet_SecureStorageChanged_ImportWallet: String { return self._s[1732]! } + public var Settings_Support: String { return self._s[1733]! } + public var Notifications_ChannelNotificationsSound: String { return self._s[1734]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[1735]! } + public var Privacy_Forwards_Preview: String { return self._s[1736]! } + public var GroupPermission_ApplyAlertAction: String { return self._s[1737]! } + public var Watch_Stickers_StickerPacks: String { return self._s[1738]! } + public var Common_Select: String { return self._s[1740]! } + public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[1741]! } + public var WallpaperSearch_ColorGray: String { return self._s[1744]! } + public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[1745]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[1746]! } + public var Appearance_PreviewReplyAuthor: String { return self._s[1747]! } + public var TwoStepAuth_RecoveryTitle: String { return self._s[1748]! } + public var Widget_AuthRequired: String { return self._s[1749]! } + public var Camera_FlashOn: String { return self._s[1750]! } + public var Conversation_ContextMenuLookUp: String { return self._s[1751]! } + public var Channel_Stickers_NotFoundHelp: String { return self._s[1752]! } + public var Watch_Suggestion_OK: String { return self._s[1753]! } public func Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1738]!, self._r[1738]!, [_0]) + return formatWithArgumentRanges(self._s[1755]!, self._r[1755]!, [_0]) } public func Notification_PinnedLiveLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1740]!, self._r[1740]!, [_0]) + return formatWithArgumentRanges(self._s[1757]!, self._r[1757]!, [_0]) } - public var TextFormat_Strikethrough: String { return self._s[1741]! } - public var DialogList_AdLabel: String { return self._s[1742]! } - public var WatchRemote_NotificationText: String { return self._s[1743]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1744]! } - public var Conversation_ReportSpam: String { return self._s[1745]! } - public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1746]! } - public var Settings_LogoutConfirmationTitle: String { return self._s[1748]! } - public var PhoneLabel_Title: String { return self._s[1749]! } - public var Passport_Address_EditRentalAgreement: String { return self._s[1750]! } - public var Settings_ChangePhoneNumber: String { return self._s[1751]! } - public var Notifications_ExceptionsTitle: String { return self._s[1752]! } - public var Notifications_AlertTones: String { return self._s[1753]! } - public var Call_ReportIncludeLogDescription: String { return self._s[1754]! } - public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1755]! } - public var AutoDownloadSettings_PrivateChats: String { return self._s[1756]! } - public var VoiceOver_Chat_Photo: String { return self._s[1758]! } - public var TwoStepAuth_AddHintTitle: String { return self._s[1759]! } - public var ReportPeer_ReasonOther: String { return self._s[1760]! } - public var ChatList_Context_JoinChannel: String { return self._s[1761]! } - public var KeyCommand_ScrollDown: String { return self._s[1763]! } - public var Conversation_ScheduleMessage_Title: String { return self._s[1764]! } + public var TextFormat_Strikethrough: String { return self._s[1758]! } + public var DialogList_AdLabel: String { return self._s[1759]! } + public var WatchRemote_NotificationText: String { return self._s[1760]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[1761]! } + public var Conversation_ReportSpam: String { return self._s[1762]! } + public var SettingsSearch_Synonyms_Privacy_Data_TopPeers: String { return self._s[1763]! } + public var Settings_LogoutConfirmationTitle: String { return self._s[1765]! } + public var PhoneLabel_Title: String { return self._s[1766]! } + public var Passport_Address_EditRentalAgreement: String { return self._s[1767]! } + public var Settings_ChangePhoneNumber: String { return self._s[1768]! } + public var Notifications_ExceptionsTitle: String { return self._s[1769]! } + public var Notifications_AlertTones: String { return self._s[1770]! } + public var Call_ReportIncludeLogDescription: String { return self._s[1771]! } + public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[1772]! } + public var AutoDownloadSettings_PrivateChats: String { return self._s[1773]! } + public var VoiceOver_Chat_Photo: String { return self._s[1775]! } + public var TwoStepAuth_AddHintTitle: String { return self._s[1776]! } + public var ReportPeer_ReasonOther: String { return self._s[1777]! } + public var ChatList_Context_JoinChannel: String { return self._s[1778]! } + public var KeyCommand_ScrollDown: String { return self._s[1780]! } + public var Conversation_ScheduleMessage_Title: String { return self._s[1781]! } public func Login_BannedPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1765]!, self._r[1765]!, [_0]) + return formatWithArgumentRanges(self._s[1782]!, self._r[1782]!, [_0]) } - public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1766]! } - public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1767]! } - public var AuthSessions_LogOut: String { return self._s[1768]! } - public var Passport_Identity_TypeInternalPassport: String { return self._s[1769]! } - public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1770]! } - public var Passport_Phone_Title: String { return self._s[1771]! } - public var ContactList_Context_StartSecretChat: String { return self._s[1772]! } - public var Settings_PhoneNumber: String { return self._s[1773]! } + public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[1783]! } + public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[1784]! } + public var AuthSessions_LogOut: String { return self._s[1785]! } + public var Passport_Identity_TypeInternalPassport: String { return self._s[1786]! } + public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[1787]! } + public var Passport_Phone_Title: String { return self._s[1788]! } + public var ContactList_Context_StartSecretChat: String { return self._s[1789]! } + public var Settings_PhoneNumber: String { return self._s[1790]! } public func Conversation_ScheduleMessage_SendToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1774]!, self._r[1774]!, [_0]) - } - public var NotificationsSound_Alert: String { return self._s[1775]! } - public var Wallet_SecureStorageChanged_CreateWallet: String { return self._s[1776]! } - public var WebSearch_SearchNoResults: String { return self._s[1777]! } - public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1779]! } - public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1780]! } - public var SettingsSearch_Synonyms_Passport: String { return self._s[1781]! } - public var PhotoEditor_CurvesTool: String { return self._s[1782]! } - public var Checkout_PaymentMethod: String { return self._s[1784]! } - public func PUSH_CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1785]!, self._r[1785]!, [_1, _2]) - } - public var Contacts_AccessDeniedError: String { return self._s[1786]! } - public var Camera_PhotoMode: String { return self._s[1789]! } - public var EditTheme_Expand_Preview_IncomingText: String { return self._s[1790]! } - public func Updated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1791]!, self._r[1791]!, [_0]) } - public var Passport_Address_AddUtilityBill: String { return self._s[1793]! } - public var CallSettings_OnMobile: String { return self._s[1794]! } - public var Tour_Text2: String { return self._s[1795]! } - public func PUSH_CHAT_MESSAGE_ROUND(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1796]!, self._r[1796]!, [_1, _2]) + public var NotificationsSound_Alert: String { return self._s[1792]! } + public var Wallet_SecureStorageChanged_CreateWallet: String { return self._s[1793]! } + public var WebSearch_SearchNoResults: String { return self._s[1794]! } + public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[1796]! } + public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1797]! } + public var SettingsSearch_Synonyms_Passport: String { return self._s[1798]! } + public var PhotoEditor_CurvesTool: String { return self._s[1799]! } + public var Checkout_PaymentMethod: String { return self._s[1801]! } + public func PUSH_CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1802]!, self._r[1802]!, [_1, _2]) } - public var DialogList_EncryptionProcessing: String { return self._s[1798]! } - public var Permissions_Skip: String { return self._s[1799]! } - public var Wallet_Words_NotDoneOk: String { return self._s[1800]! } - public var SecretImage_Title: String { return self._s[1801]! } - public var Watch_MessageView_Title: String { return self._s[1802]! } - public var Channel_DiscussionGroupAdd: String { return self._s[1803]! } - public var AttachmentMenu_Poll: String { return self._s[1804]! } + public var Contacts_AccessDeniedError: String { return self._s[1803]! } + public var Camera_PhotoMode: String { return self._s[1806]! } + public var EditTheme_Expand_Preview_IncomingText: String { return self._s[1807]! } + public var Passport_Address_AddUtilityBill: String { return self._s[1809]! } + public var CallSettings_OnMobile: String { return self._s[1810]! } + public var Tour_Text2: String { return self._s[1811]! } + public func PUSH_CHAT_MESSAGE_ROUND(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1812]!, self._r[1812]!, [_1, _2]) + } + public var DialogList_EncryptionProcessing: String { return self._s[1814]! } + public var Permissions_Skip: String { return self._s[1815]! } + public var Wallet_Words_NotDoneOk: String { return self._s[1816]! } + public var SecretImage_Title: String { return self._s[1817]! } + public var Watch_MessageView_Title: String { return self._s[1818]! } + public var Channel_DiscussionGroupAdd: String { return self._s[1819]! } + public var AttachmentMenu_Poll: String { return self._s[1820]! } public func Notification_GroupInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1805]!, self._r[1805]!, [_0]) + return formatWithArgumentRanges(self._s[1821]!, self._r[1821]!, [_0]) } public func Channel_DiscussionGroup_PrivateChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1806]!, self._r[1806]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1822]!, self._r[1822]!, [_1, _2]) } - public var Notification_CallCanceled: String { return self._s[1807]! } - public var WallpaperPreview_Title: String { return self._s[1808]! } - public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1809]! } - public var Settings_ProxyConnecting: String { return self._s[1810]! } - public var Settings_CheckPhoneNumberText: String { return self._s[1812]! } - public var VoiceOver_Chat_YourVideo: String { return self._s[1813]! } - public var Wallet_Intro_Title: String { return self._s[1814]! } - public var Profile_MessageLifetime5s: String { return self._s[1815]! } - public var Username_InvalidCharacters: String { return self._s[1816]! } - public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1817]! } - public var ScheduledMessages_ClearAll: String { return self._s[1818]! } - public var WallpaperPreview_CropBottomText: String { return self._s[1819]! } - public var AutoDownloadSettings_LimitBySize: String { return self._s[1820]! } - public var Settings_AddAccount: String { return self._s[1821]! } - public var Notification_CreatedChannel: String { return self._s[1824]! } + public var Notification_CallCanceled: String { return self._s[1823]! } + public var WallpaperPreview_Title: String { return self._s[1824]! } + public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[1825]! } + public var Settings_ProxyConnecting: String { return self._s[1826]! } + public var Settings_CheckPhoneNumberText: String { return self._s[1828]! } + public var VoiceOver_Chat_YourVideo: String { return self._s[1829]! } + public var Wallet_Intro_Title: String { return self._s[1830]! } + public var Profile_MessageLifetime5s: String { return self._s[1831]! } + public var Username_InvalidCharacters: String { return self._s[1832]! } + public var VoiceOver_Media_PlaybackRateFast: String { return self._s[1833]! } + public var ScheduledMessages_ClearAll: String { return self._s[1834]! } + public var WallpaperPreview_CropBottomText: String { return self._s[1835]! } + public var AutoDownloadSettings_LimitBySize: String { return self._s[1836]! } + public var Settings_AddAccount: String { return self._s[1837]! } + public var Notification_CreatedChannel: String { return self._s[1840]! } public func PUSH_CHAT_DELETE_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1825]!, self._r[1825]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1841]!, self._r[1841]!, [_1, _2, _3]) } - public var Passcode_AppLockedAlert: String { return self._s[1827]! } - public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1828]! } - public var VoiceOver_Media_PlaybackStop: String { return self._s[1829]! } - public var Contacts_TopSection: String { return self._s[1830]! } + public var Passcode_AppLockedAlert: String { return self._s[1843]! } + public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1844]! } + public var VoiceOver_Media_PlaybackStop: String { return self._s[1845]! } + public var Contacts_TopSection: String { return self._s[1846]! } public func Conversation_SetReminder_RemindOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1831]!, self._r[1831]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1847]!, self._r[1847]!, [_0, _1]) } - public var Wallet_Info_Receive: String { return self._s[1832]! } - public var Wallet_Completed_ViewWallet: String { return self._s[1833]! } + public var Wallet_Info_Receive: String { return self._s[1848]! } + public var Wallet_Completed_ViewWallet: String { return self._s[1849]! } public func Time_MonthOfYear_m6(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1834]!, self._r[1834]!, [_0]) + return formatWithArgumentRanges(self._s[1850]!, self._r[1850]!, [_0]) } - public var ReportPeer_ReasonSpam: String { return self._s[1835]! } - public var UserInfo_TapToCall: String { return self._s[1836]! } - public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1838]! } - public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1839]! } - public var Common_Search: String { return self._s[1840]! } - public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1841]! } + public var ReportPeer_ReasonSpam: String { return self._s[1851]! } + public var UserInfo_TapToCall: String { return self._s[1852]! } + public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[1854]! } + public var AutoDownloadSettings_DataUsageCustom: String { return self._s[1855]! } + public var Common_Search: String { return self._s[1856]! } + public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1857]! } public func Channel_AdminLog_MessageChangedGroupGeoLocation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1842]!, self._r[1842]!, [_0]) + return formatWithArgumentRanges(self._s[1858]!, self._r[1858]!, [_0]) } - public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1843]! } - public var Message_InvoiceLabel: String { return self._s[1844]! } - public var Conversation_InputTextPlaceholder: String { return self._s[1845]! } - public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1846]! } + public var Wallet_Month_ShortJuly: String { return self._s[1859]! } + public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1860]! } + public var Message_InvoiceLabel: String { return self._s[1861]! } + public var Conversation_InputTextPlaceholder: String { return self._s[1862]! } + public var NetworkUsageSettings_MediaImageDataSection: String { return self._s[1863]! } public func Passport_Address_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1847]!, self._r[1847]!, [_0]) + return formatWithArgumentRanges(self._s[1864]!, self._r[1864]!, [_0]) } - public var Conversation_Info: String { return self._s[1848]! } - public var Login_InfoDeletePhoto: String { return self._s[1849]! } - public var Passport_Language_vi: String { return self._s[1851]! } - public var UserInfo_ScamUserWarning: String { return self._s[1852]! } - public var Conversation_Search: String { return self._s[1853]! } - public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1855]! } - public func Updated_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1856]!, self._r[1856]!, [_0]) - } - public var ReportPeer_ReasonPornography: String { return self._s[1857]! } - public var AutoDownloadSettings_PhotosTitle: String { return self._s[1858]! } - public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1859]! } - public var Map_LiveLocationGroupDescription: String { return self._s[1860]! } - public var Channel_Setup_TypeHeader: String { return self._s[1861]! } - public var AuthSessions_LoggedIn: String { return self._s[1862]! } - public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1863]! } - public var Login_SmsRequestState3: String { return self._s[1864]! } - public var Passport_Address_EditUtilityBill: String { return self._s[1865]! } - public var Appearance_ReduceMotionInfo: String { return self._s[1866]! } - public var Join_ChannelsTooMuch: String { return self._s[1867]! } - public var Channel_Edit_LinkItem: String { return self._s[1868]! } - public var Privacy_Calls_P2PNever: String { return self._s[1869]! } - public var Conversation_AddToReadingList: String { return self._s[1871]! } - public var Share_MultipleMessagesDisabled: String { return self._s[1872]! } - public var Message_Animation: String { return self._s[1873]! } - public var Conversation_DefaultRestrictedMedia: String { return self._s[1874]! } - public var Map_Unknown: String { return self._s[1875]! } - public var AutoDownloadSettings_LastDelimeter: String { return self._s[1876]! } + public var Conversation_Info: String { return self._s[1865]! } + public var Login_InfoDeletePhoto: String { return self._s[1866]! } + public var Passport_Language_vi: String { return self._s[1868]! } + public var UserInfo_ScamUserWarning: String { return self._s[1869]! } + public var Conversation_Search: String { return self._s[1870]! } + public var DialogList_DeleteBotConversationConfirmation: String { return self._s[1872]! } + public var ReportPeer_ReasonPornography: String { return self._s[1873]! } + public var AutoDownloadSettings_PhotosTitle: String { return self._s[1874]! } + public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[1875]! } + public var Map_LiveLocationGroupDescription: String { return self._s[1876]! } + public var Channel_Setup_TypeHeader: String { return self._s[1877]! } + public var AuthSessions_LoggedIn: String { return self._s[1878]! } + public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[1879]! } + public var Login_SmsRequestState3: String { return self._s[1880]! } + public var Passport_Address_EditUtilityBill: String { return self._s[1881]! } + public var Appearance_ReduceMotionInfo: String { return self._s[1882]! } + public var Join_ChannelsTooMuch: String { return self._s[1883]! } + public var Channel_Edit_LinkItem: String { return self._s[1884]! } + public var Privacy_Calls_P2PNever: String { return self._s[1885]! } + public var Conversation_AddToReadingList: String { return self._s[1887]! } + public var Share_MultipleMessagesDisabled: String { return self._s[1888]! } + public var Message_Animation: String { return self._s[1889]! } + public var Conversation_DefaultRestrictedMedia: String { return self._s[1890]! } + public var Map_Unknown: String { return self._s[1891]! } + public var AutoDownloadSettings_LastDelimeter: String { return self._s[1892]! } public func PUSH_PINNED_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1877]!, self._r[1877]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1893]!, self._r[1893]!, [_1, _2]) } public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1878]!, self._r[1878]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1894]!, self._r[1894]!, [_1, _2]) } - public var Call_StatusRequesting: String { return self._s[1879]! } - public var Conversation_SecretChatContextBotAlert: String { return self._s[1880]! } - public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1881]! } + public var Call_StatusRequesting: String { return self._s[1895]! } + public var Conversation_SecretChatContextBotAlert: String { return self._s[1896]! } + public var SocksProxySetup_ProxyStatusChecking: String { return self._s[1897]! } public func PUSH_CHAT_MESSAGE_DOC(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1882]!, self._r[1882]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1898]!, self._r[1898]!, [_1, _2]) } public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1883]!, self._r[1883]!, [_0]) + return formatWithArgumentRanges(self._s[1899]!, self._r[1899]!, [_0]) } - public var Update_Skip: String { return self._s[1884]! } - public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1885]! } - public var Message_PinnedPollMessage: String { return self._s[1886]! } - public var BlockedUsers_Title: String { return self._s[1887]! } + public var Update_Skip: String { return self._s[1900]! } + public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[1901]! } + public var Message_PinnedPollMessage: String { return self._s[1902]! } + public var BlockedUsers_Title: String { return self._s[1903]! } public func PUSH_CHANNEL_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1888]!, self._r[1888]!, [_1]) + return formatWithArgumentRanges(self._s[1904]!, self._r[1904]!, [_1]) } - public var Username_CheckingUsername: String { return self._s[1889]! } - public var NotificationsSound_Bell: String { return self._s[1890]! } - public var Conversation_SendMessageErrorFlood: String { return self._s[1891]! } - public var Weekday_Monday: String { return self._s[1892]! } - public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1893]! } - public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1894]! } - public var ChatSettings_Groups: String { return self._s[1895]! } + public var Username_CheckingUsername: String { return self._s[1905]! } + public var NotificationsSound_Bell: String { return self._s[1906]! } + public var Conversation_SendMessageErrorFlood: String { return self._s[1907]! } + public var Weekday_Monday: String { return self._s[1908]! } + public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[1909]! } + public var ChannelMembers_ChannelAdminsTitle: String { return self._s[1910]! } + public var ChatSettings_Groups: String { return self._s[1911]! } public func Conversation_SetReminder_RemindTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1896]!, self._r[1896]!, [_0]) + return formatWithArgumentRanges(self._s[1912]!, self._r[1912]!, [_0]) } - public var Your_card_was_declined: String { return self._s[1897]! } - public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1899]! } - public var ChatList_Unmute: String { return self._s[1900]! } - public var PhotoEditor_CurvesAll: String { return self._s[1901]! } - public var Weekday_ShortTuesday: String { return self._s[1902]! } - public var DialogList_Read: String { return self._s[1903]! } - public var Appearance_AppIconClassic: String { return self._s[1904]! } - public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1905]! } - public var Passport_Identity_Gender: String { return self._s[1906]! } + public var Your_card_was_declined: String { return self._s[1913]! } + public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1915]! } + public var Wallet_Month_ShortApril: String { return self._s[1916]! } + public var ChatList_Unmute: String { return self._s[1917]! } + public var PhotoEditor_CurvesAll: String { return self._s[1918]! } + public var Weekday_ShortTuesday: String { return self._s[1919]! } + public var DialogList_Read: String { return self._s[1920]! } + public var Appearance_AppIconClassic: String { return self._s[1921]! } + public var ChannelMembers_WhoCanAddMembers_AllMembers: String { return self._s[1922]! } + public var Passport_Identity_Gender: String { return self._s[1923]! } public func Target_ShareGameConfirmationPrivate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1907]!, self._r[1907]!, [_0]) + return formatWithArgumentRanges(self._s[1924]!, self._r[1924]!, [_0]) } - public var Target_SelectGroup: String { return self._s[1908]! } + public var Target_SelectGroup: String { return self._s[1925]! } public func DialogList_EncryptedChatStartedIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1910]!, self._r[1910]!, [_0]) + return formatWithArgumentRanges(self._s[1927]!, self._r[1927]!, [_0]) } - public var Passport_Language_en: String { return self._s[1911]! } - public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1912]! } - public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1913]! } - public var Login_CancelPhoneVerificationContinue: String { return self._s[1914]! } - public var ScheduledMessages_SendNow: String { return self._s[1915]! } - public var Checkout_NewCard_PaymentCard: String { return self._s[1917]! } - public var Login_InfoHelp: String { return self._s[1918]! } - public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1919]! } - public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1920]! } + public var Passport_Language_en: String { return self._s[1928]! } + public var AutoDownloadSettings_AutodownloadPhotos: String { return self._s[1929]! } + public var Channel_Username_CreatePublicLinkHelp: String { return self._s[1930]! } + public var Login_CancelPhoneVerificationContinue: String { return self._s[1931]! } + public var ScheduledMessages_SendNow: String { return self._s[1932]! } + public var Checkout_NewCard_PaymentCard: String { return self._s[1934]! } + public var Login_InfoHelp: String { return self._s[1935]! } + public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1936]! } + public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[1937]! } public func Channel_AdminLog_MessageChangedLinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1921]!, self._r[1921]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1938]!, self._r[1938]!, [_1, _2]) } - public var SocksProxySetup_AddProxy: String { return self._s[1924]! } - public var CreatePoll_Title: String { return self._s[1925]! } - public var Conversation_ViewTheme: String { return self._s[1926]! } - public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1927]! } - public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1928]! } - public var UserInfo_GroupsInCommon: String { return self._s[1929]! } - public var Call_AudioRouteHide: String { return self._s[1930]! } - public var ContactInfo_PhoneLabelMobile: String { return self._s[1932]! } + public var SocksProxySetup_AddProxy: String { return self._s[1941]! } + public var CreatePoll_Title: String { return self._s[1942]! } + public var Conversation_ViewTheme: String { return self._s[1943]! } + public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[1944]! } + public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[1945]! } + public var UserInfo_GroupsInCommon: String { return self._s[1946]! } + public var Call_AudioRouteHide: String { return self._s[1947]! } + public func Wallet_Info_TransactionDateHeader(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1949]!, self._r[1949]!, [_1, _2]) + } + public var ContactInfo_PhoneLabelMobile: String { return self._s[1950]! } public func ChatList_LeaveGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1933]!, self._r[1933]!, [_0]) + return formatWithArgumentRanges(self._s[1951]!, self._r[1951]!, [_0]) } - public var TextFormat_Bold: String { return self._s[1934]! } - public var FastTwoStepSetup_EmailSection: String { return self._s[1935]! } - public var Notifications_Title: String { return self._s[1936]! } - public var Group_Username_InvalidTooShort: String { return self._s[1937]! } - public var Channel_ErrorAddTooMuch: String { return self._s[1938]! } + public var TextFormat_Bold: String { return self._s[1952]! } + public var FastTwoStepSetup_EmailSection: String { return self._s[1953]! } + public var Notifications_Title: String { return self._s[1954]! } + public var Group_Username_InvalidTooShort: String { return self._s[1955]! } + public var Channel_ErrorAddTooMuch: String { return self._s[1956]! } public func DialogList_MultipleTypingSuffix(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1939]!, self._r[1939]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1957]!, self._r[1957]!, ["\(_0)"]) } - public var VoiceOver_DiscardPreparedContent: String { return self._s[1941]! } - public var Stickers_SuggestAdded: String { return self._s[1942]! } - public var Login_CountryCode: String { return self._s[1943]! } - public var ChatSettings_AutoPlayVideos: String { return self._s[1944]! } - public var Map_GetDirections: String { return self._s[1945]! } - public var Wallet_Receive_ShareInvoiceUrl: String { return self._s[1946]! } - public var Login_PhoneFloodError: String { return self._s[1947]! } + public var VoiceOver_DiscardPreparedContent: String { return self._s[1959]! } + public var Stickers_SuggestAdded: String { return self._s[1960]! } + public var Login_CountryCode: String { return self._s[1961]! } + public var ChatSettings_AutoPlayVideos: String { return self._s[1962]! } + public var Map_GetDirections: String { return self._s[1963]! } + public var Wallet_Receive_ShareInvoiceUrl: String { return self._s[1964]! } + public var Login_PhoneFloodError: String { return self._s[1965]! } public func Time_MonthOfYear_m3(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1948]!, self._r[1948]!, [_0]) + return formatWithArgumentRanges(self._s[1966]!, self._r[1966]!, [_0]) } - public var Settings_SetUsername: String { return self._s[1950]! } - public var Group_Location_ChangeLocation: String { return self._s[1951]! } - public var Notification_GroupInviterSelf: String { return self._s[1952]! } - public var InstantPage_TapToOpenLink: String { return self._s[1953]! } + public func Wallet_Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1967]!, self._r[1967]!, [_1, _2, _3]) + } + public var Settings_SetUsername: String { return self._s[1969]! } + public var Group_Location_ChangeLocation: String { return self._s[1970]! } + public var Notification_GroupInviterSelf: String { return self._s[1971]! } + public var InstantPage_TapToOpenLink: String { return self._s[1972]! } public func Notification_ChannelInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1954]!, self._r[1954]!, [_0]) + return formatWithArgumentRanges(self._s[1973]!, self._r[1973]!, [_0]) } - public var Watch_Suggestion_TalkLater: String { return self._s[1955]! } - public var SecretChat_Title: String { return self._s[1956]! } - public var Group_UpgradeNoticeText1: String { return self._s[1957]! } - public var AuthSessions_Title: String { return self._s[1958]! } + public var Watch_Suggestion_TalkLater: String { return self._s[1974]! } + public var SecretChat_Title: String { return self._s[1975]! } + public var Group_UpgradeNoticeText1: String { return self._s[1976]! } + public var AuthSessions_Title: String { return self._s[1977]! } public func TextFormat_AddLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1959]!, self._r[1959]!, [_0]) + return formatWithArgumentRanges(self._s[1978]!, self._r[1978]!, [_0]) } - public var PhotoEditor_CropAuto: String { return self._s[1960]! } - public var Channel_About_Title: String { return self._s[1961]! } - public var FastTwoStepSetup_EmailHelp: String { return self._s[1962]! } + public var PhotoEditor_CropAuto: String { return self._s[1979]! } + public var Channel_About_Title: String { return self._s[1980]! } + public var FastTwoStepSetup_EmailHelp: String { return self._s[1981]! } public func Conversation_Bytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1964]!, self._r[1964]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1983]!, self._r[1983]!, ["\(_0)"]) } - public var VoiceOver_MessageContextReport: String { return self._s[1965]! } - public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1967]! } - public var Group_Setup_HistoryVisibleHelp: String { return self._s[1968]! } + public var VoiceOver_MessageContextReport: String { return self._s[1984]! } + public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1986]! } + public var Group_Setup_HistoryVisibleHelp: String { return self._s[1987]! } public func PUSH_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1969]!, self._r[1969]!, [_1]) + return formatWithArgumentRanges(self._s[1988]!, self._r[1988]!, [_1]) } public func SharedMedia_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1971]!, self._r[1971]!, [_0]) - } - public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1972]!, self._r[1972]!, [_0]) - } - public var Privacy_PaymentsClearInfoHelp: String { return self._s[1973]! } - public var Presence_online: String { return self._s[1975]! } - public var PasscodeSettings_Title: String { return self._s[1976]! } - public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1977]! } - public var Web_OpenExternal: String { return self._s[1978]! } - public var AutoDownloadSettings_AutoDownload: String { return self._s[1980]! } - public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[1981]! } - public var LocalGroup_Title: String { return self._s[1982]! } - public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1983]!, self._r[1983]!, [_0]) - } - public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[1984]! } - public var Map_YouAreHere: String { return self._s[1985]! } - public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1986]!, self._r[1986]!, [_0]) - } - public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1987]!, self._r[1987]!, [_0]) - } - public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[1988]! } - public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[1989]! } - public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1990]!, self._r[1990]!, [_0]) } - public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { + public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1991]!, self._r[1991]!, [_0]) } - public var SocksProxySetup_Username: String { return self._s[1992]! } - public var Bot_Start: String { return self._s[1993]! } + public var Privacy_PaymentsClearInfoHelp: String { return self._s[1992]! } + public var Presence_online: String { return self._s[1995]! } + public var PasscodeSettings_Title: String { return self._s[1996]! } + public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1997]! } + public var Web_OpenExternal: String { return self._s[1998]! } + public var AutoDownloadSettings_AutoDownload: String { return self._s[2000]! } + public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[2001]! } + public var LocalGroup_Title: String { return self._s[2002]! } + public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2003]!, self._r[2003]!, [_0]) + } + public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[2004]! } + public var Map_YouAreHere: String { return self._s[2005]! } + public func AuthSessions_Message(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2006]!, self._r[2006]!, [_0]) + } + public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2007]!, self._r[2007]!, [_0]) + } + public var PrivacyLastSeenSettings_AlwaysShareWith: String { return self._s[2008]! } + public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[2009]! } + public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2010]!, self._r[2010]!, [_0]) + } + public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2011]!, self._r[2011]!, [_0]) + } + public var SocksProxySetup_Username: String { return self._s[2012]! } + public var Bot_Start: String { return self._s[2013]! } public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1994]!, self._r[1994]!, [_0]) + return formatWithArgumentRanges(self._s[2014]!, self._r[2014]!, [_0]) } public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1995]!, self._r[1995]!, [_0]) + return formatWithArgumentRanges(self._s[2015]!, self._r[2015]!, [_0]) } - public var Contacts_SortByPresence: String { return self._s[1996]! } - public var AccentColor_Title: String { return self._s[1998]! } - public var Conversation_DiscardVoiceMessageTitle: String { return self._s[1999]! } + public var Contacts_SortByPresence: String { return self._s[2016]! } + public var AccentColor_Title: String { return self._s[2018]! } + public var Conversation_DiscardVoiceMessageTitle: String { return self._s[2019]! } public func PUSH_CHAT_CREATED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2000]!, self._r[2000]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2020]!, self._r[2020]!, [_1, _2]) } public func PrivacySettings_LastSeenContactsMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2001]!, self._r[2001]!, [_0]) + return formatWithArgumentRanges(self._s[2021]!, self._r[2021]!, [_0]) } public func Channel_AdminLog_MessageChangedLinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2002]!, self._r[2002]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2022]!, self._r[2022]!, [_1, _2]) } - public var Passport_Email_EnterOtherEmail: String { return self._s[2003]! } - public var Login_InfoAvatarPhoto: String { return self._s[2004]! } - public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[2005]! } - public var Tour_Title4: String { return self._s[2006]! } - public var Passport_Identity_Translation: String { return self._s[2007]! } - public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[2008]! } - public var Login_TermsOfServiceLabel: String { return self._s[2010]! } - public var Passport_Language_it: String { return self._s[2011]! } - public var KeyCommand_JumpToNextUnreadChat: String { return self._s[2012]! } - public var Passport_Identity_SelfieHelp: String { return self._s[2013]! } - public var Conversation_ClearAll: String { return self._s[2015]! } - public var Wallet_Send_UninitializedText: String { return self._s[2017]! } - public var Channel_OwnershipTransfer_Title: String { return self._s[2018]! } - public var TwoStepAuth_FloodError: String { return self._s[2019]! } + public var Passport_Email_EnterOtherEmail: String { return self._s[2023]! } + public var Login_InfoAvatarPhoto: String { return self._s[2024]! } + public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[2025]! } + public var Tour_Title4: String { return self._s[2026]! } + public var Passport_Identity_Translation: String { return self._s[2027]! } + public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[2028]! } + public var Login_TermsOfServiceLabel: String { return self._s[2030]! } + public var Passport_Language_it: String { return self._s[2031]! } + public var KeyCommand_JumpToNextUnreadChat: String { return self._s[2032]! } + public var Passport_Identity_SelfieHelp: String { return self._s[2033]! } + public var Conversation_ClearAll: String { return self._s[2035]! } + public var Wallet_Send_UninitializedText: String { return self._s[2037]! } + public var Channel_OwnershipTransfer_Title: String { return self._s[2038]! } + public var TwoStepAuth_FloodError: String { return self._s[2039]! } public func PUSH_CHANNEL_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2020]!, self._r[2020]!, [_1]) + return formatWithArgumentRanges(self._s[2040]!, self._r[2040]!, [_1]) } - public var Paint_Delete: String { return self._s[2021]! } + public var Paint_Delete: String { return self._s[2041]! } public func Wallet_Sent_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2022]!, self._r[2022]!, [_0]) + return formatWithArgumentRanges(self._s[2042]!, self._r[2042]!, [_0]) } - public var Privacy_AddNewPeer: String { return self._s[2023]! } + public var Privacy_AddNewPeer: String { return self._s[2043]! } public func Channel_AdminLog_MessageRank(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2024]!, self._r[2024]!, [_1]) + return formatWithArgumentRanges(self._s[2044]!, self._r[2044]!, [_1]) } - public var LogoutOptions_SetPasscodeText: String { return self._s[2025]! } + public var LogoutOptions_SetPasscodeText: String { return self._s[2045]! } public func Passport_AcceptHelp(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2026]!, self._r[2026]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2046]!, self._r[2046]!, [_1, _2]) } - public var Message_PinnedAudioMessage: String { return self._s[2027]! } + public var Message_PinnedAudioMessage: String { return self._s[2047]! } public func Watch_Time_ShortTodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2028]!, self._r[2028]!, [_0]) + return formatWithArgumentRanges(self._s[2048]!, self._r[2048]!, [_0]) } - public var Notification_Mute1hMin: String { return self._s[2029]! } - public var Notifications_GroupNotificationsSound: String { return self._s[2030]! } - public var SocksProxySetup_ShareProxyList: String { return self._s[2031]! } - public var Conversation_MessageEditedLabel: String { return self._s[2032]! } - public var Notification_Exceptions_AlwaysOff: String { return self._s[2033]! } - public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[2034]! } + public var Notification_Mute1hMin: String { return self._s[2049]! } + public var Notifications_GroupNotificationsSound: String { return self._s[2050]! } + public var Wallet_Month_GenNovember: String { return self._s[2051]! } + public var SocksProxySetup_ShareProxyList: String { return self._s[2052]! } + public var Conversation_MessageEditedLabel: String { return self._s[2053]! } + public var Notification_Exceptions_AlwaysOff: String { return self._s[2054]! } + public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[2055]! } public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2035]!, self._r[2035]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[2056]!, self._r[2056]!, [_0, _1, _2]) } - public var NetworkUsageSettings_ResetStats: String { return self._s[2036]! } + public var NetworkUsageSettings_ResetStats: String { return self._s[2057]! } public func PUSH_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2037]!, self._r[2037]!, [_1]) + return formatWithArgumentRanges(self._s[2058]!, self._r[2058]!, [_1]) } - public var AccessDenied_LocationTracking: String { return self._s[2038]! } - public var Month_GenOctober: String { return self._s[2039]! } - public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[2040]! } - public var EnterPasscode_EnterPasscode: String { return self._s[2041]! } - public var MediaPicker_TimerTooltip: String { return self._s[2043]! } - public var SharedMedia_TitleAll: String { return self._s[2044]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[2047]! } - public var Conversation_RestrictedMedia: String { return self._s[2048]! } - public var AccessDenied_PhotosRestricted: String { return self._s[2049]! } - public var Privacy_Forwards_WhoCanForward: String { return self._s[2051]! } - public var ChangePhoneNumberCode_Called: String { return self._s[2052]! } + public var AccessDenied_LocationTracking: String { return self._s[2059]! } + public var Month_GenOctober: String { return self._s[2060]! } + public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[2061]! } + public var EnterPasscode_EnterPasscode: String { return self._s[2062]! } + public var MediaPicker_TimerTooltip: String { return self._s[2064]! } + public var SharedMedia_TitleAll: String { return self._s[2065]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsExceptions: String { return self._s[2068]! } + public var Conversation_RestrictedMedia: String { return self._s[2069]! } + public var AccessDenied_PhotosRestricted: String { return self._s[2070]! } + public var Privacy_Forwards_WhoCanForward: String { return self._s[2072]! } + public var ChangePhoneNumberCode_Called: String { return self._s[2073]! } public func Notification_PinnedDocumentMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2053]!, self._r[2053]!, [_0]) + return formatWithArgumentRanges(self._s[2074]!, self._r[2074]!, [_0]) } - public var Conversation_SavedMessages: String { return self._s[2056]! } - public var Your_cards_expiration_month_is_invalid: String { return self._s[2058]! } - public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[2059]! } + public var Conversation_SavedMessages: String { return self._s[2077]! } + public var Your_cards_expiration_month_is_invalid: String { return self._s[2079]! } + public var FastTwoStepSetup_PasswordPlaceholder: String { return self._s[2080]! } public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2061]!, self._r[2061]!, [_0]) + return formatWithArgumentRanges(self._s[2082]!, self._r[2082]!, [_0]) } - public var VoiceOver_Chat_YourMessage: String { return self._s[2062]! } + public var VoiceOver_Chat_YourMessage: String { return self._s[2083]! } public func VoiceOver_Chat_Title(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2063]!, self._r[2063]!, [_0]) + return formatWithArgumentRanges(self._s[2084]!, self._r[2084]!, [_0]) } - public var ReportPeer_AlertSuccess: String { return self._s[2064]! } - public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[2065]! } + public var ReportPeer_AlertSuccess: String { return self._s[2085]! } + public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[2086]! } public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2066]!, self._r[2066]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2087]!, self._r[2087]!, [_1, _2]) } - public var Checkout_PasswordEntry_Title: String { return self._s[2067]! } - public var PhotoEditor_FadeTool: String { return self._s[2068]! } - public var Privacy_ContactsReset: String { return self._s[2069]! } + public var Checkout_PasswordEntry_Title: String { return self._s[2088]! } + public var PhotoEditor_FadeTool: String { return self._s[2089]! } + public var Privacy_ContactsReset: String { return self._s[2090]! } public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2071]!, self._r[2071]!, [_0]) + return formatWithArgumentRanges(self._s[2092]!, self._r[2092]!, [_0]) } - public var Message_PinnedVideoMessage: String { return self._s[2072]! } - public var ChatList_Mute: String { return self._s[2073]! } - public var Permissions_CellularDataText_v0: String { return self._s[2074]! } - public var ShareMenu_SelectChats: String { return self._s[2077]! } - public var ChatList_Context_Unarchive: String { return self._s[2078]! } - public var MusicPlayer_VoiceNote: String { return self._s[2079]! } - public var Conversation_RestrictedText: String { return self._s[2080]! } - public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[2081]! } - public var TwoStepAuth_DisableSuccess: String { return self._s[2082]! } - public var Cache_Videos: String { return self._s[2083]! } - public var PrivacySettings_PhoneNumber: String { return self._s[2084]! } - public var FeatureDisabled_Oops: String { return self._s[2086]! } - public var Passport_Address_PostcodePlaceholder: String { return self._s[2087]! } + public var Message_PinnedVideoMessage: String { return self._s[2093]! } + public var ChatList_Mute: String { return self._s[2094]! } + public func Wallet_Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2095]!, self._r[2095]!, [_1, _2, _3]) + } + public var Permissions_CellularDataText_v0: String { return self._s[2096]! } + public var ShareMenu_SelectChats: String { return self._s[2099]! } + public var ChatList_Context_Unarchive: String { return self._s[2100]! } + public var MusicPlayer_VoiceNote: String { return self._s[2101]! } + public var Conversation_RestrictedText: String { return self._s[2102]! } + public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[2103]! } + public var Wallet_Month_GenApril: String { return self._s[2104]! } + public var Wallet_Month_ShortMarch: String { return self._s[2105]! } + public var TwoStepAuth_DisableSuccess: String { return self._s[2106]! } + public var Cache_Videos: String { return self._s[2107]! } + public var PrivacySettings_PhoneNumber: String { return self._s[2108]! } + public var Wallet_Month_GenFebruary: String { return self._s[2109]! } + public var FeatureDisabled_Oops: String { return self._s[2111]! } + public var Passport_Address_PostcodePlaceholder: String { return self._s[2112]! } public func AddContact_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2088]!, self._r[2088]!, [_0]) + return formatWithArgumentRanges(self._s[2113]!, self._r[2113]!, [_0]) } - public var Stickers_GroupStickersHelp: String { return self._s[2089]! } - public var GroupPermission_NoSendPolls: String { return self._s[2090]! } - public var Wallet_Qr_ScanCode: String { return self._s[2091]! } - public var Message_VideoExpired: String { return self._s[2093]! } - public var Notifications_Badge: String { return self._s[2094]! } - public var GroupInfo_GroupHistoryVisible: String { return self._s[2095]! } - public var Wallet_Receive_AddressCopied: String { return self._s[2096]! } - public var CreatePoll_OptionPlaceholder: String { return self._s[2097]! } - public var Username_InvalidTooShort: String { return self._s[2098]! } - public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[2099]! } - public var Channel_AdminLog_PinMessages: String { return self._s[2100]! } - public var ArchivedChats_IntroTitle3: String { return self._s[2101]! } + public var Stickers_GroupStickersHelp: String { return self._s[2114]! } + public var GroupPermission_NoSendPolls: String { return self._s[2115]! } + public var Wallet_Qr_ScanCode: String { return self._s[2116]! } + public var Message_VideoExpired: String { return self._s[2118]! } + public var Notifications_Badge: String { return self._s[2119]! } + public var GroupInfo_GroupHistoryVisible: String { return self._s[2120]! } + public var Wallet_Receive_AddressCopied: String { return self._s[2121]! } + public var CreatePoll_OptionPlaceholder: String { return self._s[2122]! } + public var Username_InvalidTooShort: String { return self._s[2123]! } + public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[2124]! } + public var Channel_AdminLog_PinMessages: String { return self._s[2125]! } + public var ArchivedChats_IntroTitle3: String { return self._s[2126]! } public func Notification_MessageLifetimeRemoved(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2102]!, self._r[2102]!, [_1]) + return formatWithArgumentRanges(self._s[2127]!, self._r[2127]!, [_1]) } - public var Permissions_SiriAllowInSettings_v0: String { return self._s[2103]! } - public var Conversation_DefaultRestrictedText: String { return self._s[2104]! } - public var SharedMedia_CategoryDocs: String { return self._s[2107]! } + public var Permissions_SiriAllowInSettings_v0: String { return self._s[2128]! } + public var Conversation_DefaultRestrictedText: String { return self._s[2129]! } + public var SharedMedia_CategoryDocs: String { return self._s[2132]! } public func PUSH_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2108]!, self._r[2108]!, [_1]) + return formatWithArgumentRanges(self._s[2133]!, self._r[2133]!, [_1]) } - public var Wallet_Send_UninitializedTitle: String { return self._s[2109]! } - public var Privacy_Forwards_NeverLink: String { return self._s[2111]! } + public var Wallet_Send_UninitializedTitle: String { return self._s[2134]! } + public var Privacy_Forwards_NeverLink: String { return self._s[2136]! } public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2112]!, self._r[2112]!, [_1]) + return formatWithArgumentRanges(self._s[2137]!, self._r[2137]!, [_1]) } - public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2113]! } + public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2138]! } public func Time_MonthOfYear_m12(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2114]!, self._r[2114]!, [_0]) + return formatWithArgumentRanges(self._s[2139]!, self._r[2139]!, [_0]) } - public var ChatSettings_PrivateChats: String { return self._s[2115]! } - public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[2116]! } - public var Conversation_PrivateMessageLinkCopied: String { return self._s[2117]! } - public var Channel_UpdatePhotoItem: String { return self._s[2118]! } - public var GroupInfo_LeftStatus: String { return self._s[2119]! } - public var Watch_MessageView_Forward: String { return self._s[2121]! } - public var ReportPeer_ReasonChildAbuse: String { return self._s[2122]! } - public var Cache_ClearEmpty: String { return self._s[2124]! } - public var Localization_LanguageName: String { return self._s[2125]! } - public var WebSearch_GIFs: String { return self._s[2126]! } - public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2127]! } - public var Username_InvalidStartsWithNumber: String { return self._s[2128]! } - public var Common_Back: String { return self._s[2129]! } - public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2130]! } - public var Wallet_Send_Send: String { return self._s[2131]! } + public var ChatSettings_PrivateChats: String { return self._s[2140]! } + public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[2141]! } + public var Conversation_PrivateMessageLinkCopied: String { return self._s[2142]! } + public var Channel_UpdatePhotoItem: String { return self._s[2143]! } + public var GroupInfo_LeftStatus: String { return self._s[2144]! } + public var Watch_MessageView_Forward: String { return self._s[2146]! } + public var ReportPeer_ReasonChildAbuse: String { return self._s[2147]! } + public var Cache_ClearEmpty: String { return self._s[2149]! } + public var Localization_LanguageName: String { return self._s[2150]! } + public var WebSearch_GIFs: String { return self._s[2151]! } + public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[2152]! } + public var Username_InvalidStartsWithNumber: String { return self._s[2153]! } + public var Common_Back: String { return self._s[2154]! } + public var Passport_Identity_DateOfBirthPlaceholder: String { return self._s[2155]! } + public var Wallet_Send_Send: String { return self._s[2156]! } public func PUSH_CHANNEL_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2132]!, self._r[2132]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2157]!, self._r[2157]!, [_1, _2]) } - public var Wallet_Info_RefreshErrorTitle: String { return self._s[2133]! } - public var Passport_Email_Help: String { return self._s[2134]! } - public var Watch_Conversation_Reply: String { return self._s[2136]! } - public var Conversation_EditingMessageMediaChange: String { return self._s[2138]! } - public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2139]! } - public var Channel_BanUser_Unban: String { return self._s[2141]! } - public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2142]! } - public var Group_Username_CreatePublicLinkHelp: String { return self._s[2143]! } - public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2145]! } - public var Wallet_Send_AddressHeader: String { return self._s[2146]! } - public var Passport_Identity_Name: String { return self._s[2147]! } + public var Wallet_Info_RefreshErrorTitle: String { return self._s[2158]! } + public var Wallet_Month_GenJune: String { return self._s[2159]! } + public var Passport_Email_Help: String { return self._s[2160]! } + public var Watch_Conversation_Reply: String { return self._s[2162]! } + public var Conversation_EditingMessageMediaChange: String { return self._s[2164]! } + public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2165]! } + public var Channel_BanUser_Unban: String { return self._s[2167]! } + public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[2168]! } + public var Group_Username_CreatePublicLinkHelp: String { return self._s[2169]! } + public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[2171]! } + public var Wallet_Send_AddressHeader: String { return self._s[2172]! } + public var Passport_Identity_Name: String { return self._s[2173]! } public func Channel_DiscussionGroup_HeaderGroupSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2148]!, self._r[2148]!, [_0]) + return formatWithArgumentRanges(self._s[2174]!, self._r[2174]!, [_0]) } - public var GroupRemoved_ViewUserInfo: String { return self._s[2149]! } - public var Conversation_BlockUser: String { return self._s[2150]! } - public var Month_GenJanuary: String { return self._s[2151]! } - public var ChatSettings_TextSize: String { return self._s[2152]! } - public var Notification_PassportValuePhone: String { return self._s[2153]! } - public var Passport_Language_ne: String { return self._s[2154]! } - public var Notification_CallBack: String { return self._s[2155]! } - public var Wallet_SecureStorageReset_BiometryTouchId: String { return self._s[2156]! } - public var TwoStepAuth_EmailHelp: String { return self._s[2157]! } + public var GroupRemoved_ViewUserInfo: String { return self._s[2175]! } + public var Conversation_BlockUser: String { return self._s[2176]! } + public var Month_GenJanuary: String { return self._s[2177]! } + public var ChatSettings_TextSize: String { return self._s[2178]! } + public var Notification_PassportValuePhone: String { return self._s[2179]! } + public var Passport_Language_ne: String { return self._s[2180]! } + public var Notification_CallBack: String { return self._s[2181]! } + public var Wallet_SecureStorageReset_BiometryTouchId: String { return self._s[2182]! } + public var TwoStepAuth_EmailHelp: String { return self._s[2183]! } public func Time_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2158]!, self._r[2158]!, [_0]) + return formatWithArgumentRanges(self._s[2184]!, self._r[2184]!, [_0]) } - public var Channel_Info_Management: String { return self._s[2159]! } - public var Passport_FieldIdentityUploadHelp: String { return self._s[2160]! } - public var Stickers_FrequentlyUsed: String { return self._s[2161]! } - public var Channel_BanUser_PermissionSendMessages: String { return self._s[2162]! } - public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2164]! } + public var Channel_Info_Management: String { return self._s[2185]! } + public var Passport_FieldIdentityUploadHelp: String { return self._s[2186]! } + public var Stickers_FrequentlyUsed: String { return self._s[2187]! } + public var Channel_BanUser_PermissionSendMessages: String { return self._s[2188]! } + public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[2190]! } public func LOCAL_CHANNEL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2165]!, self._r[2165]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[2191]!, self._r[2191]!, [_1, "\(_2)"]) } - public var Passport_Address_EditResidentialAddress: String { return self._s[2166]! } - public var PrivacyPolicy_DeclineTitle: String { return self._s[2167]! } - public var CreatePoll_TextHeader: String { return self._s[2168]! } + public var Passport_Address_EditResidentialAddress: String { return self._s[2192]! } + public var PrivacyPolicy_DeclineTitle: String { return self._s[2193]! } + public var CreatePoll_TextHeader: String { return self._s[2194]! } public func Checkout_SavePasswordTimeoutAndTouchId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2169]!, self._r[2169]!, [_0]) + return formatWithArgumentRanges(self._s[2195]!, self._r[2195]!, [_0]) } - public var PhotoEditor_QualityMedium: String { return self._s[2170]! } - public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2171]! } - public var Conversation_StatusKickedFromChannel: String { return self._s[2173]! } - public var CheckoutInfo_ReceiverInfoName: String { return self._s[2174]! } - public var Group_ErrorSendRestrictedStickers: String { return self._s[2175]! } + public var PhotoEditor_QualityMedium: String { return self._s[2196]! } + public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2197]! } + public var Conversation_StatusKickedFromChannel: String { return self._s[2199]! } + public var CheckoutInfo_ReceiverInfoName: String { return self._s[2200]! } + public var Group_ErrorSendRestrictedStickers: String { return self._s[2201]! } public func Conversation_RestrictedInlineTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2176]!, self._r[2176]!, [_0]) + return formatWithArgumentRanges(self._s[2202]!, self._r[2202]!, [_0]) } public func Channel_AdminLog_MessageTransferedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2177]!, self._r[2177]!, [_1]) + return formatWithArgumentRanges(self._s[2203]!, self._r[2203]!, [_1]) } - public var LogoutOptions_LogOutWalletInfo: String { return self._s[2178]! } - public var Conversation_LinkDialogOpen: String { return self._s[2180]! } - public var VoiceOver_Chat_PollNoVotes: String { return self._s[2181]! } - public var Settings_Username: String { return self._s[2183]! } - public var Conversation_Block: String { return self._s[2185]! } - public var Wallpaper_Wallpaper: String { return self._s[2186]! } - public var SocksProxySetup_UseProxy: String { return self._s[2188]! } - public var Wallet_Send_Confirmation: String { return self._s[2189]! } - public var EditTheme_UploadEditedTheme: String { return self._s[2190]! } - public var UserInfo_ShareMyContactInfo: String { return self._s[2191]! } - public var MessageTimer_Forever: String { return self._s[2192]! } - public var Privacy_Calls_WhoCanCallMe: String { return self._s[2193]! } - public var PhotoEditor_DiscardChanges: String { return self._s[2194]! } - public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2195]! } - public var Passport_Language_da: String { return self._s[2196]! } - public var SocksProxySetup_PortPlaceholder: String { return self._s[2197]! } + public var LogoutOptions_LogOutWalletInfo: String { return self._s[2204]! } + public var Conversation_LinkDialogOpen: String { return self._s[2206]! } + public var VoiceOver_Chat_PollNoVotes: String { return self._s[2207]! } + public var Settings_Username: String { return self._s[2209]! } + public var Conversation_Block: String { return self._s[2211]! } + public var Wallpaper_Wallpaper: String { return self._s[2212]! } + public var SocksProxySetup_UseProxy: String { return self._s[2214]! } + public var Wallet_Send_Confirmation: String { return self._s[2215]! } + public var EditTheme_UploadEditedTheme: String { return self._s[2216]! } + public var UserInfo_ShareMyContactInfo: String { return self._s[2217]! } + public var MessageTimer_Forever: String { return self._s[2218]! } + public var Privacy_Calls_WhoCanCallMe: String { return self._s[2219]! } + public var PhotoEditor_DiscardChanges: String { return self._s[2220]! } + public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[2221]! } + public var Passport_Language_da: String { return self._s[2222]! } + public var SocksProxySetup_PortPlaceholder: String { return self._s[2223]! } public func SecretGIF_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2198]!, self._r[2198]!, [_0]) + return formatWithArgumentRanges(self._s[2224]!, self._r[2224]!, [_0]) } - public var Passport_Address_EditPassportRegistration: String { return self._s[2199]! } + public var Passport_Address_EditPassportRegistration: String { return self._s[2225]! } public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2201]!, self._r[2201]!, [_0]) + return formatWithArgumentRanges(self._s[2227]!, self._r[2227]!, [_0]) } - public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2203]! } - public var Conversation_SearchByName_Prefix: String { return self._s[2204]! } - public var Conversation_PinnedPoll: String { return self._s[2205]! } - public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2206]! } + public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[2229]! } + public var Conversation_SearchByName_Prefix: String { return self._s[2230]! } + public var Conversation_PinnedPoll: String { return self._s[2231]! } + public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2232]! } public func PUSH_ENCRYPTION_ACCEPT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2207]!, self._r[2207]!, [_1]) + return formatWithArgumentRanges(self._s[2233]!, self._r[2233]!, [_1]) } - public var WallpaperSearch_ColorPurple: String { return self._s[2208]! } - public var Cache_ByPeerHeader: String { return self._s[2209]! } + public var WallpaperSearch_ColorPurple: String { return self._s[2234]! } + public var Cache_ByPeerHeader: String { return self._s[2235]! } public func Conversation_EncryptedPlaceholderTitleIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2210]!, self._r[2210]!, [_0]) + return formatWithArgumentRanges(self._s[2236]!, self._r[2236]!, [_0]) } - public var ChatSettings_AutoDownloadDocuments: String { return self._s[2211]! } - public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2214]! } - public var Wallet_Completed_Title: String { return self._s[2215]! } - public var Notification_PinnedMessage: String { return self._s[2216]! } - public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2218]! } - public var Contacts_SortBy: String { return self._s[2219]! } + public var ChatSettings_AutoDownloadDocuments: String { return self._s[2237]! } + public var Appearance_ThemePreview_Chat_3_Text: String { return self._s[2240]! } + public var Wallet_Completed_Title: String { return self._s[2241]! } + public var Notification_PinnedMessage: String { return self._s[2242]! } + public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[2244]! } + public var Contacts_SortBy: String { return self._s[2245]! } public func PUSH_CHANNEL_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2220]!, self._r[2220]!, [_1]) + return formatWithArgumentRanges(self._s[2246]!, self._r[2246]!, [_1]) } public func PUSH_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2222]!, self._r[2222]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2248]!, self._r[2248]!, [_1, _2]) } - public var Call_EncryptionKey_Title: String { return self._s[2223]! } - public var Watch_UserInfo_Service: String { return self._s[2224]! } - public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2226]! } - public var Conversation_Unpin: String { return self._s[2228]! } - public var CancelResetAccount_Title: String { return self._s[2229]! } - public var Map_LiveLocationFor15Minutes: String { return self._s[2230]! } + public var Call_EncryptionKey_Title: String { return self._s[2249]! } + public var Watch_UserInfo_Service: String { return self._s[2250]! } + public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[2252]! } + public var Conversation_Unpin: String { return self._s[2254]! } + public var CancelResetAccount_Title: String { return self._s[2255]! } + public var Map_LiveLocationFor15Minutes: String { return self._s[2256]! } public func Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2232]!, self._r[2232]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2258]!, self._r[2258]!, [_1, _2, _3]) } - public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2233]! } - public var CallSettings_Title: String { return self._s[2234]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2235]! } - public var PasscodeSettings_EncryptDataHelp: String { return self._s[2237]! } - public var AutoDownloadSettings_Contacts: String { return self._s[2238]! } + public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[2259]! } + public var CallSettings_Title: String { return self._s[2260]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[2261]! } + public var PasscodeSettings_EncryptDataHelp: String { return self._s[2263]! } + public var AutoDownloadSettings_Contacts: String { return self._s[2264]! } public func Channel_AdminLog_MessageRankName(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2239]!, self._r[2239]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2265]!, self._r[2265]!, [_1, _2]) } - public var Passport_Identity_DocumentDetails: String { return self._s[2240]! } - public var LoginPassword_PasswordHelp: String { return self._s[2241]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2242]! } - public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2243]! } - public var Checkout_TotalPaidAmount: String { return self._s[2244]! } + public var Passport_Identity_DocumentDetails: String { return self._s[2266]! } + public var LoginPassword_PasswordHelp: String { return self._s[2267]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[2268]! } + public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2269]! } + public var Checkout_TotalPaidAmount: String { return self._s[2270]! } public func FileSize_KB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2245]!, self._r[2245]!, [_0]) + return formatWithArgumentRanges(self._s[2271]!, self._r[2271]!, [_0]) } - public var PasscodeSettings_ChangePasscode: String { return self._s[2246]! } - public var Conversation_SecretLinkPreviewAlert: String { return self._s[2248]! } - public var Privacy_SecretChatsLinkPreviews: String { return self._s[2249]! } + public var PasscodeSettings_ChangePasscode: String { return self._s[2272]! } + public var Conversation_SecretLinkPreviewAlert: String { return self._s[2274]! } + public var Privacy_SecretChatsLinkPreviews: String { return self._s[2275]! } public func PUSH_CHANNEL_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2250]!, self._r[2250]!, [_1]) + return formatWithArgumentRanges(self._s[2276]!, self._r[2276]!, [_1]) } - public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2251]! } - public var Contacts_InviteFriends: String { return self._s[2253]! } - public var Map_ChooseLocationTitle: String { return self._s[2254]! } - public var Conversation_StopPoll: String { return self._s[2256]! } + public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[2277]! } + public var Contacts_InviteFriends: String { return self._s[2279]! } + public var Map_ChooseLocationTitle: String { return self._s[2280]! } + public var Conversation_StopPoll: String { return self._s[2282]! } public func WebSearch_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2257]!, self._r[2257]!, [_0]) + return formatWithArgumentRanges(self._s[2283]!, self._r[2283]!, [_0]) } - public var Call_Camera: String { return self._s[2258]! } - public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2259]! } - public var Calls_RatingFeedback: String { return self._s[2260]! } - public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2261]! } - public var NotificationsSound_Pulse: String { return self._s[2262]! } - public var Watch_LastSeen_Lately: String { return self._s[2263]! } - public var ReportGroupLocation_Report: String { return self._s[2266]! } - public var Widget_NoUsers: String { return self._s[2267]! } - public var Conversation_UnvotePoll: String { return self._s[2268]! } - public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2270]! } - public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2271]! } - public var NotificationsSound_Circles: String { return self._s[2272]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2275]! } - public var Wallet_Settings_DeleteWallet: String { return self._s[2276]! } - public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2277]! } - public var Proxy_TooltipUnavailable: String { return self._s[2278]! } - public var Passport_Identity_CountryPlaceholder: String { return self._s[2280]! } - public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2282]! } - public var Conversation_FileDropbox: String { return self._s[2283]! } - public var Notifications_ExceptionsUnmuted: String { return self._s[2284]! } - public var Tour_Text3: String { return self._s[2286]! } - public var Login_ResetAccountProtected_Title: String { return self._s[2288]! } - public var GroupPermission_NoSendMessages: String { return self._s[2289]! } - public var WallpaperSearch_ColorTitle: String { return self._s[2290]! } - public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2291]! } + public var Call_Camera: String { return self._s[2284]! } + public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[2285]! } + public var Calls_RatingFeedback: String { return self._s[2286]! } + public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[2287]! } + public var Wallet_Alert_OK: String { return self._s[2288]! } + public var NotificationsSound_Pulse: String { return self._s[2289]! } + public var Watch_LastSeen_Lately: String { return self._s[2290]! } + public var ReportGroupLocation_Report: String { return self._s[2293]! } + public var Widget_NoUsers: String { return self._s[2294]! } + public var Conversation_UnvotePoll: String { return self._s[2295]! } + public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[2297]! } + public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[2298]! } + public var NotificationsSound_Circles: String { return self._s[2299]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[2302]! } + public var Wallet_Settings_DeleteWallet: String { return self._s[2303]! } + public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2304]! } + public var Proxy_TooltipUnavailable: String { return self._s[2305]! } + public var Passport_Identity_CountryPlaceholder: String { return self._s[2307]! } + public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[2309]! } + public var Conversation_FileDropbox: String { return self._s[2310]! } + public var Notifications_ExceptionsUnmuted: String { return self._s[2311]! } + public var Tour_Text3: String { return self._s[2313]! } + public var Login_ResetAccountProtected_Title: String { return self._s[2315]! } + public var GroupPermission_NoSendMessages: String { return self._s[2316]! } + public var WallpaperSearch_ColorTitle: String { return self._s[2317]! } + public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2318]! } public func Conversation_LiveLocationYouAnd(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2293]!, self._r[2293]!, [_0]) + return formatWithArgumentRanges(self._s[2320]!, self._r[2320]!, [_0]) } - public var GroupInfo_AddParticipantTitle: String { return self._s[2294]! } - public var Checkout_ShippingOption_Title: String { return self._s[2295]! } - public var ChatSettings_AutoDownloadTitle: String { return self._s[2296]! } + public var GroupInfo_AddParticipantTitle: String { return self._s[2321]! } + public var Checkout_ShippingOption_Title: String { return self._s[2322]! } + public var ChatSettings_AutoDownloadTitle: String { return self._s[2323]! } public func DialogList_SingleTypingSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2297]!, self._r[2297]!, [_0]) + return formatWithArgumentRanges(self._s[2324]!, self._r[2324]!, [_0]) } public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2298]!, self._r[2298]!, [_0]) + return formatWithArgumentRanges(self._s[2325]!, self._r[2325]!, [_0]) } - public var Channel_Management_LabelAdministrator: String { return self._s[2299]! } - public var EditTheme_FileReadError: String { return self._s[2300]! } - public var OwnershipTransfer_ComeBackLater: String { return self._s[2301]! } - public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2302]! } - public var AutoDownloadSettings_Photos: String { return self._s[2304]! } - public var Appearance_PreviewIncomingText: String { return self._s[2305]! } - public var ChatList_Context_MarkAllAsRead: String { return self._s[2306]! } - public var ChannelInfo_ConfirmLeave: String { return self._s[2307]! } - public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2308]! } - public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2309]! } - public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2310]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2311]! } - public var GroupInfo_SetGroupPhotoStop: String { return self._s[2312]! } - public var Notification_SecretChatScreenshot: String { return self._s[2313]! } - public var AccessDenied_Wallpapers: String { return self._s[2314]! } - public var ChatList_Context_Mute: String { return self._s[2316]! } - public var Passport_Address_City: String { return self._s[2317]! } - public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2318]! } - public var Appearance_ThemeCarouselClassic: String { return self._s[2319]! } - public var SocksProxySetup_SecretPlaceholder: String { return self._s[2320]! } - public var AccessDenied_LocationDisabled: String { return self._s[2321]! } - public var Group_Location_Title: String { return self._s[2322]! } - public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2324]! } - public var GroupInfo_Sound: String { return self._s[2325]! } - public var ChannelInfo_ScamChannelWarning: String { return self._s[2326]! } - public var Stickers_RemoveFromFavorites: String { return self._s[2327]! } - public var Contacts_Title: String { return self._s[2328]! } - public var EditTheme_ThemeTemplateAlertText: String { return self._s[2329]! } - public var Passport_Language_fr: String { return self._s[2330]! } - public var Notifications_ResetAllNotifications: String { return self._s[2331]! } - public var PrivacySettings_SecurityTitle: String { return self._s[2334]! } - public var Checkout_NewCard_Title: String { return self._s[2335]! } - public var Login_HaveNotReceivedCodeInternal: String { return self._s[2336]! } - public var Conversation_ForwardChats: String { return self._s[2337]! } - public var Wallet_SecureStorageReset_PasscodeText: String { return self._s[2339]! } - public var PasscodeSettings_4DigitCode: String { return self._s[2340]! } - public var Settings_FAQ: String { return self._s[2342]! } - public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2343]! } - public var Conversation_ContextMenuForward: String { return self._s[2344]! } - public var VoiceOver_Chat_YourPhoto: String { return self._s[2347]! } - public var PrivacyPolicy_Title: String { return self._s[2350]! } - public var Notifications_TextTone: String { return self._s[2351]! } - public var Profile_CreateNewContact: String { return self._s[2352]! } - public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2353]! } - public var Call_Speaker: String { return self._s[2355]! } - public var AutoNightTheme_AutomaticSection: String { return self._s[2356]! } - public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2358]! } - public var Channel_Username_InvalidCharacters: String { return self._s[2359]! } + public var Channel_Management_LabelAdministrator: String { return self._s[2326]! } + public var EditTheme_FileReadError: String { return self._s[2327]! } + public var OwnershipTransfer_ComeBackLater: String { return self._s[2328]! } + public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[2329]! } + public var AutoDownloadSettings_Photos: String { return self._s[2331]! } + public var Appearance_PreviewIncomingText: String { return self._s[2332]! } + public var ChatList_Context_MarkAllAsRead: String { return self._s[2333]! } + public var ChannelInfo_ConfirmLeave: String { return self._s[2334]! } + public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[2335]! } + public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2336]! } + public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[2337]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[2338]! } + public var GroupInfo_SetGroupPhotoStop: String { return self._s[2339]! } + public var Notification_SecretChatScreenshot: String { return self._s[2340]! } + public var AccessDenied_Wallpapers: String { return self._s[2341]! } + public var ChatList_Context_Mute: String { return self._s[2343]! } + public var Passport_Address_City: String { return self._s[2344]! } + public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[2345]! } + public var Appearance_ThemeCarouselClassic: String { return self._s[2346]! } + public var SocksProxySetup_SecretPlaceholder: String { return self._s[2347]! } + public var AccessDenied_LocationDisabled: String { return self._s[2348]! } + public var Group_Location_Title: String { return self._s[2349]! } + public var SocksProxySetup_HostnamePlaceholder: String { return self._s[2351]! } + public var GroupInfo_Sound: String { return self._s[2352]! } + public var ChannelInfo_ScamChannelWarning: String { return self._s[2353]! } + public var Stickers_RemoveFromFavorites: String { return self._s[2354]! } + public var Contacts_Title: String { return self._s[2355]! } + public var EditTheme_ThemeTemplateAlertText: String { return self._s[2356]! } + public var Passport_Language_fr: String { return self._s[2357]! } + public var Notifications_ResetAllNotifications: String { return self._s[2358]! } + public var PrivacySettings_SecurityTitle: String { return self._s[2361]! } + public var Checkout_NewCard_Title: String { return self._s[2362]! } + public var Login_HaveNotReceivedCodeInternal: String { return self._s[2363]! } + public var Conversation_ForwardChats: String { return self._s[2364]! } + public var Wallet_SecureStorageReset_PasscodeText: String { return self._s[2366]! } + public var PasscodeSettings_4DigitCode: String { return self._s[2367]! } + public var Settings_FAQ: String { return self._s[2369]! } + public var AutoDownloadSettings_DocumentsTitle: String { return self._s[2370]! } + public var Conversation_ContextMenuForward: String { return self._s[2371]! } + public var VoiceOver_Chat_YourPhoto: String { return self._s[2374]! } + public var PrivacyPolicy_Title: String { return self._s[2377]! } + public var Notifications_TextTone: String { return self._s[2378]! } + public var Profile_CreateNewContact: String { return self._s[2379]! } + public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[2380]! } + public var Call_Speaker: String { return self._s[2382]! } + public var AutoNightTheme_AutomaticSection: String { return self._s[2383]! } + public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2385]! } + public var Channel_Username_InvalidCharacters: String { return self._s[2386]! } public func Channel_AdminLog_MessageChangedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2360]!, self._r[2360]!, [_0]) + return formatWithArgumentRanges(self._s[2387]!, self._r[2387]!, [_0]) } - public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2361]! } - public var PrivacySettings_LastSeenTitle: String { return self._s[2362]! } - public var Channel_AdminLog_CanInviteUsers: String { return self._s[2363]! } - public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2364]! } - public var OwnershipTransfer_SecurityCheck: String { return self._s[2365]! } - public var Conversation_MessageDeliveryFailed: String { return self._s[2366]! } - public var Watch_ChatList_NoConversationsText: String { return self._s[2367]! } - public var Bot_Unblock: String { return self._s[2368]! } - public var TextFormat_Italic: String { return self._s[2369]! } - public var WallpaperSearch_ColorPink: String { return self._s[2370]! } - public var Settings_About_Help: String { return self._s[2371]! } - public var SearchImages_Title: String { return self._s[2372]! } - public var Weekday_Wednesday: String { return self._s[2373]! } - public var Conversation_ClousStorageInfo_Description1: String { return self._s[2374]! } - public var ExplicitContent_AlertTitle: String { return self._s[2375]! } + public var AutoDownloadSettings_AutodownloadFiles: String { return self._s[2388]! } + public var PrivacySettings_LastSeenTitle: String { return self._s[2389]! } + public var Channel_AdminLog_CanInviteUsers: String { return self._s[2390]! } + public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[2391]! } + public var OwnershipTransfer_SecurityCheck: String { return self._s[2392]! } + public var Conversation_MessageDeliveryFailed: String { return self._s[2393]! } + public var Watch_ChatList_NoConversationsText: String { return self._s[2394]! } + public var Bot_Unblock: String { return self._s[2395]! } + public var TextFormat_Italic: String { return self._s[2396]! } + public var WallpaperSearch_ColorPink: String { return self._s[2397]! } + public var Settings_About_Help: String { return self._s[2398]! } + public var SearchImages_Title: String { return self._s[2399]! } + public var Weekday_Wednesday: String { return self._s[2400]! } + public var Conversation_ClousStorageInfo_Description1: String { return self._s[2401]! } + public var ExplicitContent_AlertTitle: String { return self._s[2402]! } public func Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2376]!, self._r[2376]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2403]!, self._r[2403]!, [_1, _2, _3]) } - public var Channel_DiscussionGroup_Create: String { return self._s[2377]! } - public var Weekday_Thursday: String { return self._s[2378]! } - public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2379]! } - public var Channel_Members_AddMembersHelp: String { return self._s[2380]! } + public var Channel_DiscussionGroup_Create: String { return self._s[2404]! } + public var Weekday_Thursday: String { return self._s[2405]! } + public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[2406]! } + public var Channel_Members_AddMembersHelp: String { return self._s[2407]! } public func Checkout_SavePasswordTimeout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2381]!, self._r[2381]!, [_0]) + return formatWithArgumentRanges(self._s[2408]!, self._r[2408]!, [_0]) } - public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2382]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2383]! } - public var Passport_RequestedInformation: String { return self._s[2384]! } - public var Login_PhoneAndCountryHelp: String { return self._s[2385]! } - public var Conversation_EncryptionProcessing: String { return self._s[2387]! } - public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2388]! } - public var PhotoEditor_EnhanceTool: String { return self._s[2390]! } - public var Channel_Setup_Title: String { return self._s[2391]! } - public var Conversation_SearchPlaceholder: String { return self._s[2392]! } - public var AccessDenied_LocationAlwaysDenied: String { return self._s[2393]! } - public var Checkout_ErrorGeneric: String { return self._s[2394]! } - public var Passport_Language_hu: String { return self._s[2395]! } + public var Channel_DiscussionGroup_LinkGroup: String { return self._s[2409]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2410]! } + public var Passport_RequestedInformation: String { return self._s[2411]! } + public var Login_PhoneAndCountryHelp: String { return self._s[2412]! } + public var Conversation_EncryptionProcessing: String { return self._s[2414]! } + public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[2415]! } + public var PhotoEditor_EnhanceTool: String { return self._s[2417]! } + public var Channel_Setup_Title: String { return self._s[2418]! } + public var Conversation_SearchPlaceholder: String { return self._s[2419]! } + public var AccessDenied_LocationAlwaysDenied: String { return self._s[2420]! } + public var Checkout_ErrorGeneric: String { return self._s[2421]! } + public var Passport_Language_hu: String { return self._s[2422]! } + public var Wallet_Month_ShortSeptember: String { return self._s[2423]! } public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2397]!, self._r[2397]!, [_0]) + return formatWithArgumentRanges(self._s[2425]!, self._r[2425]!, [_0]) } public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2400]!, self._r[2400]!, [_1]) + return formatWithArgumentRanges(self._s[2428]!, self._r[2428]!, [_1]) } public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2401]!, self._r[2401]!, [_0]) + return formatWithArgumentRanges(self._s[2429]!, self._r[2429]!, [_0]) } - public var Group_Location_Info: String { return self._s[2402]! } - public var Conversation_CloudStorageInfo_Title: String { return self._s[2403]! } - public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2404]! } - public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2405]! } + public var Group_Location_Info: String { return self._s[2430]! } + public var Conversation_CloudStorageInfo_Title: String { return self._s[2431]! } + public var Permissions_PeopleNearbyAllow_v0: String { return self._s[2432]! } + public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2433]! } public func Notification_Exceptions_MutedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2406]!, self._r[2406]!, [_0]) + return formatWithArgumentRanges(self._s[2434]!, self._r[2434]!, [_0]) } - public var Conversation_ClearPrivateHistory: String { return self._s[2407]! } - public var ContactInfo_PhoneLabelHome: String { return self._s[2408]! } - public var Appearance_RemoveThemeConfirmation: String { return self._s[2409]! } - public var PrivacySettings_LastSeenContacts: String { return self._s[2410]! } + public var Conversation_ClearPrivateHistory: String { return self._s[2435]! } + public var ContactInfo_PhoneLabelHome: String { return self._s[2436]! } + public var Appearance_RemoveThemeConfirmation: String { return self._s[2437]! } + public var PrivacySettings_LastSeenContacts: String { return self._s[2438]! } public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2411]!, self._r[2411]!, [_0]) + return formatWithArgumentRanges(self._s[2439]!, self._r[2439]!, [_0]) } - public var Passport_Language_cs: String { return self._s[2412]! } - public var Message_PinnedAnimationMessage: String { return self._s[2414]! } - public var Passport_Identity_ReverseSideHelp: String { return self._s[2416]! } - public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2417]! } - public var Wallet_Info_TransactionTo: String { return self._s[2419]! } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2420]! } - public var Embed_PlayingInPIP: String { return self._s[2421]! } - public var AutoNightTheme_ScheduleSection: String { return self._s[2422]! } + public var Passport_Language_cs: String { return self._s[2440]! } + public var Message_PinnedAnimationMessage: String { return self._s[2442]! } + public var Passport_Identity_ReverseSideHelp: String { return self._s[2444]! } + public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[2445]! } + public var Wallet_Info_TransactionTo: String { return self._s[2447]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[2448]! } + public var Embed_PlayingInPIP: String { return self._s[2449]! } + public var AutoNightTheme_ScheduleSection: String { return self._s[2450]! } public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2423]!, self._r[2423]!, [_0]) + return formatWithArgumentRanges(self._s[2451]!, self._r[2451]!, [_0]) } - public var MediaPicker_LivePhotoDescription: String { return self._s[2424]! } + public var MediaPicker_LivePhotoDescription: String { return self._s[2452]! } public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2425]!, self._r[2425]!, [_1]) + return formatWithArgumentRanges(self._s[2453]!, self._r[2453]!, [_1]) } - public var Notification_PaymentSent: String { return self._s[2426]! } - public var PhotoEditor_CurvesGreen: String { return self._s[2427]! } - public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2428]! } - public var SaveIncomingPhotosSettings_Title: String { return self._s[2429]! } - public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2430]! } - public var VoiceOver_Chat_PagePreview: String { return self._s[2431]! } + public var Notification_PaymentSent: String { return self._s[2454]! } + public var PhotoEditor_CurvesGreen: String { return self._s[2455]! } + public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[2456]! } + public var SaveIncomingPhotosSettings_Title: String { return self._s[2457]! } + public var NotificationSettings_ShowNotificationsAllAccounts: String { return self._s[2458]! } + public var VoiceOver_Chat_PagePreview: String { return self._s[2459]! } public func PUSH_MESSAGE_SCREENSHOT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2434]!, self._r[2434]!, [_1]) + return formatWithArgumentRanges(self._s[2462]!, self._r[2462]!, [_1]) } public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2435]!, self._r[2435]!, [_1]) + return formatWithArgumentRanges(self._s[2463]!, self._r[2463]!, [_1]) } public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2436]!, self._r[2436]!, [_1]) + return formatWithArgumentRanges(self._s[2464]!, self._r[2464]!, [_1]) } - public var NetworkUsageSettings_CallDataSection: String { return self._s[2438]! } - public var PasscodeSettings_HelpTop: String { return self._s[2439]! } - public var Conversation_WalletRequiredTitle: String { return self._s[2440]! } - public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2441]! } - public var Passport_Address_TypeRentalAgreement: String { return self._s[2442]! } - public var EditTheme_ShortLink: String { return self._s[2443]! } - public var ProxyServer_VoiceOver_Active: String { return self._s[2444]! } - public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2445]! } - public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2446]! } - public var Call_Accept: String { return self._s[2448]! } - public var GroupRemoved_RemoveInfo: String { return self._s[2449]! } - public var Month_GenMarch: String { return self._s[2451]! } - public var PhotoEditor_ShadowsTool: String { return self._s[2452]! } - public var LoginPassword_Title: String { return self._s[2453]! } - public var Call_End: String { return self._s[2454]! } - public var Watch_Conversation_GroupInfo: String { return self._s[2455]! } - public var VoiceOver_Chat_Contact: String { return self._s[2456]! } - public var EditTheme_Create_Preview_IncomingText: String { return self._s[2457]! } - public var CallSettings_Always: String { return self._s[2458]! } - public var CallFeedback_Success: String { return self._s[2459]! } - public var TwoStepAuth_SetupHint: String { return self._s[2460]! } + public var NetworkUsageSettings_CallDataSection: String { return self._s[2466]! } + public var PasscodeSettings_HelpTop: String { return self._s[2467]! } + public var Conversation_WalletRequiredTitle: String { return self._s[2468]! } + public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2469]! } + public var Passport_Address_TypeRentalAgreement: String { return self._s[2470]! } + public var EditTheme_ShortLink: String { return self._s[2471]! } + public var ProxyServer_VoiceOver_Active: String { return self._s[2472]! } + public var ReportPeer_ReasonOther_Placeholder: String { return self._s[2473]! } + public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[2474]! } + public var Call_Accept: String { return self._s[2476]! } + public var GroupRemoved_RemoveInfo: String { return self._s[2477]! } + public var Month_GenMarch: String { return self._s[2479]! } + public var PhotoEditor_ShadowsTool: String { return self._s[2480]! } + public var LoginPassword_Title: String { return self._s[2481]! } + public var Call_End: String { return self._s[2482]! } + public var Watch_Conversation_GroupInfo: String { return self._s[2483]! } + public var VoiceOver_Chat_Contact: String { return self._s[2484]! } + public var EditTheme_Create_Preview_IncomingText: String { return self._s[2485]! } + public var CallSettings_Always: String { return self._s[2486]! } + public var CallFeedback_Success: String { return self._s[2487]! } + public var TwoStepAuth_SetupHint: String { return self._s[2488]! } public func AddContact_ContactWillBeSharedAfterMutual(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2461]!, self._r[2461]!, [_1]) + return formatWithArgumentRanges(self._s[2489]!, self._r[2489]!, [_1]) } - public var ConversationProfile_UsersTooMuchError: String { return self._s[2462]! } - public var Login_PhoneTitle: String { return self._s[2463]! } - public var Passport_FieldPhoneHelp: String { return self._s[2464]! } - public var Weekday_ShortSunday: String { return self._s[2465]! } - public var Passport_InfoFAQ_URL: String { return self._s[2466]! } - public var ContactInfo_Job: String { return self._s[2468]! } - public var UserInfo_InviteBotToGroup: String { return self._s[2469]! } - public var Appearance_ThemeCarouselNightBlue: String { return self._s[2470]! } - public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2471]! } - public var Invite_ChannelsTooMuch: String { return self._s[2472]! } - public var Wallet_Send_ConfirmationConfirm: String { return self._s[2473]! } - public var Wallet_TransactionInfo_OtherFeeInfo: String { return self._s[2474]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2475]! } - public var Wallet_Receive_AmountText: String { return self._s[2476]! } - public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2477]! } - public var CallFeedback_ReasonNoise: String { return self._s[2478]! } - public var Appearance_AppIconDefault: String { return self._s[2480]! } - public var Passport_Identity_AddInternalPassport: String { return self._s[2481]! } - public var MediaPicker_AddCaption: String { return self._s[2482]! } - public var CallSettings_TabIconDescription: String { return self._s[2483]! } + public var ConversationProfile_UsersTooMuchError: String { return self._s[2490]! } + public var Login_PhoneTitle: String { return self._s[2491]! } + public var Passport_FieldPhoneHelp: String { return self._s[2492]! } + public var Weekday_ShortSunday: String { return self._s[2493]! } + public var Passport_InfoFAQ_URL: String { return self._s[2494]! } + public var ContactInfo_Job: String { return self._s[2496]! } + public var UserInfo_InviteBotToGroup: String { return self._s[2497]! } + public var Appearance_ThemeCarouselNightBlue: String { return self._s[2498]! } + public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2499]! } + public var Invite_ChannelsTooMuch: String { return self._s[2500]! } + public var Wallet_Send_ConfirmationConfirm: String { return self._s[2501]! } + public var Wallet_TransactionInfo_OtherFeeInfo: String { return self._s[2502]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsPreview: String { return self._s[2503]! } + public var Wallet_Receive_AmountText: String { return self._s[2504]! } + public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2505]! } + public var CallFeedback_ReasonNoise: String { return self._s[2506]! } + public var Appearance_AppIconDefault: String { return self._s[2508]! } + public var Passport_Identity_AddInternalPassport: String { return self._s[2509]! } + public var MediaPicker_AddCaption: String { return self._s[2510]! } + public var CallSettings_TabIconDescription: String { return self._s[2511]! } public func VoiceOver_Chat_Caption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2484]!, self._r[2484]!, [_0]) + return formatWithArgumentRanges(self._s[2512]!, self._r[2512]!, [_0]) } - public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2485]! } - public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2486]! } - public var Passport_Identity_TypePersonalDetails: String { return self._s[2487]! } - public var DialogList_SearchSectionRecent: String { return self._s[2488]! } - public var PrivacyPolicy_DeclineMessage: String { return self._s[2489]! } - public var LogoutOptions_ClearCacheText: String { return self._s[2492]! } - public var LastSeen_WithinAWeek: String { return self._s[2493]! } - public var ChannelMembers_GroupAdminsTitle: String { return self._s[2494]! } - public var Conversation_CloudStorage_ChatStatus: String { return self._s[2496]! } - public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2497]! } + public var ChatList_UndoArchiveHiddenTitle: String { return self._s[2513]! } + public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[2514]! } + public var Passport_Identity_TypePersonalDetails: String { return self._s[2515]! } + public var DialogList_SearchSectionRecent: String { return self._s[2516]! } + public var PrivacyPolicy_DeclineMessage: String { return self._s[2517]! } + public var LogoutOptions_ClearCacheText: String { return self._s[2520]! } + public var LastSeen_WithinAWeek: String { return self._s[2521]! } + public var ChannelMembers_GroupAdminsTitle: String { return self._s[2522]! } + public var Conversation_CloudStorage_ChatStatus: String { return self._s[2524]! } + public var VoiceOver_Media_PlaybackRateNormal: String { return self._s[2525]! } public func AddContact_SharedContactExceptionInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2498]!, self._r[2498]!, [_0]) + return formatWithArgumentRanges(self._s[2526]!, self._r[2526]!, [_0]) } - public var Passport_Address_TypeResidentialAddress: String { return self._s[2499]! } - public var Conversation_StatusLeftGroup: String { return self._s[2500]! } - public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2501]! } - public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2503]! } - public var GroupPermission_AddSuccess: String { return self._s[2504]! } - public var PhotoEditor_BlurToolRadial: String { return self._s[2506]! } - public var Conversation_ContextMenuCopy: String { return self._s[2507]! } - public var AccessDenied_CallMicrophone: String { return self._s[2508]! } + public var Passport_Address_TypeResidentialAddress: String { return self._s[2527]! } + public var Conversation_StatusLeftGroup: String { return self._s[2528]! } + public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[2529]! } + public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[2531]! } + public var GroupPermission_AddSuccess: String { return self._s[2532]! } + public var PhotoEditor_BlurToolRadial: String { return self._s[2534]! } + public var Conversation_ContextMenuCopy: String { return self._s[2535]! } + public var AccessDenied_CallMicrophone: String { return self._s[2536]! } public func Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2509]!, self._r[2509]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2537]!, self._r[2537]!, [_1, _2, _3]) } - public var Login_InvalidFirstNameError: String { return self._s[2510]! } - public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2511]! } - public var Checkout_PaymentMethod_New: String { return self._s[2512]! } - public var ShareMenu_CopyShareLinkGame: String { return self._s[2513]! } - public var PhotoEditor_QualityTool: String { return self._s[2514]! } - public var Login_SendCodeViaSms: String { return self._s[2515]! } - public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2516]! } - public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2517]! } - public var Wallet_Receive_CopyAddress: String { return self._s[2518]! } - public var Login_EmailNotConfiguredError: String { return self._s[2519]! } - public var SocksProxySetup_Status: String { return self._s[2520]! } - public var PrivacyPolicy_Accept: String { return self._s[2521]! } - public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2522]! } - public var Appearance_AppIconClassicX: String { return self._s[2523]! } + public var Login_InvalidFirstNameError: String { return self._s[2538]! } + public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2539]! } + public var Checkout_PaymentMethod_New: String { return self._s[2540]! } + public var ShareMenu_CopyShareLinkGame: String { return self._s[2541]! } + public var PhotoEditor_QualityTool: String { return self._s[2542]! } + public var Login_SendCodeViaSms: String { return self._s[2543]! } + public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[2544]! } + public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[2545]! } + public var Wallet_Receive_CopyAddress: String { return self._s[2546]! } + public var Login_EmailNotConfiguredError: String { return self._s[2547]! } + public var SocksProxySetup_Status: String { return self._s[2548]! } + public var PrivacyPolicy_Accept: String { return self._s[2549]! } + public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[2550]! } + public var Appearance_AppIconClassicX: String { return self._s[2551]! } public func PUSH_CHAT_MESSAGE_TEXT(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2524]!, self._r[2524]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2552]!, self._r[2552]!, [_1, _2, _3]) } - public var OwnershipTransfer_SecurityRequirements: String { return self._s[2525]! } - public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2526]! } - public var AutoNightTheme_Automatic: String { return self._s[2527]! } - public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2528]! } - public var Privacy_ContactsSyncHelp: String { return self._s[2529]! } - public var Cache_Help: String { return self._s[2530]! } - public var Group_ErrorAccessDenied: String { return self._s[2531]! } - public var Passport_Language_fa: String { return self._s[2532]! } - public var Wallet_Intro_Text: String { return self._s[2533]! } - public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2534]! } - public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2535]! } - public var PrivacySettings_LastSeen: String { return self._s[2536]! } + public var OwnershipTransfer_SecurityRequirements: String { return self._s[2553]! } + public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[2555]! } + public var AutoNightTheme_Automatic: String { return self._s[2556]! } + public var Channel_Username_InvalidStartsWithNumber: String { return self._s[2557]! } + public var Privacy_ContactsSyncHelp: String { return self._s[2558]! } + public var Cache_Help: String { return self._s[2559]! } + public var Group_ErrorAccessDenied: String { return self._s[2560]! } + public var Passport_Language_fa: String { return self._s[2561]! } + public var Wallet_Intro_Text: String { return self._s[2562]! } + public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2563]! } + public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2564]! } + public var PrivacySettings_LastSeen: String { return self._s[2565]! } public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2537]!, self._r[2537]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2566]!, self._r[2566]!, [_0, _1]) } - public var Preview_SaveGif: String { return self._s[2541]! } - public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2542]! } - public var Profile_About: String { return self._s[2543]! } - public var Channel_About_Placeholder: String { return self._s[2544]! } - public var Login_InfoTitle: String { return self._s[2545]! } + public var Preview_SaveGif: String { return self._s[2570]! } + public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[2571]! } + public var Profile_About: String { return self._s[2572]! } + public var Channel_About_Placeholder: String { return self._s[2573]! } + public var Login_InfoTitle: String { return self._s[2574]! } public func TwoStepAuth_SetupPendingEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2546]!, self._r[2546]!, [_0]) + return formatWithArgumentRanges(self._s[2575]!, self._r[2575]!, [_0]) } - public var EditTheme_Expand_Preview_IncomingReplyText: String { return self._s[2547]! } - public var Watch_Suggestion_CantTalk: String { return self._s[2549]! } - public var ContactInfo_Title: String { return self._s[2550]! } - public var Media_ShareThisVideo: String { return self._s[2551]! } - public var Weekday_ShortFriday: String { return self._s[2552]! } - public var AccessDenied_Contacts: String { return self._s[2554]! } - public var Notification_CallIncomingShort: String { return self._s[2555]! } - public var Group_Setup_TypePublic: String { return self._s[2556]! } - public var Notifications_MessageNotificationsExceptions: String { return self._s[2557]! } - public var Notifications_Badge_IncludeChannels: String { return self._s[2558]! } - public var Notifications_MessageNotificationsPreview: String { return self._s[2561]! } - public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2562]! } - public var Group_ErrorAddTooMuchBots: String { return self._s[2563]! } - public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2564]! } - public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2565]! } + public var EditTheme_Expand_Preview_IncomingReplyText: String { return self._s[2576]! } + public var Watch_Suggestion_CantTalk: String { return self._s[2578]! } + public var ContactInfo_Title: String { return self._s[2579]! } + public var Media_ShareThisVideo: String { return self._s[2580]! } + public var Weekday_ShortFriday: String { return self._s[2581]! } + public var AccessDenied_Contacts: String { return self._s[2583]! } + public var Notification_CallIncomingShort: String { return self._s[2584]! } + public var Group_Setup_TypePublic: String { return self._s[2585]! } + public var Notifications_MessageNotificationsExceptions: String { return self._s[2586]! } + public var Notifications_Badge_IncludeChannels: String { return self._s[2587]! } + public var Notifications_MessageNotificationsPreview: String { return self._s[2590]! } + public var ConversationProfile_ErrorCreatingConversation: String { return self._s[2591]! } + public var Group_ErrorAddTooMuchBots: String { return self._s[2592]! } + public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[2593]! } + public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[2594]! } public func Wallet_SecureStorageChanged_BiometryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2566]!, self._r[2566]!, [_0]) + return formatWithArgumentRanges(self._s[2595]!, self._r[2595]!, [_0]) } - public var DialogList_Typing: String { return self._s[2567]! } - public var CallFeedback_IncludeLogs: String { return self._s[2569]! } - public var Checkout_Phone: String { return self._s[2571]! } - public var Login_InfoFirstNamePlaceholder: String { return self._s[2574]! } - public var Privacy_Calls_Integration: String { return self._s[2575]! } - public var Notifications_PermissionsAllow: String { return self._s[2576]! } - public var TwoStepAuth_AddHintDescription: String { return self._s[2580]! } - public var Settings_ChatSettings: String { return self._s[2581]! } + public var DialogList_Typing: String { return self._s[2596]! } + public var CallFeedback_IncludeLogs: String { return self._s[2598]! } + public var Checkout_Phone: String { return self._s[2600]! } + public var Login_InfoFirstNamePlaceholder: String { return self._s[2603]! } + public var Privacy_Calls_Integration: String { return self._s[2604]! } + public var Notifications_PermissionsAllow: String { return self._s[2605]! } + public var TwoStepAuth_AddHintDescription: String { return self._s[2609]! } + public var Settings_ChatSettings: String { return self._s[2610]! } public func Channel_AdminLog_MessageInvitedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2582]!, self._r[2582]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2611]!, self._r[2611]!, [_1, _2]) } - public var GroupRemoved_DeleteUser: String { return self._s[2584]! } + public var GroupRemoved_DeleteUser: String { return self._s[2613]! } public func Channel_AdminLog_PollStopped(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2585]!, self._r[2585]!, [_0]) + return formatWithArgumentRanges(self._s[2614]!, self._r[2614]!, [_0]) } - public var Wallet_TransactionInfo_FeeInfoURL: String { return self._s[2586]! } + public var Wallet_TransactionInfo_FeeInfoURL: String { return self._s[2615]! } public func PUSH_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2587]!, self._r[2587]!, [_1]) + return formatWithArgumentRanges(self._s[2616]!, self._r[2616]!, [_1]) } - public var Login_ContinueWithLocalization: String { return self._s[2588]! } - public var Watch_Message_ForwardedFrom: String { return self._s[2589]! } - public var TwoStepAuth_EnterEmailCode: String { return self._s[2591]! } - public var Conversation_Unblock: String { return self._s[2592]! } - public var PrivacySettings_DataSettings: String { return self._s[2593]! } - public var Group_PublicLink_Info: String { return self._s[2594]! } - public var Notifications_InAppNotificationsVibrate: String { return self._s[2595]! } + public var Login_ContinueWithLocalization: String { return self._s[2617]! } + public var Watch_Message_ForwardedFrom: String { return self._s[2618]! } + public var TwoStepAuth_EnterEmailCode: String { return self._s[2620]! } + public var Conversation_Unblock: String { return self._s[2621]! } + public var PrivacySettings_DataSettings: String { return self._s[2622]! } + public var Group_PublicLink_Info: String { return self._s[2623]! } + public func Wallet_Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2624]!, self._r[2624]!, [_1, _2, _3]) + } + public var Notifications_InAppNotificationsVibrate: String { return self._s[2625]! } public func Privacy_GroupsAndChannels_InviteToChannelError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2596]!, self._r[2596]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2626]!, self._r[2626]!, [_0, _1]) } - public var Wallet_RestoreFailed_CreateWallet: String { return self._s[2598]! } - public var PrivacySettings_Passcode: String { return self._s[2600]! } - public var Call_Mute: String { return self._s[2601]! } - public var Passport_Language_dz: String { return self._s[2602]! } - public var Wallet_Receive_AmountHeader: String { return self._s[2603]! } - public var Passport_Language_tk: String { return self._s[2604]! } + public var Wallet_RestoreFailed_CreateWallet: String { return self._s[2628]! } + public var PrivacySettings_Passcode: String { return self._s[2630]! } + public var Call_Mute: String { return self._s[2631]! } + public var Wallet_Weekday_Yesterday: String { return self._s[2632]! } + public var Passport_Language_dz: String { return self._s[2633]! } + public var Wallet_Receive_AmountHeader: String { return self._s[2634]! } + public var Passport_Language_tk: String { return self._s[2635]! } public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2605]!, self._r[2605]!, [_0]) - } - public var Settings_Search: String { return self._s[2606]! } - public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2607]! } - public var Conversation_ContextMenuReply: String { return self._s[2608]! } - public var WallpaperSearch_ColorBrown: String { return self._s[2609]! } - public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2610]! } - public var Tour_Title1: String { return self._s[2611]! } - public var Conversation_ClearGroupHistory: String { return self._s[2613]! } - public var Wallet_TransactionInfo_RecipientHeader: String { return self._s[2614]! } - public var WallpaperPreview_Motion: String { return self._s[2615]! } - public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2616]!, self._r[2616]!, [_0]) - } - public var Call_RateCall: String { return self._s[2617]! } - public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2618]! } - public var Passport_PasswordCompleteSetup: String { return self._s[2619]! } - public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2620]! } - public var UserInfo_LastNamePlaceholder: String { return self._s[2622]! } - public func Login_WillCallYou(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2624]!, self._r[2624]!, [_0]) - } - public var Compose_Create: String { return self._s[2625]! } - public var Contacts_InviteToTelegram: String { return self._s[2626]! } - public var GroupInfo_Notifications: String { return self._s[2627]! } - public var Message_PinnedLiveLocationMessage: String { return self._s[2629]! } - public var Month_GenApril: String { return self._s[2630]! } - public var Appearance_AutoNightTheme: String { return self._s[2631]! } - public var ChatSettings_AutomaticAudioDownload: String { return self._s[2633]! } - public var Login_CodeSentSms: String { return self._s[2635]! } - public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2636]!, self._r[2636]!, [_0]) } - public var EmptyGroupInfo_Line3: String { return self._s[2637]! } - public var LogoutOptions_ContactSupportText: String { return self._s[2638]! } - public var Passport_Language_hr: String { return self._s[2639]! } - public var Common_ActionNotAllowedError: String { return self._s[2640]! } - public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2641]!, self._r[2641]!, [_0]) + public var Settings_Search: String { return self._s[2637]! } + public var Wallet_Month_ShortFebruary: String { return self._s[2638]! } + public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[2639]! } + public var Conversation_ContextMenuReply: String { return self._s[2640]! } + public var WallpaperSearch_ColorBrown: String { return self._s[2641]! } + public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[2642]! } + public var Tour_Title1: String { return self._s[2643]! } + public var Wallet_Alert_Cancel: String { return self._s[2644]! } + public var Conversation_ClearGroupHistory: String { return self._s[2646]! } + public var Wallet_TransactionInfo_RecipientHeader: String { return self._s[2647]! } + public var WallpaperPreview_Motion: String { return self._s[2648]! } + public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2649]!, self._r[2649]!, [_0]) } - public var GroupInfo_InviteLink_CopyLink: String { return self._s[2642]! } - public var Wallet_Info_TransactionFrom: String { return self._s[2643]! } - public var Wallet_Send_ErrorDecryptionFailed: String { return self._s[2644]! } - public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2645]! } - public var Privacy_SecretChatsTitle: String { return self._s[2646]! } - public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2648]! } - public var GroupInfo_AddUserLeftError: String { return self._s[2649]! } - public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2650]! } - public var LogoutOptions_ContactSupportTitle: String { return self._s[2651]! } - public var Channel_AddBotErrorHaveRights: String { return self._s[2652]! } - public var Preview_DeleteGif: String { return self._s[2653]! } - public var GroupInfo_Permissions_Exceptions: String { return self._s[2654]! } - public var Group_ErrorNotMutualContact: String { return self._s[2655]! } - public var Notification_MessageLifetime5s: String { return self._s[2656]! } - public func Watch_LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { + public var Call_RateCall: String { return self._s[2650]! } + public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[2651]! } + public var Passport_PasswordCompleteSetup: String { return self._s[2652]! } + public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[2653]! } + public var UserInfo_LastNamePlaceholder: String { return self._s[2655]! } + public func Login_WillCallYou(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2657]!, self._r[2657]!, [_0]) } - public var VoiceOver_Chat_Video: String { return self._s[2658]! } - public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2660]! } - public var ReportSpam_DeleteThisChat: String { return self._s[2661]! } - public var Passport_Address_AddBankStatement: String { return self._s[2662]! } - public var Notification_CallIncoming: String { return self._s[2663]! } - public var Wallet_Words_NotDoneTitle: String { return self._s[2664]! } - public var Compose_NewGroupTitle: String { return self._s[2665]! } - public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2667]! } - public var Passport_Address_Postcode: String { return self._s[2669]! } + public var Compose_Create: String { return self._s[2658]! } + public var Contacts_InviteToTelegram: String { return self._s[2659]! } + public var GroupInfo_Notifications: String { return self._s[2660]! } + public var Message_PinnedLiveLocationMessage: String { return self._s[2662]! } + public var Month_GenApril: String { return self._s[2663]! } + public var Appearance_AutoNightTheme: String { return self._s[2664]! } + public var ChatSettings_AutomaticAudioDownload: String { return self._s[2666]! } + public var Login_CodeSentSms: String { return self._s[2668]! } + public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2669]!, self._r[2669]!, [_0]) + } + public var EmptyGroupInfo_Line3: String { return self._s[2670]! } + public var LogoutOptions_ContactSupportText: String { return self._s[2671]! } + public var Passport_Language_hr: String { return self._s[2672]! } + public var Common_ActionNotAllowedError: String { return self._s[2673]! } + public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2674]!, self._r[2674]!, [_0]) + } + public var GroupInfo_InviteLink_CopyLink: String { return self._s[2675]! } + public var Wallet_Info_TransactionFrom: String { return self._s[2676]! } + public var Wallet_Send_ErrorDecryptionFailed: String { return self._s[2677]! } + public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[2678]! } + public var Privacy_SecretChatsTitle: String { return self._s[2679]! } + public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[2681]! } + public var GroupInfo_AddUserLeftError: String { return self._s[2682]! } + public var AutoDownloadSettings_TypePrivateChats: String { return self._s[2683]! } + public var LogoutOptions_ContactSupportTitle: String { return self._s[2684]! } + public var Channel_AddBotErrorHaveRights: String { return self._s[2685]! } + public var Preview_DeleteGif: String { return self._s[2686]! } + public var GroupInfo_Permissions_Exceptions: String { return self._s[2687]! } + public var Group_ErrorNotMutualContact: String { return self._s[2688]! } + public var Notification_MessageLifetime5s: String { return self._s[2689]! } + public func Watch_LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2690]!, self._r[2690]!, [_0]) + } + public var VoiceOver_Chat_Video: String { return self._s[2691]! } + public var Channel_OwnershipTransfer_ErrorPublicChannelsTooMuch: String { return self._s[2693]! } + public var ReportSpam_DeleteThisChat: String { return self._s[2694]! } + public var Passport_Address_AddBankStatement: String { return self._s[2695]! } + public var Notification_CallIncoming: String { return self._s[2696]! } + public var Wallet_Words_NotDoneTitle: String { return self._s[2697]! } + public var Compose_NewGroupTitle: String { return self._s[2698]! } + public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[2700]! } + public var Passport_Address_Postcode: String { return self._s[2702]! } public func LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2670]!, self._r[2670]!, [_0]) + return formatWithArgumentRanges(self._s[2703]!, self._r[2703]!, [_0]) } - public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2671]! } - public var VoiceOver_Chat_YourMusic: String { return self._s[2672]! } - public var WallpaperColors_Title: String { return self._s[2673]! } - public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2674]! } - public var VoiceOver_MessageContextForward: String { return self._s[2675]! } - public var GroupPermission_Duration: String { return self._s[2676]! } + public var Checkout_NewCard_SaveInfoHelp: String { return self._s[2704]! } + public var Wallet_Month_ShortOctober: String { return self._s[2705]! } + public var VoiceOver_Chat_YourMusic: String { return self._s[2706]! } + public var WallpaperColors_Title: String { return self._s[2707]! } + public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[2708]! } + public var VoiceOver_MessageContextForward: String { return self._s[2709]! } + public var GroupPermission_Duration: String { return self._s[2710]! } public func Cache_Clear(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2677]!, self._r[2677]!, [_0]) + return formatWithArgumentRanges(self._s[2711]!, self._r[2711]!, [_0]) } - public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2678]! } - public var Username_Placeholder: String { return self._s[2679]! } - public var CallFeedback_WhatWentWrong: String { return self._s[2680]! } - public var Passport_FieldAddressUploadHelp: String { return self._s[2681]! } - public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2682]! } + public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[2712]! } + public var Username_Placeholder: String { return self._s[2713]! } + public var CallFeedback_WhatWentWrong: String { return self._s[2714]! } + public var Passport_FieldAddressUploadHelp: String { return self._s[2715]! } + public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[2716]! } public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2684]!, self._r[2684]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2718]!, self._r[2718]!, [_1, _2]) } - public var Passport_PasswordDescription: String { return self._s[2685]! } - public var Channel_MessagePhotoUpdated: String { return self._s[2686]! } - public var MediaPicker_TapToUngroupDescription: String { return self._s[2687]! } - public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2688]! } - public var AttachmentMenu_PhotoOrVideo: String { return self._s[2689]! } - public var Conversation_ContextMenuMore: String { return self._s[2690]! } - public var Privacy_PaymentsClearInfo: String { return self._s[2691]! } - public var CallSettings_TabIcon: String { return self._s[2692]! } - public var KeyCommand_Find: String { return self._s[2693]! } - public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2694]! } - public var EditTheme_Edit_Preview_IncomingText: String { return self._s[2695]! } - public var Message_PinnedGame: String { return self._s[2696]! } - public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2697]! } - public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2699]! } - public var Login_CallRequestState2: String { return self._s[2701]! } - public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2703]! } + public var Passport_PasswordDescription: String { return self._s[2719]! } + public var Channel_MessagePhotoUpdated: String { return self._s[2720]! } + public var MediaPicker_TapToUngroupDescription: String { return self._s[2721]! } + public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[2722]! } + public var AttachmentMenu_PhotoOrVideo: String { return self._s[2723]! } + public var Conversation_ContextMenuMore: String { return self._s[2724]! } + public var Privacy_PaymentsClearInfo: String { return self._s[2725]! } + public var CallSettings_TabIcon: String { return self._s[2726]! } + public var KeyCommand_Find: String { return self._s[2727]! } + public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[2728]! } + public var EditTheme_Edit_Preview_IncomingText: String { return self._s[2729]! } + public var Message_PinnedGame: String { return self._s[2730]! } + public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[2731]! } + public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2733]! } + public var Login_CallRequestState2: String { return self._s[2735]! } + public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[2737]! } public func VoiceOver_Chat_PhotoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2704]!, self._r[2704]!, [_0]) + return formatWithArgumentRanges(self._s[2738]!, self._r[2738]!, [_0]) } public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2706]!, self._r[2706]!, [_0]) + return formatWithArgumentRanges(self._s[2740]!, self._r[2740]!, [_0]) } - public var WallpaperPreview_Blurred: String { return self._s[2707]! } - public var Conversation_InstantPagePreview: String { return self._s[2708]! } + public var WallpaperPreview_Blurred: String { return self._s[2741]! } + public var Conversation_InstantPagePreview: String { return self._s[2742]! } public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2709]!, self._r[2709]!, [_0]) + return formatWithArgumentRanges(self._s[2743]!, self._r[2743]!, [_0]) } - public var SecretTimer_VideoDescription: String { return self._s[2712]! } - public var WallpaperSearch_ColorRed: String { return self._s[2713]! } - public var GroupPermission_NoPinMessages: String { return self._s[2714]! } - public var Passport_Language_es: String { return self._s[2715]! } - public var Permissions_ContactsAllow_v0: String { return self._s[2717]! } - public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2718]! } + public var SecretTimer_VideoDescription: String { return self._s[2746]! } + public var WallpaperSearch_ColorRed: String { return self._s[2747]! } + public var GroupPermission_NoPinMessages: String { return self._s[2748]! } + public var Passport_Language_es: String { return self._s[2749]! } + public var Permissions_ContactsAllow_v0: String { return self._s[2751]! } + public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2752]! } public func PUSH_CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2719]!, self._r[2719]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2753]!, self._r[2753]!, [_1, _2]) } - public var Privacy_Forwards_CustomHelp: String { return self._s[2720]! } - public var WebPreview_GettingLinkInfo: String { return self._s[2721]! } - public var Watch_UserInfo_Unmute: String { return self._s[2722]! } - public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2723]! } - public var AccessDenied_CameraRestricted: String { return self._s[2725]! } + public var Privacy_Forwards_CustomHelp: String { return self._s[2754]! } + public var WebPreview_GettingLinkInfo: String { return self._s[2755]! } + public var Watch_UserInfo_Unmute: String { return self._s[2756]! } + public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[2757]! } + public var AccessDenied_CameraRestricted: String { return self._s[2759]! } public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2726]!, self._r[2726]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[2760]!, self._r[2760]!, ["\(_0)"]) } - public var ChatList_ReadAll: String { return self._s[2728]! } - public var Settings_CopyUsername: String { return self._s[2729]! } - public var Contacts_SearchLabel: String { return self._s[2730]! } - public var Map_OpenInYandexNavigator: String { return self._s[2732]! } - public var PasscodeSettings_EncryptData: String { return self._s[2733]! } - public var WallpaperSearch_ColorPrefix: String { return self._s[2734]! } - public var Notifications_GroupNotificationsPreview: String { return self._s[2735]! } - public var DialogList_AdNoticeAlert: String { return self._s[2736]! } - public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2738]! } - public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2739]! } - public var Localization_LanguageCustom: String { return self._s[2740]! } - public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2741]! } - public var CallFeedback_Title: String { return self._s[2742]! } - public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2745]! } - public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2746]! } - public var Wallet_Intro_CreateErrorTitle: String { return self._s[2747]! } - public var Conversation_InfoGroup: String { return self._s[2748]! } - public var Compose_NewMessage: String { return self._s[2749]! } - public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2750]! } - public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2751]! } - public var Wallet_SecureStorageReset_BiometryFaceId: String { return self._s[2752]! } - public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2753]! } + public var ChatList_ReadAll: String { return self._s[2762]! } + public var Settings_CopyUsername: String { return self._s[2763]! } + public var Contacts_SearchLabel: String { return self._s[2764]! } + public var Map_OpenInYandexNavigator: String { return self._s[2766]! } + public var PasscodeSettings_EncryptData: String { return self._s[2767]! } + public var WallpaperSearch_ColorPrefix: String { return self._s[2768]! } + public var Notifications_GroupNotificationsPreview: String { return self._s[2769]! } + public var DialogList_AdNoticeAlert: String { return self._s[2770]! } + public var Wallet_Month_GenMay: String { return self._s[2772]! } + public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2773]! } + public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2774]! } + public var Localization_LanguageCustom: String { return self._s[2775]! } + public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[2776]! } + public var CallFeedback_Title: String { return self._s[2777]! } + public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[2780]! } + public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2781]! } + public var Wallet_Intro_CreateErrorTitle: String { return self._s[2782]! } + public var Conversation_InfoGroup: String { return self._s[2783]! } + public var Compose_NewMessage: String { return self._s[2784]! } + public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2785]! } + public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2786]! } + public var Wallet_SecureStorageReset_BiometryFaceId: String { return self._s[2787]! } + public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2788]! } public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2754]!, self._r[2754]!, [_0]) + return formatWithArgumentRanges(self._s[2789]!, self._r[2789]!, [_0]) } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2755]! } - public var Login_CancelSignUpConfirmation: String { return self._s[2756]! } - public var ChangePhoneNumberCode_Help: String { return self._s[2757]! } - public var PrivacySettings_DeleteAccountHelp: String { return self._s[2758]! } - public var Channel_BlackList_Title: String { return self._s[2759]! } - public var UserInfo_PhoneCall: String { return self._s[2760]! } - public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2762]! } - public var State_connecting: String { return self._s[2763]! } - public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2764]! } - public var EditTheme_Expand_BottomInfo: String { return self._s[2765]! } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[2790]! } + public var Login_CancelSignUpConfirmation: String { return self._s[2791]! } + public var ChangePhoneNumberCode_Help: String { return self._s[2792]! } + public var PrivacySettings_DeleteAccountHelp: String { return self._s[2793]! } + public var Channel_BlackList_Title: String { return self._s[2794]! } + public var UserInfo_PhoneCall: String { return self._s[2795]! } + public var Passport_Address_OneOfTypeBankStatement: String { return self._s[2797]! } + public var Wallet_Month_ShortJanuary: String { return self._s[2798]! } + public var State_connecting: String { return self._s[2799]! } + public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[2800]! } + public var Wallet_Month_GenMarch: String { return self._s[2801]! } + public var EditTheme_Expand_BottomInfo: String { return self._s[2802]! } public func LastSeen_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2766]!, self._r[2766]!, [_0]) + return formatWithArgumentRanges(self._s[2803]!, self._r[2803]!, [_0]) } public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2767]!, self._r[2767]!, [_0]) + return formatWithArgumentRanges(self._s[2804]!, self._r[2804]!, [_0]) } - public var Notifications_GroupNotifications: String { return self._s[2768]! } - public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[2769]! } - public var Passport_Identity_EditPassport: String { return self._s[2770]! } - public var EnterPasscode_RepeatNewPasscode: String { return self._s[2772]! } - public var Localization_EnglishLanguageName: String { return self._s[2773]! } - public var Share_AuthDescription: String { return self._s[2774]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2775]! } - public var Passport_Identity_Surname: String { return self._s[2776]! } - public var Compose_TokenListPlaceholder: String { return self._s[2777]! } - public var Passport_Identity_OneOfTypePassport: String { return self._s[2778]! } - public var Settings_AboutEmpty: String { return self._s[2779]! } - public var Conversation_Unmute: String { return self._s[2780]! } - public var CreateGroup_ChannelsTooMuch: String { return self._s[2782]! } - public var Wallet_Sending_Text: String { return self._s[2783]! } + public var Notifications_GroupNotifications: String { return self._s[2805]! } + public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[2806]! } + public var Passport_Identity_EditPassport: String { return self._s[2807]! } + public var EnterPasscode_RepeatNewPasscode: String { return self._s[2809]! } + public var Localization_EnglishLanguageName: String { return self._s[2810]! } + public var Share_AuthDescription: String { return self._s[2811]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[2812]! } + public var Passport_Identity_Surname: String { return self._s[2813]! } + public var Compose_TokenListPlaceholder: String { return self._s[2814]! } + public var Passport_Identity_OneOfTypePassport: String { return self._s[2815]! } + public var Settings_AboutEmpty: String { return self._s[2816]! } + public var Conversation_Unmute: String { return self._s[2817]! } + public var CreateGroup_ChannelsTooMuch: String { return self._s[2819]! } + public var Wallet_Sending_Text: String { return self._s[2820]! } public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2784]!, self._r[2784]!, [_1]) + return formatWithArgumentRanges(self._s[2821]!, self._r[2821]!, [_1]) } - public var Login_CodeSentCall: String { return self._s[2785]! } - public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2787]! } - public var ChatSettings_Appearance: String { return self._s[2788]! } - public var Appearance_PickAccentColor: String { return self._s[2789]! } + public var Login_CodeSentCall: String { return self._s[2822]! } + public var ContactInfo_PhoneLabelHomeFax: String { return self._s[2824]! } + public var ChatSettings_Appearance: String { return self._s[2825]! } + public var Appearance_PickAccentColor: String { return self._s[2826]! } public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2790]!, self._r[2790]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2827]!, self._r[2827]!, [_1, _2]) } public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2791]!, self._r[2791]!, [_1]) + return formatWithArgumentRanges(self._s[2828]!, self._r[2828]!, [_1]) } - public var Notification_CallMissed: String { return self._s[2792]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2793]! } - public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2794]! } - public var ChatAdmins_AdminLabel: String { return self._s[2796]! } - public var KeyCommand_JumpToNextChat: String { return self._s[2797]! } - public var Conversation_StopPollConfirmationTitle: String { return self._s[2799]! } - public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2800]! } - public var Month_GenJune: String { return self._s[2801]! } - public var Watch_Location_Current: String { return self._s[2802]! } - public var Wallet_Receive_CopyInvoiceUrl: String { return self._s[2803]! } - public var Conversation_TitleMute: String { return self._s[2804]! } + public var Notification_CallMissed: String { return self._s[2829]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[2830]! } + public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2831]! } + public var Wallet_Month_GenOctober: String { return self._s[2833]! } + public var ChatAdmins_AdminLabel: String { return self._s[2834]! } + public var KeyCommand_JumpToNextChat: String { return self._s[2835]! } + public var Conversation_StopPollConfirmationTitle: String { return self._s[2837]! } + public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[2838]! } + public var Month_GenJune: String { return self._s[2839]! } + public var Watch_Location_Current: String { return self._s[2840]! } + public var Wallet_Receive_CopyInvoiceUrl: String { return self._s[2841]! } + public var Conversation_TitleMute: String { return self._s[2842]! } public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2805]!, self._r[2805]!, [_1]) + return formatWithArgumentRanges(self._s[2843]!, self._r[2843]!, [_1]) } - public var GroupInfo_DeleteAndExit: String { return self._s[2806]! } + public var GroupInfo_DeleteAndExit: String { return self._s[2844]! } public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2807]!, self._r[2807]!, [_0]) + return formatWithArgumentRanges(self._s[2845]!, self._r[2845]!, [_0]) } - public var Call_ReportPlaceholder: String { return self._s[2808]! } - public var Chat_SlowmodeSendError: String { return self._s[2809]! } - public var MaskStickerSettings_Info: String { return self._s[2810]! } - public var EditTheme_Expand_TopInfo: String { return self._s[2811]! } + public var Call_ReportPlaceholder: String { return self._s[2846]! } + public var Chat_SlowmodeSendError: String { return self._s[2847]! } + public var MaskStickerSettings_Info: String { return self._s[2848]! } + public var EditTheme_Expand_TopInfo: String { return self._s[2849]! } public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2812]!, self._r[2812]!, [_0]) + return formatWithArgumentRanges(self._s[2850]!, self._r[2850]!, [_0]) } - public var Checkout_NewCard_PostcodeTitle: String { return self._s[2813]! } - public var Passport_Address_RegionPlaceholder: String { return self._s[2815]! } - public var Contacts_ShareTelegram: String { return self._s[2816]! } - public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2817]! } - public var Channel_ErrorAccessDenied: String { return self._s[2818]! } - public var UserInfo_ScamBotWarning: String { return self._s[2820]! } - public var Stickers_GroupChooseStickerPack: String { return self._s[2821]! } - public var Call_ConnectionErrorTitle: String { return self._s[2822]! } - public var UserInfo_NotificationsEnable: String { return self._s[2823]! } - public var ArchivedChats_IntroText1: String { return self._s[2824]! } - public var Tour_Text4: String { return self._s[2827]! } - public var WallpaperSearch_Recent: String { return self._s[2828]! } - public var GroupInfo_ScamGroupWarning: String { return self._s[2829]! } - public var Profile_MessageLifetime2s: String { return self._s[2831]! } - public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2832]! } - public var Notification_MessageLifetime2s: String { return self._s[2833]! } + public var Checkout_NewCard_PostcodeTitle: String { return self._s[2851]! } + public var Passport_Address_RegionPlaceholder: String { return self._s[2853]! } + public var Contacts_ShareTelegram: String { return self._s[2854]! } + public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[2855]! } + public var Channel_ErrorAccessDenied: String { return self._s[2856]! } + public var UserInfo_ScamBotWarning: String { return self._s[2858]! } + public var Stickers_GroupChooseStickerPack: String { return self._s[2859]! } + public var Call_ConnectionErrorTitle: String { return self._s[2860]! } + public var UserInfo_NotificationsEnable: String { return self._s[2861]! } + public var ArchivedChats_IntroText1: String { return self._s[2862]! } + public var Tour_Text4: String { return self._s[2865]! } + public var WallpaperSearch_Recent: String { return self._s[2866]! } + public var GroupInfo_ScamGroupWarning: String { return self._s[2867]! } + public var Profile_MessageLifetime2s: String { return self._s[2869]! } + public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[2870]! } + public var Notification_MessageLifetime2s: String { return self._s[2871]! } public func Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2834]!, self._r[2834]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2872]!, self._r[2872]!, [_1, _2, _3]) } - public var Cache_ClearCache: String { return self._s[2835]! } - public var AutoNightTheme_UpdateLocation: String { return self._s[2836]! } - public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2837]! } + public var Cache_ClearCache: String { return self._s[2873]! } + public var AutoNightTheme_UpdateLocation: String { return self._s[2874]! } + public var Permissions_NotificationsUnreachableText_v0: String { return self._s[2875]! } public func Channel_AdminLog_MessageChangedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2842]!, self._r[2842]!, [_0]) + return formatWithArgumentRanges(self._s[2879]!, self._r[2879]!, [_0]) } public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2844]!, self._r[2844]!, [_0]) + return formatWithArgumentRanges(self._s[2881]!, self._r[2881]!, [_0]) } - public var LocalGroup_Text: String { return self._s[2845]! } - public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2846]! } - public var SocksProxySetup_TypeSocks: String { return self._s[2847]! } - public var ChatList_UnarchiveAction: String { return self._s[2848]! } - public var AutoNightTheme_Title: String { return self._s[2849]! } - public var InstantPage_FeedbackButton: String { return self._s[2850]! } - public var Passport_FieldAddress: String { return self._s[2851]! } + public var LocalGroup_Text: String { return self._s[2882]! } + public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[2883]! } + public var SocksProxySetup_TypeSocks: String { return self._s[2884]! } + public var ChatList_UnarchiveAction: String { return self._s[2885]! } + public var AutoNightTheme_Title: String { return self._s[2886]! } + public var InstantPage_FeedbackButton: String { return self._s[2887]! } + public var Passport_FieldAddress: String { return self._s[2888]! } public func Channel_AdminLog_SetSlowmode(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2852]!, self._r[2852]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2889]!, self._r[2889]!, [_1, _2]) } - public var Month_ShortMarch: String { return self._s[2853]! } + public var Month_ShortMarch: String { return self._s[2890]! } public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2854]!, self._r[2854]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2891]!, self._r[2891]!, [_1, _2]) } - public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2855]! } - public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2856]! } - public var Passport_FloodError: String { return self._s[2857]! } - public var SecretGif_Title: String { return self._s[2858]! } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2859]! } - public var ChatList_Context_UnhideArchive: String { return self._s[2860]! } - public var Passport_Language_th: String { return self._s[2862]! } - public var Passport_Address_Address: String { return self._s[2863]! } - public var Login_InvalidLastNameError: String { return self._s[2864]! } - public var Notifications_InAppNotificationsPreview: String { return self._s[2865]! } - public var Notifications_PermissionsUnreachableTitle: String { return self._s[2866]! } - public var ChatList_Context_Archive: String { return self._s[2867]! } - public var SettingsSearch_FAQ: String { return self._s[2868]! } - public var ShareMenu_Send: String { return self._s[2869]! } - public var WallpaperSearch_ColorYellow: String { return self._s[2871]! } - public var Month_GenNovember: String { return self._s[2873]! } - public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2875]! } + public var SocksProxySetup_UsernamePlaceholder: String { return self._s[2892]! } + public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[2893]! } + public var Passport_FloodError: String { return self._s[2894]! } + public var SecretGif_Title: String { return self._s[2895]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2896]! } + public var ChatList_Context_UnhideArchive: String { return self._s[2897]! } + public var Passport_Language_th: String { return self._s[2899]! } + public var Passport_Address_Address: String { return self._s[2900]! } + public var Login_InvalidLastNameError: String { return self._s[2901]! } + public var Notifications_InAppNotificationsPreview: String { return self._s[2902]! } + public var Notifications_PermissionsUnreachableTitle: String { return self._s[2903]! } + public var ChatList_Context_Archive: String { return self._s[2904]! } + public var SettingsSearch_FAQ: String { return self._s[2905]! } + public var ShareMenu_Send: String { return self._s[2906]! } + public var WallpaperSearch_ColorYellow: String { return self._s[2908]! } + public var Month_GenNovember: String { return self._s[2910]! } + public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[2912]! } public func Conversation_ShareMyPhoneNumberConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2876]!, self._r[2876]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2913]!, self._r[2913]!, [_1, _2]) + } + public var Checkout_Email: String { return self._s[2914]! } + public var NotificationsSound_Tritone: String { return self._s[2915]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[2917]! } + public var Wallet_ContextMenuCopy: String { return self._s[2919]! } + public func Wallet_Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2921]!, self._r[2921]!, [_1, _2, _3]) } - public var Checkout_Email: String { return self._s[2878]! } - public var NotificationsSound_Tritone: String { return self._s[2879]! } - public var StickerPacksSettings_ManagingHelp: String { return self._s[2881]! } public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2884]!, self._r[2884]!, [_1]) - } - public var ChangePhoneNumberNumber_Help: String { return self._s[2885]! } - public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2886]!, self._r[2886]!, [_1, _1, _1, _2]) - } - public var ChatList_UndoArchiveTitle: String { return self._s[2887]! } - public var Notification_Exceptions_Add: String { return self._s[2888]! } - public var DialogList_You: String { return self._s[2889]! } - public var MediaPicker_Send: String { return self._s[2892]! } - public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2893]! } - public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2894]! } - public var Call_AudioRouteSpeaker: String { return self._s[2895]! } - public var Watch_UserInfo_Title: String { return self._s[2896]! } - public var VoiceOver_Chat_PollFinalResults: String { return self._s[2897]! } - public var Appearance_AccentColor: String { return self._s[2898]! } - public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2899]!, self._r[2899]!, [_0]) - } - public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2900]! } - public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2901]!, self._r[2901]!, [_1, _2]) - } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[2902]! } - public var WebSearch_RecentClearConfirmation: String { return self._s[2903]! } - public var Notification_CallOutgoing: String { return self._s[2904]! } - public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2905]! } - public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2906]! } - public var Call_RecordingDisabledMessage: String { return self._s[2907]! } - public var Message_Game: String { return self._s[2908]! } - public var Conversation_PressVolumeButtonForSound: String { return self._s[2909]! } - public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2910]! } - public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2911]! } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2912]! } - public var Date_DialogDateFormat: String { return self._s[2913]! } - public var WallpaperColors_SetCustomColor: String { return self._s[2914]! } - public var Notifications_InAppNotifications: String { return self._s[2915]! } - public func Channel_Management_RemovedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2916]!, self._r[2916]!, [_0]) - } - public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2917]!, self._r[2917]!, [_1, _2]) - } - public var NewContact_Title: String { return self._s[2918]! } - public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2919]!, self._r[2919]!, [_0]) - } - public var Conversation_ViewContactDetails: String { return self._s[2920]! } - public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2922]!, self._r[2922]!, [_1]) } - public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2923]! } - public var Passport_Identity_ExpiryDateNone: String { return self._s[2924]! } - public var PrivacySettings_Title: String { return self._s[2925]! } - public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2928]! } - public var GroupRemoved_UsersSectionTitle: String { return self._s[2929]! } - public var VoiceOver_Chat_ContactEmail: String { return self._s[2930]! } - public var Contacts_PhoneNumber: String { return self._s[2931]! } - public var Map_ShowPlaces: String { return self._s[2933]! } - public var ChatAdmins_Title: String { return self._s[2934]! } - public var InstantPage_Reference: String { return self._s[2936]! } - public var Wallet_Info_Updating: String { return self._s[2937]! } - public var ReportGroupLocation_Text: String { return self._s[2938]! } + public var ChangePhoneNumberNumber_Help: String { return self._s[2923]! } + public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2924]!, self._r[2924]!, [_1, _1, _1, _2]) + } + public var ChatList_UndoArchiveTitle: String { return self._s[2925]! } + public var Notification_Exceptions_Add: String { return self._s[2926]! } + public var DialogList_You: String { return self._s[2927]! } + public var MediaPicker_Send: String { return self._s[2930]! } + public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[2931]! } + public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[2932]! } + public var Call_AudioRouteSpeaker: String { return self._s[2933]! } + public var Watch_UserInfo_Title: String { return self._s[2934]! } + public var VoiceOver_Chat_PollFinalResults: String { return self._s[2935]! } + public var Appearance_AccentColor: String { return self._s[2937]! } + public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2938]!, self._r[2938]!, [_0]) + } + public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2939]! } + public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2940]!, self._r[2940]!, [_1, _2]) + } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[2941]! } + public var WebSearch_RecentClearConfirmation: String { return self._s[2942]! } + public var Notification_CallOutgoing: String { return self._s[2943]! } + public var PrivacySettings_PasscodeAndFaceId: String { return self._s[2944]! } + public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[2945]! } + public var Call_RecordingDisabledMessage: String { return self._s[2946]! } + public var Message_Game: String { return self._s[2947]! } + public var Conversation_PressVolumeButtonForSound: String { return self._s[2948]! } + public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[2949]! } + public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[2950]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[2951]! } + public var Date_DialogDateFormat: String { return self._s[2952]! } + public var WallpaperColors_SetCustomColor: String { return self._s[2953]! } + public var Notifications_InAppNotifications: String { return self._s[2954]! } + public func Channel_Management_RemovedBy(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2955]!, self._r[2955]!, [_0]) + } + public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2956]!, self._r[2956]!, [_1, _2]) + } + public var NewContact_Title: String { return self._s[2957]! } + public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2958]!, self._r[2958]!, [_0]) + } + public var Conversation_ViewContactDetails: String { return self._s[2959]! } + public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2961]!, self._r[2961]!, [_1]) + } + public var Checkout_NewCard_CardholderNameTitle: String { return self._s[2962]! } + public var Passport_Identity_ExpiryDateNone: String { return self._s[2963]! } + public var PrivacySettings_Title: String { return self._s[2964]! } + public var Conversation_SilentBroadcastTooltipOff: String { return self._s[2967]! } + public var GroupRemoved_UsersSectionTitle: String { return self._s[2968]! } + public var VoiceOver_Chat_ContactEmail: String { return self._s[2969]! } + public var Contacts_PhoneNumber: String { return self._s[2970]! } + public var Map_ShowPlaces: String { return self._s[2972]! } + public var ChatAdmins_Title: String { return self._s[2973]! } + public var InstantPage_Reference: String { return self._s[2975]! } + public var Wallet_Info_Updating: String { return self._s[2976]! } + public var ReportGroupLocation_Text: String { return self._s[2977]! } public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2939]!, self._r[2939]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2978]!, self._r[2978]!, [_1, _2]) } - public var Camera_FlashOff: String { return self._s[2940]! } - public var Wallet_Intro_TermsUrl: String { return self._s[2941]! } - public var Watch_UserInfo_Block: String { return self._s[2942]! } - public var ChatSettings_Stickers: String { return self._s[2943]! } - public var ChatSettings_DownloadInBackground: String { return self._s[2944]! } - public var Appearance_ThemeCarouselTintedNight: String { return self._s[2945]! } + public var Camera_FlashOff: String { return self._s[2979]! } + public var Wallet_Intro_TermsUrl: String { return self._s[2980]! } + public var Watch_UserInfo_Block: String { return self._s[2981]! } + public var ChatSettings_Stickers: String { return self._s[2982]! } + public var ChatSettings_DownloadInBackground: String { return self._s[2983]! } + public var Appearance_ThemeCarouselTintedNight: String { return self._s[2984]! } public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2946]!, self._r[2946]!, [_0]) + return formatWithArgumentRanges(self._s[2985]!, self._r[2985]!, [_0]) } - public var Settings_ViewPhoto: String { return self._s[2947]! } - public var Login_CheckOtherSessionMessages: String { return self._s[2948]! } - public var AutoDownloadSettings_Cellular: String { return self._s[2949]! } - public var Wallet_Created_ExportErrorTitle: String { return self._s[2950]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2951]! } - public var VoiceOver_MessageContextShare: String { return self._s[2952]! } + public var Settings_ViewPhoto: String { return self._s[2986]! } + public var Login_CheckOtherSessionMessages: String { return self._s[2987]! } + public var AutoDownloadSettings_Cellular: String { return self._s[2988]! } + public var Wallet_Created_ExportErrorTitle: String { return self._s[2989]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2990]! } + public var VoiceOver_MessageContextShare: String { return self._s[2991]! } public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2954]!, self._r[2954]!, [_0]) + return formatWithArgumentRanges(self._s[2993]!, self._r[2993]!, [_0]) } - public var Privacy_DeleteDrafts: String { return self._s[2955]! } - public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2956]! } + public var Privacy_DeleteDrafts: String { return self._s[2994]! } + public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[2995]! } public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2957]!, self._r[2957]!, [_0]) + return formatWithArgumentRanges(self._s[2996]!, self._r[2996]!, [_0]) } - public var DialogList_SavedMessagesHelp: String { return self._s[2958]! } - public var Wallet_SecureStorageNotAvailable_Title: String { return self._s[2959]! } - public var DialogList_SavedMessages: String { return self._s[2960]! } - public var GroupInfo_UpgradeButton: String { return self._s[2961]! } - public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[2963]! } - public var DialogList_Pin: String { return self._s[2964]! } + public var DialogList_SavedMessagesHelp: String { return self._s[2997]! } + public var Wallet_SecureStorageNotAvailable_Title: String { return self._s[2998]! } + public var DialogList_SavedMessages: String { return self._s[2999]! } + public var GroupInfo_UpgradeButton: String { return self._s[3000]! } + public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[3002]! } + public var DialogList_Pin: String { return self._s[3003]! } public func ForwardedAuthors2(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2965]!, self._r[2965]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3004]!, self._r[3004]!, [_0, _1]) } public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2966]!, self._r[2966]!, [_0]) + return formatWithArgumentRanges(self._s[3005]!, self._r[3005]!, [_0]) } - public var Notification_Exceptions_AlwaysOn: String { return self._s[2967]! } - public var UserInfo_NotificationsDisable: String { return self._s[2968]! } - public var Paint_Outlined: String { return self._s[2969]! } - public var Activity_PlayingGame: String { return self._s[2970]! } - public var SearchImages_NoImagesFound: String { return self._s[2971]! } - public var SocksProxySetup_ProxyType: String { return self._s[2972]! } - public var AppleWatch_ReplyPresetsHelp: String { return self._s[2974]! } - public var Conversation_ContextMenuCancelSending: String { return self._s[2975]! } - public var Settings_AppLanguage: String { return self._s[2976]! } - public var TwoStepAuth_ResetAccountHelp: String { return self._s[2977]! } - public var Common_ChoosePhoto: String { return self._s[2978]! } - public var CallFeedback_ReasonEcho: String { return self._s[2979]! } + public var Notification_Exceptions_AlwaysOn: String { return self._s[3006]! } + public var UserInfo_NotificationsDisable: String { return self._s[3007]! } + public var Paint_Outlined: String { return self._s[3008]! } + public var Activity_PlayingGame: String { return self._s[3009]! } + public var SearchImages_NoImagesFound: String { return self._s[3010]! } + public var SocksProxySetup_ProxyType: String { return self._s[3011]! } + public var AppleWatch_ReplyPresetsHelp: String { return self._s[3013]! } + public var Conversation_ContextMenuCancelSending: String { return self._s[3014]! } + public var Settings_AppLanguage: String { return self._s[3015]! } + public var TwoStepAuth_ResetAccountHelp: String { return self._s[3016]! } + public var Common_ChoosePhoto: String { return self._s[3017]! } + public var CallFeedback_ReasonEcho: String { return self._s[3018]! } public func PUSH_PINNED_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2980]!, self._r[2980]!, [_1]) + return formatWithArgumentRanges(self._s[3019]!, self._r[3019]!, [_1]) } - public var Privacy_Calls_AlwaysAllow: String { return self._s[2981]! } - public var Activity_UploadingVideo: String { return self._s[2982]! } - public var Conversation_WalletRequiredNotNow: String { return self._s[2983]! } - public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[2984]! } - public var NetworkUsageSettings_Wifi: String { return self._s[2985]! } - public var VoiceOver_Editing_ClearText: String { return self._s[2986]! } - public var PUSH_SENDER_YOU: String { return self._s[2987]! } - public var Channel_BanUser_PermissionReadMessages: String { return self._s[2988]! } - public var Checkout_PayWithTouchId: String { return self._s[2989]! } - public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2990]! } + public var Privacy_Calls_AlwaysAllow: String { return self._s[3020]! } + public var Activity_UploadingVideo: String { return self._s[3021]! } + public var Conversation_WalletRequiredNotNow: String { return self._s[3022]! } + public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[3023]! } + public var NetworkUsageSettings_Wifi: String { return self._s[3024]! } + public var VoiceOver_Editing_ClearText: String { return self._s[3025]! } + public var PUSH_SENDER_YOU: String { return self._s[3026]! } + public var Channel_BanUser_PermissionReadMessages: String { return self._s[3027]! } + public var Checkout_PayWithTouchId: String { return self._s[3028]! } + public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[3029]! } public func PUSH_LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2992]!, self._r[2992]!, [_1]) + return formatWithArgumentRanges(self._s[3031]!, self._r[3031]!, [_1]) } - public var Notifications_ExceptionsNone: String { return self._s[2993]! } + public var Notifications_ExceptionsNone: String { return self._s[3032]! } public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2994]!, self._r[2994]!, [_0]) + return formatWithArgumentRanges(self._s[3033]!, self._r[3033]!, [_0]) } public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2995]!, self._r[2995]!, [_1]) + return formatWithArgumentRanges(self._s[3034]!, self._r[3034]!, [_1]) } - public var AuthSessions_IncompleteAttempts: String { return self._s[2997]! } - public var Passport_Address_Region: String { return self._s[3000]! } - public var ChatList_DeleteChat: String { return self._s[3001]! } - public var LogoutOptions_ClearCacheTitle: String { return self._s[3002]! } - public var PhotoEditor_TiltShift: String { return self._s[3003]! } - public var Settings_FAQ_URL: String { return self._s[3004]! } - public var Passport_Language_sl: String { return self._s[3005]! } - public var Settings_PrivacySettings: String { return self._s[3007]! } - public var SharedMedia_TitleLink: String { return self._s[3008]! } - public var Passport_Identity_TypePassportUploadScan: String { return self._s[3009]! } - public var Settings_SetProfilePhoto: String { return self._s[3010]! } - public var Channel_About_Help: String { return self._s[3011]! } - public var Contacts_PermissionsEnable: String { return self._s[3012]! } - public var Wallet_Sending_Title: String { return self._s[3013]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[3014]! } - public var AttachmentMenu_SendAsFiles: String { return self._s[3015]! } - public var CallFeedback_ReasonInterruption: String { return self._s[3017]! } - public var Passport_Address_AddTemporaryRegistration: String { return self._s[3018]! } - public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[3019]! } - public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[3020]! } - public var PrivacySettings_DeleteAccountTitle: String { return self._s[3021]! } - public var AccessDenied_VideoMessageCamera: String { return self._s[3023]! } - public var Map_OpenInYandexMaps: String { return self._s[3025]! } - public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[3026]! } - public var VoiceOver_MessageContextReply: String { return self._s[3027]! } - public var PhotoEditor_SaturationTool: String { return self._s[3028]! } + public var AuthSessions_IncompleteAttempts: String { return self._s[3036]! } + public var Passport_Address_Region: String { return self._s[3039]! } + public var ChatList_DeleteChat: String { return self._s[3040]! } + public var LogoutOptions_ClearCacheTitle: String { return self._s[3041]! } + public var PhotoEditor_TiltShift: String { return self._s[3042]! } + public var Settings_FAQ_URL: String { return self._s[3043]! } + public var Passport_Language_sl: String { return self._s[3044]! } + public var Settings_PrivacySettings: String { return self._s[3046]! } + public var SharedMedia_TitleLink: String { return self._s[3047]! } + public var Passport_Identity_TypePassportUploadScan: String { return self._s[3048]! } + public var Settings_SetProfilePhoto: String { return self._s[3049]! } + public var Channel_About_Help: String { return self._s[3050]! } + public var Contacts_PermissionsEnable: String { return self._s[3051]! } + public var Wallet_Sending_Title: String { return self._s[3052]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[3053]! } + public var AttachmentMenu_SendAsFiles: String { return self._s[3054]! } + public var CallFeedback_ReasonInterruption: String { return self._s[3056]! } + public var Passport_Address_AddTemporaryRegistration: String { return self._s[3057]! } + public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[3058]! } + public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[3059]! } + public var PrivacySettings_DeleteAccountTitle: String { return self._s[3060]! } + public var AccessDenied_VideoMessageCamera: String { return self._s[3062]! } + public var Map_OpenInYandexMaps: String { return self._s[3064]! } + public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[3065]! } + public var VoiceOver_MessageContextReply: String { return self._s[3066]! } + public var PhotoEditor_SaturationTool: String { return self._s[3067]! } public func PUSH_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3029]!, self._r[3029]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3068]!, self._r[3068]!, [_1, _2]) } - public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[3030]! } - public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[3031]! } - public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[3032]! } - public var Appearance_TextSize: String { return self._s[3033]! } + public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[3069]! } + public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[3070]! } + public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[3071]! } + public var Appearance_TextSize: String { return self._s[3072]! } public func LOCAL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3034]!, self._r[3034]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3073]!, self._r[3073]!, [_1, "\(_2)"]) } - public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[3035]! } - public var Channel_Username_InvalidTooShort: String { return self._s[3037]! } + public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[3074]! } + public var Channel_Username_InvalidTooShort: String { return self._s[3076]! } public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3038]!, self._r[3038]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3077]!, self._r[3077]!, [_1, _2]) } public func PUSH_CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3039]!, self._r[3039]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3078]!, self._r[3078]!, [_1, _2, _3]) } - public var GroupInfo_PublicLinkAdd: String { return self._s[3040]! } - public var Passport_PassportInformation: String { return self._s[3043]! } - public var Theme_Unsupported: String { return self._s[3044]! } - public var WatchRemote_AlertTitle: String { return self._s[3045]! } - public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[3046]! } - public var ConvertToSupergroup_HelpText: String { return self._s[3048]! } + public var GroupInfo_PublicLinkAdd: String { return self._s[3079]! } + public var Passport_PassportInformation: String { return self._s[3082]! } + public var Theme_Unsupported: String { return self._s[3083]! } + public var WatchRemote_AlertTitle: String { return self._s[3084]! } + public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[3085]! } + public var ConvertToSupergroup_HelpText: String { return self._s[3087]! } public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3049]!, self._r[3049]!, [_0]) + return formatWithArgumentRanges(self._s[3088]!, self._r[3088]!, [_0]) } public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3050]!, self._r[3050]!, [_1]) + return formatWithArgumentRanges(self._s[3089]!, self._r[3089]!, [_1]) } - public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[3051]! } - public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[3053]! } - public var AccessDenied_CameraDisabled: String { return self._s[3054]! } + public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[3090]! } + public var Wallet_Navigation_Done: String { return self._s[3092]! } + public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[3093]! } + public var AccessDenied_CameraDisabled: String { return self._s[3094]! } public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3055]!, self._r[3055]!, [_0]) + return formatWithArgumentRanges(self._s[3095]!, self._r[3095]!, [_0]) } - public var PhotoEditor_ContrastTool: String { return self._s[3058]! } + public var PhotoEditor_ContrastTool: String { return self._s[3098]! } public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3059]!, self._r[3059]!, [_1]) + return formatWithArgumentRanges(self._s[3099]!, self._r[3099]!, [_1]) } - public var DialogList_Draft: String { return self._s[3060]! } - public var Privacy_TopPeersDelete: String { return self._s[3062]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[3063]! } - public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[3064]! } - public var WebSearch_RecentSectionClear: String { return self._s[3065]! } - public var EditTheme_ErrorInvalidCharacters: String { return self._s[3066]! } - public var Watch_ChatList_NoConversationsTitle: String { return self._s[3068]! } - public var Common_Done: String { return self._s[3070]! } - public var AuthSessions_EmptyText: String { return self._s[3071]! } - public var Conversation_ShareBotContactConfirmation: String { return self._s[3072]! } - public var Tour_Title5: String { return self._s[3073]! } - public var Wallet_Settings_Title: String { return self._s[3074]! } + public var DialogList_Draft: String { return self._s[3100]! } + public var Privacy_TopPeersDelete: String { return self._s[3102]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[3103]! } + public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[3104]! } + public var WebSearch_RecentSectionClear: String { return self._s[3105]! } + public var EditTheme_ErrorInvalidCharacters: String { return self._s[3106]! } + public var Watch_ChatList_NoConversationsTitle: String { return self._s[3108]! } + public var Common_Done: String { return self._s[3110]! } + public var AuthSessions_EmptyText: String { return self._s[3111]! } + public var Conversation_ShareBotContactConfirmation: String { return self._s[3112]! } + public var Tour_Title5: String { return self._s[3113]! } + public var Wallet_Settings_Title: String { return self._s[3114]! } public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3075]!, self._r[3075]!, [_0]) + return formatWithArgumentRanges(self._s[3115]!, self._r[3115]!, [_0]) } - public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[3076]! } - public var Conversation_LinkDialogSave: String { return self._s[3077]! } - public var GroupInfo_ActionRestrict: String { return self._s[3078]! } - public var Checkout_Title: String { return self._s[3079]! } - public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[3081]! } - public var Channel_AdminLog_CanChangeInfo: String { return self._s[3083]! } - public var Notification_RenamedGroup: String { return self._s[3084]! } - public var PeopleNearby_Groups: String { return self._s[3085]! } - public var Checkout_PayWithFaceId: String { return self._s[3086]! } - public var Channel_BanList_BlockedTitle: String { return self._s[3087]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[3089]! } - public var Checkout_WebConfirmation_Title: String { return self._s[3090]! } - public var Notifications_MessageNotificationsAlert: String { return self._s[3091]! } + public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[3116]! } + public var Conversation_LinkDialogSave: String { return self._s[3117]! } + public var GroupInfo_ActionRestrict: String { return self._s[3118]! } + public var Checkout_Title: String { return self._s[3119]! } + public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[3121]! } + public var Channel_AdminLog_CanChangeInfo: String { return self._s[3123]! } + public var Notification_RenamedGroup: String { return self._s[3124]! } + public var PeopleNearby_Groups: String { return self._s[3125]! } + public var Checkout_PayWithFaceId: String { return self._s[3126]! } + public var Channel_BanList_BlockedTitle: String { return self._s[3127]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[3129]! } + public var Checkout_WebConfirmation_Title: String { return self._s[3130]! } + public var Notifications_MessageNotificationsAlert: String { return self._s[3131]! } public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3092]!, self._r[3092]!, [_0]) + return formatWithArgumentRanges(self._s[3132]!, self._r[3132]!, [_0]) } - public var Profile_AddToExisting: String { return self._s[3094]! } + public var Profile_AddToExisting: String { return self._s[3134]! } public func Profile_CreateEncryptedChatOutdatedError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3095]!, self._r[3095]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3135]!, self._r[3135]!, [_0, _1]) } - public var Cache_Files: String { return self._s[3097]! } - public var Permissions_PrivacyPolicy: String { return self._s[3098]! } - public var SocksProxySetup_ConnectAndSave: String { return self._s[3099]! } - public var UserInfo_NotificationsDefaultDisabled: String { return self._s[3100]! } - public var AutoDownloadSettings_TypeContacts: String { return self._s[3102]! } - public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[3104]! } - public var Calls_NoCallsPlaceholder: String { return self._s[3105]! } - public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[3106]! } - public var VoiceOver_AttachMedia: String { return self._s[3108]! } - public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[3109]! } + public var Cache_Files: String { return self._s[3137]! } + public var Permissions_PrivacyPolicy: String { return self._s[3138]! } + public var SocksProxySetup_ConnectAndSave: String { return self._s[3139]! } + public var UserInfo_NotificationsDefaultDisabled: String { return self._s[3140]! } + public var AutoDownloadSettings_TypeContacts: String { return self._s[3142]! } + public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[3144]! } + public var Calls_NoCallsPlaceholder: String { return self._s[3145]! } + public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[3146]! } + public var VoiceOver_AttachMedia: String { return self._s[3148]! } + public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[3149]! } public func PUSH_CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3110]!, self._r[3110]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3150]!, self._r[3150]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[3111]! } - public var Conversation_SetReminder_Title: String { return self._s[3112]! } - public var Passport_FieldAddressHelp: String { return self._s[3113]! } - public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[3114]! } - public var PUSH_REMINDER_TITLE: String { return self._s[3115]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[3151]! } + public var Conversation_SetReminder_Title: String { return self._s[3152]! } + public var Passport_FieldAddressHelp: String { return self._s[3153]! } + public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[3154]! } + public var PUSH_REMINDER_TITLE: String { return self._s[3155]! } public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3116]!, self._r[3116]!, [_0]) + return formatWithArgumentRanges(self._s[3156]!, self._r[3156]!, [_0]) } - public var Channel_AdminLog_EmptyTitle: String { return self._s[3117]! } - public var Privacy_Calls_NeverAllow_Title: String { return self._s[3118]! } - public var Login_UnknownError: String { return self._s[3119]! } - public var Group_UpgradeNoticeText2: String { return self._s[3122]! } - public var Watch_Compose_AddContact: String { return self._s[3123]! } - public var Web_Error: String { return self._s[3124]! } - public var Gif_Search: String { return self._s[3125]! } - public var Profile_MessageLifetime1h: String { return self._s[3126]! } - public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[3127]! } - public var Channel_Username_CheckingUsername: String { return self._s[3128]! } - public var CallFeedback_ReasonSilentRemote: String { return self._s[3129]! } - public var AutoDownloadSettings_TypeChannels: String { return self._s[3130]! } - public var Channel_AboutItem: String { return self._s[3131]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[3133]! } - public var VoiceOver_Chat_VoiceMessage: String { return self._s[3134]! } - public var GroupInfo_SharedMedia: String { return self._s[3135]! } + public var Channel_AdminLog_EmptyTitle: String { return self._s[3157]! } + public var Privacy_Calls_NeverAllow_Title: String { return self._s[3158]! } + public var Login_UnknownError: String { return self._s[3159]! } + public var Group_UpgradeNoticeText2: String { return self._s[3162]! } + public var Watch_Compose_AddContact: String { return self._s[3163]! } + public var Web_Error: String { return self._s[3164]! } + public var Gif_Search: String { return self._s[3165]! } + public var Profile_MessageLifetime1h: String { return self._s[3166]! } + public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[3167]! } + public var Channel_Username_CheckingUsername: String { return self._s[3168]! } + public var CallFeedback_ReasonSilentRemote: String { return self._s[3169]! } + public var AutoDownloadSettings_TypeChannels: String { return self._s[3170]! } + public var Channel_AboutItem: String { return self._s[3171]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[3173]! } + public var VoiceOver_Chat_VoiceMessage: String { return self._s[3174]! } + public var GroupInfo_SharedMedia: String { return self._s[3175]! } public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3136]!, self._r[3136]!, [_1]) + return formatWithArgumentRanges(self._s[3176]!, self._r[3176]!, [_1]) } - public var Call_PhoneCallInProgressMessage: String { return self._s[3137]! } + public var Call_PhoneCallInProgressMessage: String { return self._s[3177]! } public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3138]!, self._r[3138]!, [_1]) + return formatWithArgumentRanges(self._s[3178]!, self._r[3178]!, [_1]) } - public var ChatList_UndoArchiveRevealedText: String { return self._s[3139]! } - public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[3140]! } - public var Conversation_SearchByName_Placeholder: String { return self._s[3141]! } - public var CreatePoll_AddOption: String { return self._s[3142]! } - public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[3143]! } - public var Group_UpgradeNoticeHeader: String { return self._s[3144]! } - public var Channel_Management_AddModerator: String { return self._s[3145]! } - public var AutoDownloadSettings_MaxFileSize: String { return self._s[3146]! } - public var StickerPacksSettings_ShowStickersButton: String { return self._s[3147]! } - public var Wallet_Info_RefreshErrorNetworkText: String { return self._s[3148]! } - public var NotificationsSound_Hello: String { return self._s[3149]! } - public var SocksProxySetup_SavedProxies: String { return self._s[3150]! } - public var Channel_Stickers_Placeholder: String { return self._s[3152]! } + public var ChatList_UndoArchiveRevealedText: String { return self._s[3179]! } + public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[3180]! } + public var Conversation_SearchByName_Placeholder: String { return self._s[3181]! } + public var CreatePoll_AddOption: String { return self._s[3182]! } + public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[3183]! } + public var Group_UpgradeNoticeHeader: String { return self._s[3184]! } + public var Channel_Management_AddModerator: String { return self._s[3185]! } + public var AutoDownloadSettings_MaxFileSize: String { return self._s[3186]! } + public var StickerPacksSettings_ShowStickersButton: String { return self._s[3187]! } + public var Wallet_Info_RefreshErrorNetworkText: String { return self._s[3188]! } + public var NotificationsSound_Hello: String { return self._s[3190]! } + public var SocksProxySetup_SavedProxies: String { return self._s[3191]! } + public var Channel_Stickers_Placeholder: String { return self._s[3193]! } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3153]!, self._r[3153]!, [_0]) + return formatWithArgumentRanges(self._s[3194]!, self._r[3194]!, [_0]) } - public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[3154]! } - public var Channel_Management_AddModeratorHelp: String { return self._s[3155]! } - public var ContactInfo_BirthdayLabel: String { return self._s[3156]! } - public var ChangePhoneNumberCode_RequestingACall: String { return self._s[3157]! } - public var AutoDownloadSettings_Channels: String { return self._s[3158]! } - public var Passport_Language_mn: String { return self._s[3159]! } - public var Notifications_ResetAllNotificationsHelp: String { return self._s[3162]! } - public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[3163]! } - public var Passport_Language_ja: String { return self._s[3165]! } - public var Settings_About_Title: String { return self._s[3166]! } - public var Settings_NotificationsAndSounds: String { return self._s[3167]! } - public var ChannelInfo_DeleteGroup: String { return self._s[3168]! } - public var Settings_BlockedUsers: String { return self._s[3169]! } + public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[3195]! } + public var Channel_Management_AddModeratorHelp: String { return self._s[3196]! } + public var ContactInfo_BirthdayLabel: String { return self._s[3197]! } + public var ChangePhoneNumberCode_RequestingACall: String { return self._s[3198]! } + public var AutoDownloadSettings_Channels: String { return self._s[3199]! } + public var Passport_Language_mn: String { return self._s[3200]! } + public var Notifications_ResetAllNotificationsHelp: String { return self._s[3203]! } + public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[3204]! } + public var Passport_Language_ja: String { return self._s[3206]! } + public var Settings_About_Title: String { return self._s[3207]! } + public var Settings_NotificationsAndSounds: String { return self._s[3208]! } + public var ChannelInfo_DeleteGroup: String { return self._s[3209]! } + public var Settings_BlockedUsers: String { return self._s[3210]! } public func Time_MonthOfYear_m4(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3170]!, self._r[3170]!, [_0]) + return formatWithArgumentRanges(self._s[3211]!, self._r[3211]!, [_0]) } - public var EditTheme_Create_Preview_OutgoingText: String { return self._s[3171]! } - public var AutoDownloadSettings_PreloadVideo: String { return self._s[3172]! } - public var Passport_Address_AddResidentialAddress: String { return self._s[3173]! } - public var Channel_Username_Title: String { return self._s[3174]! } + public var EditTheme_Create_Preview_OutgoingText: String { return self._s[3212]! } + public var Wallet_Weekday_Today: String { return self._s[3213]! } + public var AutoDownloadSettings_PreloadVideo: String { return self._s[3214]! } + public var Passport_Address_AddResidentialAddress: String { return self._s[3215]! } + public var Channel_Username_Title: String { return self._s[3216]! } public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3175]!, self._r[3175]!, [_0]) + return formatWithArgumentRanges(self._s[3217]!, self._r[3217]!, [_0]) } - public var AttachmentMenu_File: String { return self._s[3177]! } - public var AppleWatch_Title: String { return self._s[3178]! } - public var Activity_RecordingVideoMessage: String { return self._s[3179]! } + public var AttachmentMenu_File: String { return self._s[3219]! } + public var AppleWatch_Title: String { return self._s[3220]! } + public var Activity_RecordingVideoMessage: String { return self._s[3221]! } public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3180]!, self._r[3180]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3222]!, self._r[3222]!, [_1, _2]) } - public var Weekday_Saturday: String { return self._s[3181]! } - public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3182]! } - public var Profile_CreateEncryptedChatError: String { return self._s[3183]! } - public var Common_Next: String { return self._s[3185]! } - public var Channel_Stickers_YourStickers: String { return self._s[3187]! } - public var Message_Theme: String { return self._s[3188]! } - public var Call_AudioRouteHeadphones: String { return self._s[3189]! } - public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3191]! } - public var Watch_Contacts_NoResults: String { return self._s[3193]! } - public var PhotoEditor_TintTool: String { return self._s[3196]! } - public var LoginPassword_ResetAccount: String { return self._s[3198]! } - public var Settings_SavedMessages: String { return self._s[3199]! } - public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3200]! } - public var Bot_GenericSupportStatus: String { return self._s[3201]! } - public var StickerPack_Add: String { return self._s[3202]! } - public var Checkout_TotalAmount: String { return self._s[3203]! } - public var Your_cards_number_is_invalid: String { return self._s[3204]! } - public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3205]! } - public var VoiceOver_Chat_VideoMessage: String { return self._s[3206]! } + public var Weekday_Saturday: String { return self._s[3223]! } + public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3224]! } + public var Profile_CreateEncryptedChatError: String { return self._s[3225]! } + public var Common_Next: String { return self._s[3227]! } + public var Channel_Stickers_YourStickers: String { return self._s[3229]! } + public var Message_Theme: String { return self._s[3230]! } + public var Call_AudioRouteHeadphones: String { return self._s[3231]! } + public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3233]! } + public var Watch_Contacts_NoResults: String { return self._s[3235]! } + public var PhotoEditor_TintTool: String { return self._s[3238]! } + public var LoginPassword_ResetAccount: String { return self._s[3240]! } + public var Settings_SavedMessages: String { return self._s[3241]! } + public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3242]! } + public var Bot_GenericSupportStatus: String { return self._s[3243]! } + public var StickerPack_Add: String { return self._s[3244]! } + public var Checkout_TotalAmount: String { return self._s[3245]! } + public var Your_cards_number_is_invalid: String { return self._s[3246]! } + public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3247]! } + public var VoiceOver_Chat_VideoMessage: String { return self._s[3248]! } public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3207]!, self._r[3207]!, [_0]) + return formatWithArgumentRanges(self._s[3249]!, self._r[3249]!, [_0]) } public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3208]!, self._r[3208]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3250]!, self._r[3250]!, [_1, _2]) } - public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3209]! } + public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3251]! } public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3211]!, self._r[3211]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3253]!, self._r[3253]!, [_1, _2]) } public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3212]!, self._r[3212]!, [_0]) - } - public var GroupInfo_InviteLink_ShareLink: String { return self._s[3213]! } - public var StickerPack_Share: String { return self._s[3214]! } - public var Passport_DeleteAddress: String { return self._s[3215]! } - public var Settings_Passport: String { return self._s[3216]! } - public var SharedMedia_EmptyFilesText: String { return self._s[3217]! } - public var Conversation_DeleteMessagesForMe: String { return self._s[3218]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3219]! } - public var Contacts_PermissionsText: String { return self._s[3220]! } - public var Group_Setup_HistoryVisible: String { return self._s[3221]! } - public var Passport_Address_AddRentalAgreement: String { return self._s[3223]! } - public var SocksProxySetup_Title: String { return self._s[3224]! } - public var Notification_Mute1h: String { return self._s[3225]! } - public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3226]!, self._r[3226]!, [_0]) - } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3228]! } - public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3229]!, self._r[3229]!, [_1]) - } - public var FastTwoStepSetup_PasswordSection: String { return self._s[3230]! } - public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3233]! } - public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3235]! } - public var DialogList_NoMessagesText: String { return self._s[3236]! } - public var Privacy_ContactsResetConfirmation: String { return self._s[3237]! } - public var Privacy_Calls_P2PHelp: String { return self._s[3238]! } - public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3240]! } - public var Your_cards_expiration_year_is_invalid: String { return self._s[3241]! } - public var Common_TakePhotoOrVideo: String { return self._s[3242]! } - public var Wallet_Words_Text: String { return self._s[3243]! } - public var Call_StatusBusy: String { return self._s[3244]! } - public var Conversation_PinnedMessage: String { return self._s[3245]! } - public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3246]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3247]! } - public var Undo_ChatCleared: String { return self._s[3248]! } - public var AppleWatch_ReplyPresets: String { return self._s[3249]! } - public var Passport_DiscardMessageDescription: String { return self._s[3251]! } - public var Login_NetworkError: String { return self._s[3252]! } - public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3253]!, self._r[3253]!, [_0]) - } - public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3254]!, self._r[3254]!, [_0]) } - public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3255]! } - public var Wallet_WordCheck_ViewWords: String { return self._s[3257]! } - public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3258]! } + public var GroupInfo_InviteLink_ShareLink: String { return self._s[3255]! } + public var StickerPack_Share: String { return self._s[3256]! } + public var Passport_DeleteAddress: String { return self._s[3257]! } + public var Settings_Passport: String { return self._s[3258]! } + public var SharedMedia_EmptyFilesText: String { return self._s[3259]! } + public var Conversation_DeleteMessagesForMe: String { return self._s[3260]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3261]! } + public var Contacts_PermissionsText: String { return self._s[3262]! } + public var Group_Setup_HistoryVisible: String { return self._s[3263]! } + public var Wallet_Month_ShortDecember: String { return self._s[3265]! } + public var Passport_Address_AddRentalAgreement: String { return self._s[3266]! } + public var SocksProxySetup_Title: String { return self._s[3267]! } + public var Notification_Mute1h: String { return self._s[3268]! } + public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3269]!, self._r[3269]!, [_0]) + } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3270]! } + public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3271]!, self._r[3271]!, [_1]) + } + public var FastTwoStepSetup_PasswordSection: String { return self._s[3272]! } + public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3275]! } + public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3277]! } + public var DialogList_NoMessagesText: String { return self._s[3278]! } + public var Privacy_ContactsResetConfirmation: String { return self._s[3279]! } + public var Privacy_Calls_P2PHelp: String { return self._s[3280]! } + public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3282]! } + public var Your_cards_expiration_year_is_invalid: String { return self._s[3283]! } + public var Common_TakePhotoOrVideo: String { return self._s[3284]! } + public var Wallet_Words_Text: String { return self._s[3285]! } + public var Call_StatusBusy: String { return self._s[3286]! } + public var Conversation_PinnedMessage: String { return self._s[3287]! } + public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3288]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3289]! } + public var Undo_ChatCleared: String { return self._s[3290]! } + public var AppleWatch_ReplyPresets: String { return self._s[3291]! } + public var Passport_DiscardMessageDescription: String { return self._s[3293]! } + public var Login_NetworkError: String { return self._s[3294]! } + public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3295]!, self._r[3295]!, [_0]) + } + public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3296]!, self._r[3296]!, [_0]) + } + public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3297]! } + public var Wallet_WordCheck_ViewWords: String { return self._s[3299]! } + public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3300]! } public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3260]!, self._r[3260]!, [_0]) + return formatWithArgumentRanges(self._s[3302]!, self._r[3302]!, [_0]) } - public var Call_ConnectionErrorMessage: String { return self._s[3261]! } - public var VoiceOver_Chat_Music: String { return self._s[3262]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3263]! } - public var Compose_GroupTokenListPlaceholder: String { return self._s[3265]! } - public var ConversationMedia_Title: String { return self._s[3266]! } - public var EncryptionKey_Title: String { return self._s[3268]! } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3269]! } - public var Notification_Exceptions_AddException: String { return self._s[3270]! } - public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3271]! } - public var Profile_MessageLifetime1m: String { return self._s[3272]! } + public var Call_ConnectionErrorMessage: String { return self._s[3303]! } + public var VoiceOver_Chat_Music: String { return self._s[3304]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3305]! } + public var Compose_GroupTokenListPlaceholder: String { return self._s[3307]! } + public var ConversationMedia_Title: String { return self._s[3308]! } + public var EncryptionKey_Title: String { return self._s[3310]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3311]! } + public var Notification_Exceptions_AddException: String { return self._s[3312]! } + public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3313]! } + public var Profile_MessageLifetime1m: String { return self._s[3314]! } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3273]!, self._r[3273]!, [_1]) + return formatWithArgumentRanges(self._s[3315]!, self._r[3315]!, [_1]) } - public var Month_GenMay: String { return self._s[3274]! } + public var Month_GenMay: String { return self._s[3316]! } public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3275]!, self._r[3275]!, [_0]) - } - public var PeopleNearby_Users: String { return self._s[3276]! } - public var Wallet_Send_AddressInfo: String { return self._s[3277]! } - public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3278]! } - public var AutoDownloadSettings_ResetSettings: String { return self._s[3279]! } - public var Conversation_EmptyPlaceholder: String { return self._s[3281]! } - public var Passport_Address_AddPassportRegistration: String { return self._s[3282]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[3283]! } - public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3284]! } - public var Camera_TapAndHoldForVideo: String { return self._s[3285]! } - public var Channel_JoinChannel: String { return self._s[3287]! } - public var Appearance_Animations: String { return self._s[3290]! } - public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3291]!, self._r[3291]!, [_1, _2]) - } - public var Stickers_GroupStickers: String { return self._s[3293]! } - public var Appearance_ShareTheme: String { return self._s[3294]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[3296]! } - public var Passport_Address_Street: String { return self._s[3297]! } - public var Conversation_AddContact: String { return self._s[3298]! } - public var Login_PhonePlaceholder: String { return self._s[3299]! } - public var Channel_Members_InviteLink: String { return self._s[3301]! } - public var Bot_Stop: String { return self._s[3302]! } - public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3304]! } - public var Notification_PassportValueAddress: String { return self._s[3305]! } - public var Month_ShortJuly: String { return self._s[3306]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3307]! } - public var Channel_AdminLog_BanSendMedia: String { return self._s[3308]! } - public var Passport_Identity_ReverseSide: String { return self._s[3309]! } - public var Watch_Stickers_Recents: String { return self._s[3312]! } - public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3314]! } - public var Map_SendThisLocation: String { return self._s[3315]! } - public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3316]!, self._r[3316]!, [_0]) - } - public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3317]!, self._r[3317]!, [_0]) } - public var ConvertToSupergroup_Note: String { return self._s[3318]! } - public var Wallet_Intro_NotNow: String { return self._s[3319]! } + public var PeopleNearby_Users: String { return self._s[3318]! } + public var Wallet_Send_AddressInfo: String { return self._s[3319]! } + public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3320]! } + public var AutoDownloadSettings_ResetSettings: String { return self._s[3321]! } + public func Wallet_Updated_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3323]!, self._r[3323]!, [_0]) + } + public var Conversation_EmptyPlaceholder: String { return self._s[3324]! } + public var Passport_Address_AddPassportRegistration: String { return self._s[3325]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[3326]! } + public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3327]! } + public var Camera_TapAndHoldForVideo: String { return self._s[3328]! } + public var Channel_JoinChannel: String { return self._s[3330]! } + public var Appearance_Animations: String { return self._s[3333]! } + public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3334]!, self._r[3334]!, [_1, _2]) + } + public var Stickers_GroupStickers: String { return self._s[3336]! } + public var Appearance_ShareTheme: String { return self._s[3337]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[3339]! } + public var Passport_Address_Street: String { return self._s[3340]! } + public var Conversation_AddContact: String { return self._s[3341]! } + public var Login_PhonePlaceholder: String { return self._s[3342]! } + public var Channel_Members_InviteLink: String { return self._s[3344]! } + public var Bot_Stop: String { return self._s[3345]! } + public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3347]! } + public var Notification_PassportValueAddress: String { return self._s[3348]! } + public var Month_ShortJuly: String { return self._s[3349]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3350]! } + public var Channel_AdminLog_BanSendMedia: String { return self._s[3351]! } + public var Passport_Identity_ReverseSide: String { return self._s[3352]! } + public var Watch_Stickers_Recents: String { return self._s[3355]! } + public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3357]! } + public var Map_SendThisLocation: String { return self._s[3358]! } + public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3359]!, self._r[3359]!, [_0]) + } + public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3360]!, self._r[3360]!, [_0]) + } + public var ConvertToSupergroup_Note: String { return self._s[3361]! } + public var Wallet_Intro_NotNow: String { return self._s[3362]! } public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3320]!, self._r[3320]!, [_0]) + return formatWithArgumentRanges(self._s[3363]!, self._r[3363]!, [_0]) } - public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3321]! } + public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3364]! } public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3322]!, self._r[3322]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3365]!, self._r[3365]!, [_0, _1]) } - public var Login_CallRequestState3: String { return self._s[3324]! } - public var Wallpaper_SearchShort: String { return self._s[3325]! } - public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3327]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3328]! } - public var Channel_BotDoesntSupportGroups: String { return self._s[3329]! } + public var Login_CallRequestState3: String { return self._s[3367]! } + public var Wallpaper_SearchShort: String { return self._s[3368]! } + public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3370]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3371]! } + public var Channel_BotDoesntSupportGroups: String { return self._s[3372]! } public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3330]!, self._r[3330]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3373]!, self._r[3373]!, [_1, _2]) } - public var Channel_AdminLogFilter_Title: String { return self._s[3331]! } - public var Notifications_GroupNotificationsExceptions: String { return self._s[3336]! } + public var Channel_AdminLogFilter_Title: String { return self._s[3374]! } + public var Notifications_GroupNotificationsExceptions: String { return self._s[3378]! } public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3337]!, self._r[3337]!, [_0]) + return formatWithArgumentRanges(self._s[3379]!, self._r[3379]!, [_0]) } - public var Passport_CorrectErrors: String { return self._s[3338]! } - public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3339]! } + public var Passport_CorrectErrors: String { return self._s[3380]! } + public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3381]! } public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3340]!, self._r[3340]!, [_0]) + return formatWithArgumentRanges(self._s[3382]!, self._r[3382]!, [_0]) } - public var Map_SendMyCurrentLocation: String { return self._s[3341]! } - public var Channel_DiscussionGroup: String { return self._s[3342]! } + public var Map_SendMyCurrentLocation: String { return self._s[3383]! } + public var Channel_DiscussionGroup: String { return self._s[3384]! } public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3343]!, self._r[3343]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3385]!, self._r[3385]!, [_1, _2]) } - public var SharedMedia_SearchNoResults: String { return self._s[3344]! } - public var Permissions_NotificationsText_v0: String { return self._s[3345]! } - public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[3346]! } - public var Appearance_AppIcon: String { return self._s[3347]! } - public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3348]! } - public var LoginPassword_FloodError: String { return self._s[3349]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[3351]! } + public var SharedMedia_SearchNoResults: String { return self._s[3386]! } + public var Permissions_NotificationsText_v0: String { return self._s[3387]! } + public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[3388]! } + public var Appearance_AppIcon: String { return self._s[3389]! } + public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3390]! } + public var LoginPassword_FloodError: String { return self._s[3391]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[3393]! } public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3352]!, self._r[3352]!, [_0]) + return formatWithArgumentRanges(self._s[3394]!, self._r[3394]!, [_0]) } - public var Passport_Language_bn: String { return self._s[3353]! } + public var Passport_Language_bn: String { return self._s[3395]! } public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3354]!, self._r[3354]!, [_0]) + return formatWithArgumentRanges(self._s[3396]!, self._r[3396]!, [_0]) } - public var ChatList_Context_Pin: String { return self._s[3355]! } + public var ChatList_Context_Pin: String { return self._s[3397]! } public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3356]!, self._r[3356]!, [_0]) + return formatWithArgumentRanges(self._s[3398]!, self._r[3398]!, [_0]) } public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3357]!, self._r[3357]!, [_0]) + return formatWithArgumentRanges(self._s[3399]!, self._r[3399]!, [_0]) } - public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3360]! } - public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3362]! } - public var Contacts_PermissionsAllow: String { return self._s[3363]! } - public var ReportPeer_ReasonCopyright: String { return self._s[3364]! } - public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3365]! } - public var WallpaperPreview_Pattern: String { return self._s[3366]! } - public var Paint_Duplicate: String { return self._s[3367]! } - public var Passport_Address_Country: String { return self._s[3368]! } - public var Notification_RenamedChannel: String { return self._s[3370]! } - public var ChatList_Context_Unmute: String { return self._s[3371]! } - public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3372]! } - public var Group_MessagePhotoUpdated: String { return self._s[3373]! } - public var Channel_BanUser_PermissionSendMedia: String { return self._s[3374]! } - public var Conversation_ContextMenuBan: String { return self._s[3375]! } - public var TwoStepAuth_EmailSent: String { return self._s[3376]! } - public var MessagePoll_NoVotes: String { return self._s[3377]! } - public var Wallet_Send_ErrorNotEnoughFundsTitle: String { return self._s[3378]! } - public var Passport_Language_is: String { return self._s[3379]! } - public var PeopleNearby_UsersEmpty: String { return self._s[3381]! } - public var Tour_Text5: String { return self._s[3382]! } + public var Wallet_Navigation_Close: String { return self._s[3400]! } + public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3404]! } + public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3406]! } + public var Wallet_Month_GenDecember: String { return self._s[3407]! } + public var Contacts_PermissionsAllow: String { return self._s[3408]! } + public var ReportPeer_ReasonCopyright: String { return self._s[3409]! } + public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3410]! } + public var WallpaperPreview_Pattern: String { return self._s[3411]! } + public var Paint_Duplicate: String { return self._s[3412]! } + public var Passport_Address_Country: String { return self._s[3413]! } + public var Notification_RenamedChannel: String { return self._s[3415]! } + public var ChatList_Context_Unmute: String { return self._s[3416]! } + public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3417]! } + public var Group_MessagePhotoUpdated: String { return self._s[3418]! } + public var Channel_BanUser_PermissionSendMedia: String { return self._s[3419]! } + public var Conversation_ContextMenuBan: String { return self._s[3420]! } + public var TwoStepAuth_EmailSent: String { return self._s[3421]! } + public var MessagePoll_NoVotes: String { return self._s[3422]! } + public var Wallet_Send_ErrorNotEnoughFundsTitle: String { return self._s[3423]! } + public var Passport_Language_is: String { return self._s[3424]! } + public var PeopleNearby_UsersEmpty: String { return self._s[3426]! } + public var Tour_Text5: String { return self._s[3427]! } public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3384]!, self._r[3384]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3429]!, self._r[3429]!, [_1, _2]) } - public var Undo_SecretChatDeleted: String { return self._s[3385]! } - public var SocksProxySetup_ShareQRCode: String { return self._s[3386]! } + public var Undo_SecretChatDeleted: String { return self._s[3430]! } + public var SocksProxySetup_ShareQRCode: String { return self._s[3431]! } public func VoiceOver_Chat_Size(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3387]!, self._r[3387]!, [_0]) + return formatWithArgumentRanges(self._s[3432]!, self._r[3432]!, [_0]) } - public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3388]! } - public var Paint_Edit: String { return self._s[3390]! } - public var ScheduledMessages_ReminderNotification: String { return self._s[3392]! } - public var Undo_DeletedGroup: String { return self._s[3394]! } - public var LoginPassword_ForgotPassword: String { return self._s[3395]! } - public var Wallet_WordImport_IncorrectTitle: String { return self._s[3396]! } - public var GroupInfo_GroupNamePlaceholder: String { return self._s[3397]! } + public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3433]! } + public var Paint_Edit: String { return self._s[3435]! } + public var ScheduledMessages_ReminderNotification: String { return self._s[3437]! } + public var Undo_DeletedGroup: String { return self._s[3439]! } + public var LoginPassword_ForgotPassword: String { return self._s[3440]! } + public var Wallet_WordImport_IncorrectTitle: String { return self._s[3441]! } + public var GroupInfo_GroupNamePlaceholder: String { return self._s[3442]! } public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3398]!, self._r[3398]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3443]!, self._r[3443]!, [_0, _1]) } - public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3399]! } - public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3400]! } - public var Passport_Language_uz: String { return self._s[3401]! } - public var Conversation_PinMessageAlertGroup: String { return self._s[3402]! } - public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3403]! } - public var Map_StopLiveLocation: String { return self._s[3405]! } - public var VoiceOver_MessageContextSend: String { return self._s[3407]! } - public var PasscodeSettings_Help: String { return self._s[3408]! } - public var NotificationsSound_Input: String { return self._s[3409]! } - public var Share_Title: String { return self._s[3412]! } - public var LogoutOptions_Title: String { return self._s[3413]! } - public var Wallet_Send_AddressText: String { return self._s[3414]! } - public var Login_TermsOfServiceAgree: String { return self._s[3415]! } - public var Compose_NewEncryptedChatTitle: String { return self._s[3416]! } - public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3417]! } - public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3418]! } - public var EnterPasscode_EnterTitle: String { return self._s[3419]! } + public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3444]! } + public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3445]! } + public var Passport_Language_uz: String { return self._s[3446]! } + public var Conversation_PinMessageAlertGroup: String { return self._s[3447]! } + public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3448]! } + public var Map_StopLiveLocation: String { return self._s[3450]! } + public var VoiceOver_MessageContextSend: String { return self._s[3452]! } + public var PasscodeSettings_Help: String { return self._s[3453]! } + public var NotificationsSound_Input: String { return self._s[3454]! } + public var Share_Title: String { return self._s[3457]! } + public var LogoutOptions_Title: String { return self._s[3458]! } + public var Wallet_Send_AddressText: String { return self._s[3459]! } + public var Login_TermsOfServiceAgree: String { return self._s[3460]! } + public var Compose_NewEncryptedChatTitle: String { return self._s[3461]! } + public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3462]! } + public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[3463]! } + public var EnterPasscode_EnterTitle: String { return self._s[3464]! } public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3420]!, self._r[3420]!, [_0]) + return formatWithArgumentRanges(self._s[3465]!, self._r[3465]!, [_0]) } - public var Settings_CopyPhoneNumber: String { return self._s[3421]! } - public var Conversation_AddToContacts: String { return self._s[3422]! } + public var Settings_CopyPhoneNumber: String { return self._s[3466]! } + public var Conversation_AddToContacts: String { return self._s[3467]! } public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3423]!, self._r[3423]!, [_0]) + return formatWithArgumentRanges(self._s[3468]!, self._r[3468]!, [_0]) } - public var NotificationsSound_Keys: String { return self._s[3424]! } + public var NotificationsSound_Keys: String { return self._s[3469]! } public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3425]!, self._r[3425]!, [_0]) + return formatWithArgumentRanges(self._s[3470]!, self._r[3470]!, [_0]) } - public var Notification_MessageLifetime1w: String { return self._s[3426]! } - public var Message_Video: String { return self._s[3427]! } - public var AutoDownloadSettings_CellularTitle: String { return self._s[3428]! } + public var Notification_MessageLifetime1w: String { return self._s[3471]! } + public var Message_Video: String { return self._s[3472]! } + public var AutoDownloadSettings_CellularTitle: String { return self._s[3473]! } public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3429]!, self._r[3429]!, [_1]) + return formatWithArgumentRanges(self._s[3474]!, self._r[3474]!, [_1]) } - public var Wallet_Receive_AmountInfo: String { return self._s[3432]! } + public var Wallet_Receive_AmountInfo: String { return self._s[3477]! } public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3433]!, self._r[3433]!, [_0]) + return formatWithArgumentRanges(self._s[3478]!, self._r[3478]!, [_0]) } public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3434]!, self._r[3434]!, [_0]) + return formatWithArgumentRanges(self._s[3479]!, self._r[3479]!, [_0]) } - public var Passport_Language_mk: String { return self._s[3435]! } - public var CreatePoll_CancelConfirmation: String { return self._s[3436]! } - public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3438]! } - public var PrivacyPolicy_Decline: String { return self._s[3439]! } - public var Passport_Identity_DoesNotExpire: String { return self._s[3440]! } - public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3441]! } - public var Permissions_SiriAllow_v0: String { return self._s[3443]! } - public var Appearance_ThemeCarouselNight: String { return self._s[3444]! } + public var Passport_Language_mk: String { return self._s[3480]! } + public func Wallet_Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3481]!, self._r[3481]!, [_1, _2, _3]) + } + public var CreatePoll_CancelConfirmation: String { return self._s[3482]! } + public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3484]! } + public var PrivacyPolicy_Decline: String { return self._s[3485]! } + public var Passport_Identity_DoesNotExpire: String { return self._s[3486]! } + public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[3487]! } + public var Permissions_SiriAllow_v0: String { return self._s[3489]! } + public var Wallet_Month_ShortAugust: String { return self._s[3490]! } + public var Appearance_ThemeCarouselNight: String { return self._s[3491]! } public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3445]!, self._r[3445]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3492]!, self._r[3492]!, [_1, "\(_2)"]) } public func Notification_RenamedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3446]!, self._r[3446]!, [_0]) + return formatWithArgumentRanges(self._s[3493]!, self._r[3493]!, [_0]) } - public var Paint_Regular: String { return self._s[3447]! } - public var ChatSettings_AutoDownloadReset: String { return self._s[3448]! } - public var SocksProxySetup_ShareLink: String { return self._s[3449]! } - public var Wallet_Qr_Title: String { return self._s[3450]! } - public var BlockedUsers_SelectUserTitle: String { return self._s[3451]! } - public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3453]! } - public var GroupInfo_InviteByLink: String { return self._s[3454]! } - public var MessageTimer_Custom: String { return self._s[3455]! } - public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3456]! } - public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3458]! } - public var Conversation_SendMessage_SetReminder: String { return self._s[3459]! } - public var VoiceOver_Chat_Selected: String { return self._s[3460]! } - public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3461]! } - public var Channel_Username_InvalidTaken: String { return self._s[3462]! } - public var Conversation_ClousStorageInfo_Description3: String { return self._s[3463]! } - public var Wallet_WordCheck_TryAgain: String { return self._s[3464]! } - public var Wallet_Info_TransactionPendingHeader: String { return self._s[3465]! } - public var Settings_ChatBackground: String { return self._s[3466]! } - public var Channel_Subscribers_Title: String { return self._s[3467]! } - public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[3468]! } - public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3469]! } - public var Watch_ConnectionDescription: String { return self._s[3470]! } - public var ChatList_ArchivedChatsTitle: String { return self._s[3474]! } - public var Wallpaper_ResetWallpapers: String { return self._s[3475]! } - public var EditProfile_Title: String { return self._s[3476]! } - public var NotificationsSound_Bamboo: String { return self._s[3478]! } - public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3480]! } - public var Login_SmsRequestState2: String { return self._s[3481]! } - public var Passport_Language_ar: String { return self._s[3482]! } + public var Paint_Regular: String { return self._s[3494]! } + public var ChatSettings_AutoDownloadReset: String { return self._s[3495]! } + public var SocksProxySetup_ShareLink: String { return self._s[3496]! } + public var Wallet_Qr_Title: String { return self._s[3497]! } + public var BlockedUsers_SelectUserTitle: String { return self._s[3498]! } + public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3500]! } + public var GroupInfo_InviteByLink: String { return self._s[3501]! } + public var MessageTimer_Custom: String { return self._s[3502]! } + public var UserInfo_NotificationsDefaultEnabled: String { return self._s[3503]! } + public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3505]! } + public var Conversation_SendMessage_SetReminder: String { return self._s[3506]! } + public var VoiceOver_Chat_Selected: String { return self._s[3507]! } + public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[3508]! } + public var Channel_Username_InvalidTaken: String { return self._s[3509]! } + public var Conversation_ClousStorageInfo_Description3: String { return self._s[3510]! } + public var Wallet_WordCheck_TryAgain: String { return self._s[3511]! } + public var Wallet_Info_TransactionPendingHeader: String { return self._s[3512]! } + public var Settings_ChatBackground: String { return self._s[3513]! } + public var Channel_Subscribers_Title: String { return self._s[3514]! } + public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[3515]! } + public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[3516]! } + public var Watch_ConnectionDescription: String { return self._s[3517]! } + public var ChatList_ArchivedChatsTitle: String { return self._s[3521]! } + public var Wallpaper_ResetWallpapers: String { return self._s[3522]! } + public var EditProfile_Title: String { return self._s[3523]! } + public var NotificationsSound_Bamboo: String { return self._s[3525]! } + public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[3527]! } + public var Login_SmsRequestState2: String { return self._s[3528]! } + public var Passport_Language_ar: String { return self._s[3529]! } public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3483]!, self._r[3483]!, [_0]) + return formatWithArgumentRanges(self._s[3530]!, self._r[3530]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3484]! } - public var Wallet_Created_Text: String { return self._s[3485]! } - public var Conversation_MessageDialogEdit: String { return self._s[3486]! } - public var Wallet_Created_Proceed: String { return self._s[3487]! } - public var Wallet_Words_Done: String { return self._s[3488]! } - public var VoiceOver_Media_PlaybackPause: String { return self._s[3489]! } + public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[3531]! } + public var Wallet_Created_Text: String { return self._s[3532]! } + public var Conversation_MessageDialogEdit: String { return self._s[3533]! } + public var Wallet_Created_Proceed: String { return self._s[3534]! } + public var Wallet_Words_Done: String { return self._s[3535]! } + public var VoiceOver_Media_PlaybackPause: String { return self._s[3536]! } public func PUSH_AUTH_UNKNOWN(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3490]!, self._r[3490]!, [_1]) + return formatWithArgumentRanges(self._s[3537]!, self._r[3537]!, [_1]) } - public var Common_Close: String { return self._s[3491]! } - public var GroupInfo_PublicLink: String { return self._s[3492]! } - public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3493]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3494]! } + public var Common_Close: String { return self._s[3538]! } + public var GroupInfo_PublicLink: String { return self._s[3539]! } + public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[3540]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[3541]! } public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3498]!, self._r[3498]!, [_0]) - } - public var UserInfo_About_Placeholder: String { return self._s[3499]! } - public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3500]!, self._r[3500]!, [_0]) - } - public var GroupInfo_Permissions_SectionTitle: String { return self._s[3501]! } - public var Channel_Info_Banned: String { return self._s[3503]! } - public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3504]!, self._r[3504]!, [_0]) - } - public var Appearance_Other: String { return self._s[3505]! } - public var Passport_Language_my: String { return self._s[3506]! } - public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3507]! } - public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3508]!, self._r[3508]!, [_1, _2, _3]) - } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3509]! } - public var Preview_CopyAddress: String { return self._s[3510]! } - public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3511]!, self._r[3511]!, [_0]) - } - public var KeyCommand_JumpToPreviousChat: String { return self._s[3512]! } - public var UserInfo_BotSettings: String { return self._s[3513]! } - public var LiveLocation_MenuStopAll: String { return self._s[3515]! } - public var Passport_PasswordCreate: String { return self._s[3516]! } - public var StickerSettings_MaskContextInfo: String { return self._s[3517]! } - public var Message_PinnedLocationMessage: String { return self._s[3518]! } - public var Map_Satellite: String { return self._s[3519]! } - public var Watch_Message_Unsupported: String { return self._s[3520]! } - public var Username_TooManyPublicUsernamesError: String { return self._s[3521]! } - public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3522]! } - public func Notification_PinnedTextMessage(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3523]!, self._r[3523]!, [_0, _1]) - } - public func Conversation_OpenBotLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3524]!, self._r[3524]!, [_0]) - } - public var Wallet_WordImport_Continue: String { return self._s[3525]! } - public var Notifications_ChannelNotificationsHelp: String { return self._s[3526]! } - public var Privacy_Calls_P2PContacts: String { return self._s[3527]! } - public var NotificationsSound_None: String { return self._s[3528]! } - public var Wallet_TransactionInfo_StorageFeeHeader: String { return self._s[3529]! } - public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3531]! } - public var AccessDenied_VoiceMicrophone: String { return self._s[3532]! } - public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3533]!, self._r[3533]!, [_1]) - } - public var Cache_Indexing: String { return self._s[3534]! } - public var DialogList_RecentTitlePeople: String { return self._s[3536]! } - public var DialogList_EncryptionRejected: String { return self._s[3537]! } - public var GroupInfo_Administrators: String { return self._s[3538]! } - public var Passport_ScanPassportHelp: String { return self._s[3539]! } - public var Application_Name: String { return self._s[3540]! } - public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3541]! } - public var Appearance_ThemeCarouselDay: String { return self._s[3543]! } - public var Passport_Identity_TranslationHelp: String { return self._s[3544]! } - public func VoiceOver_Chat_VideoMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3545]!, self._r[3545]!, [_0]) } - public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3546]!, self._r[3546]!, [_0]) - } - public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { + public var UserInfo_About_Placeholder: String { return self._s[3546]! } + public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3547]!, self._r[3547]!, [_0]) } - public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3548]! } - public var Privacy_ChatsTitle: String { return self._s[3549]! } - public var DialogList_ClearHistoryConfirmation: String { return self._s[3550]! } - public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3551]! } - public var Watch_Suggestion_HoldOn: String { return self._s[3552]! } - public var Group_EditAdmin_TransferOwnership: String { return self._s[3553]! } - public var Group_LinkedChannel: String { return self._s[3554]! } - public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3555]! } - public var SocksProxySetup_RequiredCredentials: String { return self._s[3556]! } - public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3557]! } - public var TwoStepAuth_EmailSkipAlert: String { return self._s[3558]! } - public var ScheduledMessages_RemindersTitle: String { return self._s[3560]! } - public var Channel_Setup_TypePublic: String { return self._s[3562]! } + public var GroupInfo_Permissions_SectionTitle: String { return self._s[3548]! } + public var Channel_Info_Banned: String { return self._s[3550]! } + public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3551]!, self._r[3551]!, [_0]) + } + public var Appearance_Other: String { return self._s[3552]! } + public var Passport_Language_my: String { return self._s[3553]! } + public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3554]! } + public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3555]!, self._r[3555]!, [_1, _2, _3]) + } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[3556]! } + public var Preview_CopyAddress: String { return self._s[3557]! } + public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3558]!, self._r[3558]!, [_0]) + } + public var KeyCommand_JumpToPreviousChat: String { return self._s[3559]! } + public var UserInfo_BotSettings: String { return self._s[3560]! } + public var LiveLocation_MenuStopAll: String { return self._s[3562]! } + public var Passport_PasswordCreate: String { return self._s[3563]! } + public var StickerSettings_MaskContextInfo: String { return self._s[3564]! } + public var Message_PinnedLocationMessage: String { return self._s[3565]! } + public var Map_Satellite: String { return self._s[3566]! } + public var Watch_Message_Unsupported: String { return self._s[3567]! } + public var Username_TooManyPublicUsernamesError: String { return self._s[3568]! } + public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[3569]! } + public func Notification_PinnedTextMessage(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3570]!, self._r[3570]!, [_0, _1]) + } + public func Conversation_OpenBotLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3571]!, self._r[3571]!, [_0]) + } + public var Wallet_WordImport_Continue: String { return self._s[3572]! } + public var Notifications_ChannelNotificationsHelp: String { return self._s[3573]! } + public var Privacy_Calls_P2PContacts: String { return self._s[3574]! } + public var NotificationsSound_None: String { return self._s[3575]! } + public var Wallet_TransactionInfo_StorageFeeHeader: String { return self._s[3576]! } + public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[3578]! } + public var AccessDenied_VoiceMicrophone: String { return self._s[3579]! } + public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3580]!, self._r[3580]!, [_1]) + } + public var Cache_Indexing: String { return self._s[3581]! } + public var DialogList_RecentTitlePeople: String { return self._s[3583]! } + public var DialogList_EncryptionRejected: String { return self._s[3584]! } + public var GroupInfo_Administrators: String { return self._s[3585]! } + public var Passport_ScanPassportHelp: String { return self._s[3586]! } + public var Application_Name: String { return self._s[3587]! } + public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[3588]! } + public var Appearance_ThemeCarouselDay: String { return self._s[3590]! } + public var Passport_Identity_TranslationHelp: String { return self._s[3591]! } + public func VoiceOver_Chat_VideoMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3592]!, self._r[3592]!, [_0]) + } + public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3593]!, self._r[3593]!, [_0]) + } + public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3594]!, self._r[3594]!, [_0]) + } + public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3595]! } + public var Privacy_ChatsTitle: String { return self._s[3596]! } + public var DialogList_ClearHistoryConfirmation: String { return self._s[3597]! } + public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[3598]! } + public var Watch_Suggestion_HoldOn: String { return self._s[3599]! } + public var Group_EditAdmin_TransferOwnership: String { return self._s[3600]! } + public var Group_LinkedChannel: String { return self._s[3601]! } + public var VoiceOver_Chat_SeenByRecipient: String { return self._s[3602]! } + public var SocksProxySetup_RequiredCredentials: String { return self._s[3603]! } + public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[3604]! } + public var TwoStepAuth_EmailSkipAlert: String { return self._s[3605]! } + public var ScheduledMessages_RemindersTitle: String { return self._s[3607]! } + public var Channel_Setup_TypePublic: String { return self._s[3609]! } public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3563]!, self._r[3563]!, [_0]) + return formatWithArgumentRanges(self._s[3610]!, self._r[3610]!, [_0]) } - public var Channel_TypeSetup_Title: String { return self._s[3565]! } - public var Map_OpenInMaps: String { return self._s[3567]! } + public var Channel_TypeSetup_Title: String { return self._s[3612]! } + public var Map_OpenInMaps: String { return self._s[3614]! } public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3568]!, self._r[3568]!, [_1]) + return formatWithArgumentRanges(self._s[3615]!, self._r[3615]!, [_1]) } - public var NotificationsSound_Tremolo: String { return self._s[3570]! } + public var NotificationsSound_Tremolo: String { return self._s[3617]! } public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3571]!, self._r[3571]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3618]!, self._r[3618]!, [_1, _2, _3]) } - public var ConversationProfile_UnknownAddMemberError: String { return self._s[3572]! } - public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3573]! } - public var Passport_PasswordHelp: String { return self._s[3574]! } - public var Login_CodeExpiredError: String { return self._s[3575]! } - public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3576]! } - public var Conversation_TitleUnmute: String { return self._s[3577]! } - public var Passport_Identity_ScansHelp: String { return self._s[3578]! } - public var Passport_Language_lo: String { return self._s[3579]! } - public var Camera_FlashAuto: String { return self._s[3580]! } - public var Conversation_OpenBotLinkOpen: String { return self._s[3581]! } - public var Common_Cancel: String { return self._s[3582]! } - public var DialogList_SavedMessagesTooltip: String { return self._s[3583]! } - public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3584]! } - public var Appearance_TintAllColors: String { return self._s[3585]! } + public var ConversationProfile_UnknownAddMemberError: String { return self._s[3619]! } + public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3620]! } + public var Passport_PasswordHelp: String { return self._s[3621]! } + public var Login_CodeExpiredError: String { return self._s[3622]! } + public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[3623]! } + public var Conversation_TitleUnmute: String { return self._s[3624]! } + public var Passport_Identity_ScansHelp: String { return self._s[3625]! } + public var Passport_Language_lo: String { return self._s[3626]! } + public var Camera_FlashAuto: String { return self._s[3627]! } + public var Conversation_OpenBotLinkOpen: String { return self._s[3628]! } + public var Common_Cancel: String { return self._s[3629]! } + public var DialogList_SavedMessagesTooltip: String { return self._s[3630]! } + public var TwoStepAuth_SetupPasswordTitle: String { return self._s[3631]! } + public var Appearance_TintAllColors: String { return self._s[3632]! } public func PUSH_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3586]!, self._r[3586]!, [_1]) + return formatWithArgumentRanges(self._s[3633]!, self._r[3633]!, [_1]) } - public var Conversation_ReportSpamConfirmation: String { return self._s[3587]! } - public var ChatSettings_Title: String { return self._s[3589]! } - public var Passport_PasswordReset: String { return self._s[3590]! } - public var SocksProxySetup_TypeNone: String { return self._s[3591]! } - public var EditTheme_Title: String { return self._s[3593]! } - public var PhoneNumberHelp_Help: String { return self._s[3594]! } - public var Checkout_EnterPassword: String { return self._s[3595]! } - public var Share_AuthTitle: String { return self._s[3597]! } - public var Activity_UploadingDocument: String { return self._s[3598]! } - public var State_Connecting: String { return self._s[3599]! } - public var Profile_MessageLifetime1w: String { return self._s[3600]! } - public var Conversation_ContextMenuReport: String { return self._s[3601]! } - public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3602]! } - public var AutoNightTheme_ScheduledTo: String { return self._s[3603]! } + public var Conversation_ReportSpamConfirmation: String { return self._s[3634]! } + public var ChatSettings_Title: String { return self._s[3636]! } + public var Passport_PasswordReset: String { return self._s[3637]! } + public var SocksProxySetup_TypeNone: String { return self._s[3638]! } + public var EditTheme_Title: String { return self._s[3640]! } + public var PhoneNumberHelp_Help: String { return self._s[3641]! } + public var Checkout_EnterPassword: String { return self._s[3642]! } + public var Share_AuthTitle: String { return self._s[3644]! } + public var Activity_UploadingDocument: String { return self._s[3645]! } + public var State_Connecting: String { return self._s[3646]! } + public var Profile_MessageLifetime1w: String { return self._s[3647]! } + public var Conversation_ContextMenuReport: String { return self._s[3648]! } + public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3649]! } + public var AutoNightTheme_ScheduledTo: String { return self._s[3650]! } public func VoiceOver_Chat_AnonymousPollFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3604]!, self._r[3604]!, [_0]) + return formatWithArgumentRanges(self._s[3651]!, self._r[3651]!, [_0]) } - public var AuthSessions_Terminate: String { return self._s[3605]! } - public var Wallet_WordImport_CanNotRemember: String { return self._s[3606]! } - public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3607]! } - public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3608]! } - public var PhotoEditor_Set: String { return self._s[3609]! } - public var EmptyGroupInfo_Title: String { return self._s[3610]! } - public var Login_PadPhoneHelp: String { return self._s[3611]! } - public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3614]! } - public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3616]! } - public var NotificationsSound_Complete: String { return self._s[3617]! } - public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3618]! } - public var Group_Info_AdminLog: String { return self._s[3619]! } - public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3620]! } - public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3621]! } - public var Conversation_Admin: String { return self._s[3623]! } - public var Conversation_GifTooltip: String { return self._s[3624]! } - public var Passport_NotLoggedInMessage: String { return self._s[3625]! } + public var AuthSessions_Terminate: String { return self._s[3652]! } + public var Wallet_WordImport_CanNotRemember: String { return self._s[3653]! } + public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3654]! } + public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[3655]! } + public var PhotoEditor_Set: String { return self._s[3656]! } + public var EmptyGroupInfo_Title: String { return self._s[3657]! } + public var Login_PadPhoneHelp: String { return self._s[3658]! } + public var AutoDownloadSettings_TypeGroupChats: String { return self._s[3660]! } + public var PrivacyPolicy_DeclineLastWarning: String { return self._s[3662]! } + public var NotificationsSound_Complete: String { return self._s[3663]! } + public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[3664]! } + public var Group_Info_AdminLog: String { return self._s[3665]! } + public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[3666]! } + public func Wallet_Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3667]!, self._r[3667]!, [_1, _2, _3]) + } + public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[3668]! } + public var Conversation_Admin: String { return self._s[3670]! } + public var Conversation_GifTooltip: String { return self._s[3671]! } + public var Passport_NotLoggedInMessage: String { return self._s[3672]! } public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3627]!, self._r[3627]!, [_0]) + return formatWithArgumentRanges(self._s[3674]!, self._r[3674]!, [_0]) } - public var Profile_MessageLifetimeForever: String { return self._s[3628]! } - public var SharedMedia_EmptyTitle: String { return self._s[3630]! } - public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3632]! } - public var Username_Help: String { return self._s[3633]! } - public var DialogList_LanguageTooltip: String { return self._s[3635]! } - public var Map_LoadError: String { return self._s[3636]! } - public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3637]! } - public var Channel_AdminLog_AddMembers: String { return self._s[3638]! } - public var ArchivedChats_IntroTitle2: String { return self._s[3639]! } - public var Notification_Exceptions_NewException: String { return self._s[3640]! } - public var TwoStepAuth_EmailTitle: String { return self._s[3641]! } - public var WatchRemote_AlertText: String { return self._s[3642]! } + public var Profile_MessageLifetimeForever: String { return self._s[3675]! } + public var SharedMedia_EmptyTitle: String { return self._s[3677]! } + public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[3679]! } + public var Username_Help: String { return self._s[3680]! } + public var DialogList_LanguageTooltip: String { return self._s[3682]! } + public var Map_LoadError: String { return self._s[3683]! } + public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3684]! } + public var Channel_AdminLog_AddMembers: String { return self._s[3685]! } + public var ArchivedChats_IntroTitle2: String { return self._s[3686]! } + public var Notification_Exceptions_NewException: String { return self._s[3687]! } + public var TwoStepAuth_EmailTitle: String { return self._s[3688]! } + public var WatchRemote_AlertText: String { return self._s[3689]! } public func Wallet_Send_ConfirmationText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3643]!, self._r[3643]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3690]!, self._r[3690]!, [_1, _2]) } - public var ChatSettings_ConnectionType_Title: String { return self._s[3646]! } + public var ChatSettings_ConnectionType_Title: String { return self._s[3694]! } public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3647]!, self._r[3647]!, [_0]) + return formatWithArgumentRanges(self._s[3695]!, self._r[3695]!, [_0]) } - public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3648]! } - public var Passport_Address_CountryPlaceholder: String { return self._s[3649]! } + public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3696]! } + public var Passport_Address_CountryPlaceholder: String { return self._s[3697]! } public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3650]!, self._r[3650]!, [_0]) + return formatWithArgumentRanges(self._s[3698]!, self._r[3698]!, [_0]) } public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3651]!, self._r[3651]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3699]!, self._r[3699]!, [_1, _2, _3]) } - public var Group_AdminLog_EmptyText: String { return self._s[3652]! } - public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3653]! } - public var Conversation_PrivateChannelTooltip: String { return self._s[3655]! } - public var Wallet_Created_ExportErrorText: String { return self._s[3656]! } - public var ChatList_UndoArchiveText1: String { return self._s[3657]! } - public var AccessDenied_VideoMicrophone: String { return self._s[3658]! } - public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3659]! } - public var Cache_ClearNone: String { return self._s[3660]! } - public var SocksProxySetup_FailedToConnect: String { return self._s[3661]! } - public var Permissions_NotificationsTitle_v0: String { return self._s[3662]! } + public var Group_AdminLog_EmptyText: String { return self._s[3700]! } + public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[3701]! } + public var Conversation_PrivateChannelTooltip: String { return self._s[3703]! } + public var Wallet_Created_ExportErrorText: String { return self._s[3704]! } + public var ChatList_UndoArchiveText1: String { return self._s[3705]! } + public var AccessDenied_VideoMicrophone: String { return self._s[3706]! } + public var Conversation_ContextMenuStickerPackAdd: String { return self._s[3707]! } + public var Cache_ClearNone: String { return self._s[3708]! } + public var SocksProxySetup_FailedToConnect: String { return self._s[3709]! } + public var Permissions_NotificationsTitle_v0: String { return self._s[3710]! } public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3663]!, self._r[3663]!, [_0]) + return formatWithArgumentRanges(self._s[3711]!, self._r[3711]!, [_0]) } - public var Passport_Identity_Country: String { return self._s[3664]! } + public var Passport_Identity_Country: String { return self._s[3712]! } public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3665]!, self._r[3665]!, [_0]) + return formatWithArgumentRanges(self._s[3713]!, self._r[3713]!, [_0]) } public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3666]!, self._r[3666]!, [_0]) + return formatWithArgumentRanges(self._s[3714]!, self._r[3714]!, [_0]) } - public var Exceptions_AddToExceptions: String { return self._s[3667]! } - public var AccessDenied_Settings: String { return self._s[3668]! } - public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3669]! } - public var Month_ShortMay: String { return self._s[3670]! } - public var Compose_NewGroup: String { return self._s[3672]! } - public var Group_Setup_TypePrivate: String { return self._s[3674]! } - public var Login_PadPhoneHelpTitle: String { return self._s[3676]! } - public var Appearance_ThemeDayClassic: String { return self._s[3677]! } - public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3678]! } - public var AutoDownloadSettings_OffForAll: String { return self._s[3679]! } - public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3680]! } - public var Conversation_typing: String { return self._s[3682]! } - public var Undo_ScheduledMessagesCleared: String { return self._s[3683]! } - public var Paint_Masks: String { return self._s[3684]! } - public var Contacts_DeselectAll: String { return self._s[3685]! } - public var Username_InvalidTaken: String { return self._s[3686]! } - public var Call_StatusNoAnswer: String { return self._s[3687]! } - public var TwoStepAuth_EmailAddSuccess: String { return self._s[3688]! } - public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3689]! } - public var Passport_Identity_Selfie: String { return self._s[3690]! } - public var Login_InfoLastNamePlaceholder: String { return self._s[3691]! } - public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3692]! } - public var Conversation_ClearSecretHistory: String { return self._s[3693]! } - public var PeopleNearby_Description: String { return self._s[3695]! } - public var NetworkUsageSettings_Title: String { return self._s[3696]! } - public var Your_cards_security_code_is_invalid: String { return self._s[3698]! } + public var Exceptions_AddToExceptions: String { return self._s[3715]! } + public var AccessDenied_Settings: String { return self._s[3716]! } + public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[3717]! } + public var Month_ShortMay: String { return self._s[3718]! } + public var Compose_NewGroup: String { return self._s[3720]! } + public var Group_Setup_TypePrivate: String { return self._s[3722]! } + public var Login_PadPhoneHelpTitle: String { return self._s[3724]! } + public var Appearance_ThemeDayClassic: String { return self._s[3725]! } + public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[3726]! } + public var AutoDownloadSettings_OffForAll: String { return self._s[3727]! } + public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3728]! } + public var Conversation_typing: String { return self._s[3730]! } + public var Undo_ScheduledMessagesCleared: String { return self._s[3731]! } + public var Paint_Masks: String { return self._s[3732]! } + public var Contacts_DeselectAll: String { return self._s[3733]! } + public func Wallet_Updated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3734]!, self._r[3734]!, [_0]) + } + public var Username_InvalidTaken: String { return self._s[3735]! } + public var Call_StatusNoAnswer: String { return self._s[3736]! } + public var TwoStepAuth_EmailAddSuccess: String { return self._s[3737]! } + public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[3738]! } + public var Passport_Identity_Selfie: String { return self._s[3739]! } + public var Login_InfoLastNamePlaceholder: String { return self._s[3740]! } + public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[3741]! } + public var Conversation_ClearSecretHistory: String { return self._s[3742]! } + public var PeopleNearby_Description: String { return self._s[3744]! } + public var NetworkUsageSettings_Title: String { return self._s[3745]! } + public var Your_cards_security_code_is_invalid: String { return self._s[3747]! } public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3700]!, self._r[3700]!, [_0]) - } - public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3701]!, self._r[3701]!, [_1, _2]) - } - public var SaveIncomingPhotosSettings_From: String { return self._s[3703]! } - public var VoiceOver_Navigation_Search: String { return self._s[3704]! } - public var Map_LiveLocationTitle: String { return self._s[3705]! } - public var Login_InfoAvatarAdd: String { return self._s[3706]! } - public var Passport_Identity_FilesView: String { return self._s[3707]! } - public var UserInfo_GenericPhoneLabel: String { return self._s[3708]! } - public var Privacy_Calls_NeverAllow: String { return self._s[3709]! } - public var VoiceOver_Chat_File: String { return self._s[3710]! } - public var Wallet_Settings_DeleteWalletInfo: String { return self._s[3711]! } - public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3712]!, self._r[3712]!, [_0]) - } - public var ContactInfo_PhoneNumberHidden: String { return self._s[3713]! } - public var TwoStepAuth_ConfirmationText: String { return self._s[3714]! } - public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3715]! } - public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3716]!, self._r[3716]!, [_1, _2, _3]) - } - public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3717]! } - public var Wallet_Intro_CreateErrorText: String { return self._s[3718]! } - public var Tour_Title2: String { return self._s[3719]! } - public var Wallet_Sent_ViewWallet: String { return self._s[3720]! } - public var Conversation_FileOpenIn: String { return self._s[3721]! } - public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3722]! } - public var Wallet_Send_ErrorInvalidAddress: String { return self._s[3723]! } - public var Wallpaper_Set: String { return self._s[3724]! } - public var Passport_Identity_Translations: String { return self._s[3726]! } - public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3727]!, self._r[3727]!, [_0]) - } - public var Channel_LeaveChannel: String { return self._s[3728]! } - public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3729]!, self._r[3729]!, [_1]) - } - public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3731]! } - public var PhotoEditor_HighlightsTint: String { return self._s[3732]! } - public var Passport_Email_Delete: String { return self._s[3733]! } - public var Conversation_Mute: String { return self._s[3735]! } - public var Channel_AddBotAsAdmin: String { return self._s[3736]! } - public var Channel_AdminLog_CanSendMessages: String { return self._s[3738]! } - public var Channel_Management_LabelOwner: String { return self._s[3740]! } - public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3741]!, self._r[3741]!, [_1, _2]) - } - public var Calls_CallTabDescription: String { return self._s[3742]! } - public var Passport_Identity_NativeNameHelp: String { return self._s[3743]! } - public var Common_No: String { return self._s[3744]! } - public var Weekday_Sunday: String { return self._s[3745]! } - public var Notification_Reply: String { return self._s[3746]! } - public var Conversation_ViewMessage: String { return self._s[3747]! } - public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3748]!, self._r[3748]!, [_0]) - } - public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3749]!, self._r[3749]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3750]! } - public var Wallet_Send_Title: String { return self._s[3751]! } - public var Message_PinnedDocumentMessage: String { return self._s[3752]! } - public var Wallet_Info_RefreshErrorText: String { return self._s[3753]! } - public var DialogList_TabTitle: String { return self._s[3755]! } - public var ChatSettings_AutoPlayTitle: String { return self._s[3756]! } - public var Passport_FieldEmail: String { return self._s[3757]! } - public var Conversation_UnpinMessageAlert: String { return self._s[3758]! } - public var Passport_Address_TypeBankStatement: String { return self._s[3759]! } - public var Wallet_SecureStorageReset_Title: String { return self._s[3760]! } - public var Passport_Identity_ExpiryDate: String { return self._s[3761]! } - public var Privacy_Calls_P2P: String { return self._s[3762]! } + public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3750]!, self._r[3750]!, [_1, _2]) + } + public var SaveIncomingPhotosSettings_From: String { return self._s[3752]! } + public var VoiceOver_Navigation_Search: String { return self._s[3753]! } + public var Map_LiveLocationTitle: String { return self._s[3754]! } + public var Login_InfoAvatarAdd: String { return self._s[3755]! } + public var Passport_Identity_FilesView: String { return self._s[3756]! } + public var UserInfo_GenericPhoneLabel: String { return self._s[3757]! } + public var Privacy_Calls_NeverAllow: String { return self._s[3758]! } + public var VoiceOver_Chat_File: String { return self._s[3759]! } + public var Wallet_Settings_DeleteWalletInfo: String { return self._s[3760]! } + public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3761]!, self._r[3761]!, [_0]) + } + public var ContactInfo_PhoneNumberHidden: String { return self._s[3762]! } + public var TwoStepAuth_ConfirmationText: String { return self._s[3763]! } + public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[3764]! } + public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3765]!, self._r[3765]!, [_1, _2, _3]) + } + public var Channel_AdminLogFilter_AdminsAll: String { return self._s[3766]! } + public var Wallet_Intro_CreateErrorText: String { return self._s[3767]! } + public var Tour_Title2: String { return self._s[3768]! } + public var Wallet_Sent_ViewWallet: String { return self._s[3769]! } + public var Conversation_FileOpenIn: String { return self._s[3770]! } + public var Checkout_ErrorPrecheckoutFailed: String { return self._s[3771]! } + public var Wallet_Send_ErrorInvalidAddress: String { return self._s[3772]! } + public var Wallpaper_Set: String { return self._s[3773]! } + public var Passport_Identity_Translations: String { return self._s[3775]! } + public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3776]!, self._r[3776]!, [_0]) + } + public var Channel_LeaveChannel: String { return self._s[3777]! } + public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3778]!, self._r[3778]!, [_1]) + } + public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[3780]! } + public var PhotoEditor_HighlightsTint: String { return self._s[3781]! } + public var Passport_Email_Delete: String { return self._s[3782]! } + public var Conversation_Mute: String { return self._s[3784]! } + public var Channel_AddBotAsAdmin: String { return self._s[3785]! } + public var Channel_AdminLog_CanSendMessages: String { return self._s[3787]! } + public var Channel_Management_LabelOwner: String { return self._s[3789]! } + public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3790]!, self._r[3790]!, [_1, _2]) + } + public var Calls_CallTabDescription: String { return self._s[3791]! } + public var Passport_Identity_NativeNameHelp: String { return self._s[3792]! } + public var Common_No: String { return self._s[3793]! } + public var Weekday_Sunday: String { return self._s[3794]! } + public var Notification_Reply: String { return self._s[3795]! } + public var Conversation_ViewMessage: String { return self._s[3796]! } + public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3797]!, self._r[3797]!, [_0]) + } + public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3798]!, self._r[3798]!, [_0]) + } + public func Wallet_Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3799]!, self._r[3799]!, [_1, _2, _3]) + } + public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[3800]! } + public var Wallet_Send_Title: String { return self._s[3801]! } + public var Message_PinnedDocumentMessage: String { return self._s[3802]! } + public var Wallet_Info_RefreshErrorText: String { return self._s[3803]! } + public var DialogList_TabTitle: String { return self._s[3805]! } + public var ChatSettings_AutoPlayTitle: String { return self._s[3806]! } + public var Passport_FieldEmail: String { return self._s[3807]! } + public var Conversation_UnpinMessageAlert: String { return self._s[3808]! } + public var Passport_Address_TypeBankStatement: String { return self._s[3809]! } + public var Wallet_SecureStorageReset_Title: String { return self._s[3810]! } + public var Passport_Identity_ExpiryDate: String { return self._s[3811]! } + public var Privacy_Calls_P2P: String { return self._s[3812]! } public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3764]!, self._r[3764]!, [_0]) + return formatWithArgumentRanges(self._s[3814]!, self._r[3814]!, [_0]) } - public var SocksProxySetup_UseForCallsHelp: String { return self._s[3765]! } + public var SocksProxySetup_UseForCallsHelp: String { return self._s[3815]! } public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3766]!, self._r[3766]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3816]!, self._r[3816]!, [_1, _2]) } - public var Stickers_ClearRecent: String { return self._s[3767]! } - public var EnterPasscode_ChangeTitle: String { return self._s[3768]! } - public var Passport_InfoText: String { return self._s[3769]! } - public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3770]! } + public var Stickers_ClearRecent: String { return self._s[3817]! } + public var EnterPasscode_ChangeTitle: String { return self._s[3818]! } + public var Passport_InfoText: String { return self._s[3819]! } + public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[3820]! } public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3771]!, self._r[3771]!, [_0]) + return formatWithArgumentRanges(self._s[3821]!, self._r[3821]!, [_0]) } public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3772]!, self._r[3772]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3822]!, self._r[3822]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3773]! } - public var ScheduledMessages_PollUnavailable: String { return self._s[3774]! } - public var VoiceOver_Navigation_Compose: String { return self._s[3775]! } - public var Passport_Identity_EditDriversLicense: String { return self._s[3776]! } - public var Conversation_TapAndHoldToRecord: String { return self._s[3778]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3779]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[3823]! } + public var ScheduledMessages_PollUnavailable: String { return self._s[3824]! } + public var VoiceOver_Navigation_Compose: String { return self._s[3825]! } + public var Passport_Identity_EditDriversLicense: String { return self._s[3826]! } + public var Conversation_TapAndHoldToRecord: String { return self._s[3828]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[3829]! } public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3780]!, self._r[3780]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3830]!, self._r[3830]!, [_1, _2]) } - public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3782]! } + public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3832]! } public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3784]!, self._r[3784]!, [_0]) + return formatWithArgumentRanges(self._s[3834]!, self._r[3834]!, [_0]) } - public var DialogList_Unread: String { return self._s[3785]! } + public var DialogList_Unread: String { return self._s[3835]! } public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3786]!, self._r[3786]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3836]!, self._r[3836]!, [_1, _2]) } - public func Updated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3787]!, self._r[3787]!, [_0]) - } - public var User_DeletedAccount: String { return self._s[3788]! } - public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3789]! } + public var User_DeletedAccount: String { return self._s[3837]! } + public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[3838]! } public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3790]!, self._r[3790]!, [_0]) + return formatWithArgumentRanges(self._s[3839]!, self._r[3839]!, [_0]) } - public var UserInfo_NotificationsDefault: String { return self._s[3791]! } - public var SharedMedia_CategoryMedia: String { return self._s[3792]! } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3793]! } - public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3794]! } - public var Watch_ChatList_Compose: String { return self._s[3795]! } - public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3796]! } - public var AutoDownloadSettings_Delimeter: String { return self._s[3797]! } - public var Watch_Microphone_Access: String { return self._s[3798]! } - public var Group_Setup_HistoryHeader: String { return self._s[3799]! } - public var Map_SetThisLocation: String { return self._s[3800]! } - public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3801]! } - public var Activity_UploadingPhoto: String { return self._s[3802]! } - public var Conversation_Edit: String { return self._s[3804]! } - public var Group_ErrorSendRestrictedMedia: String { return self._s[3805]! } - public var Login_TermsOfServiceDecline: String { return self._s[3806]! } - public var Message_PinnedContactMessage: String { return self._s[3807]! } + public var UserInfo_NotificationsDefault: String { return self._s[3840]! } + public var SharedMedia_CategoryMedia: String { return self._s[3841]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[3842]! } + public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[3843]! } + public var Watch_ChatList_Compose: String { return self._s[3844]! } + public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[3845]! } + public var AutoDownloadSettings_Delimeter: String { return self._s[3846]! } + public var Watch_Microphone_Access: String { return self._s[3847]! } + public var Group_Setup_HistoryHeader: String { return self._s[3848]! } + public var Map_SetThisLocation: String { return self._s[3849]! } + public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3850]! } + public var Activity_UploadingPhoto: String { return self._s[3851]! } + public var Conversation_Edit: String { return self._s[3853]! } + public var Group_ErrorSendRestrictedMedia: String { return self._s[3854]! } + public var Login_TermsOfServiceDecline: String { return self._s[3855]! } + public var Message_PinnedContactMessage: String { return self._s[3856]! } public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3808]!, self._r[3808]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3857]!, self._r[3857]!, [_1, _2]) } public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3809]!, self._r[3809]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[3858]!, self._r[3858]!, [_1, _2, _3, _4, _5]) } - public var Appearance_LargeEmoji: String { return self._s[3810]! } - public var TwoStepAuth_AdditionalPassword: String { return self._s[3812]! } - public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[3813]! } + public var Appearance_LargeEmoji: String { return self._s[3859]! } + public var TwoStepAuth_AdditionalPassword: String { return self._s[3861]! } + public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[3862]! } public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3814]!, self._r[3814]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3863]!, self._r[3863]!, [_1, _2]) } - public var Passport_Phone_EnterOtherNumber: String { return self._s[3815]! } - public var Message_PinnedPhotoMessage: String { return self._s[3816]! } - public var Passport_FieldPhone: String { return self._s[3817]! } - public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3818]! } - public var ChatSettings_AutoPlayGifs: String { return self._s[3819]! } - public var InfoPlist_NSCameraUsageDescription: String { return self._s[3821]! } - public var Conversation_Call: String { return self._s[3822]! } - public var Common_TakePhoto: String { return self._s[3824]! } - public var Group_EditAdmin_RankTitle: String { return self._s[3825]! } - public var Wallet_Receive_CommentHeader: String { return self._s[3826]! } - public var Channel_NotificationLoading: String { return self._s[3827]! } + public var Passport_Phone_EnterOtherNumber: String { return self._s[3864]! } + public var Message_PinnedPhotoMessage: String { return self._s[3865]! } + public var Passport_FieldPhone: String { return self._s[3866]! } + public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3867]! } + public var ChatSettings_AutoPlayGifs: String { return self._s[3868]! } + public var InfoPlist_NSCameraUsageDescription: String { return self._s[3870]! } + public var Conversation_Call: String { return self._s[3871]! } + public var Common_TakePhoto: String { return self._s[3873]! } + public var Group_EditAdmin_RankTitle: String { return self._s[3874]! } + public var Wallet_Receive_CommentHeader: String { return self._s[3875]! } + public var Channel_NotificationLoading: String { return self._s[3876]! } public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3828]!, self._r[3828]!, [_0]) + return formatWithArgumentRanges(self._s[3877]!, self._r[3877]!, [_0]) } public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3829]!, self._r[3829]!, [_0]) + return formatWithArgumentRanges(self._s[3878]!, self._r[3878]!, [_0]) } public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3830]!, self._r[3830]!, [_1]) + return formatWithArgumentRanges(self._s[3879]!, self._r[3879]!, [_1]) } - public var Permissions_SiriTitle_v0: String { return self._s[3831]! } + public var Permissions_SiriTitle_v0: String { return self._s[3880]! } public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3832]!, self._r[3832]!, [_0]) + return formatWithArgumentRanges(self._s[3881]!, self._r[3881]!, [_0]) } public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3833]!, self._r[3833]!, [_0]) + return formatWithArgumentRanges(self._s[3882]!, self._r[3882]!, [_0]) } - public var Channel_MessagePhotoRemoved: String { return self._s[3834]! } - public var Common_edit: String { return self._s[3835]! } - public var PrivacySettings_AuthSessions: String { return self._s[3836]! } - public var Month_ShortJune: String { return self._s[3837]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3838]! } - public var Call_ReportSend: String { return self._s[3839]! } - public var Watch_LastSeen_JustNow: String { return self._s[3840]! } - public var Notifications_MessageNotifications: String { return self._s[3841]! } - public var WallpaperSearch_ColorGreen: String { return self._s[3842]! } - public var BroadcastListInfo_AddRecipient: String { return self._s[3844]! } - public var Group_Status: String { return self._s[3845]! } + public var Channel_MessagePhotoRemoved: String { return self._s[3883]! } + public var Common_edit: String { return self._s[3884]! } + public var PrivacySettings_AuthSessions: String { return self._s[3885]! } + public var Month_ShortJune: String { return self._s[3886]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3887]! } + public var Call_ReportSend: String { return self._s[3888]! } + public var Watch_LastSeen_JustNow: String { return self._s[3889]! } + public var Notifications_MessageNotifications: String { return self._s[3890]! } + public var WallpaperSearch_ColorGreen: String { return self._s[3891]! } + public var BroadcastListInfo_AddRecipient: String { return self._s[3893]! } + public var Group_Status: String { return self._s[3894]! } public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3846]!, self._r[3846]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3895]!, self._r[3895]!, [_0, _1]) } - public var TextFormat_AddLinkTitle: String { return self._s[3847]! } - public var ShareMenu_ShareTo: String { return self._s[3848]! } - public var Conversation_Moderate_Ban: String { return self._s[3849]! } + public var TextFormat_AddLinkTitle: String { return self._s[3896]! } + public var ShareMenu_ShareTo: String { return self._s[3897]! } + public var Conversation_Moderate_Ban: String { return self._s[3898]! } public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3850]!, self._r[3850]!, [_0]) + return formatWithArgumentRanges(self._s[3899]!, self._r[3899]!, [_0]) } - public var SharedMedia_ViewInChat: String { return self._s[3851]! } - public var Map_LiveLocationFor8Hours: String { return self._s[3852]! } + public var SharedMedia_ViewInChat: String { return self._s[3900]! } + public var Map_LiveLocationFor8Hours: String { return self._s[3901]! } public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3853]!, self._r[3853]!, [_1]) + return formatWithArgumentRanges(self._s[3902]!, self._r[3902]!, [_1]) } public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3854]!, self._r[3854]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3903]!, self._r[3903]!, [_1, _2]) } public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3856]!, self._r[3856]!, [_0]) + return formatWithArgumentRanges(self._s[3905]!, self._r[3905]!, [_0]) } - public var Map_OpenInHereMaps: String { return self._s[3857]! } - public var Appearance_ReduceMotion: String { return self._s[3858]! } + public var Map_OpenInHereMaps: String { return self._s[3906]! } + public var Appearance_ReduceMotion: String { return self._s[3907]! } public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3859]!, self._r[3859]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3908]!, self._r[3908]!, [_1, _2]) } - public var Channel_Setup_TypePublicHelp: String { return self._s[3860]! } - public var Passport_Identity_EditInternalPassport: String { return self._s[3861]! } - public var PhotoEditor_Skip: String { return self._s[3862]! } - public func SharedMedia_Generic(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public var Channel_Setup_TypePublicHelp: String { return self._s[3909]! } + public var Passport_Identity_EditInternalPassport: String { return self._s[3910]! } + public var PhotoEditor_Skip: String { return self._s[3911]! } + public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Passport_Scans(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedPolls(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) } - public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) } - public func Media_ShareVideo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func MessageTimer_ShortDays(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func AttachmentMenu_SendVideo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, _2, _1, _3) + public func Contacts_ImportersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) } - public func Invitation_Members(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, _2, _1, _3) + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, _1, _2) } - public func AttachmentMenu_SendVideo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) } - public func Updated_HoursAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) } - public func Updated_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func StickerPack_AddStickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_ShortSeconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_Photo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func Call_ShortMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, _0, _1) - } - public func GroupInfo_ParticipantCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func ForwardedFiles(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, _0, _1) + } + public func ChatList_DeleteConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) } - public func Map_ETAMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteExpires_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Conversation_StatusMembers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) + public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, _1, _2) } - public func LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func MessageTimer_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func MessagePoll_VotedCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) } - public func LastSeen_HoursAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MessageTimer_ShortSeconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func SharedMedia_File(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessagePoll_VotedCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ForwardedContacts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) } - public func Contacts_ImportersCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func SharedMedia_Photo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortDays(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) } - public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) } - public func QuickSend_Photos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func ForwardedGifs(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Map_ETAMinutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notification_GameScoreExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Theme_UsersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedVideos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, _1, _2) } - public func MessageTimer_Months(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, _1, _2) } - public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Call_ShortMinutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedGifs(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func ForwardedPhotos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Weeks(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, _1, _2) } - public func MuteExpires_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func InviteText_ContactsCountText(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_SelectedChats(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func MessageTimer_ShortSeconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedAudios(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func MuteExpires_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_File(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func LastSeen_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) } - public func Media_ShareItem(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, _1, _2) + public func Conversation_StatusSubscribers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortHours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) } - public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Media_ShareVideo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) } - public func InviteText_ContactsCountText(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func MessageTimer_ShortHours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, _1, _2) + public func Conversation_SelectedMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func MessageTimer_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) } - public func Map_ETAHours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Call_ShortSeconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) } - public func UserCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func QuickSend_Photos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_Link(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func MuteFor_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedContacts(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func UserCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedStickers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func ForwardedVideos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func SharedMedia_Generic(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, _1, _2) + public func Map_ETAHours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteFor_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func StickerPack_AddMaskCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func ForwardedMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notification_GameScoreSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedLocations(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func MuteExpires_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Call_Seconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteFor_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func MessageTimer_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_StatusOnline(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedVideoMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func Conversation_StatusSubscribers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Media_SharePhoto(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Seconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, _1, _2) } - public func Conversation_SelectedMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_AddMaskCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Invitation_Members(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortMinutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func ForwardedStickers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) } - public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Conversation_StatusOnline(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_AddStickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func MessageTimer_Seconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedPhotos(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Notification_GameScoreExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, _2, _1, _3) + public func StickerPack_StickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func MessageTimer_Months(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) } - public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func SharedMedia_Video(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func ForwardedAudios(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_StickerCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_DeleteConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, _1, _2) + public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, _1, _2) + public func AttachmentMenu_SendGif(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_StatusMembers(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Watch_UserInfo_Mute(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) } - public func AttachmentMenu_SendItem(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) - } public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, _2, _1, _3) + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, _1, _2) + public func MessageTimer_Weeks(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedFiles(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func AttachmentMenu_SendItem(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideoMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, _1, _2) + public func SharedMedia_Link(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteExpires_Days(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func GroupInfo_ParticipantCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedMessages(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) } - public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func MuteFor_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func MessageTimer_Years(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) } - public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Call_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) } - public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, _1, _2) } - public func Media_SharePhoto(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, _1, _2) } - public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func ForwardedLocations(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func ForwardedPolls(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Years(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func ChatList_SelectedChats(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) } - public func Theme_UsersCount(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) - return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, _1, _2) - } public func Notifications_Exceptions(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) } - public func Passport_Scans(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func Media_ShareItem(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_Video(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[113 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_Seconds(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[114 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[114 * 6 + Int(form.rawValue)]!, _1, _2) } - public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) + public func MuteExpires_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[115 * 6 + Int(form.rawValue)]!, stringValue) } @@ -4984,5 +5062,9 @@ public final class PresentationStrings { } self._ps = _ps } + + public static func ==(lhs: PresentationStrings, rhs: PresentationStrings) -> Bool { + return lhs === rhs + } } diff --git a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesRootController.swift b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesRootController.swift index c85f665ed2..b5982305bb 100644 --- a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesRootController.swift +++ b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesRootController.swift @@ -68,14 +68,6 @@ public struct PresentationResourcesRootController { public static func navigationCompactSearchIcon(_ theme: PresentationTheme) -> UIImage? { return theme.image(PresentationResourceKey.navigationCompactSearchIcon.rawValue, { theme in return generateTintedImage(image: UIImage(bundleImageName: "Chat List/SearchIcon"), color: theme.rootController.navigationBar.accentTextColor) -// return generateTintedImage(image: UIImage(bundleImageName: "Chat List/SearchIcon"), color: theme.rootController.navigationBar.accentTextColor).flatMap({ image in -// let factor: CGFloat = 0.8 -// let size = CGSize(width: floor(image.size.width * factor), height: floor(image.size.height * factor)) -// return generateImage(size, contextGenerator: { size, context in -// context.clear(CGRect(origin: CGPoint(), size: size)) -// context.draw(image.cgImage!, in: CGRect(origin: CGPoint(), size: size)) -// }) -// }) }) } diff --git a/submodules/TelegramUI/BUCK b/submodules/TelegramUI/BUCK index b5a635b812..ac79a13db7 100644 --- a/submodules/TelegramUI/BUCK +++ b/submodules/TelegramUI/BUCK @@ -87,6 +87,7 @@ framework( "//submodules/AccountContext:AccountContext", "//submodules/ComposePollUI:ComposePollUI", "//submodules/AlertUI:AlertUI", + "//submodules/PresentationDataUtils:PresentationDataUtils", "//submodules/TouchDownGesture:TouchDownGesture", "//submodules/SwipeToDismissGesture:SwipeToDismissGesture", "//submodules/DirectionalPanGesture:DirectionalPanGesture", diff --git a/submodules/TelegramUI/TelegramUI/AppDelegate.swift b/submodules/TelegramUI/TelegramUI/AppDelegate.swift index 1c6d78bd6c..fcd70db83f 100644 --- a/submodules/TelegramUI/TelegramUI/AppDelegate.swift +++ b/submodules/TelegramUI/TelegramUI/AppDelegate.swift @@ -1146,7 +1146,7 @@ final class SharedApplicationContext { self.authContextValue = context if let context = context { let presentationData = context.sharedContext.currentPresentationData.with({ $0 }) - let statusController = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: nil)) + let statusController = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) self.mainWindow.present(statusController, on: .root) let isReady: Signal = context.isReady.get() authContextReadyDisposable.set((isReady diff --git a/submodules/TelegramUI/TelegramUI/ApplicationContext.swift b/submodules/TelegramUI/TelegramUI/ApplicationContext.swift index f69e40eaa6..2129d433b3 100644 --- a/submodules/TelegramUI/TelegramUI/ApplicationContext.swift +++ b/submodules/TelegramUI/TelegramUI/ApplicationContext.swift @@ -11,6 +11,7 @@ import DeviceAccess import TelegramUpdateUI import AccountContext import AlertUI +import PresentationDataUtils import TelegramPermissions import TelegramNotices import LegacyUI diff --git a/submodules/TelegramUI/TelegramUI/ChatChannelSubscriberInputPanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatChannelSubscriberInputPanelNode.swift index 0a2ffbd7a3..5df01fafc6 100644 --- a/submodules/TelegramUI/TelegramUI/ChatChannelSubscriberInputPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatChannelSubscriberInputPanelNode.swift @@ -7,6 +7,7 @@ import Postbox import SwiftSignalKit import TelegramPresentationData import AlertUI +import PresentationDataUtils private enum SubscriberAction { case join diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index b9f4a3e874..f4d1ace892 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -23,6 +23,7 @@ import UrlEscaping import ContextUI import ComposePollUI import AlertUI +import PresentationDataUtils import UndoUI import TelegramCallsUI import TelegramNotices @@ -1021,7 +1022,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G var cancelImpl: (() -> Void)? let presentationData = strongSelf.presentationData let progressSignal = Signal { subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) self?.present(controller, in: .window(.root)) @@ -3823,7 +3824,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G disposables = DisposableDict() strongSelf.selectMessagePollOptionDisposables = disposables } - let controller = OverlayStatusController(theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, type: .loading(cancelled: nil)) + let controller = OverlayStatusController(theme: strongSelf.presentationData.theme, type: .loading(cancelled: nil)) strongSelf.present(controller, in: .window(.root)) let signal = requestMessageSelectPollOption(account: strongSelf.context.account, messageId: id, opaqueIdentifier: nil) |> afterDisposed { [weak controller] in @@ -3862,7 +3863,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G disposables = DisposableDict() strongSelf.selectMessagePollOptionDisposables = disposables } - let controller = OverlayStatusController(theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, type: .loading(cancelled: nil)) + let controller = OverlayStatusController(theme: strongSelf.presentationData.theme, type: .loading(cancelled: nil)) strongSelf.present(controller, in: .window(.root)) let signal = requestClosePoll(postbox: strongSelf.context.account.postbox, network: strongSelf.context.account.network, stateManager: strongSelf.context.account.stateManager, messageId: id) |> afterDisposed { [weak controller] in @@ -4905,7 +4906,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G statusText = strongSelf.presentationData.strings.Undo_ChatCleared } - strongSelf.present(UndoOverlayController(context: strongSelf.context, content: .removedChat(text: statusText), elevatedLayout: true, action: { shouldCommit in + strongSelf.present(UndoOverlayController(presentationData: strongSelf.context.sharedContext.currentPresentationData.with { $0 }, content: .removedChat(text: statusText), elevatedLayout: true, action: { shouldCommit in if shouldCommit { let _ = clearHistoryInteractively(postbox: account.postbox, peerId: peerId, type: type).start(completed: { self?.chatDisplayNode.historyNode.historyAppearsCleared = false @@ -6228,7 +6229,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G let presentationData = self.presentationData let displayTime = CACurrentMediaTime() let progressSignal = Signal { [weak self] subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { if CACurrentMediaTime() - displayTime > 1.5 { cancelImpl?() } @@ -6374,7 +6375,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G guard let strongSelf = self else { return } - strongSelf.present(OverlayStatusController(theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, type: .success), in: .window(.root)) + strongSelf.present(OverlayStatusController(theme: strongSelf.presentationData.theme, type: .success), in: .window(.root)) })) } }) @@ -6550,7 +6551,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G var cancelImpl: (() -> Void)? let presentationData = self.presentationData let progressSignal = Signal { [weak self] subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) self?.present(controller, in: .window(.root)) @@ -6778,7 +6779,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G guard let strongSelf = self else { return } - strongSelf.present(OverlayStatusController(theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, type: .genericSuccess(strongSelf.presentationData.strings.Conversation_ShareMyPhoneNumber_StatusSuccess(peer.compactDisplayTitle).0, true)), in: .window(.root)) + strongSelf.present(OverlayStatusController(theme: strongSelf.presentationData.theme, type: .genericSuccess(strongSelf.presentationData.strings.Conversation_ShareMyPhoneNumber_StatusSuccess(peer.compactDisplayTitle).0, true)), in: .window(.root)) }) })) @@ -6802,7 +6803,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G if let phone = peer.phone, !phone.isEmpty { } - self?.present(OverlayStatusController(theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, type: .genericSuccess(strongSelf.presentationData.strings.AddContact_StatusSuccess(peer.compactDisplayTitle).0, true)), in: .window(.root)) + self?.present(OverlayStatusController(theme: strongSelf.presentationData.theme, type: .genericSuccess(strongSelf.presentationData.strings.AddContact_StatusSuccess(peer.compactDisplayTitle).0, true)), in: .window(.root)) } }), completed: nil, cancelled: nil), in: .window(.root), with: ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) } @@ -6916,7 +6917,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G var cancelImpl: (() -> Void)? let presentationData = strongSelf.presentationData let progressSignal = Signal { subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) self?.present(controller, in: .window(.root)) diff --git a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift index 908a150212..80a9460a15 100644 --- a/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift +++ b/submodules/TelegramUI/TelegramUI/ChatInterfaceStateContextMenus.swift @@ -467,7 +467,7 @@ func contextMenuForChatPresentationIntefaceState(chatPresentationInterfaceState: let _ = (saveToCameraRoll(context: context, postbox: context.account.postbox, mediaReference: mediaReference) |> deliverOnMainQueue).start(completed: { let presentationData = context.sharedContext.currentPresentationData.with { $0 } - controllerInteraction.presentGlobalOverlayController(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .success), nil) + controllerInteraction.presentGlobalOverlayController(OverlayStatusController(theme: presentationData.theme, type: .success), nil) }) f(.default) }))) @@ -576,9 +576,9 @@ func contextMenuForChatPresentationIntefaceState(chatPresentationInterfaceState: let presentationData = context.sharedContext.currentPresentationData.with { $0 } if channel.addressName == nil { - controllerInteraction.presentGlobalOverlayController(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .genericSuccess(presentationData.strings.Conversation_PrivateMessageLinkCopied, true)), nil) + controllerInteraction.presentGlobalOverlayController(OverlayStatusController(theme: presentationData.theme, type: .genericSuccess(presentationData.strings.Conversation_PrivateMessageLinkCopied, true)), nil) } else { - controllerInteraction.presentGlobalOverlayController(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .genericSuccess(presentationData.strings.GroupInfo_InviteLink_CopyAlert_Success, false)), nil) + controllerInteraction.presentGlobalOverlayController(OverlayStatusController(theme: presentationData.theme, type: .genericSuccess(presentationData.strings.GroupInfo_InviteLink_CopyAlert_Success, false)), nil) } } }) diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift index a978a9f21d..2ef02fbf11 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerGridItem.swift @@ -299,7 +299,7 @@ final class ChatMediaInputStickerGridItemNode: GridItemNode { self.didSetUpAnimationNode = true let dimensions = item.stickerItem.file.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0)) - self.animationNode?.setup(account: item.account, resource: .resource(item.stickerItem.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) + self.animationNode?.setup(resource: .resource(item.account, item.stickerItem.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) } } } diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift index 762479af04..43d945b08d 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputStickerPackItem.swift @@ -177,7 +177,7 @@ final class ChatMediaInputStickerPackItemNode: ListViewItemNode { self.animatedStickerNode = animatedStickerNode animatedStickerNode.transform = CATransform3DMakeRotation(CGFloat.pi / 2.0, 0.0, 0.0, 1.0) self.addSubnode(animatedStickerNode) - animatedStickerNode.setup(account: account, resource: .resource(resource), width: 80, height: 80, mode: .cached) + animatedStickerNode.setup(resource: .resource(account, resource), width: 80, height: 80, mode: .cached) } animatedStickerNode.visibility = self.visibilityStatus && loopAnimatedStickers if let animatedStickerNode = self.animatedStickerNode { diff --git a/submodules/TelegramUI/TelegramUI/ChatMediaInputTrendingPane.swift b/submodules/TelegramUI/TelegramUI/ChatMediaInputTrendingPane.swift index aa50bcfaa7..86df700927 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMediaInputTrendingPane.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMediaInputTrendingPane.swift @@ -183,7 +183,7 @@ final class ChatMediaInputTrendingPane: ChatMediaInputPane { } |> deliverOnMainQueue).start(completed: { if let strongSelf = self { let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 } - strongSelf.controllerInteraction.presentController(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .success), nil) + strongSelf.controllerInteraction.presentController(OverlayStatusController(theme: presentationData.theme, type: .success), nil) } }) } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift index 1c8046d857..0981583fc3 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageAnimatedStickerItemNode.swift @@ -313,7 +313,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { if let file = file { let dimensions = file.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedSize = isEmoji ? dimensions.aspectFilled(CGSize(width: 384.0, height: 384.0)) : dimensions.aspectFitted(CGSize(width: 384.0, height: 384.0)) - self.animationNode.setup(account: item.context.account, resource: .resource(file.resource), fitzModifier: fitzModifier, width: Int(fittedSize.width), height: Int(fittedSize.height), playbackMode: playbackMode, mode: .cached) + self.animationNode.setup(resource: .resource(item.context.account, file.resource), fitzModifier: fitzModifier, width: Int(fittedSize.width), height: Int(fittedSize.height), playbackMode: playbackMode, mode: .cached) } } } diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift index b01bd7c434..29fe6562bd 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveMediaNode.swift @@ -731,7 +731,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio strongSelf.animatedStickerNode = animatedStickerNode let dimensions = updatedAnimatedStickerFile.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 384.0, height: 384.0)) - animatedStickerNode.setup(account: context.account, resource: .resource(updatedAnimatedStickerFile.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) + animatedStickerNode.setup(resource: .resource(context.account, updatedAnimatedStickerFile.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) strongSelf.insertSubnode(animatedStickerNode, aboveSubnode: strongSelf.imageNode) animatedStickerNode.visibility = strongSelf.visibility } diff --git a/submodules/TelegramUI/TelegramUI/ChatRecentActionsController.swift b/submodules/TelegramUI/TelegramUI/ChatRecentActionsController.swift index 957045f1bd..a10a9b21dc 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecentActionsController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecentActionsController.swift @@ -8,6 +8,7 @@ import TelegramPresentationData import TelegramBaseController import AccountContext import AlertUI +import PresentationDataUtils final class ChatRecentActionsController: TelegramBaseController { private var controllerNode: ChatRecentActionsControllerNode { diff --git a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift index 843dbe446d..3544ecf744 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecentActionsControllerNode.swift @@ -11,6 +11,7 @@ import SafariServices import AccountContext import TemporaryCachedPeerDataManager import AlertUI +import PresentationDataUtils import OpenInExternalAppUI import InstantPageUI import HashtagSearchUI diff --git a/submodules/TelegramUI/TelegramUI/ChatRecentActionsFilterController.swift b/submodules/TelegramUI/TelegramUI/ChatRecentActionsFilterController.swift index ae37f557f0..0952085ce9 100644 --- a/submodules/TelegramUI/TelegramUI/ChatRecentActionsFilterController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatRecentActionsFilterController.swift @@ -7,6 +7,7 @@ import TelegramCore import TelegramPresentationData import TelegramUIPreferences import ItemListUI +import PresentationDataUtils import AccountContext import ItemListPeerItem diff --git a/submodules/TelegramUI/TelegramUI/CheckDiskSpace.swift b/submodules/TelegramUI/TelegramUI/CheckDiskSpace.swift index 0e1351bb98..383f224b79 100644 --- a/submodules/TelegramUI/TelegramUI/CheckDiskSpace.swift +++ b/submodules/TelegramUI/TelegramUI/CheckDiskSpace.swift @@ -3,6 +3,7 @@ import Display import TelegramCore import AccountContext import AlertUI +import PresentationDataUtils import SettingsUI func totalDiskSpace() -> Int64 { diff --git a/submodules/TelegramUI/TelegramUI/ComposeController.swift b/submodules/TelegramUI/TelegramUI/ComposeController.swift index 636f6eefe9..0b12197fd0 100644 --- a/submodules/TelegramUI/TelegramUI/ComposeController.swift +++ b/submodules/TelegramUI/TelegramUI/ComposeController.swift @@ -8,6 +8,7 @@ import TelegramCore import TelegramPresentationData import AccountContext import AlertUI +import PresentationDataUtils import SearchUI import TelegramPermissionsUI import AppBundle diff --git a/submodules/TelegramUI/TelegramUI/ContactMultiselectionController.swift b/submodules/TelegramUI/TelegramUI/ContactMultiselectionController.swift index de6922d780..45a29d94c2 100644 --- a/submodules/TelegramUI/TelegramUI/ContactMultiselectionController.swift +++ b/submodules/TelegramUI/TelegramUI/ContactMultiselectionController.swift @@ -9,6 +9,7 @@ import TelegramPresentationData import ProgressNavigationButtonNode import AccountContext import AlertUI +import PresentationDataUtils import ContactListUI import CounterContollerTitleView diff --git a/submodules/TelegramUI/TelegramUI/CreateChannelController.swift b/submodules/TelegramUI/TelegramUI/CreateChannelController.swift index 7d328d2a13..b38b598f2c 100644 --- a/submodules/TelegramUI/TelegramUI/CreateChannelController.swift +++ b/submodules/TelegramUI/TelegramUI/CreateChannelController.swift @@ -7,8 +7,10 @@ import TelegramCore import TelegramPresentationData import LegacyComponents import ItemListUI +import PresentationDataUtils import AccountContext import AlertUI +import PresentationDataUtils import LegacyUI import ItemListAvatarAndNameInfoItem import WebSearchUI diff --git a/submodules/TelegramUI/TelegramUI/CreateGroupController.swift b/submodules/TelegramUI/TelegramUI/CreateGroupController.swift index 4d9f506eb3..7ab5bce3f7 100644 --- a/submodules/TelegramUI/TelegramUI/CreateGroupController.swift +++ b/submodules/TelegramUI/TelegramUI/CreateGroupController.swift @@ -8,8 +8,10 @@ import TelegramPresentationData import TelegramUIPreferences import LegacyComponents import ItemListUI +import PresentationDataUtils import AccountContext import AlertUI +import PresentationDataUtils import MediaResources import PhotoResources import LegacyUI diff --git a/submodules/TelegramUI/TelegramUI/HorizontalListContextResultsChatInputPanelItem.swift b/submodules/TelegramUI/TelegramUI/HorizontalListContextResultsChatInputPanelItem.swift index fdc1f556ef..e3ec584cb3 100644 --- a/submodules/TelegramUI/TelegramUI/HorizontalListContextResultsChatInputPanelItem.swift +++ b/submodules/TelegramUI/TelegramUI/HorizontalListContextResultsChatInputPanelItem.swift @@ -386,7 +386,7 @@ final class HorizontalListContextResultsChatInputPanelItemNode: ListViewItemNode } let dimensions = animatedStickerFile.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0)) - animationNode.setup(account: item.account, resource: .resource(animatedStickerFile.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) + animationNode.setup(resource: .resource(item.account, animatedStickerFile.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) } } diff --git a/submodules/TelegramUI/TelegramUI/HorizontalStickerGridItem.swift b/submodules/TelegramUI/TelegramUI/HorizontalStickerGridItem.swift index bba9baf876..1c7aad73b9 100755 --- a/submodules/TelegramUI/TelegramUI/HorizontalStickerGridItem.swift +++ b/submodules/TelegramUI/TelegramUI/HorizontalStickerGridItem.swift @@ -111,7 +111,7 @@ final class HorizontalStickerGridItemNode: GridItemNode { } let dimensions = item.file.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0)) - animationNode.setup(account: account, resource: .resource(item.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) + animationNode.setup(resource: .resource(account, item.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) self.stickerFetchedDisposable.set(freeMediaFileResourceInteractiveFetched(account: account, fileReference: stickerPackFileReference(item.file), resource: item.file.resource).start()) } else { diff --git a/submodules/TelegramUI/TelegramUI/ListMessageFileItemNode.swift b/submodules/TelegramUI/TelegramUI/ListMessageFileItemNode.swift index c819d5472e..92906e045d 100644 --- a/submodules/TelegramUI/TelegramUI/ListMessageFileItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ListMessageFileItemNode.swift @@ -7,6 +7,7 @@ import TelegramCore import SwiftSignalKit import TelegramPresentationData import ItemListUI +import PresentationDataUtils import AccountContext import TelegramStringFormatting import AccountContext diff --git a/submodules/TelegramUI/TelegramUI/ListMessageSnippetItemNode.swift b/submodules/TelegramUI/TelegramUI/ListMessageSnippetItemNode.swift index 8c53706927..c078e9eead 100644 --- a/submodules/TelegramUI/TelegramUI/ListMessageSnippetItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ListMessageSnippetItemNode.swift @@ -7,6 +7,7 @@ import TelegramCore import SwiftSignalKit import TelegramPresentationData import ItemListUI +import PresentationDataUtils import TextFormat import PhotoResources import WebsiteType diff --git a/submodules/TelegramUI/TelegramUI/MediaInputPaneTrendingItem.swift b/submodules/TelegramUI/TelegramUI/MediaInputPaneTrendingItem.swift index f375f4d55d..0329022ea9 100644 --- a/submodules/TelegramUI/TelegramUI/MediaInputPaneTrendingItem.swift +++ b/submodules/TelegramUI/TelegramUI/MediaInputPaneTrendingItem.swift @@ -118,7 +118,7 @@ final class TrendingTopItemNode: ASDisplayNode { } let dimensions = item.file.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0)) - animationNode.setup(account: account, resource: .resource(item.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) + animationNode.setup(resource: .resource(account, item.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) self.loadDisposable.set(freeMediaFileResourceInteractiveFetched(account: account, fileReference: stickerPackFileReference(item.file), resource: item.file.resource).start()) } else { self.imageNode.setSignal(chatMessageSticker(account: account, file: item.file, small: true, synchronousLoad: synchronousLoads), attemptSynchronously: synchronousLoads) diff --git a/submodules/TelegramUI/TelegramUI/NotificationContentContext.swift b/submodules/TelegramUI/TelegramUI/NotificationContentContext.swift index 05b3e48a3f..fa30bf321d 100644 --- a/submodules/TelegramUI/TelegramUI/NotificationContentContext.swift +++ b/submodules/TelegramUI/TelegramUI/NotificationContentContext.swift @@ -313,7 +313,7 @@ public final class NotificationViewControllerImpl { let dimensions = fileReference.media.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 512.0, height: 512.0)) strongSelf.imageNode.setSignal(chatMessageAnimatedSticker(postbox: accountAndImage.0.postbox, file: fileReference.media, small: false, size: fittedDimensions)) - animatedStickerNode.setup(account: accountAndImage.0, resource: .resource(fileReference.media.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .direct) + animatedStickerNode.setup(resource: .resource(accountAndImage.0, fileReference.media.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .direct) animatedStickerNode.visibility = true accountAndImage.0.network.shouldExplicitelyKeepWorkerConnections.set(.single(true)) diff --git a/submodules/TelegramUI/TelegramUI/OpenAddContact.swift b/submodules/TelegramUI/TelegramUI/OpenAddContact.swift index e4df366ee3..684c21af92 100644 --- a/submodules/TelegramUI/TelegramUI/OpenAddContact.swift +++ b/submodules/TelegramUI/TelegramUI/OpenAddContact.swift @@ -5,6 +5,7 @@ import Display import DeviceAccess import AccountContext import AlertUI +import PresentationDataUtils import PeerInfoUI func openAddContactImpl(context: AccountContext, firstName: String = "", lastName: String = "", phoneNumber: String, label: String = "_$!!$_", present: @escaping (ViewController, Any?) -> Void, pushController: @escaping (ViewController) -> Void, completed: @escaping () -> Void = {}) { diff --git a/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift b/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift index ccd3d27004..75658d2f7c 100644 --- a/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift +++ b/submodules/TelegramUI/TelegramUI/OpenChatMessage.swift @@ -17,6 +17,7 @@ import PeerAvatarGalleryUI import PeerInfoUI import SettingsUI import AlertUI +import PresentationDataUtils private enum ChatMessageGalleryControllerData { case url(String) diff --git a/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift b/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift index 610e73f0d1..1457103b97 100644 --- a/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift +++ b/submodules/TelegramUI/TelegramUI/OpenResolvedUrl.swift @@ -9,6 +9,7 @@ import TelegramPresentationData import AccountContext import OverlayStatusController import AlertUI +import PresentationDataUtils import PassportUI import InstantPageUI import StickerPackPreviewUI @@ -127,7 +128,7 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur } case let .cancelAccountReset(phone, hash): let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: nil)) + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) present(controller, nil) let _ = (requestCancelAccountResetData(network: context.account.network, hash: hash) |> deliverOnMainQueue).start(next: { [weak controller] data in @@ -219,7 +220,7 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur options = wallpaperOptions color = patternColor intensity = patternIntensity - controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: nil)) + controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) present(controller!, nil) case let .color(color): signal = .single(.color(Int32(color.rgb))) @@ -276,12 +277,12 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur return disposables } } - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: nil)) + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) present(controller, nil) var cancelImpl: (() -> Void)? let progressSignal = Signal { subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: { cancelImpl?() })) present(controller, nil) diff --git a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift index cd180a3506..952b7d16c3 100644 --- a/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift +++ b/submodules/TelegramUI/TelegramUI/PeerMediaCollectionController.swift @@ -15,6 +15,7 @@ import ShareController import OpenInExternalAppUI import PeerInfoUI import ContextUI +import PresentationDataUtils public class PeerMediaCollectionController: TelegramBaseController { private var validLayout: ContainerViewLayout? @@ -805,7 +806,7 @@ public class PeerMediaCollectionController: TelegramBaseController { guard let strongSelf = self else { return } - strongSelf.present(OverlayStatusController(theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, type: .success), in: .window(.root)) + strongSelf.present(OverlayStatusController(theme: strongSelf.presentationData.theme, type: .success), in: .window(.root)) })) } }) diff --git a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping index 12a2d787ce..75f4a93be4 100644 Binary files a/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping and b/submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping differ diff --git a/submodules/TelegramUI/TelegramUI/SharedAccountContext.swift b/submodules/TelegramUI/TelegramUI/SharedAccountContext.swift index 44b465a1e6..fb4509b04a 100644 --- a/submodules/TelegramUI/TelegramUI/SharedAccountContext.swift +++ b/submodules/TelegramUI/TelegramUI/SharedAccountContext.swift @@ -19,6 +19,7 @@ import LegacyMediaPickerUI import LocalMediaResources import OverlayStatusController import AlertUI +import PresentationDataUtils private enum CallStatusText: Equatable { case none @@ -1051,9 +1052,9 @@ public final class SharedAccountContextImpl: SharedAccountContext { present(controller) } else { if let _ = currentPublicKey { - present(WalletSplashScreen(context: context, tonContext: tonContext, mode: .intro, walletCreatedPreloadState: nil)) + present(WalletSplashScreen(context: WalletContextImpl(context: context, tonContext: tonContext), mode: .intro, walletCreatedPreloadState: nil)) } else { - present(WalletSplashScreen(context: context, tonContext: tonContext, mode: .secureStorageNotAvailable, walletCreatedPreloadState: nil)) + present(WalletSplashScreen(context: WalletContextImpl(context: context, tonContext: tonContext), mode: .secureStorageNotAvailable, walletCreatedPreloadState: nil)) } } } else { @@ -1066,20 +1067,20 @@ public final class SharedAccountContextImpl: SharedAccountContext { switch walletContext { case .generic: if exportCompleted { - present(WalletInfoScreen(context: context, tonContext: tonContext, walletInfo: walletInfo, address: address, enableDebugActions: !GlobalExperimentalSettings.isAppStoreBuild)) + present(WalletInfoScreen(context: WalletContextImpl(context: context, tonContext: tonContext), walletInfo: walletInfo, address: address, enableDebugActions: !GlobalExperimentalSettings.isAppStoreBuild)) } else { - present(WalletSplashScreen(context: context, tonContext: tonContext, mode: .created(walletInfo, nil), walletCreatedPreloadState: nil)) + present(WalletSplashScreen(context: WalletContextImpl(context: context, tonContext: tonContext), mode: .created(walletInfo, nil), walletCreatedPreloadState: nil)) } case let .send(address, amount, comment): - present(walletSendScreen(context: context, tonContext: tonContext, randomId: arc4random64(), walletInfo: walletInfo, address: address, amount: amount, comment: comment)) + present(walletSendScreen(context: WalletContextImpl(context: context, tonContext: tonContext), randomId: arc4random64(), walletInfo: walletInfo, address: address, amount: amount, comment: comment)) } }) } else { - present(WalletSplashScreen(context: context, tonContext: tonContext, mode: .secureStorageReset(.changed), walletCreatedPreloadState: nil)) + present(WalletSplashScreen(context: WalletContextImpl(context: context, tonContext: tonContext), mode: .secureStorageReset(.changed), walletCreatedPreloadState: nil)) } } else { - present(WalletSplashScreen(context: context, tonContext: tonContext, mode: .secureStorageReset(.notAvailable), walletCreatedPreloadState: nil)) + present(WalletSplashScreen(context: WalletContextImpl(context: context, tonContext: tonContext), mode: .secureStorageReset(.notAvailable), walletCreatedPreloadState: nil)) } } }) diff --git a/submodules/TelegramUI/TelegramUI/StickerPaneSearchStickerItem.swift b/submodules/TelegramUI/TelegramUI/StickerPaneSearchStickerItem.swift index b4d5087ef4..ff37014a28 100644 --- a/submodules/TelegramUI/TelegramUI/StickerPaneSearchStickerItem.swift +++ b/submodules/TelegramUI/TelegramUI/StickerPaneSearchStickerItem.swift @@ -164,7 +164,7 @@ final class StickerPaneSearchStickerItemNode: GridItemNode { } let dimensions = stickerItem.file.dimensions ?? CGSize(width: 512.0, height: 512.0) let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0)) - self.animationNode?.setup(account: account, resource: .resource(stickerItem.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) + self.animationNode?.setup(resource: .resource(account, stickerItem.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached) self.animationNode?.visibility = self.isVisibleInGrid self.stickerFetchedDisposable.set(freeMediaFileResourceInteractiveFetched(account: account, fileReference: stickerPackFileReference(stickerItem.file), resource: stickerItem.file.resource).start()) } else { diff --git a/submodules/TelegramUI/TelegramUI/SuppressContactsWarning.swift b/submodules/TelegramUI/TelegramUI/SuppressContactsWarning.swift index 901b1f5e51..daccca51c3 100644 --- a/submodules/TelegramUI/TelegramUI/SuppressContactsWarning.swift +++ b/submodules/TelegramUI/TelegramUI/SuppressContactsWarning.swift @@ -6,6 +6,7 @@ import TelegramCore import DeviceAccess import AccountContext import AlertUI +import PresentationDataUtils import TelegramNotices func presentContactsWarningSuppressionImpl(context: AccountContext, present: (ViewController, Any?) -> Void) { diff --git a/submodules/TelegramUI/TelegramUI/WalletContextImpl.swift b/submodules/TelegramUI/TelegramUI/WalletContextImpl.swift new file mode 100644 index 0000000000..76406d0096 --- /dev/null +++ b/submodules/TelegramUI/TelegramUI/WalletContextImpl.swift @@ -0,0 +1,78 @@ +import Foundation +import UIKit +import WalletUI +import Postbox +import TelegramCore +import AccountContext +import SwiftSignalKit +import TelegramPresentationData +import ShareController +import DeviceAccess + +final class WalletContextImpl: WalletContext { + private let context: AccountContext + + let postbox: Postbox + let network: Network + let tonInstance: TonInstance + let keychain: TonKeychain + let presentationData: PresentationData + + var inForeground: Signal { + return self.context.sharedContext.applicationBindings.applicationInForeground + } + + init(context: AccountContext, tonContext: TonContext) { + self.context = context + + self.postbox = self.context.account.postbox + self.network = self.context.account.network + self.tonInstance = tonContext.instance + self.keychain = tonContext.keychain + self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + } + + func presentNativeController(_ controller: UIViewController) { + self.context.sharedContext.mainWindow?.presentNative(controller) + } + + func idleTimerExtension() -> Disposable { + return self.context.sharedContext.applicationBindings.pushIdleTimerExtension() + } + + func openUrl(_ url: String) { + return self.context.sharedContext.openExternalUrl(context: self.context, urlContext: .generic, url: url, forceExternal: true, presentationData: context.sharedContext.currentPresentationData.with { $0 }, navigationController: nil, dismissInput: {}) + } + + func shareUrl(_ url: String) { + let controller = ShareController(context: self.context, subject: .url(url)) + self.context.sharedContext.mainWindow?.present(controller, on: .root) + } + + func openPlatformSettings() { + self.context.sharedContext.applicationBindings.openSettings() + } + + func authorizeAccessToCamera(completion: @escaping () -> Void) { + let presentationData = self.context.sharedContext.currentPresentationData.with { $0 } + DeviceAccess.authorizeAccess(to: .camera, presentationData: presentationData, present: { c, a in + c.presentationArguments = a + self.context.sharedContext.mainWindow?.present(c, on: .root) + }, openSettings: { [weak self] in + self?.openPlatformSettings() + }, { granted in + guard granted else { + return + } + completion() + }) + } + + func pickImage(completion: @escaping (UIImage) -> Void) { + self.context.sharedContext.openImagePicker(context: self.context, completion: { image in + completion(image) + }, present: { [weak self] controller in + self?.context.sharedContext.mainWindow?.present(controller, on: .root) + }) + } +} diff --git a/submodules/TelegramUpdateUI/Sources/UpdateInfoController.swift b/submodules/TelegramUpdateUI/Sources/UpdateInfoController.swift index 0a3e963957..a4bcb58f66 100644 --- a/submodules/TelegramUpdateUI/Sources/UpdateInfoController.swift +++ b/submodules/TelegramUpdateUI/Sources/UpdateInfoController.swift @@ -7,6 +7,7 @@ import TelegramCore import TelegramPresentationData import AccountContext import ItemListUI +import PresentationDataUtils private final class UpdateInfoControllerArguments { let openAppStorePage: () -> Void diff --git a/submodules/TelegramUpdateUI/Sources/UpdateInfoItem.swift b/submodules/TelegramUpdateUI/Sources/UpdateInfoItem.swift index d3d58c903e..46bd04d02b 100644 --- a/submodules/TelegramUpdateUI/Sources/UpdateInfoItem.swift +++ b/submodules/TelegramUpdateUI/Sources/UpdateInfoItem.swift @@ -6,6 +6,7 @@ import SwiftSignalKit import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils import TextFormat import AccountContext diff --git a/submodules/UndoUI/BUCK b/submodules/UndoUI/BUCK index 788183a009..2c9ca54a7d 100644 --- a/submodules/UndoUI/BUCK +++ b/submodules/UndoUI/BUCK @@ -13,7 +13,6 @@ static_library( "//submodules/TelegramCore:TelegramCore#shared", "//submodules/TelegramPresentationData:TelegramPresentationData", "//submodules/TextFormat:TextFormat", - "//submodules/AccountContext:AccountContext", "//submodules/RadialStatusNode:RadialStatusNode", "//submodules/AnimationUI:AnimationUI", "//submodules/AppBundle:AppBundle", diff --git a/submodules/UndoUI/Sources/UndoOverlayController.swift b/submodules/UndoUI/Sources/UndoOverlayController.swift index 2320223bae..e1ff263a32 100644 --- a/submodules/UndoUI/Sources/UndoOverlayController.swift +++ b/submodules/UndoUI/Sources/UndoOverlayController.swift @@ -1,22 +1,18 @@ import Foundation import UIKit import Display -import TelegramCore -import Postbox import TelegramPresentationData -import AccountContext public enum UndoOverlayContent { case removedChat(text: String) - case archivedChat(peerId: PeerId, title: String, text: String, undo: Bool) + case archivedChat(peerId: Int64, title: String, text: String, undo: Bool) case hidArchive(title: String, text: String, undo: Bool) case revealedArchive(title: String, text: String, undo: Bool) case succeed(text: String) - case emoji(account: Account, path: String, text: String) + case emoji(path: String, text: String) } public final class UndoOverlayController: ViewController { - private let context: AccountContext private let presentationData: PresentationData public let content: UndoOverlayContent private let elevatedLayout: Bool @@ -25,9 +21,8 @@ public final class UndoOverlayController: ViewController { private var didPlayPresentationAnimation = false - public init(context: AccountContext, content: UndoOverlayContent, elevatedLayout: Bool, animateInAsReplacement: Bool = false, action: @escaping (Bool) -> Void) { - self.context = context - self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + public init(presentationData: PresentationData, content: UndoOverlayContent, elevatedLayout: Bool, animateInAsReplacement: Bool = false, action: @escaping (Bool) -> Void) { + self.presentationData = presentationData self.content = content self.elevatedLayout = elevatedLayout self.animateInAsReplacement = animateInAsReplacement diff --git a/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift b/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift index 984a99615a..5975ba0bfb 100644 --- a/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift +++ b/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift @@ -120,13 +120,13 @@ final class UndoOverlayControllerNode: ViewControllerTracingNode { self.textNode.maximumNumberOfLines = 2 displayUndo = false self.originalRemainingSeconds = 5 - case let .emoji(account, path, text): + case let .emoji(path, text): self.iconNode = nil self.iconCheckNode = nil self.animationNode = nil self.animatedStickerNode = AnimatedStickerNode() self.animatedStickerNode?.visibility = true - self.animatedStickerNode?.setup(account: account, resource: .localFile(path), width: 100, height: 100, playbackMode: .once, mode: .direct) + self.animatedStickerNode?.setup(resource: .localFile(path), width: 100, height: 100, playbackMode: .once, mode: .direct) let body = MarkdownAttributeSet(font: Font.regular(14.0), textColor: .white) let bold = MarkdownAttributeSet(font: Font.semibold(14.0), textColor: .white) diff --git a/submodules/WalletUI/.BUCK.swp b/submodules/WalletUI/.BUCK.swp new file mode 100644 index 0000000000..c6e6a812f9 Binary files /dev/null and b/submodules/WalletUI/.BUCK.swp differ diff --git a/submodules/WalletUI/BUCK b/submodules/WalletUI/BUCK index 9387a852e0..1a770c2a68 100644 --- a/submodules/WalletUI/BUCK +++ b/submodules/WalletUI/BUCK @@ -1,5 +1,13 @@ load("//Config:buck_rule_macros.bzl", "static_library") +apple_resource( + name = "WalletUIResources", + files = glob([ + "Resources/**/*", + ], exclude = ["Resources/**/.*"]), + visibility = ["PUBLIC"], +) + static_library( name = "WalletUI", srcs = glob([ @@ -11,26 +19,22 @@ static_library( "//submodules/Display:Display#shared", "//submodules/Postbox:Postbox#shared", "//submodules/TelegramCore:TelegramCore#shared", - "//submodules/TelegramPresentationData:TelegramPresentationData", "//submodules/OverlayStatusController:OverlayStatusController", "//submodules/AppBundle:AppBundle", "//submodules/SolidRoundedButtonNode:SolidRoundedButtonNode", - "//submodules/ItemListUI:ItemListUI", - "//submodules/AccountContext:AccountContext", "//submodules/UndoUI:UndoUI", "//submodules/AlertUI:AlertUI", "//submodules/TextFormat:TextFormat", "//submodules/Camera:Camera", - "//submodules/ShareController:ShareController", "//submodules/PasscodeInputFieldNode:PasscodeInputFieldNode", "//submodules/QrCode:QrCode", "//submodules/MergeLists:MergeLists", - "//submodules/TelegramStringFormatting:TelegramStringFormatting", "//submodules/GlassButtonNode:GlassButtonNode", "//submodules/UrlHandling:UrlHandling", "//submodules/UrlEscaping:UrlEscaping", - "//submodules/LocalAuth:LocalAuth", - "//submodules/ScreenCaptureDetection:ScreenCaptureDetection", + "//submodules/LocalAuth:LocalAuth", + "//submodules/ScreenCaptureDetection:ScreenCaptureDetection", + "//submodules/AnimationUI:AnimationUI", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/WalletUI/Resources/WalletStrings.mapping b/submodules/WalletUI/Resources/WalletStrings.mapping new file mode 100644 index 0000000000..1e50f90a2a Binary files /dev/null and b/submodules/WalletUI/Resources/WalletStrings.mapping differ diff --git a/submodules/WalletUI/Sources/ItemList/ItemListController.swift b/submodules/WalletUI/Sources/ItemList/ItemListController.swift new file mode 100644 index 0000000000..69a797bb1b --- /dev/null +++ b/submodules/WalletUI/Sources/ItemList/ItemListController.swift @@ -0,0 +1,564 @@ +import Foundation +import UIKit +import Display +import SwiftSignalKit +import ProgressNavigationButtonNode + +enum ItemListNavigationButtonStyle { + case regular + case bold + case activity + + var barButtonItemStyle: UIBarButtonItem.Style { + switch self { + case .regular, .activity: + return .plain + case .bold: + return .done + } + } +} + +enum ItemListNavigationButtonContentIcon { + case search + case add + case action +} + +enum ItemListNavigationButtonContent: Equatable { + case none + case text(String) + case icon(ItemListNavigationButtonContentIcon) +} + +struct ItemListNavigationButton { + let content: ItemListNavigationButtonContent + let style: ItemListNavigationButtonStyle + let enabled: Bool + let action: () -> Void + + init(content: ItemListNavigationButtonContent, style: ItemListNavigationButtonStyle, enabled: Bool, action: @escaping () -> Void) { + self.content = content + self.style = style + self.enabled = enabled + self.action = action + } +} + +struct ItemListBackButton: Equatable { + let title: String + + init(title: String) { + self.title = title + } +} + +enum ItemListControllerTitle: Equatable { + case text(String) +} + +final class ItemListControllerTabBarItem: Equatable { + let title: String + let image: UIImage? + let selectedImage: UIImage? + let tintImages: Bool + let badgeValue: String? + + init(title: String, image: UIImage?, selectedImage: UIImage?, tintImages: Bool = true, badgeValue: String? = nil) { + self.title = title + self.image = image + self.selectedImage = selectedImage + self.tintImages = tintImages + self.badgeValue = badgeValue + } + + static func ==(lhs: ItemListControllerTabBarItem, rhs: ItemListControllerTabBarItem) -> Bool { + return lhs.title == rhs.title && lhs.image === rhs.image && lhs.selectedImage === rhs.selectedImage && lhs.tintImages == rhs.tintImages && lhs.badgeValue == rhs.badgeValue + } +} + +struct ItemListControllerState { + let theme: WalletTheme + let title: ItemListControllerTitle + let leftNavigationButton: ItemListNavigationButton? + let rightNavigationButton: ItemListNavigationButton? + let secondaryRightNavigationButton: ItemListNavigationButton? + let backNavigationButton: ItemListBackButton? + let tabBarItem: ItemListControllerTabBarItem? + let animateChanges: Bool + + init(theme: WalletTheme, title: ItemListControllerTitle, leftNavigationButton: ItemListNavigationButton?, rightNavigationButton: ItemListNavigationButton?, secondaryRightNavigationButton: ItemListNavigationButton? = nil, backNavigationButton: ItemListBackButton?, tabBarItem: ItemListControllerTabBarItem? = nil, animateChanges: Bool = true) { + self.theme = theme + self.title = title + self.leftNavigationButton = leftNavigationButton + self.rightNavigationButton = rightNavigationButton + self.secondaryRightNavigationButton = secondaryRightNavigationButton + self.backNavigationButton = backNavigationButton + self.tabBarItem = tabBarItem + self.animateChanges = animateChanges + } +} + +class ItemListController: ViewController, KeyShortcutResponder, PresentableController { + private let state: Signal<(ItemListControllerState, (ItemListNodeState, Any)), NoError> + + private var leftNavigationButtonTitleAndStyle: (ItemListNavigationButtonContent, ItemListNavigationButtonStyle)? + private var rightNavigationButtonTitleAndStyle: [(ItemListNavigationButtonContent, ItemListNavigationButtonStyle)] = [] + private var backNavigationButton: ItemListBackButton? + private var tabBarItemInfo: ItemListControllerTabBarItem? + private var navigationButtonActions: (left: (() -> Void)?, right: (() -> Void)?, secondaryRight: (() -> Void)?) = (nil, nil, nil) + + private var theme: WalletTheme + private var strings: WalletStrings + + private var validLayout: ContainerViewLayout? + + private var didPlayPresentationAnimation = false + private(set) var didAppearOnce = false + var didAppear: ((Bool) -> Void)? + private var isDismissed = false + + var titleControlValueChanged: ((Int) -> Void)? + + private var tabBarItemDisposable: Disposable? + + private let _ready = Promise() + override var ready: Promise { + return self._ready + } + + var experimentalSnapScrollToItem: Bool = false { + didSet { + if self.isNodeLoaded { + (self.displayNode as! ItemListControllerNode).listNode.experimentalSnapScrollToItem = self.experimentalSnapScrollToItem + } + } + } + + var enableInteractiveDismiss = false { + didSet { + if self.isNodeLoaded { + (self.displayNode as! ItemListControllerNode).enableInteractiveDismiss = self.enableInteractiveDismiss + } + } + } + + var alwaysSynchronous = false { + didSet { + if self.isNodeLoaded { + (self.displayNode as! ItemListControllerNode).alwaysSynchronous = self.alwaysSynchronous + } + } + } + + var visibleEntriesUpdated: ((ItemListNodeVisibleEntries) -> Void)? { + didSet { + if self.isNodeLoaded { + (self.displayNode as! ItemListControllerNode).visibleEntriesUpdated = self.visibleEntriesUpdated + } + } + } + + var visibleBottomContentOffsetChanged: ((ListViewVisibleContentOffset) -> Void)? { + didSet { + if self.isNodeLoaded { + (self.displayNode as! ItemListControllerNode).visibleBottomContentOffsetChanged = self.visibleBottomContentOffsetChanged + } + } + } + + var contentOffsetChanged: ((ListViewVisibleContentOffset, Bool) -> Void)? { + didSet { + if self.isNodeLoaded { + (self.displayNode as! ItemListControllerNode).contentOffsetChanged = self.contentOffsetChanged + } + } + } + + var contentScrollingEnded: ((ListView) -> Bool)? { + didSet { + if self.isNodeLoaded { + (self.displayNode as! ItemListControllerNode).contentScrollingEnded = self.contentScrollingEnded + } + } + } + + var searchActivated: ((Bool) -> Void)? { + didSet { + if self.isNodeLoaded { + (self.displayNode as! ItemListControllerNode).searchActivated = self.searchActivated + } + } + } + + var willScrollToTop: (() -> Void)? + + func setReorderEntry(_ f: @escaping (Int, Int, [T]) -> Void) { + self.reorderEntry = { a, b, list in + f(a, b, list.map { $0 as! T }) + } + } + private var reorderEntry: ((Int, Int, [ItemListNodeAnyEntry]) -> Void)? { + didSet { + if self.isNodeLoaded { + (self.displayNode as! ItemListControllerNode).reorderEntry = self.reorderEntry + } + } + } + + var previewItemWithTag: ((ItemListItemTag) -> UIViewController?)? + var commitPreview: ((UIViewController) -> Void)? + + var willDisappear: ((Bool) -> Void)? + var didDisappear: ((Bool) -> Void)? + + init(theme: WalletTheme, strings: WalletStrings, updatedPresentationData: Signal<(theme: WalletTheme, strings: WalletStrings), NoError>, state: Signal<(ItemListControllerState, (ItemListNodeState, ItemGenerationArguments)), NoError>, tabBarItem: Signal?) { + self.state = state + |> map { controllerState, nodeStateAndArgument -> (ItemListControllerState, (ItemListNodeState, Any)) in + return (controllerState, (nodeStateAndArgument.0, nodeStateAndArgument.1)) + } + + self.theme = theme + self.strings = strings + + super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: theme.navigationBar, strings: NavigationBarStrings(back: strings.Wallet_Navigation_Back, close: strings.Wallet_Navigation_Close))) + + self.isOpaqueWhenInOverlay = true + self.blocksBackgroundWhenInOverlay = true + + self.statusBar.statusBarStyle = theme.statusBarStyle + + self.scrollToTop = { [weak self] in + self?.willScrollToTop?() + (self?.displayNode as! ItemListControllerNode).scrollToTop() + } + + if let tabBarItem = tabBarItem { + self.tabBarItemDisposable = (tabBarItem |> deliverOnMainQueue).start(next: { [weak self] tabBarItemInfo in + if let strongSelf = self { + if strongSelf.tabBarItemInfo != tabBarItemInfo { + strongSelf.tabBarItemInfo = tabBarItemInfo + + strongSelf.tabBarItem.title = tabBarItemInfo.title + strongSelf.tabBarItem.image = tabBarItemInfo.image + strongSelf.tabBarItem.selectedImage = tabBarItemInfo.selectedImage + strongSelf.tabBarItem.badgeValue = tabBarItemInfo.badgeValue + } + } + }) + } + } + + required init(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + deinit { + self.tabBarItemDisposable?.dispose() + } + + override func loadDisplayNode() { + let previousControllerState = Atomic(value: nil) + let nodeState = self.state + |> deliverOnMainQueue + |> afterNext { [weak self] controllerState, state in + Queue.mainQueue().async { + if let strongSelf = self { + let previousState = previousControllerState.swap(controllerState) + if previousState?.title != controllerState.title { + switch controllerState.title { + case let .text(text): + strongSelf.title = text + strongSelf.navigationItem.titleView = nil + } + } + strongSelf.navigationButtonActions = (left: controllerState.leftNavigationButton?.action, right: controllerState.rightNavigationButton?.action, secondaryRight: controllerState.secondaryRightNavigationButton?.action) + + let themeUpdated = strongSelf.theme !== controllerState.theme + if strongSelf.leftNavigationButtonTitleAndStyle?.0 != controllerState.leftNavigationButton?.content || strongSelf.leftNavigationButtonTitleAndStyle?.1 != controllerState.leftNavigationButton?.style || themeUpdated { + if let leftNavigationButton = controllerState.leftNavigationButton { + let item: UIBarButtonItem + switch leftNavigationButton.content { + case .none: + item = UIBarButtonItem(title: "", style: leftNavigationButton.style.barButtonItemStyle, target: strongSelf, action: #selector(strongSelf.leftNavigationButtonPressed)) + case let .text(value): + item = UIBarButtonItem(title: value, style: leftNavigationButton.style.barButtonItemStyle, target: strongSelf, action: #selector(strongSelf.leftNavigationButtonPressed)) + case let .icon(icon): + var image: UIImage? + switch icon { + case .search: + image = nil + case .add: + image = nil + case .action: + image = nil + } + item = UIBarButtonItem(image: image, style: leftNavigationButton.style.barButtonItemStyle, target: strongSelf, action: #selector(strongSelf.leftNavigationButtonPressed)) + } + strongSelf.leftNavigationButtonTitleAndStyle = (leftNavigationButton.content, leftNavigationButton.style) + strongSelf.navigationItem.setLeftBarButton(item, animated: false) + item.isEnabled = leftNavigationButton.enabled + } else { + strongSelf.leftNavigationButtonTitleAndStyle = nil + strongSelf.navigationItem.setLeftBarButton(nil, animated: false) + } + } else if let barButtonItem = strongSelf.navigationItem.leftBarButtonItem, let leftNavigationButton = controllerState.leftNavigationButton, leftNavigationButton.enabled != barButtonItem.isEnabled { + barButtonItem.isEnabled = leftNavigationButton.enabled + } + + var rightNavigationButtonTitleAndStyle: [(ItemListNavigationButtonContent, ItemListNavigationButtonStyle, Bool)] = [] + if let secondaryRightNavigationButton = controllerState.secondaryRightNavigationButton { + rightNavigationButtonTitleAndStyle.append((secondaryRightNavigationButton.content, secondaryRightNavigationButton.style, secondaryRightNavigationButton.enabled)) + } + if let rightNavigationButton = controllerState.rightNavigationButton { + rightNavigationButtonTitleAndStyle.append((rightNavigationButton.content, rightNavigationButton.style, rightNavigationButton.enabled)) + } + + var updateRightButtonItems = false + if rightNavigationButtonTitleAndStyle.count != strongSelf.rightNavigationButtonTitleAndStyle.count { + updateRightButtonItems = true + } else { + for i in 0 ..< rightNavigationButtonTitleAndStyle.count { + if rightNavigationButtonTitleAndStyle[i].0 != strongSelf.rightNavigationButtonTitleAndStyle[i].0 || rightNavigationButtonTitleAndStyle[i].1 != strongSelf.rightNavigationButtonTitleAndStyle[i].1 { + updateRightButtonItems = true + } + } + } + + if updateRightButtonItems || themeUpdated { + strongSelf.rightNavigationButtonTitleAndStyle = rightNavigationButtonTitleAndStyle.map { ($0.0, $0.1) } + var items: [UIBarButtonItem] = [] + var index = 0 + for (content, style, _) in rightNavigationButtonTitleAndStyle { + let item: UIBarButtonItem + if case .activity = style { + item = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(color: strongSelf.theme.navigationBar.buttonColor)) + } else { + let action: Selector = (index == 0 && rightNavigationButtonTitleAndStyle.count > 1) ? #selector(strongSelf.secondaryRightNavigationButtonPressed) : #selector(strongSelf.rightNavigationButtonPressed) + switch content { + case .none: + item = UIBarButtonItem(title: "", style: style.barButtonItemStyle, target: strongSelf, action: action) + case let .text(value): + item = UIBarButtonItem(title: value, style: style.barButtonItemStyle, target: strongSelf, action: action) + case let .icon(icon): + var image: UIImage? + switch icon { + case .search: + image = nil + case .add: + image = nil + case .action: + image = nil + } + item = UIBarButtonItem(image: image, style: style.barButtonItemStyle, target: strongSelf, action: action) + } + } + items.append(item) + index += 1 + } + strongSelf.navigationItem.setRightBarButtonItems(items, animated: false) + index = 0 + for (_, _, enabled) in rightNavigationButtonTitleAndStyle { + items[index].isEnabled = enabled + index += 1 + } + } else { + for i in 0 ..< rightNavigationButtonTitleAndStyle.count { + strongSelf.navigationItem.rightBarButtonItems?[i].isEnabled = rightNavigationButtonTitleAndStyle[i].2 + } + } + + if strongSelf.backNavigationButton != controllerState.backNavigationButton { + strongSelf.backNavigationButton = controllerState.backNavigationButton + + if let backNavigationButton = strongSelf.backNavigationButton { + strongSelf.navigationItem.backBarButtonItem = UIBarButtonItem(title: backNavigationButton.title, style: .plain, target: nil, action: nil) + } else { + strongSelf.navigationItem.backBarButtonItem = nil + } + } + + if strongSelf.theme !== controllerState.theme { + strongSelf.theme = controllerState.theme + + strongSelf.navigationBar?.updatePresentationData(NavigationBarPresentationData(theme: strongSelf.theme.navigationBar, strings: NavigationBarStrings(back: strongSelf.strings.Wallet_Navigation_Back, close: strongSelf.strings.Wallet_Navigation_Close))) + strongSelf.statusBar.statusBarStyle = strongSelf.theme.statusBarStyle + + var items = strongSelf.navigationItem.rightBarButtonItems ?? [] + for i in 0 ..< strongSelf.rightNavigationButtonTitleAndStyle.count { + if case .activity = strongSelf.rightNavigationButtonTitleAndStyle[i].1 { + items[i] = UIBarButtonItem(customDisplayNode: ProgressNavigationButtonNode(color: strongSelf.theme.navigationBar.buttonColor))! + } + } + strongSelf.navigationItem.setRightBarButtonItems(items, animated: false) + } + } + } + } |> map { ($0.theme, $1) } + let displayNode = ItemListControllerNode(controller: self, navigationBar: self.navigationBar!, updateNavigationOffset: { [weak self] offset in + if let strongSelf = self { + strongSelf.navigationOffset = offset + } + }, state: nodeState) + displayNode.dismiss = { [weak self] in + self?.presentingViewController?.dismiss(animated: true, completion: nil) + } + displayNode.enableInteractiveDismiss = self.enableInteractiveDismiss + displayNode.alwaysSynchronous = self.alwaysSynchronous + displayNode.visibleEntriesUpdated = self.visibleEntriesUpdated + displayNode.visibleBottomContentOffsetChanged = self.visibleBottomContentOffsetChanged + displayNode.contentOffsetChanged = self.contentOffsetChanged + displayNode.contentScrollingEnded = self.contentScrollingEnded + displayNode.searchActivated = self.searchActivated + displayNode.reorderEntry = self.reorderEntry + displayNode.listNode.experimentalSnapScrollToItem = self.experimentalSnapScrollToItem + displayNode.requestLayout = { [weak self] transition in + self?.requestLayout(transition: transition) + } + self.displayNode = displayNode + super.displayNodeDidLoad() + self._ready.set((self.displayNode as! ItemListControllerNode).ready) + } + + override func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { + super.containerLayoutUpdated(layout, transition: transition) + + self.validLayout = layout + + (self.displayNode as! ItemListControllerNode).containerLayoutUpdated(layout, navigationBarHeight: self.navigationInsetHeight, transition: transition) + } + + @objc func leftNavigationButtonPressed() { + self.navigationButtonActions.left?() + } + + @objc func rightNavigationButtonPressed() { + self.navigationButtonActions.right?() + } + + @objc func secondaryRightNavigationButtonPressed() { + self.navigationButtonActions.secondaryRight?() + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + + self.viewDidAppear(completion: {}) + } + + func viewDidAppear(completion: @escaping () -> Void) { + (self.displayNode as! ItemListControllerNode).listNode.preloadPages = true + + if let presentationArguments = self.presentationArguments as? ViewControllerPresentationArguments, !self.didPlayPresentationAnimation { + self.didPlayPresentationAnimation = true + if case .modalSheet = presentationArguments.presentationAnimation { + (self.displayNode as! ItemListControllerNode).animateIn(completion: { + presentationArguments.completion?() + completion() + }) + self.updateTransitionWhenPresentedAsModal?(1.0, .animated(duration: 0.5, curve: .spring)) + } else { + completion() + } + } else { + completion() + } + + let firstTime = !self.didAppearOnce + self.didAppearOnce = true + self.didAppear?(firstTime) + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + + self.willDisappear?(animated) + } + + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + + self.didDisappear?(animated) + } + + func frameForItemNode(_ predicate: (ListViewItemNode) -> Bool) -> CGRect? { + var result: CGRect? + (self.displayNode as! ItemListControllerNode).listNode.forEachItemNode { itemNode in + if let itemNode = itemNode as? ListViewItemNode { + if predicate(itemNode) { + result = itemNode.convert(itemNode.bounds, to: self.displayNode) + } + } + } + return result + } + + func forEachItemNode(_ f: (ListViewItemNode) -> Void) { + (self.displayNode as! ItemListControllerNode).listNode.forEachItemNode { itemNode in + if let itemNode = itemNode as? ListViewItemNode { + f(itemNode) + } + } + } + + func ensureItemNodeVisible(_ itemNode: ListViewItemNode, animated: Bool = true) { + (self.displayNode as! ItemListControllerNode).listNode.ensureItemNodeVisible(itemNode, animated: animated) + } + + func afterLayout(_ f: @escaping () -> Void) { + (self.displayNode as! ItemListControllerNode).afterLayout(f) + } + + func previewingController(from sourceView: UIView, for location: CGPoint) -> (UIViewController, CGRect)? { + guard let layout = self.validLayout, case .phone = layout.deviceMetrics.type else { + return nil + } + + let boundsSize = self.view.bounds.size + let contentSize: CGSize + if case .unknown = layout.deviceMetrics { + contentSize = boundsSize + } else { + contentSize = layout.deviceMetrics.previewingContentSize(inLandscape: boundsSize.width > boundsSize.height) + } + + var selectedNode: ItemListItemNode? + let listLocation = self.view.convert(location, to: (self.displayNode as! ItemListControllerNode).listNode.view) + (self.displayNode as! ItemListControllerNode).listNode.forEachItemNode { itemNode in + if itemNode.frame.contains(listLocation), let itemNode = itemNode as? ItemListItemNode { + selectedNode = itemNode + } + } + if let selectedNode = selectedNode as? (ItemListItemNode & ListViewItemNode), let tag = selectedNode.tag { + var sourceRect = selectedNode.view.superview!.convert(selectedNode.frame, to: sourceView) + sourceRect.size.height -= UIScreenPixel + + if let controller = self.previewItemWithTag?(tag) { + if let controller = controller as? ContainableController { + controller.containerLayoutUpdated(ContainerViewLayout(size: contentSize, metrics: LayoutMetrics(), deviceMetrics: layout.deviceMetrics, intrinsicInsets: UIEdgeInsets(), safeInsets: UIEdgeInsets(), statusBarHeight: nil, inputHeight: nil, inputHeightIsInteractivellyChanging: false, inVoiceOver: false), transition: .immediate) + } + return (controller, sourceRect) + } else { + return nil + } + } else { + return nil + } + } + + func clearItemNodesHighlight(animated: Bool = false) { + (self.displayNode as! ItemListControllerNode).listNode.clearHighlightAnimated(animated) + } + + func previewingCommit(_ viewControllerToCommit: UIViewController) { + self.commitPreview?(viewControllerToCommit) + } + + var keyShortcuts: [KeyShortcut] { + return [KeyShortcut(input: UIKeyCommand.inputEscape, action: { [weak self] in + if !(self?.navigationController?.topViewController is TabBarController) { + _ = self?.navigationBar?.executeBack() + } + })] + } +} diff --git a/submodules/WalletUI/Sources/ItemList/ItemListControllerEmptyStateItem.swift b/submodules/WalletUI/Sources/ItemList/ItemListControllerEmptyStateItem.swift new file mode 100644 index 0000000000..2a24cb8538 --- /dev/null +++ b/submodules/WalletUI/Sources/ItemList/ItemListControllerEmptyStateItem.swift @@ -0,0 +1,14 @@ +import Foundation +import UIKit +import AsyncDisplayKit +import Display + +protocol ItemListControllerEmptyStateItem { + func isEqual(to: ItemListControllerEmptyStateItem) -> Bool + func node(current: ItemListControllerEmptyStateItemNode?) -> ItemListControllerEmptyStateItemNode +} + +class ItemListControllerEmptyStateItemNode: ASDisplayNode { + func updateLayout(layout: ContainerViewLayout, navigationBarHeight: CGFloat, transition: ContainedViewLayoutTransition) { + } +} diff --git a/submodules/WalletUI/Sources/ItemList/ItemListControllerNode.swift b/submodules/WalletUI/Sources/ItemList/ItemListControllerNode.swift new file mode 100644 index 0000000000..89661fdf44 --- /dev/null +++ b/submodules/WalletUI/Sources/ItemList/ItemListControllerNode.swift @@ -0,0 +1,706 @@ +import Foundation +import UIKit +import AsyncDisplayKit +import Display +import SwiftSignalKit +import TelegramCore +import MergeLists + +typealias ItemListSectionId = Int32 + +protocol ItemListNodeAnyEntry { + var anyId: AnyHashable { get } + var tag: ItemListItemTag? { get } + func isLessThan(_ rhs: ItemListNodeAnyEntry) -> Bool + func isEqual(_ rhs: ItemListNodeAnyEntry) -> Bool + func item(_ arguments: Any) -> ListViewItem +} + +protocol ItemListNodeEntry: Comparable, Identifiable, ItemListNodeAnyEntry { + var section: ItemListSectionId { get } +} + +extension ItemListNodeEntry { + var anyId: AnyHashable { + return self.stableId + } + + func isLessThan(_ rhs: ItemListNodeAnyEntry) -> Bool { + return self < (rhs as! Self) + } + + func isEqual(_ rhs: ItemListNodeAnyEntry) -> Bool { + return self == (rhs as! Self) + } +} + +extension ItemListNodeEntry { + var tag: ItemListItemTag? { return nil } +} + +private struct ItemListNodeEntryTransition { + let deletions: [ListViewDeleteItem] + let insertions: [ListViewInsertItem] + let updates: [ListViewUpdateItem] +} + +private func preparedItemListNodeEntryTransition(from fromEntries: [ItemListNodeAnyEntry], to toEntries: [ItemListNodeAnyEntry], arguments: Any) -> ItemListNodeEntryTransition { + let (deleteIndices, indicesAndItems, updateIndices) = mergeListsStableWithUpdates(leftList: fromEntries, rightList: toEntries, isLess: { lhs, rhs in + return lhs.isLessThan(rhs) + }, isEqual: { lhs, rhs in + return lhs.isEqual(rhs) + }, getId: { value in + return value.anyId + }) + + let deletions = deleteIndices.map { ListViewDeleteItem(index: $0, directionHint: nil) } + let insertions = indicesAndItems.map { ListViewInsertItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(arguments), directionHint: nil) } + let updates = updateIndices.map { ListViewUpdateItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(arguments), directionHint: nil) } + + return ItemListNodeEntryTransition(deletions: deletions, insertions: insertions, updates: updates) +} + +enum ItemListStyle { + case plain + case blocks +} + +private struct ItemListNodeTransition { + let theme: WalletTheme + let entries: ItemListNodeEntryTransition + let updateStyle: ItemListStyle? + let emptyStateItem: ItemListControllerEmptyStateItem? + let searchItem: ItemListControllerSearch? + let focusItemTag: ItemListItemTag? + let ensureVisibleItemTag: ItemListItemTag? + let scrollToItem: ListViewScrollToItem? + let firstTime: Bool + let animated: Bool + let animateAlpha: Bool + let crossfade: Bool + let mergedEntries: [ItemListNodeAnyEntry] + let scrollEnabled: Bool +} + +final class ItemListNodeState { + let entries: [ItemListNodeAnyEntry] + let style: ItemListStyle + let emptyStateItem: ItemListControllerEmptyStateItem? + let searchItem: ItemListControllerSearch? + let animateChanges: Bool + let crossfadeState: Bool + let scrollEnabled: Bool + let focusItemTag: ItemListItemTag? + let ensureVisibleItemTag: ItemListItemTag? + let initialScrollToItem: ListViewScrollToItem? + + init(entries: [T], style: ItemListStyle, focusItemTag: ItemListItemTag? = nil, ensureVisibleItemTag: ItemListItemTag? = nil, emptyStateItem: ItemListControllerEmptyStateItem? = nil, searchItem: ItemListControllerSearch? = nil, initialScrollToItem: ListViewScrollToItem? = nil, crossfadeState: Bool = false, animateChanges: Bool = true, scrollEnabled: Bool = true) { + self.entries = entries.map { $0 } + self.style = style + self.emptyStateItem = emptyStateItem + self.searchItem = searchItem + self.crossfadeState = crossfadeState + self.animateChanges = animateChanges + self.focusItemTag = focusItemTag + self.ensureVisibleItemTag = ensureVisibleItemTag + self.initialScrollToItem = initialScrollToItem + self.scrollEnabled = scrollEnabled + } +} + +private final class ItemListNodeOpaqueState { + let mergedEntries: [ItemListNodeAnyEntry] + + init(mergedEntries: [ItemListNodeAnyEntry]) { + self.mergedEntries = mergedEntries + } +} + +final class ItemListNodeVisibleEntries: Sequence { + let iterate: () -> ItemListNodeAnyEntry? + + init(iterate: @escaping () -> ItemListNodeAnyEntry?) { + self.iterate = iterate + } + + func makeIterator() -> AnyIterator { + return AnyIterator { () -> ItemListNodeAnyEntry? in + return self.iterate() + } + } +} + +final class ItemListControllerNodeView: UITracingLayerView, PreviewingHostView { + var onLayout: (() -> Void)? + + init(controller: ItemListController?) { + self.controller = controller + + super.init(frame: CGRect()) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func layoutSubviews() { + super.layoutSubviews() + + self.onLayout?() + } + + private var inHitTest = false + var hitTestImpl: ((CGPoint, UIEvent?) -> UIView?)? + + override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + if self.inHitTest { + return super.hitTest(point, with: event) + } else { + self.inHitTest = true + let result = self.hitTestImpl?(point, event) + self.inHitTest = false + return result + } + } + + var previewingDelegate: PreviewingHostViewDelegate? { + return PreviewingHostViewDelegate(controllerForLocation: { [weak self] sourceView, point in + return self?.controller?.previewingController(from: sourceView, for: point) + }, commitController: { [weak self] controller in + self?.controller?.previewingCommit(controller) + }) + } + + weak var controller: ItemListController? +} + +class ItemListControllerNode: ASDisplayNode, UIScrollViewDelegate { + private var _ready = ValuePromise() + var ready: Signal { + return self._ready.get() + } + private var didSetReady = false + + private let navigationBar: NavigationBar + + let listNode: ListView + private let leftOverlayNode: ASDisplayNode + private let rightOverlayNode: ASDisplayNode + private var emptyStateItem: ItemListControllerEmptyStateItem? + private var emptyStateNode: ItemListControllerEmptyStateItemNode? + + private var searchItem: ItemListControllerSearch? + private var searchNode: ItemListControllerSearchNode? + + private let transitionDisposable = MetaDisposable() + + private var enqueuedTransitions: [ItemListNodeTransition] = [] + private var validLayout: (ContainerViewLayout, CGFloat)? + + private var theme: WalletTheme? + private var listStyle: ItemListStyle? + + private var appliedFocusItemTag: ItemListItemTag? + private var appliedEnsureVisibleItemTag: ItemListItemTag? + + private var afterLayoutActions: [() -> Void] = [] + + let updateNavigationOffset: (CGFloat) -> Void + var dismiss: (() -> Void)? + + var visibleEntriesUpdated: ((ItemListNodeVisibleEntries) -> Void)? + var visibleBottomContentOffsetChanged: ((ListViewVisibleContentOffset) -> Void)? + var contentOffsetChanged: ((ListViewVisibleContentOffset, Bool) -> Void)? + var contentScrollingEnded: ((ListView) -> Bool)? + var searchActivated: ((Bool) -> Void)? + var reorderEntry: ((Int, Int, [ItemListNodeAnyEntry]) -> Void)? + var requestLayout: ((ContainedViewLayoutTransition) -> Void)? + + var enableInteractiveDismiss = false { + didSet { + } + } + + var alwaysSynchronous = false + + init(controller: ItemListController?, navigationBar: NavigationBar, updateNavigationOffset: @escaping (CGFloat) -> Void, state: Signal<(WalletTheme, (ItemListNodeState, Any)), NoError>) { + self.navigationBar = navigationBar + self.updateNavigationOffset = updateNavigationOffset + + self.listNode = ListView() + self.leftOverlayNode = ASDisplayNode() + self.rightOverlayNode = ASDisplayNode() + + super.init() + + self.setViewBlock({ [weak controller] in + return ItemListControllerNodeView(controller: controller) + }) + + self.backgroundColor = nil + self.isOpaque = false + + self.addSubnode(self.listNode) + + self.listNode.displayedItemRangeChanged = { [weak self] displayedRange, opaqueTransactionState in + if let strongSelf = self, let visibleEntriesUpdated = strongSelf.visibleEntriesUpdated, let mergedEntries = (opaqueTransactionState as? ItemListNodeOpaqueState)?.mergedEntries { + if let visible = displayedRange.visibleRange { + let indexRange = (visible.firstIndex, visible.lastIndex) + + var index = indexRange.0 + let iterator = ItemListNodeVisibleEntries(iterate: { + var item: ItemListNodeAnyEntry? + if index <= indexRange.1 { + item = mergedEntries[index] + } + index += 1 + return item + }) + visibleEntriesUpdated(iterator) + } + } + } + + self.listNode.reorderItem = { [weak self] fromIndex, toIndex, opaqueTransactionState in + if let strongSelf = self, let reorderEntry = strongSelf.reorderEntry, let mergedEntries = (opaqueTransactionState as? ItemListNodeOpaqueState)?.mergedEntries { + if fromIndex >= 0 && fromIndex < mergedEntries.count && toIndex >= 0 && toIndex < mergedEntries.count { + reorderEntry(fromIndex, toIndex, mergedEntries) + } + } + return .single(false) + } + + self.listNode.visibleBottomContentOffsetChanged = { [weak self] offset in + self?.visibleBottomContentOffsetChanged?(offset) + } + + self.listNode.visibleContentOffsetChanged = { [weak self] offset in + var inVoiceOver = false + if let validLayout = self?.validLayout { + inVoiceOver = validLayout.0.inVoiceOver + } + self?.contentOffsetChanged?(offset, inVoiceOver) + } + + self.listNode.didEndScrolling = { [weak self] in + if let strongSelf = self { + let _ = strongSelf.contentScrollingEnded?(strongSelf.listNode) + } + } + + let previousState = Atomic(value: nil) + self.transitionDisposable.set(((state |> map { theme, stateAndArguments -> ItemListNodeTransition in + let (state, arguments) = stateAndArguments + if state.entries.count > 1 { + for i in 1 ..< state.entries.count { + assert(state.entries[i - 1].isLessThan(state.entries[i])) + } + } + let previous = previousState.swap(state) + let transition = preparedItemListNodeEntryTransition(from: previous?.entries ?? [], to: state.entries, arguments: arguments) + var updatedStyle: ItemListStyle? + if previous?.style != state.style { + updatedStyle = state.style + } + + var scrollToItem: ListViewScrollToItem? + if previous == nil { + scrollToItem = state.initialScrollToItem + } + + return ItemListNodeTransition(theme: theme, entries: transition, updateStyle: updatedStyle, emptyStateItem: state.emptyStateItem, searchItem: state.searchItem, focusItemTag: state.focusItemTag, ensureVisibleItemTag: state.ensureVisibleItemTag, scrollToItem: scrollToItem, firstTime: previous == nil, animated: previous != nil && state.animateChanges, animateAlpha: previous != nil && state.animateChanges, crossfade: state.crossfadeState, mergedEntries: state.entries, scrollEnabled: state.scrollEnabled) + }) |> deliverOnMainQueue).start(next: { [weak self] transition in + if let strongSelf = self { + strongSelf.enqueueTransition(transition) + } + })) + } + + deinit { + self.transitionDisposable.dispose() + } + + override func didLoad() { + super.didLoad() + + (self.view as? ItemListControllerNodeView)?.onLayout = { [weak self] in + guard let strongSelf = self else { + return + } + if !strongSelf.afterLayoutActions.isEmpty { + let afterLayoutActions = strongSelf.afterLayoutActions + strongSelf.afterLayoutActions = [] + for f in afterLayoutActions { + f() + } + } + } + + (self.view as? ItemListControllerNodeView)?.hitTestImpl = { [weak self] point, event in + return self?.hitTest(point, with: event) + } + } + + func animateIn(completion: (() -> Void)? = nil) { + self.layer.animatePosition(from: CGPoint(x: self.layer.position.x, y: self.layer.position.y + self.layer.bounds.size.height), to: self.layer.position, duration: 0.5, timingFunction: kCAMediaTimingFunctionSpring, completion: { _ in + completion?() + }) + } + + func animateOut(completion: (() -> Void)? = nil) { + self.layer.animatePosition(from: self.layer.position, to: CGPoint(x: self.layer.position.x, y: self.layer.position.y + self.layer.bounds.size.height), duration: 0.2, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue, removeOnCompletion: false, completion: { [weak self] _ in + if let strongSelf = self { + strongSelf.dismiss?() + } + completion?() + }) + } + + func containerLayoutUpdated(_ layout: ContainerViewLayout, navigationBarHeight: CGFloat, transition: ContainedViewLayoutTransition) { + var duration: Double = 0.0 + var curve: UInt = 0 + switch transition { + case .immediate: + break + case let .animated(animationDuration, animationCurve): + duration = animationDuration + switch animationCurve { + case .easeInOut, .custom: + break + case .spring: + curve = 7 + } + } + + let listViewCurve: ListViewAnimationCurve + if curve == 7 { + listViewCurve = .Spring(duration: duration) + } else { + listViewCurve = .Default(duration: duration) + } + + var insets = layout.insets(options: [.input]) + insets.top += navigationBarHeight + + var addedInsets: UIEdgeInsets? + if layout.size.width > 480.0 { + let inset = max(20.0, floor((layout.size.width - 674.0) / 2.0)) + insets.left += inset + insets.right += inset + addedInsets = UIEdgeInsets(top: 0.0, left: inset, bottom: 0.0, right: inset) + + if self.leftOverlayNode.supernode == nil { + self.insertSubnode(self.leftOverlayNode, aboveSubnode: self.listNode) + } + if self.rightOverlayNode.supernode == nil { + self.insertSubnode(self.rightOverlayNode, aboveSubnode: self.listNode) + } + } else { + insets.left += layout.safeInsets.left + insets.right += layout.safeInsets.right + + if self.leftOverlayNode.supernode != nil { + self.leftOverlayNode.removeFromSupernode() + } + if self.rightOverlayNode.supernode != nil { + self.rightOverlayNode.removeFromSupernode() + } + } + + self.listNode.bounds = CGRect(x: 0.0, y: 0.0, width: layout.size.width, height: layout.size.height) + self.listNode.position = CGPoint(x: layout.size.width / 2.0, y: layout.size.height / 2.0) + + self.listNode.transaction(deleteIndices: [], insertIndicesAndItems: [], updateIndicesAndItems: [], options: [.Synchronous, .LowLatency], scrollToItem: nil, updateSizeAndInsets: ListViewUpdateSizeAndInsets(size: layout.size, insets: insets, duration: duration, curve: listViewCurve), stationaryItemRange: nil, updateOpaqueState: nil, completion: { _ in }) + + self.leftOverlayNode.frame = CGRect(x: 0.0, y: 0.0, width: insets.left, height: layout.size.height) + self.rightOverlayNode.frame = CGRect(x: layout.size.width - insets.right, y: 0.0, width: insets.right, height: layout.size.height) + + if let emptyStateNode = self.emptyStateNode { + var layout = layout + if let addedInsets = addedInsets { + layout = layout.addedInsets(insets: addedInsets) + } + emptyStateNode.updateLayout(layout: layout, navigationBarHeight: navigationBarHeight, transition: transition) + } + + if let searchNode = self.searchNode { + searchNode.updateLayout(layout: layout, navigationBarHeight: navigationBarHeight, transition: transition) + } + + let dequeue = self.validLayout == nil + self.validLayout = (layout, navigationBarHeight) + if dequeue { + self.dequeueTransitions() + } + + if !self.afterLayoutActions.isEmpty { + let afterLayoutActions = self.afterLayoutActions + self.afterLayoutActions = [] + for f in afterLayoutActions { + f() + } + } + } + + private func enqueueTransition(_ transition: ItemListNodeTransition) { + self.enqueuedTransitions.append(transition) + if self.validLayout != nil { + self.dequeueTransitions() + } + } + + private func dequeueTransitions() { + while !self.enqueuedTransitions.isEmpty { + let transition = self.enqueuedTransitions.removeFirst() + + if transition.theme !== self.theme { + self.theme = transition.theme + + if let listStyle = self.listStyle { + switch listStyle { + case .plain: + self.backgroundColor = transition.theme.list.plainBackgroundColor + self.listNode.backgroundColor = transition.theme.list.plainBackgroundColor + self.leftOverlayNode.backgroundColor = transition.theme.list.plainBackgroundColor + self.rightOverlayNode.backgroundColor = transition.theme.list.plainBackgroundColor + case .blocks: + self.backgroundColor = transition.theme.list.blocksBackgroundColor + self.listNode.backgroundColor = transition.theme.list.blocksBackgroundColor + self.leftOverlayNode.backgroundColor = transition.theme.list.blocksBackgroundColor + self.rightOverlayNode.backgroundColor = transition.theme.list.blocksBackgroundColor + } + } + } + + if let updateStyle = transition.updateStyle { + self.listStyle = updateStyle + + if let _ = self.theme { + switch updateStyle { + case .plain: + self.backgroundColor = transition.theme.list.plainBackgroundColor + self.listNode.backgroundColor = transition.theme.list.plainBackgroundColor + self.leftOverlayNode.backgroundColor = transition.theme.list.plainBackgroundColor + self.rightOverlayNode.backgroundColor = transition.theme.list.plainBackgroundColor + case .blocks: + self.backgroundColor = transition.theme.list.blocksBackgroundColor + self.listNode.backgroundColor = transition.theme.list.blocksBackgroundColor + self.leftOverlayNode.backgroundColor = transition.theme.list.blocksBackgroundColor + self.rightOverlayNode.backgroundColor = transition.theme.list.blocksBackgroundColor + } + } + } + + var options = ListViewDeleteAndInsertOptions() + if transition.firstTime { + options.insert(.Synchronous) + options.insert(.LowLatency) + options.insert(.PreferSynchronousResourceLoading) + options.insert(.PreferSynchronousDrawing) + } else if transition.animated { + options.insert(.AnimateInsertion) + } else if transition.animateAlpha { + options.insert(.PreferSynchronousResourceLoading) + options.insert(.PreferSynchronousDrawing) + options.insert(.AnimateAlpha) + } else if transition.crossfade { + options.insert(.AnimateCrossfade) + } else { + options.insert(.Synchronous) + options.insert(.PreferSynchronousDrawing) + } + if self.alwaysSynchronous { + options.insert(.Synchronous) + options.insert(.LowLatency) + } + let focusItemTag = transition.focusItemTag + let ensureVisibleItemTag = transition.ensureVisibleItemTag + var scrollToItem: ListViewScrollToItem? + if let item = transition.scrollToItem { + scrollToItem = item + } else if self.listNode.experimentalSnapScrollToItem, let ensureVisibleItemTag = ensureVisibleItemTag { + for i in 0 ..< transition.mergedEntries.count { + if let tag = transition.mergedEntries[i].tag, tag.isEqual(to: ensureVisibleItemTag) { + scrollToItem = ListViewScrollToItem(index: i, position: ListViewScrollPosition.visible, animated: true, curve: .Default(duration: nil), directionHint: .Down) + } + } + } + + var updateSearchItem = false + if let searchItem = self.searchItem, let updatedSearchItem = transition.searchItem { + updateSearchItem = !searchItem.isEqual(to: updatedSearchItem) + } else if (self.searchItem != nil) != (transition.searchItem != nil) { + updateSearchItem = true + } + if updateSearchItem { + self.searchItem = transition.searchItem + if let searchItem = transition.searchItem { + let updatedTitleContentNode = searchItem.titleContentNode(current: self.navigationBar.contentNode as? (NavigationBarContentNode & ItemListControllerSearchNavigationContentNode)) + if updatedTitleContentNode !== self.navigationBar.contentNode { + if let titleContentNode = self.navigationBar.contentNode as? ItemListControllerSearchNavigationContentNode { + titleContentNode.deactivate() + } + updatedTitleContentNode.setQueryUpdated { [weak self] query in + if let strongSelf = self { + strongSelf.searchNode?.queryUpdated(query) + } + } + self.navigationBar.setContentNode(updatedTitleContentNode, animated: true) + updatedTitleContentNode.activate() + } + + let updatedNode = searchItem.node(current: self.searchNode, titleContentNode: updatedTitleContentNode) + if let searchNode = self.searchNode, updatedNode !== searchNode { + searchNode.removeFromSupernode() + } + if self.searchNode !== updatedNode { + self.searchNode = updatedNode + if let validLayout = self.validLayout { + updatedNode.updateLayout(layout: validLayout.0, navigationBarHeight: validLayout.1, transition: .immediate) + } + self.insertSubnode(updatedNode, belowSubnode: self.navigationBar) + updatedNode.activate() + } + } else { + if let searchNode = self.searchNode { + self.searchNode = nil + searchNode.deactivate() + } + + if let titleContentNode = self.navigationBar.contentNode { + if let titleContentNode = titleContentNode as? ItemListControllerSearchNavigationContentNode { + titleContentNode.deactivate() + } + self.navigationBar.setContentNode(nil, animated: true) + } + } + } + + self.listNode.transaction(deleteIndices: transition.entries.deletions, insertIndicesAndItems: transition.entries.insertions, updateIndicesAndItems: transition.entries.updates, options: options, scrollToItem: scrollToItem, updateOpaqueState: ItemListNodeOpaqueState(mergedEntries: transition.mergedEntries), completion: { [weak self] _ in + if let strongSelf = self { + if !strongSelf.didSetReady { + strongSelf.didSetReady = true + strongSelf._ready.set(true) + } + + var updatedFocusItemTag = false + if let appliedFocusItemTag = strongSelf.appliedFocusItemTag, let focusItemTag = focusItemTag { + updatedFocusItemTag = !appliedFocusItemTag.isEqual(to: focusItemTag) + } else if (strongSelf.appliedFocusItemTag != nil) != (focusItemTag != nil) { + updatedFocusItemTag = true + } + if updatedFocusItemTag { + if let focusItemTag = focusItemTag { + strongSelf.listNode.forEachItemNode { itemNode in + if let itemNode = itemNode as? ItemListItemNode { + if let itemTag = itemNode.tag { + if itemTag.isEqual(to: focusItemTag) { + if let focusableNode = itemNode as? ItemListItemFocusableNode { + focusableNode.focus() + } + } + } + } + } + strongSelf.appliedFocusItemTag = focusItemTag + } + } + + var updatedEnsureVisibleItemTag = false + if let appliedEnsureVisibleTag = strongSelf.appliedEnsureVisibleItemTag, let ensureVisibleItemTag = ensureVisibleItemTag { + updatedEnsureVisibleItemTag = !appliedEnsureVisibleTag.isEqual(to: ensureVisibleItemTag) + } else if (strongSelf.appliedEnsureVisibleItemTag != nil) != (ensureVisibleItemTag != nil) { + updatedEnsureVisibleItemTag = true + } + if updatedEnsureVisibleItemTag { + if let ensureVisibleItemTag = ensureVisibleItemTag { + var applied = false + strongSelf.listNode.forEachItemNode { itemNode in + if let itemNode = itemNode as? ItemListItemNode { + if let itemTag = itemNode.tag { + if itemTag.isEqual(to: ensureVisibleItemTag) { + if let itemNode = itemNode as? ListViewItemNode { + strongSelf.listNode.ensureItemNodeVisible(itemNode) + applied = true + } + } + } + } + } + if applied { + strongSelf.appliedEnsureVisibleItemTag = ensureVisibleItemTag + } + } + } + } + }) + var updateEmptyStateItem = false + if let emptyStateItem = self.emptyStateItem, let updatedEmptyStateItem = transition.emptyStateItem { + updateEmptyStateItem = !emptyStateItem.isEqual(to: updatedEmptyStateItem) + } else if (self.emptyStateItem != nil) != (transition.emptyStateItem != nil) { + updateEmptyStateItem = true + } + if updateEmptyStateItem { + self.emptyStateItem = transition.emptyStateItem + if let emptyStateItem = transition.emptyStateItem { + let updatedNode = emptyStateItem.node(current: self.emptyStateNode) + if let emptyStateNode = self.emptyStateNode, updatedNode !== emptyStateNode { + emptyStateNode.removeFromSupernode() + } + if self.emptyStateNode !== updatedNode { + self.emptyStateNode = updatedNode + if let validLayout = self.validLayout { + updatedNode.updateLayout(layout: validLayout.0, navigationBarHeight: validLayout.1, transition: .immediate) + } + self.addSubnode(updatedNode) + } + } else if let emptyStateNode = self.emptyStateNode { + emptyStateNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, removeOnCompletion: false, completion: { [weak emptyStateNode] _ in + emptyStateNode?.removeFromSupernode() + }) + self.listNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2) + self.emptyStateNode = nil + } + } + self.listNode.scrollEnabled = transition.scrollEnabled + + if updateSearchItem { + self.requestLayout?(.animated(duration: 0.3, curve: .spring)) + } + } + } + + func scrollToTop() { + self.listNode.transaction(deleteIndices: [], insertIndicesAndItems: [], updateIndicesAndItems: [], options: [.Synchronous, .LowLatency], scrollToItem: ListViewScrollToItem(index: 0, position: .top(0.0), animated: true, curve: .Default(duration: nil), directionHint: .Up), updateSizeAndInsets: nil, stationaryItemRange: nil, updateOpaqueState: nil, completion: { _ in }) + self.searchNode?.scrollToTop() + } + + func scrollViewDidScroll(_ scrollView: UIScrollView) { + let distanceFromEquilibrium = scrollView.contentOffset.y - scrollView.contentSize.height / 3.0 + self.updateNavigationOffset(-distanceFromEquilibrium) + } + + func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer) { + targetContentOffset.pointee = scrollView.contentOffset + + let scrollVelocity = scrollView.panGestureRecognizer.velocity(in: scrollView) + if abs(scrollVelocity.y) > 200.0 { + self.animateOut() + } + } + + override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + if let searchNode = self.searchNode { + if let result = searchNode.hitTest(point, with: event) { + return result + } + } + + return super.hitTest(point, with: event) + } + + func afterLayout(_ f: @escaping () -> Void) { + self.afterLayoutActions.append(f) + self.view.setNeedsLayout() + } +} diff --git a/submodules/WalletUI/Sources/ItemList/ItemListControllerSearch.swift b/submodules/WalletUI/Sources/ItemList/ItemListControllerSearch.swift new file mode 100644 index 0000000000..4eade671d3 --- /dev/null +++ b/submodules/WalletUI/Sources/ItemList/ItemListControllerSearch.swift @@ -0,0 +1,39 @@ +import Foundation +import UIKit +import AsyncDisplayKit +import Display + +protocol ItemListControllerSearchNavigationContentNode { + func activate() + func deactivate() + + func setQueryUpdated(_ f: @escaping (String) -> Void) +} + +protocol ItemListControllerSearch { + func isEqual(to: ItemListControllerSearch) -> Bool + func titleContentNode(current: (NavigationBarContentNode & ItemListControllerSearchNavigationContentNode)?) -> NavigationBarContentNode & ItemListControllerSearchNavigationContentNode + func node(current: ItemListControllerSearchNode?, titleContentNode: (NavigationBarContentNode & ItemListControllerSearchNavigationContentNode)?) -> ItemListControllerSearchNode +} + +class ItemListControllerSearchNode: ASDisplayNode { + func activate() { + self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue) + } + + func deactivate() { + self.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.2, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue, removeOnCompletion: false, completion: { [weak self] _ in + self?.removeFromSupernode() + }) + } + + func scrollToTop() { + } + + func queryUpdated(_ query: String) { + } + + func updateLayout(layout: ContainerViewLayout, navigationBarHeight: CGFloat, transition: ContainedViewLayoutTransition) { + } +} + diff --git a/submodules/WalletUI/Sources/ItemList/ItemListItem.swift b/submodules/WalletUI/Sources/ItemList/ItemListItem.swift new file mode 100644 index 0000000000..704131718b --- /dev/null +++ b/submodules/WalletUI/Sources/ItemList/ItemListItem.swift @@ -0,0 +1,150 @@ +import Foundation +import UIKit +import Display + +protocol ItemListItemTag { + func isEqual(to other: ItemListItemTag) -> Bool +} + +protocol ItemListItem { + var sectionId: ItemListSectionId { get } + var tag: ItemListItemTag? { get } + var isAlwaysPlain: Bool { get } + var requestsNoInset: Bool { get } +} + +extension ItemListItem { + //let accessoryItem: ListViewAccessoryItem? + + var isAlwaysPlain: Bool { + return false + } + + var tag: ItemListItemTag? { + return nil + } + + var requestsNoInset: Bool { + return false + } +} + +protocol ItemListItemNode { + var tag: ItemListItemTag? { get } +} + +protocol ItemListItemFocusableNode { + func focus() +} + +enum ItemListInsetWithOtherSection { + case none + case full + case reduced +} + +enum ItemListNeighbor { + case none + case otherSection(ItemListInsetWithOtherSection) + case sameSection(alwaysPlain: Bool) +} + +struct ItemListNeighbors { + var top: ItemListNeighbor + var bottom: ItemListNeighbor + + init(top: ItemListNeighbor, bottom: ItemListNeighbor) { + self.top = top + self.bottom = bottom + } +} + +func itemListNeighbors(item: ItemListItem, topItem: ItemListItem?, bottomItem: ItemListItem?) -> ItemListNeighbors { + let topNeighbor: ItemListNeighbor + if let topItem = topItem { + if topItem.sectionId != item.sectionId { + let topInset: ItemListInsetWithOtherSection + if topItem.requestsNoInset { + topInset = .none + } else { + if topItem is ItemListTextItem { + topInset = .reduced + } else { + topInset = .full + } + } + topNeighbor = .otherSection(topInset) + } else { + topNeighbor = .sameSection(alwaysPlain: topItem.isAlwaysPlain) + } + } else { + topNeighbor = .none + } + + let bottomNeighbor: ItemListNeighbor + if let bottomItem = bottomItem { + if bottomItem.sectionId != item.sectionId { + let bottomInset: ItemListInsetWithOtherSection + if bottomItem.requestsNoInset { + bottomInset = .none + } else { + bottomInset = .full + } + bottomNeighbor = .otherSection(bottomInset) + } else { + bottomNeighbor = .sameSection(alwaysPlain: bottomItem.isAlwaysPlain) + } + } else { + bottomNeighbor = .none + } + + return ItemListNeighbors(top: topNeighbor, bottom: bottomNeighbor) +} + +func itemListNeighborsPlainInsets(_ neighbors: ItemListNeighbors) -> UIEdgeInsets { + var insets = UIEdgeInsets() + switch neighbors.top { + case .otherSection: + insets.top += 22.0 + case .none, .sameSection: + break + } + switch neighbors.bottom { + case .none: + insets.bottom += 22.0 + case .otherSection, .sameSection: + break + } + return insets +} + +func itemListNeighborsGroupedInsets(_ neighbors: ItemListNeighbors) -> UIEdgeInsets { + let topInset: CGFloat + switch neighbors.top { + case .none: + topInset = UIScreenPixel + 35.0 + case .sameSection: + topInset = 0.0 + case let .otherSection(otherInset): + switch otherInset { + case .none: + topInset = 0.0 + case .full: + topInset = UIScreenPixel + 35.0 + case .reduced: + topInset = UIScreenPixel + 16.0 + } + } + let bottomInset: CGFloat + switch neighbors.bottom { + case .sameSection, .otherSection: + bottomInset = 0.0 + case .none: + bottomInset = UIScreenPixel + 35.0 + } + return UIEdgeInsets(top: topInset, left: 0.0, bottom: bottomInset, right: 0.0) +} + +func itemListHasRoundedBlockLayout(_ params: ListViewItemLayoutParams) -> Bool { + return params.width > 480.0 +} diff --git a/submodules/WalletUI/Sources/ItemList/ItemListLoadingIndicatorEmptyStateItem.swift b/submodules/WalletUI/Sources/ItemList/ItemListLoadingIndicatorEmptyStateItem.swift new file mode 100644 index 0000000000..8a02461881 --- /dev/null +++ b/submodules/WalletUI/Sources/ItemList/ItemListLoadingIndicatorEmptyStateItem.swift @@ -0,0 +1,56 @@ +import Foundation +import UIKit +import AsyncDisplayKit +import Display +import ActivityIndicator + +final class ItemListLoadingIndicatorEmptyStateItem: ItemListControllerEmptyStateItem { + let theme: WalletTheme + + init(theme: WalletTheme) { + self.theme = theme + } + + func isEqual(to: ItemListControllerEmptyStateItem) -> Bool { + return to is ItemListLoadingIndicatorEmptyStateItem + } + + func node(current: ItemListControllerEmptyStateItemNode?) -> ItemListControllerEmptyStateItemNode { + if let current = current as? ItemListLoadingIndicatorEmptyStateItemNode { + current.theme = self.theme + return current + } else { + return ItemListLoadingIndicatorEmptyStateItemNode(theme: self.theme) + } + } +} + +final class ItemListLoadingIndicatorEmptyStateItemNode: ItemListControllerEmptyStateItemNode { + var theme: WalletTheme { + didSet { + self.indicator.type = .custom(self.theme.list.itemAccentColor, 40.0, 2.0, false) + } + } + private let indicator: ActivityIndicator + + private var validLayout: (ContainerViewLayout, CGFloat)? + + init(theme: WalletTheme) { + self.theme = theme + self.indicator = ActivityIndicator(type: .custom(theme.list.itemAccentColor, 22.0, 2.0, false)) + + super.init() + + self.addSubnode(self.indicator) + } + + override func updateLayout(layout: ContainerViewLayout, navigationBarHeight: CGFloat, transition: ContainedViewLayoutTransition) { + self.validLayout = (layout, navigationBarHeight) + + var insets = layout.insets(options: [.statusBar]) + insets.top += navigationBarHeight + + let size = CGSize(width: 22.0, height: 22.0) + transition.updateFrame(node: self.indicator, frame: CGRect(origin: CGPoint(x: floor((layout.size.width - size.width) / 2.0), y: insets.top + floor((layout.size.height - insets.top - insets.bottom - size.height) / 2.0)), size: size)) + } +} diff --git a/submodules/WalletUI/Sources/ItemList/Items/ItemListActionItem.swift b/submodules/WalletUI/Sources/ItemList/Items/ItemListActionItem.swift new file mode 100644 index 0000000000..05d9ef723e --- /dev/null +++ b/submodules/WalletUI/Sources/ItemList/Items/ItemListActionItem.swift @@ -0,0 +1,334 @@ +import Foundation +import UIKit +import Display +import AsyncDisplayKit +import SwiftSignalKit + +enum ItemListActionKind { + case generic + case destructive + case neutral + case disabled +} + +enum ItemListActionAlignment { + case natural + case center +} + +class ItemListActionItem: ListViewItem, ItemListItem { + let theme: WalletTheme + let title: String + let kind: ItemListActionKind + let alignment: ItemListActionAlignment + let sectionId: ItemListSectionId + let style: ItemListStyle + let action: () -> Void + let longTapAction: (() -> Void)? + let clearHighlightAutomatically: Bool + let tag: Any? + + init(theme: WalletTheme, title: String, kind: ItemListActionKind, alignment: ItemListActionAlignment, sectionId: ItemListSectionId, style: ItemListStyle, action: @escaping () -> Void, longTapAction: (() -> Void)? = nil, clearHighlightAutomatically: Bool = true, tag: Any? = nil) { + self.theme = theme + self.title = title + self.kind = kind + self.alignment = alignment + self.sectionId = sectionId + self.style = style + self.action = action + self.longTapAction = longTapAction + self.clearHighlightAutomatically = clearHighlightAutomatically + self.tag = tag + } + + func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) { + async { + let node = ItemListActionItemNode() + let (layout, apply) = node.asyncLayout()(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem)) + + node.contentSize = layout.contentSize + node.insets = layout.insets + + Queue.mainQueue().async { + completion(node, { + return (nil, { _ in apply() }) + }) + } + } + } + + func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping (ListViewItemApply) -> Void) -> Void) { + Queue.mainQueue().async { + if let nodeValue = node() as? ItemListActionItemNode { + let makeLayout = nodeValue.asyncLayout() + + async { + let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem)) + Queue.mainQueue().async { + completion(layout, { _ in + apply() + }) + } + } + } + } + } + + var selectable: Bool = true + + func selected(listView: ListView){ + if self.clearHighlightAutomatically { + listView.clearHighlightAnimated(true) + } + self.action() + } +} + +private let titleFont = Font.regular(17.0) + +class ItemListActionItemNode: ListViewItemNode, ItemListItemNode { + private let backgroundNode: ASDisplayNode + private let topStripeNode: ASDisplayNode + private let bottomStripeNode: ASDisplayNode + private let highlightedBackgroundNode: ASDisplayNode + private let maskNode: ASImageNode + + private let titleNode: TextNode + + private let activateArea: AccessibilityAreaNode + + private var item: ItemListActionItem? + + var tag: ItemListItemTag? { + return self.item?.tag as? ItemListItemTag + } + + init() { + self.backgroundNode = ASDisplayNode() + self.backgroundNode.isLayerBacked = true + self.backgroundNode.backgroundColor = .white + self.maskNode = ASImageNode() + self.topStripeNode = ASDisplayNode() + self.topStripeNode.isLayerBacked = true + + self.bottomStripeNode = ASDisplayNode() + self.bottomStripeNode.isLayerBacked = true + + self.titleNode = TextNode() + self.titleNode.isUserInteractionEnabled = false + self.titleNode.contentMode = .left + self.titleNode.contentsScale = UIScreen.main.scale + + self.highlightedBackgroundNode = ASDisplayNode() + self.highlightedBackgroundNode.isLayerBacked = true + + self.activateArea = AccessibilityAreaNode() + + super.init(layerBacked: false, dynamicBounce: false) + + self.addSubnode(self.titleNode) + + self.addSubnode(self.activateArea) + } + + func asyncLayout() -> (_ item: ItemListActionItem, _ params: ListViewItemLayoutParams, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) { + let makeTitleLayout = TextNode.asyncLayout(self.titleNode) + + let currentItem = self.item + + return { item, params, neighbors in + var updatedTheme: WalletTheme? + + if currentItem?.theme !== item.theme { + updatedTheme = item.theme + } + + let textColor: UIColor + switch item.kind { + case .destructive: + textColor = item.theme.list.itemDestructiveColor + case .generic: + textColor = item.theme.list.itemAccentColor + case .neutral: + textColor = item.theme.list.itemPrimaryTextColor + case .disabled: + textColor = item.theme.list.itemDisabledTextColor + } + + let (titleLayout, titleApply) = makeTitleLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: item.title, font: titleFont, textColor: textColor), backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width - params.leftInset - params.rightInset - 20.0, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) + + let contentSize: CGSize + let insets: UIEdgeInsets + let separatorHeight = UIScreenPixel + + let itemBackgroundColor: UIColor + let itemSeparatorColor: UIColor + switch item.style { + case .plain: + itemBackgroundColor = item.theme.list.plainBackgroundColor + itemSeparatorColor = item.theme.list.itemPlainSeparatorColor + contentSize = CGSize(width: params.width, height: 44.0) + insets = itemListNeighborsPlainInsets(neighbors) + case .blocks: + itemBackgroundColor = item.theme.list.itemBlocksBackgroundColor + itemSeparatorColor = item.theme.list.itemBlocksSeparatorColor + contentSize = CGSize(width: params.width, height: 44.0) + insets = itemListNeighborsGroupedInsets(neighbors) + } + + let layout = ListViewItemNodeLayout(contentSize: contentSize, insets: insets) + + return (layout, { [weak self] in + if let strongSelf = self { + strongSelf.item = item + + strongSelf.activateArea.frame = CGRect(origin: CGPoint(x: params.leftInset, y: 0.0), size: CGSize(width: params.width - params.leftInset - params.rightInset, height: layout.contentSize.height)) + strongSelf.activateArea.accessibilityLabel = item.title + + var accessibilityTraits: UIAccessibilityTraits = .button + switch item.kind { + case .disabled: + accessibilityTraits.insert(.notEnabled) + default: + break + } + strongSelf.activateArea.accessibilityTraits = accessibilityTraits + + if let _ = updatedTheme { + strongSelf.topStripeNode.backgroundColor = itemSeparatorColor + strongSelf.bottomStripeNode.backgroundColor = itemSeparatorColor + strongSelf.backgroundNode.backgroundColor = itemBackgroundColor + strongSelf.highlightedBackgroundNode.backgroundColor = item.theme.list.itemHighlightedBackgroundColor + } + + let _ = titleApply() + + let leftInset = 16.0 + params.leftInset + + switch item.style { + case .plain: + if strongSelf.backgroundNode.supernode != nil { + strongSelf.backgroundNode.removeFromSupernode() + } + if strongSelf.topStripeNode.supernode != nil { + strongSelf.topStripeNode.removeFromSupernode() + } + if strongSelf.bottomStripeNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 0) + } + if strongSelf.maskNode.supernode != nil { + strongSelf.maskNode.removeFromSupernode() + } + strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: leftInset, y: contentSize.height - separatorHeight), size: CGSize(width: params.width - leftInset, height: separatorHeight)) + case .blocks: + if strongSelf.backgroundNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.backgroundNode, at: 0) + } + if strongSelf.topStripeNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.topStripeNode, at: 1) + } + if strongSelf.bottomStripeNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 2) + } + if strongSelf.maskNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.maskNode, at: 3) + } + + let hasCorners = itemListHasRoundedBlockLayout(params) + var hasTopCorners = false + var hasBottomCorners = false + switch neighbors.top { + case .sameSection(false): + strongSelf.topStripeNode.isHidden = true + default: + hasTopCorners = true + strongSelf.topStripeNode.isHidden = hasCorners + } + let bottomStripeInset: CGFloat + let bottomStripeOffset: CGFloat + switch neighbors.bottom { + case .sameSection(false): + bottomStripeInset = 16.0 + params.leftInset + bottomStripeOffset = -separatorHeight + default: + bottomStripeInset = 0.0 + bottomStripeOffset = 0.0 + hasBottomCorners = true + strongSelf.bottomStripeNode.isHidden = hasCorners + } + + strongSelf.maskNode.image = hasCorners ? cornersImage(item.theme, top: hasTopCorners, bottom: hasBottomCorners) : nil + + strongSelf.backgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: contentSize.height + min(insets.top, separatorHeight) + min(insets.bottom, separatorHeight))) + strongSelf.maskNode.frame = strongSelf.backgroundNode.frame.insetBy(dx: params.leftInset, dy: 0.0) + strongSelf.topStripeNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: separatorHeight)) + strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: bottomStripeInset, y: contentSize.height + bottomStripeOffset), size: CGSize(width: params.width - bottomStripeInset, height: separatorHeight)) + } + + switch item.alignment { + case .natural: + strongSelf.titleNode.frame = CGRect(origin: CGPoint(x: leftInset, y: 11.0), size: titleLayout.size) + case .center: + strongSelf.titleNode.frame = CGRect(origin: CGPoint(x: params.leftInset + floor((params.width - params.leftInset - params.rightInset - titleLayout.size.width) / 2.0), y: 11.0), size: titleLayout.size) + } + + strongSelf.highlightedBackgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -UIScreenPixel), size: CGSize(width: params.width, height: 44.0 + UIScreenPixel + UIScreenPixel)) + } + }) + } + } + + override func setHighlighted(_ highlighted: Bool, at point: CGPoint, animated: Bool) { + super.setHighlighted(highlighted, at: point, animated: animated) + + if highlighted && self.item?.kind != ItemListActionKind.disabled { + self.highlightedBackgroundNode.alpha = 1.0 + if self.highlightedBackgroundNode.supernode == nil { + var anchorNode: ASDisplayNode? + if self.bottomStripeNode.supernode != nil { + anchorNode = self.bottomStripeNode + } else if self.topStripeNode.supernode != nil { + anchorNode = self.topStripeNode + } else if self.backgroundNode.supernode != nil { + anchorNode = self.backgroundNode + } + if let anchorNode = anchorNode { + self.insertSubnode(self.highlightedBackgroundNode, aboveSubnode: anchorNode) + } else { + self.addSubnode(self.highlightedBackgroundNode) + } + } + } else { + if self.highlightedBackgroundNode.supernode != nil { + if animated { + self.highlightedBackgroundNode.layer.animateAlpha(from: self.highlightedBackgroundNode.alpha, to: 0.0, duration: 0.4, completion: { [weak self] completed in + if let strongSelf = self { + if completed { + strongSelf.highlightedBackgroundNode.removeFromSupernode() + } + } + }) + self.highlightedBackgroundNode.alpha = 0.0 + } else { + self.highlightedBackgroundNode.removeFromSupernode() + } + } + } + } + + override func animateInsertion(_ currentTimestamp: Double, duration: Double, short: Bool) { + self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.4) + } + + override func animateRemoved(_ currentTimestamp: Double, duration: Double) { + self.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.15, removeOnCompletion: false) + } + + override func longTapped() { + self.item?.longTapAction?() + } + + override var canBeLongTapped: Bool { + return self.item?.longTapAction != nil + } +} diff --git a/submodules/WalletUI/Sources/ItemList/Items/ItemListMultilineInputItem.swift b/submodules/WalletUI/Sources/ItemList/Items/ItemListMultilineInputItem.swift new file mode 100644 index 0000000000..5d017847fc --- /dev/null +++ b/submodules/WalletUI/Sources/ItemList/Items/ItemListMultilineInputItem.swift @@ -0,0 +1,469 @@ +import Foundation +import UIKit +import Display +import AsyncDisplayKit +import SwiftSignalKit + +enum ItemListMultilineInputItemTextLimitMode { + case characters + case bytes +} + +struct ItemListMultilineInputItemTextLimit { + let value: Int + let display: Bool + let mode: ItemListMultilineInputItemTextLimitMode + + init(value: Int, display: Bool, mode: ItemListMultilineInputItemTextLimitMode = .characters) { + self.value = value + self.display = display + self.mode = mode + } +} + +struct ItemListMultilineInputInlineAction { + let icon: UIImage + let action: (() -> Void)? + + init(icon: UIImage, action: (() -> Void)?) { + self.icon = icon + self.action = action + } +} + +class ItemListMultilineInputItem: ListViewItem, ItemListItem { + let theme: WalletTheme + let text: String + let placeholder: String + let sectionId: ItemListSectionId + let style: ItemListStyle + let capitalization: Bool + let autocorrection: Bool + let returnKeyType: UIReturnKeyType + let action: (() -> Void)? + let textUpdated: (String) -> Void + let shouldUpdateText: (String) -> Bool + let processPaste: ((String) -> Void)? + let updatedFocus: ((Bool) -> Void)? + let maxLength: ItemListMultilineInputItemTextLimit? + let minimalHeight: CGFloat? + let inlineAction: ItemListMultilineInputInlineAction? + let tag: ItemListItemTag? + + init(theme: WalletTheme, text: String, placeholder: String, maxLength: ItemListMultilineInputItemTextLimit?, sectionId: ItemListSectionId, style: ItemListStyle, capitalization: Bool = true, autocorrection: Bool = true, returnKeyType: UIReturnKeyType = .default, minimalHeight: CGFloat? = nil, textUpdated: @escaping (String) -> Void, shouldUpdateText: @escaping (String) -> Bool = { _ in return true }, processPaste: ((String) -> Void)? = nil, updatedFocus: ((Bool) -> Void)? = nil, tag: ItemListItemTag? = nil, action: (() -> Void)? = nil, inlineAction: ItemListMultilineInputInlineAction? = nil) { + self.theme = theme + self.text = text + self.placeholder = placeholder + self.maxLength = maxLength + self.sectionId = sectionId + self.style = style + self.capitalization = capitalization + self.autocorrection = autocorrection + self.returnKeyType = returnKeyType + self.minimalHeight = minimalHeight + self.textUpdated = textUpdated + self.shouldUpdateText = shouldUpdateText + self.processPaste = processPaste + self.updatedFocus = updatedFocus + self.tag = tag + self.action = action + self.inlineAction = inlineAction + } + + func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) { + async { + let node = ItemListMultilineInputItemNode() + let (layout, apply) = node.asyncLayout()(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem)) + + node.contentSize = layout.contentSize + node.insets = layout.insets + + Queue.mainQueue().async { + completion(node, { + return (nil, { _ in apply() }) + }) + } + } + } + + func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping (ListViewItemApply) -> Void) -> Void) { + Queue.mainQueue().async { + if let nodeValue = node() as? ItemListMultilineInputItemNode { + let makeLayout = nodeValue.asyncLayout() + + async { + let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem)) + Queue.mainQueue().async { + completion(layout, { _ in + apply() + }) + } + } + } + } + } +} + +private let titleFont = Font.regular(17.0) + +class ItemListMultilineInputItemNode: ListViewItemNode, ASEditableTextNodeDelegate, ItemListItemNode, ItemListItemFocusableNode { + private let backgroundNode: ASDisplayNode + private let topStripeNode: ASDisplayNode + private let bottomStripeNode: ASDisplayNode + private let maskNode: ASImageNode + + private let textClippingNode: ASDisplayNode + private let textNode: EditableTextNode + private let measureTextNode: TextNode + + private let limitTextNode: TextNode + private var inlineActionButtonNode: HighlightableButtonNode? + + private var item: ItemListMultilineInputItem? + private var layoutParams: ListViewItemLayoutParams? + + var tag: ItemListItemTag? { + return self.item?.tag + } + + init() { + self.backgroundNode = ASDisplayNode() + self.backgroundNode.isLayerBacked = true + + self.topStripeNode = ASDisplayNode() + self.topStripeNode.isLayerBacked = true + + self.bottomStripeNode = ASDisplayNode() + self.bottomStripeNode.isLayerBacked = true + + self.maskNode = ASImageNode() + + self.textClippingNode = ASDisplayNode() + self.textClippingNode.clipsToBounds = true + + self.textNode = EditableTextNode() + self.measureTextNode = TextNode() + + self.limitTextNode = TextNode() + + super.init(layerBacked: false, dynamicBounce: false) + + self.textClippingNode.addSubnode(self.textNode) + self.addSubnode(self.textClippingNode) + + } + + override func didLoad() { + super.didLoad() + + var textColor: UIColor = .black + if let item = self.item { + textColor = item.theme.list.itemPrimaryTextColor + } + self.textNode.typingAttributes = [NSAttributedString.Key.font.rawValue: Font.regular(17.0), NSAttributedString.Key.foregroundColor.rawValue: textColor] + self.textNode.clipsToBounds = true + self.textNode.delegate = self + self.textNode.hitTestSlop = UIEdgeInsets(top: -5.0, left: -5.0, bottom: -5.0, right: -5.0) + } + + func asyncLayout() -> (_ item: ItemListMultilineInputItem, _ params: ListViewItemLayoutParams, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) { + let makeTextLayout = TextNode.asyncLayout(self.measureTextNode) + let makeLimitTextLayout = TextNode.asyncLayout(self.limitTextNode) + + let currentItem = self.item + + return { item, params, neighbors in + var updatedTheme: WalletTheme? + if currentItem?.theme !== item.theme { + updatedTheme = item.theme + } + + let itemBackgroundColor: UIColor + let itemSeparatorColor: UIColor + + let leftInset = 16.0 + params.rightInset + switch item.style { + case .plain: + itemBackgroundColor = item.theme.list.plainBackgroundColor + itemSeparatorColor = item.theme.list.itemPlainSeparatorColor + case .blocks: + itemBackgroundColor = item.theme.list.itemBlocksBackgroundColor + itemSeparatorColor = item.theme.list.itemBlocksSeparatorColor + } + + var limitTextString: NSAttributedString? + var rightInset: CGFloat = params.rightInset + + if let maxLength = item.maxLength, maxLength.display { + let textLength: Int + switch maxLength.mode { + case .characters: + textLength = item.text.count + case .bytes: + textLength = item.text.data(using: .utf8, allowLossyConversion: true)?.count ?? 0 + } + let displayTextLimit = textLength > maxLength.value * 70 / 100 + let remainingCount = maxLength.value - textLength + if displayTextLimit { + limitTextString = NSAttributedString(string: "\(remainingCount)", font: Font.regular(13.0), textColor: remainingCount < 0 ? item.theme.list.itemDestructiveColor : item.theme.list.itemSecondaryTextColor) + } + + rightInset += 30.0 + 4.0 + } + + let (limitTextLayout, limitTextApply) = makeLimitTextLayout(TextNodeLayoutArguments(attributedString: limitTextString, backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: 100.0, height: 100.0), alignment: .left, cutout: nil, insets: UIEdgeInsets())) + + if limitTextLayout.size.width > 30.0 { + rightInset += 30.0 + } + + if let inlineAction = item.inlineAction { + rightInset += inlineAction.icon.size.width + 8.0 + } + + var measureText = item.text + if measureText.hasSuffix("\n") || measureText.isEmpty { + measureText += "|" + } + let attributedMeasureText = NSAttributedString(string: measureText, font: Font.regular(17.0), textColor: .black) + let attributedText = NSAttributedString(string: item.text, font: Font.regular(17.0), textColor: item.theme.list.itemPrimaryTextColor) + let (textLayout, textApply) = makeTextLayout(TextNodeLayoutArguments(attributedString: attributedMeasureText, backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: params.width - 16.0 - leftInset - rightInset, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, lineSpacing: 0.0, cutout: nil, insets: UIEdgeInsets())) + + let separatorHeight = UIScreenPixel + + let textTopInset: CGFloat = 11.0 + let textBottomInset: CGFloat = 11.0 + + var contentHeight: CGFloat = textLayout.size.height + textTopInset + textBottomInset + if let minimalHeight = item.minimalHeight { + contentHeight = max(minimalHeight, contentHeight) + } + + let contentSize = CGSize(width: params.width, height: contentHeight) + let insets = itemListNeighborsGroupedInsets(neighbors) + + let layout = ListViewItemNodeLayout(contentSize: contentSize, insets: insets) + let layoutSize = layout.size + + let attributedPlaceholderText = NSAttributedString(string: item.placeholder, font: Font.regular(17.0), textColor: item.theme.list.itemPlaceholderTextColor) + + return (layout, { [weak self] in + if let strongSelf = self { + strongSelf.item = item + strongSelf.layoutParams = params + + if let _ = updatedTheme { + strongSelf.topStripeNode.backgroundColor = itemSeparatorColor + strongSelf.bottomStripeNode.backgroundColor = itemSeparatorColor + strongSelf.backgroundNode.backgroundColor = itemBackgroundColor + + if strongSelf.isNodeLoaded { + strongSelf.textNode.typingAttributes = [NSAttributedString.Key.font.rawValue: Font.regular(17.0), NSAttributedString.Key.foregroundColor.rawValue: item.theme.list.itemPrimaryTextColor] + strongSelf.textNode.tintColor = item.theme.list.itemAccentColor + } + + if let inlineAction = item.inlineAction { + strongSelf.inlineActionButtonNode?.setImage(generateTintedImage(image: inlineAction.icon, color: item.theme.list.itemAccentColor), for: .normal) + } + } + + let capitalizationType: UITextAutocapitalizationType = item.capitalization ? .sentences : .none + let autocorrectionType: UITextAutocorrectionType = item.autocorrection ? .default : .no + + if strongSelf.textNode.textView.autocapitalizationType != capitalizationType { + strongSelf.textNode.textView.autocapitalizationType = capitalizationType + } + if strongSelf.textNode.textView.autocorrectionType != autocorrectionType { + strongSelf.textNode.textView.autocorrectionType = autocorrectionType + } + if strongSelf.textNode.textView.returnKeyType != item.returnKeyType { + strongSelf.textNode.textView.returnKeyType = item.returnKeyType + } + + let _ = textApply() + if let currentText = strongSelf.textNode.attributedText { + if currentText.string != attributedText.string || updatedTheme != nil { + strongSelf.textNode.attributedText = attributedText + } + } else { + strongSelf.textNode.attributedText = attributedText + } + + if strongSelf.backgroundNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.backgroundNode, at: 0) + } + if strongSelf.topStripeNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.topStripeNode, at: 1) + } + if strongSelf.bottomStripeNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 2) + } + if strongSelf.maskNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.maskNode, at: 3) + } + + let hasCorners = itemListHasRoundedBlockLayout(params) + var hasTopCorners = false + var hasBottomCorners = false + switch neighbors.top { + case .sameSection(false): + strongSelf.topStripeNode.isHidden = true + default: + hasTopCorners = true + strongSelf.topStripeNode.isHidden = hasCorners + } + let bottomStripeInset: CGFloat + switch neighbors.bottom { + case .sameSection(false): + bottomStripeInset = leftInset + default: + bottomStripeInset = 0.0 + hasBottomCorners = true + strongSelf.bottomStripeNode.isHidden = hasCorners + } + + strongSelf.maskNode.image = hasCorners ? cornersImage(item.theme, top: hasTopCorners, bottom: hasBottomCorners) : nil + + strongSelf.backgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: contentSize.height + min(insets.top, separatorHeight) + min(insets.bottom, separatorHeight))) + strongSelf.maskNode.frame = strongSelf.backgroundNode.frame.insetBy(dx: params.leftInset, dy: 0.0) + strongSelf.topStripeNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: layoutSize.width, height: separatorHeight)) + strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: bottomStripeInset, y: contentSize.height), size: CGSize(width: layoutSize.width - bottomStripeInset, height: separatorHeight)) + + if strongSelf.textNode.attributedPlaceholderText == nil || !strongSelf.textNode.attributedPlaceholderText!.isEqual(to: attributedPlaceholderText) { + strongSelf.textNode.attributedPlaceholderText = attributedPlaceholderText + } + + strongSelf.textNode.keyboardAppearance = item.theme.keyboardAppearance + + strongSelf.textClippingNode.frame = CGRect(origin: CGPoint(x: leftInset, y: textTopInset), size: CGSize(width: params.width - leftInset - params.rightInset, height: textLayout.size.height)) + strongSelf.textNode.frame = CGRect(origin: CGPoint(), size: CGSize(width: params.width - leftInset - 16.0 - rightInset, height: textLayout.size.height + 1.0)) + + let _ = limitTextApply() + strongSelf.limitTextNode.frame = CGRect(origin: CGPoint(x: params.width - params.rightInset - 16.0 - limitTextLayout.size.width, y: layout.contentSize.height - 15.0 - limitTextLayout.size.height), size: limitTextLayout.size) + if limitTextString != nil { + if strongSelf.limitTextNode.supernode == nil { + strongSelf.addSubnode(strongSelf.limitTextNode) + } + } else if strongSelf.limitTextNode.supernode != nil { + strongSelf.limitTextNode.removeFromSupernode() + } + + if let inlineAction = item.inlineAction { + let inlineActionButtonNode: HighlightableButtonNode + if let currentInlineActionButtonNode = strongSelf.inlineActionButtonNode { + inlineActionButtonNode = currentInlineActionButtonNode + } else { + inlineActionButtonNode = HighlightableButtonNode() + inlineActionButtonNode.setImage(generateTintedImage(image: inlineAction.icon, color: item.theme.list.itemAccentColor), for: .normal) + inlineActionButtonNode.addTarget(strongSelf, action: #selector(strongSelf.inlineActionPressed), forControlEvents: .touchUpInside) + strongSelf.addSubnode(inlineActionButtonNode) + strongSelf.inlineActionButtonNode = inlineActionButtonNode + } + inlineActionButtonNode.frame = CGRect(origin: CGPoint(x: params.width - params.rightInset - inlineAction.icon.size.width - 11.0, y: 7.0), size: inlineAction.icon.size) + } else if let inlineActionButtonNode = strongSelf.inlineActionButtonNode { + inlineActionButtonNode.removeFromSupernode() + strongSelf.inlineActionButtonNode = nil + } + } + }) + } + } + + override func animateInsertion(_ currentTimestamp: Double, duration: Double, short: Bool) { + self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.4) + } + + override func animateRemoved(_ currentTimestamp: Double, duration: Double) { + self.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.15, removeOnCompletion: false) + } + + override func animateFrameTransition(_ progress: CGFloat, _ currentValue: CGFloat) { + super.animateFrameTransition(progress, currentValue) + + guard let params = self.layoutParams else { + return + } + + let separatorHeight = UIScreenPixel + let insets = self.insets + let contentSize = CGSize(width: params.width, height: max(1.0, currentValue - insets.top - insets.bottom)) + + let leftInset = 16.0 + params.leftInset + let textTopInset: CGFloat = 11.0 + let textBottomInset: CGFloat = 11.0 + + self.backgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: contentSize.height + min(insets.top, separatorHeight) + min(insets.bottom, separatorHeight))) + self.bottomStripeNode.frame = CGRect(origin: CGPoint(x: self.bottomStripeNode.frame.minX, y: contentSize.height), size: CGSize(width: self.bottomStripeNode.frame.size.width, height: separatorHeight)) + + self.textClippingNode.frame = CGRect(origin: CGPoint(x: leftInset, y: textTopInset), size: CGSize(width: max(0.0, params.width - leftInset - params.rightInset), height: max(0.0, contentSize.height - textTopInset - textBottomInset))) + } + + func editableTextNodeDidBeginEditing(_ editableTextNode: ASEditableTextNode) { + self.item?.updatedFocus?(true) + } + + func editableTextNodeDidFinishEditing(_ editableTextNode: ASEditableTextNode) { + self.item?.updatedFocus?(false) + } + + func editableTextNode(_ editableTextNode: ASEditableTextNode, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { + if let item = self.item { + if text.count > 1, let processPaste = item.processPaste { + processPaste(text) + return false + } + + if let action = item.action, text == "\n" { + action() + return false + } + + let newText = (editableTextNode.textView.text as NSString).replacingCharacters(in: range, with: text) + if !item.shouldUpdateText(newText) { + return false + } + } + return true + } + + func editableTextNodeDidUpdateText(_ editableTextNode: ASEditableTextNode) { + if let item = self.item { + if let text = self.textNode.attributedText { + let updatedText = text.string + let updatedAttributedText = NSAttributedString(string: updatedText, font: Font.regular(17.0), textColor: item.theme.list.itemPrimaryTextColor) + if text.string != updatedAttributedText.string { + self.textNode.attributedText = updatedAttributedText + } + item.textUpdated(updatedText) + } else { + item.textUpdated("") + } + } + } + + func editableTextNodeShouldPaste(_ editableTextNode: ASEditableTextNode) -> Bool { + if let _ = self.item { + let text: String? = UIPasteboard.general.string + if let _ = text { + return true + } + } + return false + } + + func focus() { + if !self.textNode.textView.isFirstResponder { + self.textNode.textView.becomeFirstResponder() + } + } + + func animateError() { + self.textNode.layer.addShakeAnimation() + } + + @objc private func inlineActionPressed() { + if let action = self.item?.inlineAction?.action { + action() + } + } +} diff --git a/submodules/WalletUI/Sources/ItemList/Items/ItemListMultilineTextItem.swift b/submodules/WalletUI/Sources/ItemList/Items/ItemListMultilineTextItem.swift new file mode 100644 index 0000000000..cfa233a510 --- /dev/null +++ b/submodules/WalletUI/Sources/ItemList/Items/ItemListMultilineTextItem.swift @@ -0,0 +1,432 @@ +import Foundation +import UIKit +import Display +import AsyncDisplayKit +import SwiftSignalKit +import TextFormat +import AccountContext + +enum ItemListMultilineTextBaseFont { + case `default` + case monospace +} + +class ItemListMultilineTextItem: ListViewItem, ItemListItem { + let theme: WalletTheme + let text: String + let enabledEntityTypes: EnabledEntityTypes + let font: ItemListMultilineTextBaseFont + let sectionId: ItemListSectionId + let style: ItemListStyle + let action: (() -> Void)? + let longTapAction: (() -> Void)? + let linkItemAction: ((TextLinkItemActionType, TextLinkItem) -> Void)? + + let tag: Any? + + let selectable: Bool + + init(theme: WalletTheme, text: String, enabledEntityTypes: EnabledEntityTypes, font: ItemListMultilineTextBaseFont = .default, sectionId: ItemListSectionId, style: ItemListStyle, action: (() -> Void)? = nil, longTapAction: (() -> Void)? = nil, linkItemAction: ((TextLinkItemActionType, TextLinkItem) -> Void)? = nil, tag: Any? = nil) { + self.theme = theme + self.text = text + self.enabledEntityTypes = enabledEntityTypes + self.font = font + self.sectionId = sectionId + self.style = style + self.action = action + self.longTapAction = longTapAction + self.linkItemAction = linkItemAction + self.tag = tag + + self.selectable = action != nil + } + + func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) { + async { + let node = ItemListMultilineTextItemNode() + let (layout, apply) = node.asyncLayout()(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem)) + + node.contentSize = layout.contentSize + node.insets = layout.insets + + Queue.mainQueue().async { + completion(node, { + return (nil, { _ in apply() }) + }) + } + } + } + + func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping (ListViewItemApply) -> Void) -> Void) { + Queue.mainQueue().async { + if let nodeValue = node() as? ItemListMultilineTextItemNode { + let makeLayout = nodeValue.asyncLayout() + + async { + let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem)) + Queue.mainQueue().async { + completion(layout, { _ in + apply() + }) + } + } + } + } + } + + func selected(listView: ListView){ + listView.clearHighlightAnimated(true) + self.action?() + } +} + +private let titleFont = Font.regular(17.0) +private let titleBoldFont = Font.medium(17.0) +private let titleItalicFont = Font.italic(17.0) +private let titleBoldItalicFont = Font.semiboldItalic(17.0) +private let titleFixedFont = Font.regular(17.0) + +class ItemListMultilineTextItemNode: ListViewItemNode { + private let backgroundNode: ASDisplayNode + private let topStripeNode: ASDisplayNode + private let bottomStripeNode: ASDisplayNode + private let highlightedBackgroundNode: ASDisplayNode + private let maskNode: ASImageNode + + private var linkHighlightingNode: LinkHighlightingNode? + + private let textNode: TextNode + + private let activateArea: AccessibilityAreaNode + + private var item: ItemListMultilineTextItem? + + var tag: Any? { + return self.item?.tag + } + + override var canBeLongTapped: Bool { + return true + } + + init() { + self.backgroundNode = ASDisplayNode() + self.backgroundNode.isLayerBacked = true + self.backgroundNode.backgroundColor = .white + + self.topStripeNode = ASDisplayNode() + self.topStripeNode.isLayerBacked = true + + self.bottomStripeNode = ASDisplayNode() + self.bottomStripeNode.isLayerBacked = true + + self.maskNode = ASImageNode() + + self.textNode = TextNode() + self.textNode.isUserInteractionEnabled = false + self.textNode.contentMode = .left + self.textNode.contentsScale = UIScreen.main.scale + + self.highlightedBackgroundNode = ASDisplayNode() + self.highlightedBackgroundNode.isLayerBacked = true + + self.activateArea = AccessibilityAreaNode() + + super.init(layerBacked: false, dynamicBounce: false) + + self.addSubnode(self.textNode) + self.addSubnode(self.activateArea) + } + + override func didLoad() { + super.didLoad() + + let recognizer = TapLongTapOrDoubleTapGestureRecognizer(target: self, action: #selector(self.tapLongTapOrDoubleTapGesture(_:))) + recognizer.tapActionAtPoint = { [weak self] point in + if let strongSelf = self, strongSelf.linkItemAtPoint(point) != nil { + return .waitForSingleTap + } + return .fail + } + recognizer.highlight = { [weak self] point in + if let strongSelf = self { + strongSelf.updateTouchesAtPoint(point) + } + } + self.view.addGestureRecognizer(recognizer) + } + + func asyncLayout() -> (_ item: ItemListMultilineTextItem, _ params: ListViewItemLayoutParams, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) { + let makeTextLayout = TextNode.asyncLayout(self.textNode) + + let currentItem = self.item + + return { item, params, neighbors in + var updatedTheme: WalletTheme? + + if currentItem?.theme !== item.theme { + updatedTheme = item.theme + } + + let textColor: UIColor = item.theme.list.itemPrimaryTextColor + + let leftInset: CGFloat + let itemBackgroundColor: UIColor + let itemSeparatorColor: UIColor + + switch item.style { + case .plain: + itemBackgroundColor = item.theme.list.plainBackgroundColor + itemSeparatorColor = item.theme.list.itemPlainSeparatorColor + leftInset = 16.0 + params.leftInset + case .blocks: + itemBackgroundColor = item.theme.list.itemBlocksBackgroundColor + itemSeparatorColor = item.theme.list.itemBlocksSeparatorColor + leftInset = 16.0 + params.rightInset + } + + var baseFont = titleFont + var linkFont = titleFont + var boldFont = titleBoldFont + var italicFont = titleItalicFont + var boldItalicFont = titleBoldItalicFont + if case .monospace = item.font { + baseFont = Font.monospace(17.0) + linkFont = Font.monospace(17.0) + boldFont = Font.semiboldMonospace(17.0) + italicFont = Font.italicMonospace(17.0) + boldItalicFont = Font.semiboldItalicMonospace(17.0) + } + + let entities = generateTextEntities(item.text, enabledTypes: item.enabledEntityTypes) + let string = stringWithAppliedEntities(item.text, entities: entities, baseColor: textColor, linkColor: item.theme.list.itemAccentColor, baseFont: baseFont, linkFont: linkFont, boldFont: boldFont, italicFont: italicFont, boldItalicFont: boldItalicFont, fixedFont: titleFixedFont, blockQuoteFont: titleFont) + + let (titleLayout, titleApply) = makeTextLayout(TextNodeLayoutArguments(attributedString: string, backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: params.width - leftInset * 2.0, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) + + let contentSize: CGSize + let insets: UIEdgeInsets + let separatorHeight = UIScreenPixel + + switch item.style { + case .plain: + contentSize = CGSize(width: params.width, height: titleLayout.size.height + 22.0) + insets = itemListNeighborsPlainInsets(neighbors) + case .blocks: + contentSize = CGSize(width: params.width, height: titleLayout.size.height + 22.0) + insets = itemListNeighborsGroupedInsets(neighbors) + } + + let layout = ListViewItemNodeLayout(contentSize: contentSize, insets: insets) + let layoutSize = layout.size + + return (layout, { [weak self] in + if let strongSelf = self { + strongSelf.item = item + + strongSelf.activateArea.frame = CGRect(origin: CGPoint(x: params.leftInset, y: 0.0), size: CGSize(width: params.width - params.leftInset - params.rightInset, height: layout.contentSize.height)) + strongSelf.activateArea.accessibilityLabel = item.text + + if let _ = updatedTheme { + strongSelf.topStripeNode.backgroundColor = itemSeparatorColor + strongSelf.bottomStripeNode.backgroundColor = itemSeparatorColor + strongSelf.backgroundNode.backgroundColor = itemBackgroundColor + strongSelf.highlightedBackgroundNode.backgroundColor = item.theme.list.itemHighlightedBackgroundColor + } + + let _ = titleApply() + + switch item.style { + case .plain: + if strongSelf.backgroundNode.supernode != nil { + strongSelf.backgroundNode.removeFromSupernode() + } + if strongSelf.topStripeNode.supernode != nil { + strongSelf.topStripeNode.removeFromSupernode() + } + if strongSelf.bottomStripeNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 0) + } + if strongSelf.maskNode.supernode != nil { + strongSelf.maskNode.removeFromSupernode() + } + + strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: leftInset, y: contentSize.height - separatorHeight), size: CGSize(width: params.width - leftInset, height: separatorHeight)) + case .blocks: + if strongSelf.backgroundNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.backgroundNode, at: 0) + } + if strongSelf.topStripeNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.topStripeNode, at: 1) + } + if strongSelf.bottomStripeNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 2) + } + if strongSelf.maskNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.maskNode, at: 3) + } + + let hasCorners = itemListHasRoundedBlockLayout(params) + var hasTopCorners = false + var hasBottomCorners = false + switch neighbors.top { + case .sameSection(false): + strongSelf.topStripeNode.isHidden = true + default: + hasTopCorners = true + strongSelf.topStripeNode.isHidden = hasCorners + } + let bottomStripeInset: CGFloat + let bottomStripeOffset: CGFloat + switch neighbors.bottom { + case .sameSection(false): + bottomStripeInset = 16.0 + bottomStripeOffset = -separatorHeight + default: + bottomStripeInset = 0.0 + bottomStripeOffset = 0.0 + hasBottomCorners = true + strongSelf.bottomStripeNode.isHidden = hasCorners + } + + strongSelf.maskNode.image = hasCorners ? cornersImage(item.theme, top: hasTopCorners, bottom: hasBottomCorners) : nil + + strongSelf.backgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: contentSize.height + min(insets.top, separatorHeight) + min(insets.bottom, separatorHeight))) + strongSelf.maskNode.frame = strongSelf.backgroundNode.frame.insetBy(dx: params.leftInset, dy: 0.0) + strongSelf.topStripeNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: layoutSize.width, height: separatorHeight)) + strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: bottomStripeInset, y: contentSize.height + bottomStripeOffset), size: CGSize(width: layoutSize.width - bottomStripeInset, height: separatorHeight)) + } + + strongSelf.textNode.frame = CGRect(origin: CGPoint(x: leftInset, y: 11.0), size: titleLayout.size) + + strongSelf.highlightedBackgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -UIScreenPixel), size: CGSize(width: params.width, height: layout.contentSize.height + UIScreenPixel + UIScreenPixel)) + } + }) + } + } + + override func setHighlighted(_ highlighted: Bool, at point: CGPoint, animated: Bool) { + super.setHighlighted(highlighted, at: point, animated: animated) + + if highlighted && self.linkItemAtPoint(point) == nil { + self.highlightedBackgroundNode.alpha = 1.0 + if self.highlightedBackgroundNode.supernode == nil { + var anchorNode: ASDisplayNode? + if self.bottomStripeNode.supernode != nil { + anchorNode = self.bottomStripeNode + } else if self.topStripeNode.supernode != nil { + anchorNode = self.topStripeNode + } else if self.backgroundNode.supernode != nil { + anchorNode = self.backgroundNode + } + if let anchorNode = anchorNode { + self.insertSubnode(self.highlightedBackgroundNode, aboveSubnode: anchorNode) + } else { + self.addSubnode(self.highlightedBackgroundNode) + } + } + } else { + if self.highlightedBackgroundNode.supernode != nil { + if animated { + self.highlightedBackgroundNode.layer.animateAlpha(from: self.highlightedBackgroundNode.alpha, to: 0.0, duration: 0.4, completion: { [weak self] completed in + if let strongSelf = self { + if completed { + strongSelf.highlightedBackgroundNode.removeFromSupernode() + } + } + }) + self.highlightedBackgroundNode.alpha = 0.0 + } else { + self.highlightedBackgroundNode.removeFromSupernode() + } + } + } + } + + override func animateInsertion(_ currentTimestamp: Double, duration: Double, short: Bool) { + self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.4) + } + + override func animateRemoved(_ currentTimestamp: Double, duration: Double) { + self.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.15, removeOnCompletion: false) + } + + @objc private func tapLongTapOrDoubleTapGesture(_ recognizer: TapLongTapOrDoubleTapGestureRecognizer) { + switch recognizer.state { + case .ended: + if let (gesture, location) = recognizer.lastRecognizedGestureAndLocation { + switch gesture { + case .tap, .longTap: + if let item = self.item, let linkItem = self.linkItemAtPoint(location) { + item.linkItemAction?(gesture == .tap ? .tap : .longTap, linkItem) + } + default: + break + } + } + default: + break + } + } + + private func linkItemAtPoint(_ point: CGPoint) -> TextLinkItem? { + let textNodeFrame = self.textNode.frame + if let (_, attributes) = self.textNode.attributesAtPoint(CGPoint(x: point.x - textNodeFrame.minX, y: point.y - textNodeFrame.minY)) { + if let url = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.URL)] as? String { + return .url(url) + } else if let peerName = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.PeerTextMention)] as? String { + return .mention(peerName) + } else if let hashtag = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.Hashtag)] as? TelegramHashtag { + return .hashtag(hashtag.peerName, hashtag.hashtag) + } else { + return nil + } + } + return nil + } + + override func longTapped() { + self.item?.longTapAction?() + } + + private func updateTouchesAtPoint(_ point: CGPoint?) { + if let item = self.item { + var rects: [CGRect]? + if let point = point { + let textNodeFrame = self.textNode.frame + if let (index, attributes) = self.textNode.attributesAtPoint(CGPoint(x: point.x - textNodeFrame.minX, y: point.y - textNodeFrame.minY)) { + let possibleNames: [String] = [ + TelegramTextAttributes.URL, + TelegramTextAttributes.PeerMention, + TelegramTextAttributes.PeerTextMention, + TelegramTextAttributes.BotCommand, + TelegramTextAttributes.Hashtag + ] + for name in possibleNames { + if let _ = attributes[NSAttributedString.Key(rawValue: name)] { + rects = self.textNode.attributeRects(name: name, at: index) + break + } + } + } + } + + if let rects = rects { + let linkHighlightingNode: LinkHighlightingNode + if let current = self.linkHighlightingNode { + linkHighlightingNode = current + } else { + linkHighlightingNode = LinkHighlightingNode(color: item.theme.list.itemAccentColor.withAlphaComponent(0.5)) + self.linkHighlightingNode = linkHighlightingNode + self.insertSubnode(linkHighlightingNode, belowSubnode: self.textNode) + } + linkHighlightingNode.frame = self.textNode.frame + linkHighlightingNode.updateRects(rects) + } else if let linkHighlightingNode = self.linkHighlightingNode { + self.linkHighlightingNode = nil + linkHighlightingNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.18, removeOnCompletion: false, completion: { [weak linkHighlightingNode] _ in + linkHighlightingNode?.removeFromSupernode() + }) + } + } + } +} diff --git a/submodules/WalletUI/Sources/ItemList/Items/ItemListSectionHeaderItem.swift b/submodules/WalletUI/Sources/ItemList/Items/ItemListSectionHeaderItem.swift new file mode 100644 index 0000000000..f6dfe16f54 --- /dev/null +++ b/submodules/WalletUI/Sources/ItemList/Items/ItemListSectionHeaderItem.swift @@ -0,0 +1,251 @@ +import Foundation +import UIKit +import Display +import AsyncDisplayKit +import SwiftSignalKit +import ActivityIndicator + +enum ItemListSectionHeaderAccessoryTextColor { + case generic + case destructive +} + +struct ItemListSectionHeaderAccessoryText: Equatable { + let value: String + let color: ItemListSectionHeaderAccessoryTextColor + let icon: UIImage? + + init(value: String, color: ItemListSectionHeaderAccessoryTextColor, icon: UIImage? = nil) { + self.value = value + self.color = color + self.icon = icon + } +} + +enum ItemListSectionHeaderActivityIndicator { + case none + case left + case right + + fileprivate var hasActivity: Bool { + switch self { + case .left, .right: + return true + default: + return false + } + } +} + +class ItemListSectionHeaderItem: ListViewItem, ItemListItem { + let theme: WalletTheme + let text: String + let multiline: Bool + let activityIndicator: ItemListSectionHeaderActivityIndicator + let accessoryText: ItemListSectionHeaderAccessoryText? + let sectionId: ItemListSectionId + + let isAlwaysPlain: Bool = true + + init(theme: WalletTheme, text: String, multiline: Bool = false, activityIndicator: ItemListSectionHeaderActivityIndicator = .none, accessoryText: ItemListSectionHeaderAccessoryText? = nil, sectionId: ItemListSectionId) { + self.theme = theme + self.text = text + self.multiline = multiline + self.activityIndicator = activityIndicator + self.accessoryText = accessoryText + self.sectionId = sectionId + } + + func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) { + async { + let node = ItemListSectionHeaderItemNode() + let (layout, apply) = node.asyncLayout()(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem)) + + node.contentSize = layout.contentSize + node.insets = layout.insets + + Queue.mainQueue().async { + completion(node, { + return (nil, { _ in apply() }) + }) + } + } + } + + func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping (ListViewItemApply) -> Void) -> Void) { + Queue.mainQueue().async { + guard let nodeValue = node() as? ItemListSectionHeaderItemNode else { + assertionFailure() + return + } + + let makeLayout = nodeValue.asyncLayout() + async { + let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem)) + Queue.mainQueue().async { + completion(layout, { _ in + apply() + }) + } + } + } + } +} + +private let titleFont = Font.regular(14.0) + +class ItemListSectionHeaderItemNode: ListViewItemNode { + private var item: ItemListSectionHeaderItem? + + private let titleNode: TextNode + private let accessoryTextNode: TextNode + private var accessoryImageNode: ASImageNode? + private var activityIndicator: ActivityIndicator? + + private let activateArea: AccessibilityAreaNode + + init() { + self.titleNode = TextNode() + self.titleNode.isUserInteractionEnabled = false + self.titleNode.contentMode = .left + self.titleNode.contentsScale = UIScreen.main.scale + + self.accessoryTextNode = TextNode() + self.accessoryTextNode.isUserInteractionEnabled = false + self.accessoryTextNode.contentMode = .left + self.accessoryTextNode.contentsScale = UIScreen.main.scale + + self.activateArea = AccessibilityAreaNode() + self.activateArea.accessibilityTraits = [.staticText, .header] + + super.init(layerBacked: false, dynamicBounce: false) + + self.addSubnode(self.titleNode) + self.addSubnode(self.accessoryTextNode) + self.addSubnode(self.activateArea) + } + + func asyncLayout() -> (_ item: ItemListSectionHeaderItem, _ params: ListViewItemLayoutParams, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) { + let makeTitleLayout = TextNode.asyncLayout(self.titleNode) + let makeAccessoryTextLayout = TextNode.asyncLayout(self.accessoryTextNode) + + let previousItem = self.item + + return { item, params, neighbors in + let leftInset: CGFloat = 15.0 + params.leftInset + + let (titleLayout, titleApply) = makeTitleLayout(TextNodeLayoutArguments(attributedString: NSAttributedString(string: item.text, font: titleFont, textColor: item.theme.list.sectionHeaderTextColor), backgroundColor: nil, maximumNumberOfLines: item.multiline ? 0 : 1, truncationType: .end, constrainedSize: CGSize(width: params.width - params.leftInset - params.rightInset - 20.0, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) + var accessoryTextString: NSAttributedString? + var accessoryIcon: UIImage? + if let accessoryText = item.accessoryText { + let color: UIColor + switch accessoryText.color { + case .generic: + color = item.theme.list.sectionHeaderTextColor + case .destructive: + color = item.theme.list.freeTextErrorColor + } + accessoryTextString = NSAttributedString(string: accessoryText.value, font: titleFont, textColor: color) + accessoryIcon = accessoryText.icon + } + let (accessoryLayout, accessoryApply) = makeAccessoryTextLayout(TextNodeLayoutArguments(attributedString: accessoryTextString, backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width - params.leftInset - params.rightInset - 20.0, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) + + let contentSize: CGSize + var insets = UIEdgeInsets() + + contentSize = CGSize(width: params.width, height: titleLayout.size.height + 13.0) + switch neighbors.top { + case .none: + insets.top += 24.0 + case .otherSection: + insets.top += 28.0 + default: + break + } + + let layout = ListViewItemNodeLayout(contentSize: contentSize, insets: insets) + + return (layout, { [weak self] in + if let strongSelf = self { + strongSelf.item = item + + let _ = titleApply() + let _ = accessoryApply() + + strongSelf.activateArea.frame = CGRect(origin: CGPoint(x: params.leftInset, y: 0.0), size: CGSize(width: params.width - params.leftInset - params.rightInset, height: layout.contentSize.height)) + strongSelf.activateArea.accessibilityLabel = item.text + + strongSelf.titleNode.frame = CGRect(origin: CGPoint(x: leftInset, y: 7.0), size: titleLayout.size) + + var accessoryTextOffset: CGFloat = 0.0 + if let accessoryIcon = accessoryIcon { + accessoryTextOffset += accessoryIcon.size.width + 3.0 + } + strongSelf.accessoryTextNode.frame = CGRect(origin: CGPoint(x: params.width - leftInset - accessoryLayout.size.width - accessoryTextOffset, y: 7.0), size: accessoryLayout.size) + + if let accessoryIcon = accessoryIcon { + let accessoryImageNode: ASImageNode + if let currentAccessoryImageNode = strongSelf.accessoryImageNode { + accessoryImageNode = currentAccessoryImageNode + } else { + accessoryImageNode = ASImageNode() + accessoryImageNode.displaysAsynchronously = false + accessoryImageNode.displayWithoutProcessing = true + strongSelf.addSubnode(accessoryImageNode) + strongSelf.accessoryImageNode = accessoryImageNode + } + accessoryImageNode.image = accessoryIcon + accessoryImageNode.frame = CGRect(origin: CGPoint(x: params.width - leftInset - accessoryIcon.size.width, y: 7.0), size: accessoryIcon.size) + } else if let accessoryImageNode = strongSelf.accessoryImageNode { + accessoryImageNode.removeFromSupernode() + strongSelf.accessoryImageNode = nil + } + + if previousItem?.activityIndicator != item.activityIndicator { + if item.activityIndicator.hasActivity { + let activityIndicator: ActivityIndicator + if let currentActivityIndicator = strongSelf.activityIndicator { + activityIndicator = currentActivityIndicator + } else { + activityIndicator = ActivityIndicator(type: .custom(item.theme.list.sectionHeaderTextColor, 18.0, 1.0, false)) + strongSelf.addSubnode(activityIndicator) + strongSelf.activityIndicator = activityIndicator + } + activityIndicator.isHidden = false + if previousItem != nil { + activityIndicator.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2, removeOnCompletion: false) + } + } else if let activityIndicator = strongSelf.activityIndicator { + activityIndicator.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false, completion: { finished in + if finished { + activityIndicator.isHidden = true + } + }) + } + } + + var activityIndicatorOrigin: CGPoint? + switch item.activityIndicator { + case .left: + activityIndicatorOrigin = CGPoint(x: strongSelf.titleNode.frame.maxX + 6.0, y: 7.0 - UIScreenPixel) + case .right: + activityIndicatorOrigin = CGPoint(x: params.width - leftInset - 18.0, y: 7.0 - UIScreenPixel) + default: + break + } + if let activityIndicatorOrigin = activityIndicatorOrigin { + strongSelf.activityIndicator?.frame = CGRect(origin: activityIndicatorOrigin, size: CGSize(width: 18.0, height: 18.0)) + } + } + }) + } + } + + override func animateInsertion(_ currentTimestamp: Double, duration: Double, short: Bool) { + self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.4) + } + + override func animateRemoved(_ currentTimestamp: Double, duration: Double) { + self.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.15, removeOnCompletion: false) + } +} diff --git a/submodules/WalletUI/Sources/ItemList/Items/ItemListSingleLineInputItem.swift b/submodules/WalletUI/Sources/ItemList/Items/ItemListSingleLineInputItem.swift new file mode 100644 index 0000000000..eb0ea6c8e7 --- /dev/null +++ b/submodules/WalletUI/Sources/ItemList/Items/ItemListSingleLineInputItem.swift @@ -0,0 +1,462 @@ +import Foundation +import UIKit +import Display +import AsyncDisplayKit +import SwiftSignalKit + +enum ItemListSingleLineInputItemType: Equatable { + case regular(capitalization: Bool, autocorrection: Bool) + case password + case email + case number + case decimal + case username +} + +enum ItemListSingleLineInputClearType: Equatable { + case none + case always + case onFocus + + var hasButton: Bool { + switch self { + case .none: + return false + case .always, .onFocus: + return true + } + } +} + +class ItemListSingleLineInputItem: ListViewItem, ItemListItem { + let theme: WalletTheme + let strings: WalletStrings + let title: NSAttributedString + let text: String + let placeholder: String + let type: ItemListSingleLineInputItemType + let returnKeyType: UIReturnKeyType + let spacing: CGFloat + let clearType: ItemListSingleLineInputClearType + let enabled: Bool + let sectionId: ItemListSectionId + let action: () -> Void + let textUpdated: (String) -> Void + let shouldUpdateText: (String) -> Bool + let processPaste: ((String) -> String)? + let updatedFocus: ((Bool) -> Void)? + let tag: ItemListItemTag? + + init(theme: WalletTheme, strings: WalletStrings, title: NSAttributedString, text: String, placeholder: String, type: ItemListSingleLineInputItemType = .regular(capitalization: true, autocorrection: true), returnKeyType: UIReturnKeyType = .`default`, spacing: CGFloat = 0.0, clearType: ItemListSingleLineInputClearType = .none, enabled: Bool = true, tag: ItemListItemTag? = nil, sectionId: ItemListSectionId, textUpdated: @escaping (String) -> Void, shouldUpdateText: @escaping (String) -> Bool = { _ in return true }, processPaste: ((String) -> String)? = nil, updatedFocus: ((Bool) -> Void)? = nil, action: @escaping () -> Void) { + self.theme = theme + self.strings = strings + self.title = title + self.text = text + self.placeholder = placeholder + self.type = type + self.returnKeyType = returnKeyType + self.spacing = spacing + self.clearType = clearType + self.enabled = enabled + self.tag = tag + self.sectionId = sectionId + self.textUpdated = textUpdated + self.shouldUpdateText = shouldUpdateText + self.processPaste = processPaste + self.updatedFocus = updatedFocus + self.action = action + } + + func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) { + async { + let node = ItemListSingleLineInputItemNode() + let (layout, apply) = node.asyncLayout()(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem)) + + node.contentSize = layout.contentSize + node.insets = layout.insets + + Queue.mainQueue().async { + completion(node, { + return (nil, { _ in apply() }) + }) + } + } + } + + func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping (ListViewItemApply) -> Void) -> Void) { + Queue.mainQueue().async { + if let nodeValue = node() as? ItemListSingleLineInputItemNode { + + let makeLayout = nodeValue.asyncLayout() + + async { + let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem)) + Queue.mainQueue().async { + completion(layout, { _ in + apply() + }) + } + } + } + } + } +} + +private let titleFont = Font.regular(17.0) + +class ItemListSingleLineInputItemNode: ListViewItemNode, UITextFieldDelegate, ItemListItemNode, ItemListItemFocusableNode { + private let backgroundNode: ASDisplayNode + private let topStripeNode: ASDisplayNode + private let bottomStripeNode: ASDisplayNode + private let maskNode: ASImageNode + + private let titleNode: TextNode + private let textNode: TextFieldNode + private let clearIconNode: ASImageNode + private let clearButtonNode: HighlightableButtonNode + + private var item: ItemListSingleLineInputItem? + + var tag: ItemListItemTag? { + return self.item?.tag + } + + init() { + self.backgroundNode = ASDisplayNode() + self.backgroundNode.isLayerBacked = true + + self.topStripeNode = ASDisplayNode() + self.topStripeNode.isLayerBacked = true + + self.bottomStripeNode = ASDisplayNode() + self.bottomStripeNode.isLayerBacked = true + + self.maskNode = ASImageNode() + + self.titleNode = TextNode() + self.textNode = TextFieldNode() + + self.clearIconNode = ASImageNode() + self.clearIconNode.isLayerBacked = true + self.clearIconNode.displayWithoutProcessing = true + self.clearIconNode.displaysAsynchronously = false + + self.clearButtonNode = HighlightableButtonNode() + + super.init(layerBacked: false, dynamicBounce: false) + + self.addSubnode(self.titleNode) + self.addSubnode(self.textNode) + self.addSubnode(self.clearIconNode) + self.addSubnode(self.clearButtonNode) + + self.clearButtonNode.addTarget(self, action: #selector(self.clearButtonPressed), forControlEvents: .touchUpInside) + self.clearButtonNode.highligthedChanged = { [weak self] highlighted in + if let strongSelf = self { + if highlighted { + strongSelf.clearIconNode.layer.removeAnimation(forKey: "opacity") + strongSelf.clearIconNode.alpha = 0.4 + } else { + strongSelf.clearIconNode.alpha = 1.0 + strongSelf.clearIconNode.layer.animateAlpha(from: 0.4, to: 1.0, duration: 0.2) + } + } + } + } + + override func didLoad() { + super.didLoad() + + self.textNode.textField.typingAttributes = [NSAttributedString.Key.font: Font.regular(17.0)] + self.textNode.textField.font = Font.regular(17.0) + if let item = self.item { + self.textNode.textField.textColor = item.theme.list.itemPrimaryTextColor + self.textNode.textField.keyboardAppearance = item.theme.keyboardAppearance + self.textNode.textField.tintColor = item.theme.list.itemAccentColor + self.textNode.textField.accessibilityHint = item.placeholder + } + self.textNode.clipsToBounds = true + self.textNode.textField.delegate = self + self.textNode.textField.addTarget(self, action: #selector(self.textFieldTextChanged(_:)), for: .editingChanged) + self.textNode.hitTestSlop = UIEdgeInsets(top: -5.0, left: -5.0, bottom: -5.0, right: -5.0) + } + + func asyncLayout() -> (_ item: ItemListSingleLineInputItem, _ params: ListViewItemLayoutParams, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) { + let makeTitleLayout = TextNode.asyncLayout(self.titleNode) + + let currentItem = self.item + + return { item, params, neighbors in + var updatedTheme: WalletTheme? + + var updatedClearIcon: UIImage? + if currentItem?.theme !== item.theme { + updatedTheme = item.theme + updatedClearIcon = itemListClearInputIcon(item.theme) + } + + let leftInset: CGFloat = 16.0 + params.leftInset + var rightInset: CGFloat = 16.0 + params.rightInset + + if item.clearType.hasButton { + rightInset += 32.0 + } + + let titleString = NSMutableAttributedString(attributedString: item.title) + titleString.removeAttribute(NSAttributedString.Key.font, range: NSMakeRange(0, titleString.length)) + titleString.addAttributes([NSAttributedString.Key.font: Font.regular(17.0)], range: NSMakeRange(0, titleString.length)) + + let (titleLayout, titleApply) = makeTitleLayout(TextNodeLayoutArguments(attributedString: titleString, backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: params.width - 32.0 - leftInset - rightInset, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) + + let separatorHeight = UIScreenPixel + + let contentSize = CGSize(width: params.width, height: 44.0) + let insets = itemListNeighborsGroupedInsets(neighbors) + + let layout = ListViewItemNodeLayout(contentSize: contentSize, insets: insets) + let layoutSize = layout.size + + let attributedPlaceholderText = NSAttributedString(string: item.placeholder, font: Font.regular(17.0), textColor: item.theme.list.itemPlaceholderTextColor) + + return (layout, { [weak self] in + if let strongSelf = self { + strongSelf.item = item + + if let _ = updatedTheme { + strongSelf.topStripeNode.backgroundColor = item.theme.list.itemBlocksSeparatorColor + strongSelf.bottomStripeNode.backgroundColor = item.theme.list.itemBlocksSeparatorColor + strongSelf.backgroundNode.backgroundColor = item.theme.list.itemBlocksBackgroundColor + + strongSelf.textNode.textField.textColor = item.theme.list.itemPrimaryTextColor + strongSelf.textNode.textField.keyboardAppearance = item.theme.keyboardAppearance + strongSelf.textNode.textField.tintColor = item.theme.list.itemAccentColor + } + + let _ = titleApply() + strongSelf.titleNode.frame = CGRect(origin: CGPoint(x: leftInset, y: floor((layout.contentSize.height - titleLayout.size.height) / 2.0)), size: titleLayout.size) + + let secureEntry: Bool + let capitalizationType: UITextAutocapitalizationType + let autocorrectionType: UITextAutocorrectionType + let keyboardType: UIKeyboardType + + switch item.type { + case let .regular(capitalization, autocorrection): + secureEntry = false + capitalizationType = capitalization ? .sentences : .none + autocorrectionType = autocorrection ? .default : .no + keyboardType = .default + case .email: + secureEntry = false + capitalizationType = .none + autocorrectionType = .no + keyboardType = .emailAddress + case .password: + secureEntry = true + capitalizationType = .none + autocorrectionType = .no + keyboardType = .default + case .number: + secureEntry = false + capitalizationType = .none + autocorrectionType = .no + if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { + keyboardType = .asciiCapableNumberPad + } else { + keyboardType = .numberPad + } + case .decimal: + secureEntry = false + capitalizationType = .none + autocorrectionType = .no + keyboardType = .decimalPad + case .username: + secureEntry = false + capitalizationType = .none + autocorrectionType = .no + keyboardType = .asciiCapable + } + + if strongSelf.textNode.textField.isSecureTextEntry != secureEntry { + strongSelf.textNode.textField.isSecureTextEntry = secureEntry + } + if strongSelf.textNode.textField.keyboardType != keyboardType { + strongSelf.textNode.textField.keyboardType = keyboardType + } + if strongSelf.textNode.textField.autocapitalizationType != capitalizationType { + strongSelf.textNode.textField.autocapitalizationType = capitalizationType + } + if strongSelf.textNode.textField.autocorrectionType != autocorrectionType { + strongSelf.textNode.textField.autocorrectionType = autocorrectionType + } + if strongSelf.textNode.textField.returnKeyType != item.returnKeyType { + strongSelf.textNode.textField.returnKeyType = item.returnKeyType + } + + if let currentText = strongSelf.textNode.textField.text { + if currentText != item.text { + strongSelf.textNode.textField.text = item.text + } + } else { + strongSelf.textNode.textField.text = item.text + } + + strongSelf.textNode.frame = CGRect(origin: CGPoint(x: leftInset + titleLayout.size.width + item.spacing, y: floor((layout.contentSize.height - 40.0) / 2.0)), size: CGSize(width: max(1.0, params.width - (leftInset + rightInset + titleLayout.size.width + item.spacing)), height: 40.0)) + + if let image = updatedClearIcon { + strongSelf.clearIconNode.image = image + } + + let buttonSize = CGSize(width: 38.0, height: layout.contentSize.height) + strongSelf.clearButtonNode.frame = CGRect(origin: CGPoint(x: params.width - params.rightInset - buttonSize.width, y: 0.0), size: buttonSize) + if let image = strongSelf.clearIconNode.image { + strongSelf.clearIconNode.frame = CGRect(origin: CGPoint(x: params.width - params.rightInset - buttonSize.width + floor((buttonSize.width - image.size.width) / 2.0), y: floor((layout.contentSize.height - image.size.height) / 2.0)), size: image.size) + } + + strongSelf.updateClearButtonVisibility() + + if strongSelf.backgroundNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.backgroundNode, at: 0) + } + if strongSelf.topStripeNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.topStripeNode, at: 1) + } + if strongSelf.bottomStripeNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 2) + } + if strongSelf.maskNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.maskNode, at: 3) + } + + let hasCorners = itemListHasRoundedBlockLayout(params) + var hasTopCorners = false + var hasBottomCorners = false + switch neighbors.top { + case .sameSection(false): + strongSelf.topStripeNode.isHidden = true + default: + hasTopCorners = true + strongSelf.topStripeNode.isHidden = hasCorners + } + let bottomStripeInset: CGFloat + switch neighbors.bottom { + case .sameSection(false): + bottomStripeInset = leftInset + default: + bottomStripeInset = 0.0 + hasBottomCorners = true + strongSelf.bottomStripeNode.isHidden = hasCorners + } + + strongSelf.maskNode.image = hasCorners ? cornersImage(item.theme, top: hasTopCorners, bottom: hasBottomCorners) : nil + + strongSelf.backgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: contentSize.height + min(insets.top, separatorHeight) + min(insets.bottom, separatorHeight))) + strongSelf.maskNode.frame = strongSelf.backgroundNode.frame.insetBy(dx: params.leftInset, dy: 0.0) + strongSelf.topStripeNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: layoutSize.width, height: separatorHeight)) + strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: bottomStripeInset, y: contentSize.height - UIScreenPixel), size: CGSize(width: layoutSize.width - bottomStripeInset, height: separatorHeight)) + + if strongSelf.textNode.textField.attributedPlaceholder == nil || !strongSelf.textNode.textField.attributedPlaceholder!.isEqual(to: attributedPlaceholderText) { + strongSelf.textNode.textField.attributedPlaceholder = attributedPlaceholderText + strongSelf.textNode.textField.accessibilityHint = attributedPlaceholderText.string + } + + strongSelf.textNode.isUserInteractionEnabled = item.enabled + strongSelf.textNode.alpha = item.enabled ? 1.0 : 0.4 + + strongSelf.clearButtonNode.accessibilityLabel = item.strings.Wallet_VoiceOver_Editing_ClearText + } + }) + } + } + + private func updateClearButtonVisibility() { + guard let item = self.item else { + return + } + let isHidden: Bool + switch item.clearType { + case .none: + isHidden = true + case .always: + isHidden = item.text.isEmpty + case .onFocus: + isHidden = !self.textNode.textField.isFirstResponder || item.text.isEmpty + } + self.clearIconNode.isHidden = isHidden + self.clearButtonNode.isHidden = isHidden + self.clearButtonNode.isAccessibilityElement = isHidden + } + + override func animateInsertion(_ currentTimestamp: Double, duration: Double, short: Bool) { + self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.4) + } + + override func animateRemoved(_ currentTimestamp: Double, duration: Double) { + self.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.15, removeOnCompletion: false) + } + + @objc private func textFieldTextChanged(_ textField: UITextField) { + self.textUpdated(self.textNode.textField.text ?? "") + } + + @objc private func clearButtonPressed() { + self.textNode.textField.text = "" + self.textUpdated("") + } + + private func textUpdated(_ text: String) { + self.item?.textUpdated(text) + } + + func focus() { + if !self.textNode.textField.isFirstResponder { + self.textNode.textField.becomeFirstResponder() + } + } + + @objc func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { + if let item = self.item { + let newText = ((textField.text ?? "") as NSString).replacingCharacters(in: range, with: string) + if !item.shouldUpdateText(newText) { + return false + } + } + + if string.count > 1, let item = self.item, let processPaste = item.processPaste { + let result = processPaste(string) + if result != string { + var text = textField.text ?? "" + text.replaceSubrange(text.index(text.startIndex, offsetBy: range.lowerBound) ..< text.index(text.startIndex, offsetBy: range.upperBound), with: result) + textField.text = text + if let startPosition = textField.position(from: textField.beginningOfDocument, offset: range.lowerBound + result.count) { + let selectionRange = textField.textRange(from: startPosition, to: startPosition) + DispatchQueue.main.async { + textField.selectedTextRange = selectionRange + } + } + self.textFieldTextChanged(textField) + return false + } + } + return true + } + + @objc func textFieldShouldReturn(_ textField: UITextField) -> Bool { + self.item?.action() + return false + } + + @objc func textFieldDidBeginEditing(_ textField: UITextField) { + self.item?.updatedFocus?(true) + self.updateClearButtonVisibility() + } + + @objc func textFieldDidEndEditing(_ textField: UITextField) { + self.item?.updatedFocus?(false) + self.updateClearButtonVisibility() + } + + func animateError() { + self.textNode.layer.addShakeAnimation() + } +} diff --git a/submodules/WalletUI/Sources/ItemList/Items/ItemListTextItem.swift b/submodules/WalletUI/Sources/ItemList/Items/ItemListTextItem.swift new file mode 100644 index 0000000000..058c960cf8 --- /dev/null +++ b/submodules/WalletUI/Sources/ItemList/Items/ItemListTextItem.swift @@ -0,0 +1,176 @@ +import Foundation +import UIKit +import Display +import AsyncDisplayKit +import SwiftSignalKit +import TextFormat + +enum ItemListTextItemText { + case plain(String) + case markdown(String) +} + +enum ItemListTextItemLinkAction { + case tap(String) +} + +class ItemListTextItem: ListViewItem, ItemListItem { + let theme: WalletTheme + let text: ItemListTextItemText + let sectionId: ItemListSectionId + let linkAction: ((ItemListTextItemLinkAction) -> Void)? + let style: ItemListStyle + let isAlwaysPlain: Bool = true + + init(theme: WalletTheme, text: ItemListTextItemText, sectionId: ItemListSectionId, linkAction: ((ItemListTextItemLinkAction) -> Void)? = nil, style: ItemListStyle = .blocks) { + self.theme = theme + self.text = text + self.sectionId = sectionId + self.linkAction = linkAction + self.style = style + } + + func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) { + async { + let node = ItemListTextItemNode() + let (layout, apply) = node.asyncLayout()(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem)) + + node.contentSize = layout.contentSize + node.insets = layout.insets + + Queue.mainQueue().async { + completion(node, { + return (nil, { _ in apply() }) + }) + } + } + } + + func updateNode(async: @escaping (@escaping () -> Void) -> Void, node: @escaping () -> ListViewItemNode, params: ListViewItemLayoutParams, previousItem: ListViewItem?, nextItem: ListViewItem?, animation: ListViewItemUpdateAnimation, completion: @escaping (ListViewItemNodeLayout, @escaping (ListViewItemApply) -> Void) -> Void) { + Queue.mainQueue().async { + guard let nodeValue = node() as? ItemListTextItemNode else { + assertionFailure() + return + } + + let makeLayout = nodeValue.asyncLayout() + + async { + let (layout, apply) = makeLayout(self, params, itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem)) + Queue.mainQueue().async { + completion(layout, { _ in + apply() + }) + } + } + } + } +} + +private let titleFont = Font.regular(14.0) +private let titleBoldFont = Font.semibold(14.0) + +class ItemListTextItemNode: ListViewItemNode { + private let titleNode: TextNode + private let activateArea: AccessibilityAreaNode + + private var item: ItemListTextItem? + + init() { + self.titleNode = TextNode() + self.titleNode.isUserInteractionEnabled = false + self.titleNode.contentMode = .left + self.titleNode.contentsScale = UIScreen.main.scale + + self.activateArea = AccessibilityAreaNode() + self.activateArea.accessibilityTraits = .staticText + + super.init(layerBacked: false, dynamicBounce: false) + + self.addSubnode(self.titleNode) + self.addSubnode(self.activateArea) + } + + override func didLoad() { + super.didLoad() + + let recognizer = TapLongTapOrDoubleTapGestureRecognizer(target: self, action: #selector(self.tapLongTapOrDoubleTapGesture(_:))) + recognizer.tapActionAtPoint = { _ in + return .waitForSingleTap + } + self.view.addGestureRecognizer(recognizer) + } + + func asyncLayout() -> (_ item: ItemListTextItem, _ params: ListViewItemLayoutParams, _ neighbors: ItemListNeighbors) -> (ListViewItemNodeLayout, () -> Void) { + let makeTitleLayout = TextNode.asyncLayout(self.titleNode) + + return { item, params, neighbors in + let leftInset: CGFloat = 15.0 + params.leftInset + let verticalInset: CGFloat = 7.0 + + let attributedText: NSAttributedString + switch item.text { + case let .plain(text): + attributedText = NSAttributedString(string: text, font: titleFont, textColor: item.theme.list.freeTextColor) + case let .markdown(text): + attributedText = parseMarkdownIntoAttributedString(text, attributes: MarkdownAttributes(body: MarkdownAttributeSet(font: titleFont, textColor: item.theme.list.freeTextColor), bold: MarkdownAttributeSet(font: titleBoldFont, textColor: item.theme.list.freeTextColor), link: MarkdownAttributeSet(font: titleFont, textColor: item.theme.list.itemAccentColor), linkAttribute: { contents in + return (TelegramTextAttributes.URL, contents) + })) + } + let (titleLayout, titleApply) = makeTitleLayout(TextNodeLayoutArguments(attributedString: attributedText, backgroundColor: nil, maximumNumberOfLines: 0, truncationType: .end, constrainedSize: CGSize(width: params.width - params.rightInset - leftInset * 2.0, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) + + let contentSize: CGSize + + contentSize = CGSize(width: params.width, height: titleLayout.size.height + verticalInset + verticalInset) + let insets = itemListNeighborsGroupedInsets(neighbors) + + let layout = ListViewItemNodeLayout(contentSize: contentSize, insets: insets) + + return (layout, { [weak self] in + if let strongSelf = self { + strongSelf.item = item + + strongSelf.activateArea.frame = CGRect(origin: CGPoint(x: params.leftInset, y: 0.0), size: CGSize(width: params.width - params.leftInset - params.rightInset, height: layout.contentSize.height)) + strongSelf.activateArea.accessibilityLabel = attributedText.string + + strongSelf.accessibilityLabel = attributedText.string + + let _ = titleApply() + + strongSelf.titleNode.frame = CGRect(origin: CGPoint(x: leftInset, y: verticalInset), size: titleLayout.size) + } + }) + } + } + + override func animateInsertion(_ currentTimestamp: Double, duration: Double, short: Bool) { + self.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.4) + } + + override func animateRemoved(_ currentTimestamp: Double, duration: Double) { + self.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.15, removeOnCompletion: false) + } + + @objc private func tapLongTapOrDoubleTapGesture(_ recognizer: TapLongTapOrDoubleTapGestureRecognizer) { + switch recognizer.state { + case .ended: + if let (gesture, location) = recognizer.lastRecognizedGestureAndLocation { + switch gesture { + case .tap: + let titleFrame = self.titleNode.frame + if let item = self.item, titleFrame.contains(location) { + if let (_, attributes) = self.titleNode.attributesAtPoint(CGPoint(x: location.x - titleFrame.minX, y: location.y - titleFrame.minY)) { + if let url = attributes[NSAttributedString.Key(rawValue: TelegramTextAttributes.URL)] as? String { + item.linkAction?(.tap(url)) + } + } + } + default: + break + } + } + default: + break + } + } +} diff --git a/submodules/WalletUI/Sources/ToastNode.swift b/submodules/WalletUI/Sources/ToastNode.swift new file mode 100644 index 0000000000..e69de29bb2 diff --git a/submodules/WalletUI/Sources/WalletContext.swift b/submodules/WalletUI/Sources/WalletContext.swift new file mode 100644 index 0000000000..5e280e040e --- /dev/null +++ b/submodules/WalletUI/Sources/WalletContext.swift @@ -0,0 +1,24 @@ +import Foundation +import UIKit +import Postbox +import TelegramCore +import SwiftSignalKit + +public protocol WalletContext { + var postbox: Postbox { get } + var network: Network { get } + var tonInstance: TonInstance { get } + var keychain: TonKeychain { get } + var presentationData: WalletPresentationData { get } + + var inForeground: Signal { get } + + func presentNativeController(_ controller: UIViewController) + + func idleTimerExtension() -> Disposable + func openUrl(_ url: String) + func shareUrl(_ url: String) + func openPlatformSettings() + func authorizeAccessToCamera(completion: @escaping () -> Void) + func pickImage(completion: @escaping (UIImage) -> Void) +} diff --git a/submodules/WalletUI/Sources/WalletCreateInvoiceScreen.swift b/submodules/WalletUI/Sources/WalletCreateInvoiceScreen.swift index f044fdaae8..48fc296ef9 100644 --- a/submodules/WalletUI/Sources/WalletCreateInvoiceScreen.swift +++ b/submodules/WalletUI/Sources/WalletCreateInvoiceScreen.swift @@ -1,19 +1,15 @@ import Foundation import UIKit import AppBundle -import AccountContext -import TelegramPresentationData import AsyncDisplayKit import Display import Postbox import TelegramCore -import ItemListUI import SwiftSignalKit import OverlayStatusController -import ShareController private final class WalletCreateInvoiceScreenArguments { - let context: AccountContext + let context: WalletContext let updateState: ((WalletCreateInvoiceScreenState) -> WalletCreateInvoiceScreenState) -> Void let updateText: (WalletCreateInvoiceScreenEntryTag, String) -> Void let selectNextInputItem: (WalletCreateInvoiceScreenEntryTag) -> Void @@ -24,7 +20,7 @@ private final class WalletCreateInvoiceScreenArguments { let displayQrCodeContextMenu: () -> Void let scrollToBottom: () -> Void - init(context: AccountContext, updateState: @escaping ((WalletCreateInvoiceScreenState) -> WalletCreateInvoiceScreenState) -> Void, updateText: @escaping (WalletCreateInvoiceScreenEntryTag, String) -> Void, selectNextInputItem: @escaping (WalletCreateInvoiceScreenEntryTag) -> Void, dismissInput: @escaping () -> Void, copyAddress: @escaping () -> Void, shareAddressLink: @escaping () -> Void, openQrCode: @escaping () -> Void, displayQrCodeContextMenu: @escaping () -> Void, scrollToBottom: @escaping () -> Void) { + init(context: WalletContext, updateState: @escaping ((WalletCreateInvoiceScreenState) -> WalletCreateInvoiceScreenState) -> Void, updateText: @escaping (WalletCreateInvoiceScreenEntryTag, String) -> Void, selectNextInputItem: @escaping (WalletCreateInvoiceScreenEntryTag) -> Void, dismissInput: @escaping () -> Void, copyAddress: @escaping () -> Void, shareAddressLink: @escaping () -> Void, openQrCode: @escaping () -> Void, displayQrCodeContextMenu: @escaping () -> Void, scrollToBottom: @escaping () -> Void) { self.context = context self.updateState = updateState self.updateText = updateText @@ -58,16 +54,16 @@ private enum WalletCreateInvoiceScreenEntryTag: ItemListItemTag { } private enum WalletCreateInvoiceScreenEntry: ItemListNodeEntry { - case amountHeader(PresentationTheme, String) - case amount(PresentationTheme, PresentationStrings, String, String) - case commentHeader(PresentationTheme, String) - case comment(PresentationTheme, String, String) - case addressCode(PresentationTheme, String) - case addressHeader(PresentationTheme, String) - case address(PresentationTheme, String, Bool) - case copyAddress(PresentationTheme, String) - case shareAddressLink(PresentationTheme, String) - case addressInfo(PresentationTheme, String) + case amountHeader(WalletTheme, String) + case amount(WalletTheme, WalletStrings, String, String) + case commentHeader(WalletTheme, String) + case comment(WalletTheme, String, String) + case addressCode(WalletTheme, String) + case addressHeader(WalletTheme, String) + case address(WalletTheme, String, Bool) + case copyAddress(WalletTheme, String) + case shareAddressLink(WalletTheme, String) + case addressInfo(WalletTheme, String) var section: ItemListSectionId { switch self { @@ -181,7 +177,7 @@ private enum WalletCreateInvoiceScreenEntry: ItemListNodeEntry { return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) case let .amount(theme, strings, placeholder, text): return ItemListSingleLineInputItem(theme: theme, strings: strings, title: NSAttributedString(string: ""), text: text, placeholder: placeholder, type: .decimal, returnKeyType: .next, clearType: .onFocus, tag: WalletCreateInvoiceScreenEntryTag.amount, sectionId: self.section, textUpdated: { text in - let text = formatAmountText(text, decimalSeparator: arguments.context.sharedContext.currentPresentationData.with { $0 }.dateTimeFormat.decimalSeparator) + let text = formatAmountText(text, decimalSeparator: arguments.context.presentationData.dateTimeFormat.decimalSeparator) arguments.updateText(WalletCreateInvoiceScreenEntryTag.amount, text) }, shouldUpdateText: { text in return isValidAmount(text) @@ -200,7 +196,7 @@ private enum WalletCreateInvoiceScreenEntry: ItemListNodeEntry { if focus { arguments.scrollToBottom() } else { - let presentationData = arguments.context.sharedContext.currentPresentationData.with { $0 } + let presentationData = arguments.context.presentationData arguments.updateState { state in var state = state if !state.amount.isEmpty { @@ -266,7 +262,7 @@ private struct WalletCreateInvoiceScreenState: Equatable { } } -private func walletCreateInvoiceScreenEntries(presentationData: PresentationData, address: String, state: WalletCreateInvoiceScreenState) -> [WalletCreateInvoiceScreenEntry] { +private func walletCreateInvoiceScreenEntries(presentationData: WalletPresentationData, address: String, state: WalletCreateInvoiceScreenState) -> [WalletCreateInvoiceScreenEntry] { var entries: [WalletCreateInvoiceScreenEntry] = [] let amount = amountValue(state.amount) @@ -293,10 +289,9 @@ protocol WalletCreateInvoiceScreen { } private final class WalletCreateInvoiceScreenImpl: ItemListController, WalletCreateInvoiceScreen { - } -func walletCreateInvoiceScreen(context: AccountContext, address: String) -> ViewController { +func walletCreateInvoiceScreen(context: WalletContext, address: String) -> ViewController { let initialState = WalletCreateInvoiceScreenState(amount: "", comment: "", focusItemTag: nil) let statePromise = ValuePromise(initialState, ignoreRepeated: true) let stateValue = Atomic(value: initialState) @@ -332,13 +327,13 @@ func walletCreateInvoiceScreen(context: AccountContext, address: String) -> View }, dismissInput: { dismissInputImpl?() }, copyAddress: { - let presentationData = context.sharedContext.currentPresentationData.with { $0 } + let presentationData = context.presentationData let state = stateValue.with { $0 } UIPasteboard.general.string = walletInvoiceUrl(address: address, amount: state.amount, comment: state.comment) if currentStatusController == nil { - let statusController = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .genericSuccess(presentationData.strings.Wallet_Receive_InvoiceUrlCopied, false)) + let statusController = OverlayStatusController(theme: presentationData.theme, type: .genericSuccess(presentationData.strings.Wallet_Receive_InvoiceUrlCopied, false)) presentControllerImpl?(statusController, nil) currentStatusController = statusController } @@ -346,8 +341,7 @@ func walletCreateInvoiceScreen(context: AccountContext, address: String) -> View dismissInputImpl?() let state = stateValue.with { $0 } let url = walletInvoiceUrl(address: address, amount: state.amount, comment: state.comment) - let controller = ShareController(context: context, subject: .url(url), preferredAction: .default) - presentControllerImpl?(controller, nil) + context.shareUrl(url) }, openQrCode: { dismissInputImpl?() let state = stateValue.with { $0 } @@ -360,24 +354,24 @@ func walletCreateInvoiceScreen(context: AccountContext, address: String) -> View ensureItemVisibleImpl?(WalletCreateInvoiceScreenEntryTag.comment, true) }) - let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, statePromise.get()) + let signal = combineLatest(queue: .mainQueue(), .single(context.presentationData), statePromise.get()) |> map { presentationData, state -> (ItemListControllerState, (ItemListNodeState, Any)) in var ensureVisibleItemTag: ItemListItemTag? if let focusItemTag = state.focusItemTag { ensureVisibleItemTag = focusItemTag } - let rightNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Done), style: .bold, enabled: true, action: { + let rightNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Wallet_Navigation_Done), style: .bold, enabled: true, action: { dismissImpl?() }) - let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.Wallet_CreateInvoice_Title), leftNavigationButton: nil, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: false) + let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.Wallet_CreateInvoice_Title), leftNavigationButton: nil, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Wallet_Navigation_Back), animateChanges: false) let listState = ItemListNodeState(entries: walletCreateInvoiceScreenEntries(presentationData: presentationData, address: address, state: state), style: .blocks, ensureVisibleItemTag: ensureVisibleItemTag, animateChanges: false) return (controllerState, (listState, arguments)) } - let controller = WalletCreateInvoiceScreenImpl(context: context, state: signal) + let controller = WalletCreateInvoiceScreenImpl(theme: context.presentationData.theme, strings: context.presentationData.strings, updatedPresentationData: .single((context.presentationData.theme, context.presentationData.strings)), state: signal, tabBarItem: nil) controller.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait) controller.experimentalSnapScrollToItem = true presentControllerImpl = { [weak controller] c, a in diff --git a/submodules/WalletUI/Sources/WalletInfoEmptyNode.swift b/submodules/WalletUI/Sources/WalletInfoEmptyNode.swift index 9abb113d20..4636214a91 100644 --- a/submodules/WalletUI/Sources/WalletInfoEmptyNode.swift +++ b/submodules/WalletUI/Sources/WalletInfoEmptyNode.swift @@ -2,23 +2,20 @@ import Foundation import UIKit import Display import AsyncDisplayKit -import TelegramPresentationData import TelegramCore import AnimationUI import SwiftSignalKit import AppBundle class WalletInfoEmptyItem: ListViewItem { - let account: Account - let theme: PresentationTheme - let strings: PresentationStrings + let theme: WalletTheme + let strings: WalletStrings let address: String let displayAddressContextMenu: (ASDisplayNode, CGRect) -> Void let selectable: Bool = false - init(account: Account, theme: PresentationTheme, strings: PresentationStrings, address: String, displayAddressContextMenu: @escaping (ASDisplayNode, CGRect) -> Void) { - self.account = account + init(theme: WalletTheme, strings: WalletStrings, address: String, displayAddressContextMenu: @escaping (ASDisplayNode, CGRect) -> Void) { self.theme = theme self.strings = strings self.address = address @@ -27,7 +24,7 @@ class WalletInfoEmptyItem: ListViewItem { func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) { async { - let node = WalletInfoEmptyItemNode(account: self.account) + let node = WalletInfoEmptyItemNode() node.insets = UIEdgeInsets() node.layoutForParams(params, item: self, previousItem: previousItem, nextItem: nextItem) Queue.mainQueue().async { @@ -66,12 +63,12 @@ final class WalletInfoEmptyItemNode: ListViewItemNode { private var item: WalletInfoEmptyItem? - init(account: Account) { + init() { self.offsetContainer = ASDisplayNode() self.animationNode = AnimatedStickerNode() if let path = getAppBundle().path(forResource: "WalletEmpty", ofType: "tgs") { - self.animationNode.setup(account: account, resource: .localFile(path), width: 280, height: 280, playbackMode: .once, mode: .direct) + self.animationNode.setup(resource: .localFile(path), width: 280, height: 280, playbackMode: .once, mode: .direct) self.animationNode.visibility = true } diff --git a/submodules/WalletUI/Sources/WalletInfoScreen.swift b/submodules/WalletUI/Sources/WalletInfoScreen.swift index 28bd4f8f6e..d2d74d4310 100644 --- a/submodules/WalletUI/Sources/WalletInfoScreen.swift +++ b/submodules/WalletUI/Sources/WalletInfoScreen.swift @@ -1,8 +1,6 @@ import Foundation import UIKit import AppBundle -import AccountContext -import TelegramPresentationData import AsyncDisplayKit import Display import Postbox @@ -10,43 +8,39 @@ import TelegramCore import SolidRoundedButtonNode import SwiftSignalKit import MergeLists -import TelegramStringFormatting import AnimationUI public final class WalletInfoScreen: ViewController { - private let context: AccountContext - private let tonContext: TonContext + private let context: WalletContext private let walletInfo: WalletInfo? private let address: String private let enableDebugActions: Bool - private var presentationData: PresentationData + private var presentationData: WalletPresentationData private let _ready = Promise() override public var ready: Promise { return self._ready } - public init(context: AccountContext, tonContext: TonContext, walletInfo: WalletInfo?, address: String, enableDebugActions: Bool) { + public init(context: WalletContext, walletInfo: WalletInfo?, address: String, enableDebugActions: Bool) { self.context = context - self.tonContext = tonContext self.walletInfo = walletInfo self.address = address self.enableDebugActions = enableDebugActions - self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + self.presentationData = context.presentationData - let defaultNavigationPresentationData = NavigationBarPresentationData(presentationTheme: self.presentationData.theme, presentationStrings: self.presentationData.strings) - let navigationBarTheme = NavigationBarTheme(buttonColor: .white, disabledButtonColor: .white, primaryTextColor: .white, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: defaultNavigationPresentationData.theme.badgeBackgroundColor, badgeStrokeColor: defaultNavigationPresentationData.theme.badgeStrokeColor, badgeTextColor: defaultNavigationPresentationData.theme.badgeTextColor) + let navigationBarTheme = NavigationBarTheme(buttonColor: .white, disabledButtonColor: .white, primaryTextColor: .white, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: self.presentationData.theme.navigationBar.badgeBackgroundColor, badgeStrokeColor: self.presentationData.theme.navigationBar.badgeStrokeColor, badgeTextColor: self.presentationData.theme.navigationBar.badgeTextColor) - super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: navigationBarTheme, strings: defaultNavigationPresentationData.strings)) + super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: navigationBarTheme, strings: NavigationBarStrings(back: self.presentationData.strings.Wallet_Navigation_Back, close: self.presentationData.strings.Wallet_Navigation_Close))) self.statusBar.statusBarStyle = .White self.navigationPresentation = .modalInLargeLayout self.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait) self.navigationBar?.intrinsicCanTransitionInline = false - self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_Back, style: .plain, target: nil, action: nil) + self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Wallet_Navigation_Back, style: .plain, target: nil, action: nil) if let _ = walletInfo { self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: generateTintedImage(image: UIImage(bundleImageName: "Wallet/NavigationSettingsIcon"), color: .white), style: .plain, target: self, action: #selector(self.settingsPressed)) } @@ -66,16 +60,16 @@ public final class WalletInfoScreen: ViewController { @objc private func settingsPressed() { if let walletInfo = self.walletInfo { - self.push(walletSettingsController(context: self.context, tonContext: self.tonContext, walletInfo: walletInfo)) + self.push(walletSettingsController(context: self.context, walletInfo: walletInfo)) } } override public func loadDisplayNode() { - self.displayNode = WalletInfoScreenNode(account: self.context.account, tonContext: self.tonContext, presentationData: self.presentationData, walletInfo: self.walletInfo, address: self.address, sendAction: { [weak self] in + self.displayNode = WalletInfoScreenNode(context: self.context, presentationData: self.presentationData, walletInfo: self.walletInfo, address: self.address, sendAction: { [weak self] in guard let strongSelf = self, let walletInfo = strongSelf.walletInfo else { return } - strongSelf.push(walletSendScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, randomId: arc4random64(), walletInfo: walletInfo)) + strongSelf.push(walletSendScreen(context: strongSelf.context, randomId: arc4random64(), walletInfo: walletInfo)) }, receiveAction: { [weak self] in guard let strongSelf = self, let walletInfo = strongSelf.walletInfo else { return @@ -85,7 +79,7 @@ public final class WalletInfoScreen: ViewController { guard let strongSelf = self else { return } - strongSelf.push(walletTransactionInfoController(context: strongSelf.context, tonContext: strongSelf.tonContext, walletInfo: strongSelf.walletInfo, walletTransaction: transaction, enableDebugActions: strongSelf.enableDebugActions)) + strongSelf.push(walletTransactionInfoController(context: strongSelf.context, walletInfo: strongSelf.walletInfo, walletTransaction: transaction, enableDebugActions: strongSelf.enableDebugActions)) }, present: { [weak self] c, a in guard let strongSelf = self else { return @@ -106,7 +100,7 @@ public final class WalletInfoScreen: ViewController { } private final class WalletInfoBalanceNode: ASDisplayNode { - let dateTimeFormat: PresentationDateTimeFormat + let dateTimeFormat: WalletPresentationDateTimeFormat let balanceIntegralTextNode: ImmediateTextNode let balanceFractionalTextNode: ImmediateTextNode @@ -131,7 +125,7 @@ private final class WalletInfoBalanceNode: ASDisplayNode { var isLoading: Bool = true - init(account: Account, theme: PresentationTheme, dateTimeFormat: PresentationDateTimeFormat) { + init(theme: WalletTheme, dateTimeFormat: WalletPresentationDateTimeFormat) { self.dateTimeFormat = dateTimeFormat self.balanceIntegralTextNode = ImmediateTextNode() @@ -146,7 +140,7 @@ private final class WalletInfoBalanceNode: ASDisplayNode { self.balanceIconNode = AnimatedStickerNode() if let path = getAppBundle().path(forResource: "WalletIntroStatic", ofType: "tgs") { - self.balanceIconNode.setup(account: account, resource: .localFile(path), width: 120, height: 120, mode: .direct) + self.balanceIconNode.setup(resource: .localFile(path), width: 120, height: 120, mode: .direct) self.balanceIconNode.visibility = true } @@ -210,10 +204,10 @@ private final class WalletInfoHeaderNode: ASDisplayNode { private let headerBackgroundNode: ASDisplayNode private let headerCornerNode: ASImageNode - init(account: Account, presentationData: PresentationData, hasActions: Bool, sendAction: @escaping () -> Void, receiveAction: @escaping () -> Void) { + init(presentationData: WalletPresentationData, hasActions: Bool, sendAction: @escaping () -> Void, receiveAction: @escaping () -> Void) { self.hasActions = hasActions - self.balanceNode = WalletInfoBalanceNode(account: account, theme: presentationData.theme, dateTimeFormat: presentationData.dateTimeFormat) + self.balanceNode = WalletInfoBalanceNode(theme: presentationData.theme, dateTimeFormat: presentationData.dateTimeFormat) self.balanceSubtitleNode = ImmediateTextNode() self.balanceSubtitleNode.displaysAsynchronously = false @@ -446,10 +440,10 @@ private enum WalletInfoListEntry: Equatable, Comparable, Identifiable { } } - func item(account: Account, theme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, action: @escaping (WalletInfoTransaction) -> Void, displayAddressContextMenu: @escaping (ASDisplayNode, CGRect) -> Void) -> ListViewItem { + func item(theme: WalletTheme, strings: WalletStrings, dateTimeFormat: WalletPresentationDateTimeFormat, action: @escaping (WalletInfoTransaction) -> Void, displayAddressContextMenu: @escaping (ASDisplayNode, CGRect) -> Void) -> ListViewItem { switch self { case let .empty(address): - return WalletInfoEmptyItem(account: account, theme: theme, strings: strings, address: address, displayAddressContextMenu: { node, frame in + return WalletInfoEmptyItem(theme: theme, strings: strings, address: address, displayAddressContextMenu: { node, frame in displayAddressContextMenu(node, frame) }) case let .transaction(_, transaction): @@ -460,21 +454,20 @@ private enum WalletInfoListEntry: Equatable, Comparable, Identifiable { } } -private func preparedTransition(from fromEntries: [WalletInfoListEntry], to toEntries: [WalletInfoListEntry], account: Account, presentationData: PresentationData, action: @escaping (WalletInfoTransaction) -> Void, displayAddressContextMenu: @escaping (ASDisplayNode, CGRect) -> Void) -> WalletInfoListTransaction { +private func preparedTransition(from fromEntries: [WalletInfoListEntry], to toEntries: [WalletInfoListEntry], presentationData: WalletPresentationData, action: @escaping (WalletInfoTransaction) -> Void, displayAddressContextMenu: @escaping (ASDisplayNode, CGRect) -> Void) -> WalletInfoListTransaction { let (deleteIndices, indicesAndItems, updateIndices) = mergeListsStableWithUpdates(leftList: fromEntries, rightList: toEntries) let deletions = deleteIndices.map { ListViewDeleteItem(index: $0, directionHint: nil) } - let insertions = indicesAndItems.map { ListViewInsertItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(account: account, theme: presentationData.theme, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat, action: action, displayAddressContextMenu: displayAddressContextMenu), directionHint: nil) } - let updates = updateIndices.map { ListViewUpdateItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(account: account, theme: presentationData.theme, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat, action: action, displayAddressContextMenu: displayAddressContextMenu), directionHint: nil) } + let insertions = indicesAndItems.map { ListViewInsertItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(theme: presentationData.theme, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat, action: action, displayAddressContextMenu: displayAddressContextMenu), directionHint: nil) } + let updates = updateIndices.map { ListViewUpdateItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(theme: presentationData.theme, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat, action: action, displayAddressContextMenu: displayAddressContextMenu), directionHint: nil) } return WalletInfoListTransaction(deletions: deletions, insertions: insertions, updates: updates) } private final class WalletInfoScreenNode: ViewControllerTracingNode { - private let account: Account - private let tonContext: TonContext - private var presentationData: PresentationData + private let context: WalletContext + private var presentationData: WalletPresentationData private let walletInfo: WalletInfo? private let address: String @@ -512,16 +505,15 @@ private final class WalletInfoScreenNode: ViewControllerTracingNode { private var pollCombinedStateDisposable: Disposable? private var watchCombinedStateDisposable: Disposable? - init(account: Account, tonContext: TonContext, presentationData: PresentationData, walletInfo: WalletInfo?, address: String, sendAction: @escaping () -> Void, receiveAction: @escaping () -> Void, openTransaction: @escaping (WalletInfoTransaction) -> Void, present: @escaping (ViewController, Any?) -> Void) { - self.account = account - self.tonContext = tonContext + init(context: WalletContext, presentationData: WalletPresentationData, walletInfo: WalletInfo?, address: String, sendAction: @escaping () -> Void, receiveAction: @escaping () -> Void, openTransaction: @escaping (WalletInfoTransaction) -> Void, present: @escaping (ViewController, Any?) -> Void) { + self.context = context self.presentationData = presentationData self.walletInfo = walletInfo self.address = address self.openTransaction = openTransaction self.present = present - self.headerNode = WalletInfoHeaderNode(account: account, presentationData: presentationData, hasActions: walletInfo != nil, sendAction: sendAction, receiveAction: receiveAction) + self.headerNode = WalletInfoHeaderNode(presentationData: presentationData, hasActions: walletInfo != nil, sendAction: sendAction, receiveAction: receiveAction) self.listNode = ListView() self.listNode.verticalScrollIndicatorColor = UIColor(white: 0.0, alpha: 0.3) @@ -614,7 +606,7 @@ private final class WalletInfoScreenNode: ViewControllerTracingNode { if let walletInfo = walletInfo { subject = .wallet(walletInfo) - self.watchCombinedStateDisposable = (account.postbox.preferencesView(keys: [PreferencesKeys.walletCollection]) + self.watchCombinedStateDisposable = (context.postbox.preferencesView(keys: [PreferencesKeys.walletCollection]) |> deliverOnMainQueue).start(next: { [weak self] view in guard let strongSelf = self, let wallets = view.values[PreferencesKeys.walletCollection] as? WalletCollection else { return @@ -636,7 +628,7 @@ private final class WalletInfoScreenNode: ViewControllerTracingNode { subject = .address(address) } let pollCombinedState: Signal = ( - getCombinedWalletState(postbox: account.postbox, subject: subject, tonInstance: tonContext.instance) + getCombinedWalletState(postbox: context.postbox, subject: subject, tonInstance: context.tonInstance) |> ignoreValues |> `catch` { _ -> Signal in return .complete() @@ -743,7 +735,7 @@ private final class WalletInfoScreenNode: ViewControllerTracingNode { subject = .address(self.address) } - self.stateDisposable.set((getCombinedWalletState(postbox: self.account.postbox, subject: subject, tonInstance: self.tonContext.instance) + self.stateDisposable.set((getCombinedWalletState(postbox: self.context.postbox, subject: subject, tonInstance: self.context.tonInstance) |> deliverOnMainQueue).start(next: { [weak self] value in guard let strongSelf = self else { return @@ -806,8 +798,8 @@ private final class WalletInfoScreenNode: ViewControllerTracingNode { case .network: text = strongSelf.presentationData.strings.Wallet_Info_RefreshErrorNetworkText } - strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: strongSelf.presentationData.strings.Wallet_Info_RefreshErrorTitle, text: text, actions: [ - TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: { + strongSelf.present(standardTextAlertController(theme: strongSelf.presentationData.theme.alert, title: strongSelf.presentationData.strings.Wallet_Info_RefreshErrorTitle, text: text, actions: [ + TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Wallet_Alert_OK, action: { }) ], actionLayout: .vertical), nil) })) @@ -902,7 +894,7 @@ private final class WalletInfoScreenNode: ViewControllerTracingNode { break } } - self.transactionListDisposable.set((getWalletTransactions(address: self.address, previousId: lastTransactionId, tonInstance: self.tonContext.instance) + self.transactionListDisposable.set((getWalletTransactions(address: self.address, previousId: lastTransactionId, tonInstance: self.context.tonInstance) |> deliverOnMainQueue).start(next: { [weak self] transactions in guard let strongSelf = self else { return @@ -966,7 +958,7 @@ private final class WalletInfoScreenNode: ViewControllerTracingNode { } } - let transaction = preparedTransition(from: self.currentEntries ?? [], to: updatedEntries, account: self.account, presentationData: self.presentationData, action: { [weak self] transaction in + let transaction = preparedTransition(from: self.currentEntries ?? [], to: updatedEntries, presentationData: self.presentationData, action: { [weak self] transaction in guard let strongSelf = self else { return } @@ -976,7 +968,7 @@ private final class WalletInfoScreenNode: ViewControllerTracingNode { return } let address = strongSelf.address - let contextMenuController = ContextMenuController(actions: [ContextMenuAction(content: .text(title: strongSelf.presentationData.strings.Conversation_ContextMenuCopy, accessibilityLabel: strongSelf.presentationData.strings.Conversation_ContextMenuCopy), action: { + let contextMenuController = ContextMenuController(actions: [ContextMenuAction(content: .text(title: strongSelf.presentationData.strings.Wallet_ContextMenuCopy, accessibilityLabel: strongSelf.presentationData.strings.Wallet_ContextMenuCopy), action: { UIPasteboard.general.string = address })]) strongSelf.present(contextMenuController, ContextMenuControllerPresentationArguments(sourceNodeAndRect: { [weak self] in diff --git a/submodules/WalletUI/Sources/WalletInfoTransactionItem.swift b/submodules/WalletUI/Sources/WalletInfoTransactionItem.swift index 9ed2ee0b80..ec59ffaa74 100644 --- a/submodules/WalletUI/Sources/WalletInfoTransactionItem.swift +++ b/submodules/WalletUI/Sources/WalletInfoTransactionItem.swift @@ -3,23 +3,32 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit -import TelegramPresentationData -import ItemListUI import TelegramCore -import TelegramStringFormatting private let transactionIcon = UIImage(bundleImageName: "Wallet/TransactionGem")?.precomposed() +private func stringForMessageTimestamp(timestamp: Int32, dateTimeFormat: WalletPresentationDateTimeFormat, local: Bool = true) -> String { + var t = Int(timestamp) + var timeinfo = tm() + if local { + localtime_r(&t, &timeinfo) + } else { + gmtime_r(&t, &timeinfo) + } + + return stringForShortTimestamp(hours: timeinfo.tm_hour, minutes: timeinfo.tm_min, dateTimeFormat: dateTimeFormat) +} + class WalletInfoTransactionItem: ListViewItem { - let theme: PresentationTheme - let strings: PresentationStrings - let dateTimeFormat: PresentationDateTimeFormat + let theme: WalletTheme + let strings: WalletStrings + let dateTimeFormat: WalletPresentationDateTimeFormat let walletTransaction: WalletInfoTransaction let action: () -> Void fileprivate let header: WalletInfoTransactionDateHeader? - init(theme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, walletTransaction: WalletInfoTransaction, action: @escaping () -> Void) { + init(theme: WalletTheme, strings: WalletStrings, dateTimeFormat: WalletPresentationDateTimeFormat, walletTransaction: WalletInfoTransaction, action: @escaping () -> Void) { self.theme = theme self.strings = strings self.dateTimeFormat = dateTimeFormat @@ -183,7 +192,7 @@ class WalletInfoTransactionItemNode: ListViewItemNode { let currentItem = self.item return { item, params, hasPrevious, hasNext, dateHeaderAtBottom in - var updatedTheme: PresentationTheme? + var updatedTheme: WalletTheme? if currentItem?.theme !== item.theme { updatedTheme = item.theme @@ -209,7 +218,7 @@ class WalletInfoTransactionItemNode: ListViewItemNode { if transferredValue <= 0 { sign = "" title = "\(formatBalanceText(-transferredValue, decimalSeparator: item.dateTimeFormat.decimalSeparator))" - titleColor = item.theme.list.itemDestructiveColor + titleColor = item.theme.info.outgoingFundsTitleColor switch item.walletTransaction { case let .completed(transaction): if transaction.outMessages.isEmpty { @@ -246,7 +255,7 @@ class WalletInfoTransactionItemNode: ListViewItemNode { } else { sign = "" title = "\(formatBalanceText(transferredValue, decimalSeparator: item.dateTimeFormat.decimalSeparator))" - titleColor = item.theme.chatList.secretTitleColor + titleColor = item.theme.info.incomingFundsTitleColor directionText = item.strings.Wallet_Info_TransactionFrom switch item.walletTransaction { case let .completed(transaction): @@ -474,10 +483,10 @@ private final class WalletInfoTransactionDateHeader: ListViewItemHeader { private let localTimestamp: Int32 let id: Int64 - let theme: PresentationTheme - let strings: PresentationStrings + let theme: WalletTheme + let strings: WalletStrings - init(timestamp: Int32, theme: PresentationTheme, strings: PresentationStrings) { + init(timestamp: Int32, theme: WalletTheme, strings: WalletStrings) { self.timestamp = timestamp self.theme = theme self.strings = strings @@ -503,45 +512,45 @@ private final class WalletInfoTransactionDateHeader: ListViewItemHeader { private let sectionTitleFont = Font.semibold(17.0) -private func monthAtIndex(_ index: Int, strings: PresentationStrings) -> String { +private func monthAtIndex(_ index: Int, strings: WalletStrings) -> String { switch index { case 0: - return strings.Month_GenJanuary + return strings.Wallet_Month_GenJanuary case 1: - return strings.Month_GenFebruary + return strings.Wallet_Month_GenFebruary case 2: - return strings.Month_GenMarch + return strings.Wallet_Month_GenMarch case 3: - return strings.Month_GenApril + return strings.Wallet_Month_GenApril case 4: - return strings.Month_GenMay + return strings.Wallet_Month_GenMay case 5: - return strings.Month_GenJune + return strings.Wallet_Month_GenJune case 6: - return strings.Month_GenJuly + return strings.Wallet_Month_GenJuly case 7: - return strings.Month_GenAugust + return strings.Wallet_Month_GenAugust case 8: - return strings.Month_GenSeptember + return strings.Wallet_Month_GenSeptember case 9: - return strings.Month_GenOctober + return strings.Wallet_Month_GenOctober case 10: - return strings.Month_GenNovember + return strings.Wallet_Month_GenNovember case 11: - return strings.Month_GenDecember + return strings.Wallet_Month_GenDecember default: return "" } } final class WalletInfoTransactionDateHeaderNode: ListViewItemHeaderNode { - var theme: PresentationTheme - var strings: PresentationStrings + var theme: WalletTheme + var strings: WalletStrings let titleNode: ASTextNode let backgroundNode: ASDisplayNode let separatorNode: ASDisplayNode - init(theme: PresentationTheme, strings: PresentationStrings, roundedTimestamp: Int32) { + init(theme: WalletTheme, strings: WalletStrings, roundedTimestamp: Int32) { self.theme = theme self.strings = strings @@ -574,12 +583,12 @@ final class WalletInfoTransactionDateHeaderNode: ListViewItemHeaderNode { if timeinfo.tm_year == timeinfoNow.tm_year { if timeinfo.tm_yday == timeinfoNow.tm_yday { - text = strings.Weekday_Today + text = strings.Wallet_Weekday_Today } else { - text = strings.Date_ChatDateHeader(monthAtIndex(Int(timeinfo.tm_mon), strings: strings), "\(timeinfo.tm_mday)").0 + text = strings.Wallet_Info_TransactionDateHeader(monthAtIndex(Int(timeinfo.tm_mon), strings: strings), "\(timeinfo.tm_mday)").0 } } else { - text = strings.Date_ChatDateHeaderYear(monthAtIndex(Int(timeinfo.tm_mon), strings: strings), "\(timeinfo.tm_mday)", "\(1900 + timeinfo.tm_year)").0 + text = strings.Wallet_Info_TransactionDateHeaderYear(monthAtIndex(Int(timeinfo.tm_mon), strings: strings), "\(timeinfo.tm_mday)", "\(1900 + timeinfo.tm_year)").0 } } @@ -591,7 +600,7 @@ final class WalletInfoTransactionDateHeaderNode: ListViewItemHeaderNode { self.titleNode.truncationMode = .byTruncatingTail } - func updateThemeAndStrings(theme: PresentationTheme, strings: PresentationStrings) { + func updateThemeAndStrings(theme: WalletTheme, strings: WalletStrings) { self.theme = theme if let attributedString = self.titleNode.attributedText?.mutableCopy() as? NSMutableAttributedString { attributedString.addAttribute(NSAttributedString.Key.foregroundColor, value: theme.list.itemPrimaryTextColor, range: NSMakeRange(0, attributedString.length)) @@ -637,14 +646,14 @@ private final class StatusClockNode: ASDisplayNode { private var clockFrameNode: ASImageNode private var clockMinNode: ASImageNode - init(theme: PresentationTheme) { + init(theme: WalletTheme) { self.clockFrameNode = ASImageNode() self.clockMinNode = ASImageNode() super.init() - self.clockFrameNode.image = PresentationResourcesChatList.clockFrameImage(theme) - self.clockMinNode.image = PresentationResourcesChatList.clockMinImage(theme) + self.clockFrameNode.image = clockFrameImage(theme) + self.clockMinNode.image = clockMinImage(theme) self.addSubnode(self.clockFrameNode) self.addSubnode(self.clockMinNode) diff --git a/submodules/WalletUI/Sources/WalletPasscodeScreen.swift b/submodules/WalletUI/Sources/WalletPasscodeScreen.swift index 5ec642ffd2..a288cd0178 100644 --- a/submodules/WalletUI/Sources/WalletPasscodeScreen.swift +++ b/submodules/WalletUI/Sources/WalletPasscodeScreen.swift @@ -1,8 +1,6 @@ -import Foundation +/*import Foundation import UIKit import AppBundle -import AccountContext -import TelegramPresentationData import AsyncDisplayKit import Display import Postbox @@ -18,22 +16,20 @@ public enum WalletPasscodeMode { } public final class WalletPasscodeScreen: ViewController { - private let context: AccountContext - private let tonContext: TonContext - private var presentationData: PresentationData + private let context: WalletContext + private var presentationData: WalletPresentationData private let mode: WalletPasscodeMode private let randomId: Int64 - public init(context: AccountContext, tonContext: TonContext, mode: WalletPasscodeMode) { + public init(context: WalletContext, mode: WalletPasscodeMode) { self.context = context - self.tonContext = tonContext self.mode = mode self.randomId = arc4random64() - self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + self.presentationData = context.presentationData - let defaultNavigationPresentationData = NavigationBarPresentationData(presentationTheme: self.presentationData.theme, presentationStrings: self.presentationData.strings) + let defaultNavigationPresentationData = NavigationBarPresentationData(WalletTheme: self.presentationData.theme, WalletStrings: self.presentationData.strings) let navigationBarTheme = NavigationBarTheme(buttonColor: defaultNavigationPresentationData.theme.buttonColor, disabledButtonColor: defaultNavigationPresentationData.theme.disabledButtonColor, primaryTextColor: defaultNavigationPresentationData.theme.primaryTextColor, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: defaultNavigationPresentationData.theme.badgeBackgroundColor, badgeStrokeColor: defaultNavigationPresentationData.theme.badgeStrokeColor, badgeTextColor: defaultNavigationPresentationData.theme.badgeTextColor) super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: navigationBarTheme, strings: defaultNavigationPresentationData.strings)) @@ -45,7 +41,7 @@ public final class WalletPasscodeScreen: ViewController { self.navigationItem.setLeftBarButton(UIBarButtonItem(title: self.presentationData.strings.Common_Cancel, style: .plain, target: self, action: #selector(self.backPressed)), animated: false) - self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_Back, style: .plain, target: nil, action: nil) + self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Wallet_Navigation_Back, style: .plain, target: nil, action: nil) } required init(coder aDecoder: NSCoder) { @@ -58,7 +54,7 @@ public final class WalletPasscodeScreen: ViewController { } override public func loadDisplayNode() { - self.displayNode = WalletPasscodeScreenNode(account: self.context.account, presentationData: self.presentationData, mode: self.mode, proceed: { [weak self] in + self.displayNode = WalletPasscodeScreenNode(account: self.context.account, WalletPresentationData: self.presentationData, mode: self.mode, proceed: { [weak self] in guard let strongSelf = self else { return } @@ -113,7 +109,7 @@ public final class WalletPasscodeScreen: ViewController { } private final class WalletPasscodeScreenNode: ViewControllerTracingNode { - private var presentationData: PresentationData + private var presentationData: WalletPresentationData private let mode: WalletPasscodeMode private let requestBiometrics: () -> Void @@ -126,8 +122,8 @@ private final class WalletPasscodeScreenNode: ViewControllerTracingNode { private let hapticFeedback = HapticFeedback() - init(account: Account, presentationData: PresentationData, mode: WalletPasscodeMode, proceed: @escaping () -> Void, requestBiometrics: @escaping () -> Void) { - self.presentationData = presentationData + init(account: Account, presentationData: WalletPresentationData, mode: WalletPasscodeMode, proceed: @escaping () -> Void, requestBiometrics: @escaping () -> Void) { + self.presentationData = WalletPresentationData self.mode = mode self.requestBiometrics = requestBiometrics @@ -251,3 +247,4 @@ private final class WalletPasscodeScreenNode: ViewControllerTracingNode { self.hapticFeedback.error() } } +*/ diff --git a/submodules/WalletUI/Sources/WalletPresentationData.swift b/submodules/WalletUI/Sources/WalletPresentationData.swift new file mode 100644 index 0000000000..0e892b1b17 --- /dev/null +++ b/submodules/WalletUI/Sources/WalletPresentationData.swift @@ -0,0 +1,303 @@ +import Foundation +import UIKit +import SwiftSignalKit +import Display +import OverlayStatusController + +public enum WalletTimeFormat { + case regular + case military +} + +public enum WalletDateFormat { + case monthFirst + case dayFirst +} + +public struct WalletPresentationDateTimeFormat: Equatable { + public let timeFormat: WalletTimeFormat + public let dateFormat: WalletDateFormat + public let dateSeparator: String + public let decimalSeparator: String + public let groupingSeparator: String + + public init(timeFormat: WalletTimeFormat, dateFormat: WalletDateFormat, dateSeparator: String, decimalSeparator: String, groupingSeparator: String) { + self.timeFormat = timeFormat + self.dateFormat = dateFormat + self.dateSeparator = dateSeparator + self.decimalSeparator = decimalSeparator + self.groupingSeparator = groupingSeparator + } +} + +public final class WalletInfoTheme { + public let incomingFundsTitleColor: UIColor + public let outgoingFundsTitleColor: UIColor + + public init( + incomingFundsTitleColor: UIColor, + outgoingFundsTitleColor: UIColor + ) { + self.incomingFundsTitleColor = incomingFundsTitleColor + self.outgoingFundsTitleColor = outgoingFundsTitleColor + } +} + +public final class WalletSetupTheme { + public let buttonFillColor: UIColor + public let buttonForegroundColor: UIColor + public let inputBackgroundColor: UIColor + public let inputPlaceholderColor: UIColor + public let inputTextColor: UIColor + public let inputClearButtonColor: UIColor + + public init( + buttonFillColor: UIColor, + buttonForegroundColor: UIColor, + inputBackgroundColor: UIColor, + inputPlaceholderColor: UIColor, + inputTextColor: UIColor, + inputClearButtonColor: UIColor + ) { + self.buttonFillColor = buttonFillColor + self.buttonForegroundColor = buttonForegroundColor + self.inputBackgroundColor = inputBackgroundColor + self.inputPlaceholderColor = inputPlaceholderColor + self.inputTextColor = inputTextColor + self.inputClearButtonColor = inputClearButtonColor + } +} + +public final class WalletListTheme { + public let itemPrimaryTextColor: UIColor + public let itemSecondaryTextColor: UIColor + public let itemPlaceholderTextColor: UIColor + public let itemDestructiveColor: UIColor + public let itemAccentColor: UIColor + public let itemDisabledTextColor: UIColor + public let plainBackgroundColor: UIColor + public let blocksBackgroundColor: UIColor + public let itemPlainSeparatorColor: UIColor + public let itemBlocksBackgroundColor: UIColor + public let itemBlocksSeparatorColor: UIColor + public let itemHighlightedBackgroundColor: UIColor + public let sectionHeaderTextColor: UIColor + public let freeTextColor: UIColor + public let freeTextErrorColor: UIColor + public let inputClearButtonColor: UIColor + + public init( + itemPrimaryTextColor: UIColor, + itemSecondaryTextColor: UIColor, + itemPlaceholderTextColor: UIColor, + itemDestructiveColor: UIColor, + itemAccentColor: UIColor, + itemDisabledTextColor: UIColor, + plainBackgroundColor: UIColor, + blocksBackgroundColor: UIColor, + itemPlainSeparatorColor: UIColor, + itemBlocksBackgroundColor: UIColor, + itemBlocksSeparatorColor: UIColor, + itemHighlightedBackgroundColor: UIColor, + sectionHeaderTextColor: UIColor, + freeTextColor: UIColor, + freeTextErrorColor: UIColor, + inputClearButtonColor: UIColor + ) { + self.itemPrimaryTextColor = itemPrimaryTextColor + self.itemSecondaryTextColor = itemSecondaryTextColor + self.itemPlaceholderTextColor = itemPlaceholderTextColor + self.itemDestructiveColor = itemDestructiveColor + self.itemAccentColor = itemAccentColor + self.itemDisabledTextColor = itemDisabledTextColor + self.plainBackgroundColor = plainBackgroundColor + self.blocksBackgroundColor = blocksBackgroundColor + self.itemPlainSeparatorColor = itemPlainSeparatorColor + self.itemBlocksBackgroundColor = itemBlocksBackgroundColor + self.itemBlocksSeparatorColor = itemBlocksSeparatorColor + self.itemHighlightedBackgroundColor = itemHighlightedBackgroundColor + self.sectionHeaderTextColor = sectionHeaderTextColor + self.freeTextColor = freeTextColor + self.freeTextErrorColor = freeTextErrorColor + self.inputClearButtonColor = inputClearButtonColor + } +} + +public final class WalletTheme: Equatable { + public let info: WalletInfoTheme + public let setup: WalletSetupTheme + public let list: WalletListTheme + public let statusBarStyle: StatusBarStyle + public let navigationBar: NavigationBarTheme + public let keyboardAppearance: UIKeyboardAppearance + public let alert: AlertControllerTheme + public let actionSheet: ActionSheetControllerTheme + + private let resourceCache = WalletThemeResourceCache() + + public init(info: WalletInfoTheme, setup: WalletSetupTheme, list: WalletListTheme, statusBarStyle: StatusBarStyle, navigationBar: NavigationBarTheme, keyboardAppearance: UIKeyboardAppearance, alert: AlertControllerTheme, actionSheet: ActionSheetControllerTheme) { + self.info = info + self.setup = setup + self.list = list + self.statusBarStyle = statusBarStyle + self.navigationBar = navigationBar + self.keyboardAppearance = keyboardAppearance + self.alert = alert + self.actionSheet = actionSheet + } + + func image(_ key: Int32, _ generate: (WalletTheme) -> UIImage?) -> UIImage? { + return self.resourceCache.image(key, self, generate) + } + + public static func ==(lhs: WalletTheme, rhs: WalletTheme) -> Bool { + return lhs === rhs + } +} + +public final class WalletPresentationData { + public let theme: WalletTheme + public let strings: WalletStrings + public let dateTimeFormat: WalletPresentationDateTimeFormat + + public init(theme: WalletTheme, strings: WalletStrings, dateTimeFormat: WalletPresentationDateTimeFormat) { + self.theme = theme + self.strings = strings + self.dateTimeFormat = dateTimeFormat + } +} + +private final class WalletThemeResourceCacheHolder { + var images: [Int32: UIImage] = [:] +} + +private final class WalletThemeResourceCache { + private let imageCache = Atomic(value: WalletThemeResourceCacheHolder()) + + public func image(_ key: Int32, _ theme: WalletTheme, _ generate: (WalletTheme) -> UIImage?) -> UIImage? { + let result = self.imageCache.with { holder -> UIImage? in + return holder.images[key] + } + if let result = result { + return result + } else { + if let image = generate(theme) { + self.imageCache.with { holder -> Void in + holder.images[key] = image + } + return image + } else { + return nil + } + } + } +} + +enum WalletThemeResourceKey: Int32 { + case itemListCornersBoth + case itemListCornersTop + case itemListCornersBottom + case itemListClearInputIcon + case navigationShareIcon + + case clockMin + case clockFrame +} + +func cornersImage(_ theme: WalletTheme, top: Bool, bottom: Bool) -> UIImage? { + if !top && !bottom { + return nil + } + let key: WalletThemeResourceKey + if top && bottom { + key = .itemListCornersBoth + } else if top { + key = .itemListCornersTop + } else { + key = .itemListCornersBottom + } + return theme.image(key.rawValue, { theme in + return generateImage(CGSize(width: 50.0, height: 50.0), rotatedContext: { (size, context) in + let bounds = CGRect(origin: CGPoint(), size: size) + context.setFillColor(theme.list.blocksBackgroundColor.cgColor) + context.fill(bounds) + + context.setBlendMode(.clear) + + var corners: UIRectCorner = [] + if top { + corners.insert(.topLeft) + corners.insert(.topRight) + } + if bottom { + corners.insert(.bottomLeft) + corners.insert(.bottomRight) + } + let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: 11.0, height: 11.0)) + context.addPath(path.cgPath) + context.fillPath() + })?.stretchableImage(withLeftCapWidth: 25, topCapHeight: 25) + }) +} + +func itemListClearInputIcon(_ theme: WalletTheme) -> UIImage? { + return theme.image(WalletThemeResourceKey.itemListClearInputIcon.rawValue, { theme in + return generateTintedImage(image: UIImage(bundleImageName: "Components/Search Bar/Clear"), color: theme.list.inputClearButtonColor) + }) +} + +func navigationShareIcon(_ theme: WalletTheme) -> UIImage? { + return theme.image(WalletThemeResourceKey.navigationShareIcon.rawValue, { theme in + generateTintedImage(image: UIImage(bundleImageName: "Chat List/NavigationShare"), color: theme.navigationBar.buttonColor) + }) +} + +func clockFrameImage(_ theme: WalletTheme) -> UIImage? { + return theme.image(WalletThemeResourceKey.clockFrame.rawValue, { theme in + let color = theme.list.itemSecondaryTextColor + return generateImage(CGSize(width: 11.0, height: 11.0), contextGenerator: { size, context in + context.clear(CGRect(origin: CGPoint(), size: size)) + context.setStrokeColor(color.cgColor) + context.setFillColor(color.cgColor) + let strokeWidth: CGFloat = 1.0 + context.setLineWidth(strokeWidth) + context.strokeEllipse(in: CGRect(x: strokeWidth / 2.0, y: strokeWidth / 2.0, width: size.width - strokeWidth, height: size.height - strokeWidth)) + context.fill(CGRect(x: (11.0 - strokeWidth) / 2.0, y: strokeWidth * 3.0, width: strokeWidth, height: 11.0 / 2.0 - strokeWidth * 3.0)) + }) + }) +} + +func clockMinImage(_ theme: WalletTheme) -> UIImage? { + return theme.image(WalletThemeResourceKey.clockMin.rawValue, { theme in + let color = theme.list.itemSecondaryTextColor + return generateImage(CGSize(width: 11.0, height: 11.0), contextGenerator: { size, context in + context.clear(CGRect(origin: CGPoint(), size: size)) + context.setFillColor(color.cgColor) + let strokeWidth: CGFloat = 1.0 + context.fill(CGRect(x: (11.0 - strokeWidth) / 2.0, y: (11.0 - strokeWidth) / 2.0, width: 11.0 / 2.0 - strokeWidth, height: strokeWidth)) + }) + }) +} + +func walletStringsFormattedNumber(_ count: Int32, _ groupingSeparator: String = "") -> String { + let string = "\(count)" + if groupingSeparator.isEmpty || abs(count) < 1000 { + return string + } else { + var groupedString: String = "" + for i in 0 ..< Int(ceil(Double(string.count) / 3.0)) { + let index = string.count - Int(i + 1) * 3 + if !groupedString.isEmpty { + groupedString = groupingSeparator + groupedString + } + groupedString = String(string[string.index(string.startIndex, offsetBy: max(0, index)) ..< string.index(string.startIndex, offsetBy: index + 3)]) + groupedString + } + return groupedString + } +} + +extension OverlayStatusController { + convenience init(theme: WalletTheme, type: OverlayStatusControllerType) { + self.init(style: theme.keyboardAppearance == .dark ? .dark : .light, type: type) + } +} diff --git a/submodules/WalletUI/Sources/WalletQrCodeItem.swift b/submodules/WalletUI/Sources/WalletQrCodeItem.swift index 64c8790b2d..3d1eb1423d 100644 --- a/submodules/WalletUI/Sources/WalletQrCodeItem.swift +++ b/submodules/WalletUI/Sources/WalletQrCodeItem.swift @@ -3,12 +3,10 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit -import TelegramPresentationData -import ItemListUI import QrCode class WalletQrCodeItem: ListViewItem, ItemListItem { - let theme: PresentationTheme + let theme: WalletTheme let address: String let sectionId: ItemListSectionId let style: ItemListStyle @@ -16,7 +14,7 @@ class WalletQrCodeItem: ListViewItem, ItemListItem { let longTapAction: (() -> Void)? public let isAlwaysPlain: Bool = true - init(theme: PresentationTheme, address: String, sectionId: ItemListSectionId, style: ItemListStyle, action: @escaping () -> Void, longTapAction: @escaping () -> Void) { + init(theme: WalletTheme, address: String, sectionId: ItemListSectionId, style: ItemListStyle, action: @escaping () -> Void, longTapAction: @escaping () -> Void) { self.theme = theme self.address = address self.sectionId = sectionId @@ -113,7 +111,7 @@ class WalletQrCodeItemNode: ListViewItemNode { let currentItem = self.item return { item, params, neighbors in - var updatedTheme: PresentationTheme? + var updatedTheme: WalletTheme? var updatedAddress: String? if currentItem?.theme !== item.theme { diff --git a/submodules/WalletUI/Sources/WalletQrScanScreen.swift b/submodules/WalletUI/Sources/WalletQrScanScreen.swift index a993224f56..30e2d8f88f 100644 --- a/submodules/WalletUI/Sources/WalletQrScanScreen.swift +++ b/submodules/WalletUI/Sources/WalletQrScanScreen.swift @@ -1,8 +1,6 @@ import Foundation import UIKit import AppBundle -import AccountContext -import TelegramPresentationData import AsyncDisplayKit import Display import SwiftSignalKit @@ -49,23 +47,22 @@ private func generateFrameImage() -> UIImage? { } public final class WalletQrScanScreen: ViewController { - private let context: AccountContext + private let context: WalletContext private let completion: (ParsedWalletUrl) -> Void - private var presentationData: PresentationData + private var presentationData: WalletPresentationData private var codeDisposable: Disposable? private var inForegroundDisposable: Disposable? - public init(context: AccountContext, completion: @escaping (ParsedWalletUrl) -> Void) { + public init(context: WalletContext, completion: @escaping (ParsedWalletUrl) -> Void) { self.context = context self.completion = completion - self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + self.presentationData = context.presentationData - let defaultNavigationPresentationData = NavigationBarPresentationData(presentationTheme: self.presentationData.theme, presentationStrings: self.presentationData.strings) let navigationBarTheme = NavigationBarTheme(buttonColor: .white, disabledButtonColor: .white, primaryTextColor: .white, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: .clear, badgeStrokeColor: .clear, badgeTextColor: .clear) - super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: navigationBarTheme, strings: defaultNavigationPresentationData.strings)) + super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: navigationBarTheme, strings: NavigationBarStrings(back: self.presentationData.strings.Wallet_Navigation_Back, close: self.presentationData.strings.Wallet_Navigation_Close))) self.statusBar.statusBarStyle = .White @@ -73,9 +70,9 @@ public final class WalletQrScanScreen: ViewController { self.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait) self.navigationBar?.intrinsicCanTransitionInline = false - self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_Back, style: .plain, target: nil, action: nil) + self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Wallet_Navigation_Back, style: .plain, target: nil, action: nil) - self.inForegroundDisposable = (context.sharedContext.applicationBindings.applicationInForeground + self.inForegroundDisposable = (context.inForeground |> deliverOnMainQueue).start(next: { [weak self] inForeground in guard let strongSelf = self else { return @@ -122,7 +119,7 @@ public final class WalletQrScanScreen: ViewController { guard let strongSelf = self else { return } - strongSelf.context.sharedContext.openImagePicker(context: strongSelf.context, completion: { image in + strongSelf.context.pickImage(completion: { image in let detector = CIDetector(ofType: CIDetectorTypeQRCode, context: nil, options: [CIDetectorAccuracy:CIDetectorAccuracyHigh])! if let ciImage = CIImage(image: image) { var options: [String: Any] @@ -143,10 +140,9 @@ public final class WalletQrScanScreen: ViewController { } } } - let controller = textAlertController(context: strongSelf.context, title: nil, text: "No valid QR code detected.", actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]) + let theme = strongSelf.context.presentationData.theme + let controller = textAlertController(alertContext: AlertControllerContext(theme: theme.alert, themeSignal: .single(theme.alert)), title: nil, text: "No valid QR code detected.", actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Wallet_Alert_OK, action: {})]) strongSelf.present(controller, in: .window(.root)) - }, present: { [weak self] c in - self?.push(c) }) } } @@ -159,7 +155,7 @@ public final class WalletQrScanScreen: ViewController { } private final class WalletQrScanScreenNode: ViewControllerTracingNode, UIScrollViewDelegate { - private var presentationData: PresentationData + private var presentationData: WalletPresentationData private let previewNode: CameraPreviewNode private let fadeNode: ASDisplayNode @@ -182,7 +178,7 @@ private final class WalletQrScanScreenNode: ViewControllerTracingNode, UIScrollV private var validLayout: (ContainerViewLayout, CGFloat)? - init(presentationData: PresentationData) { + init(presentationData: WalletPresentationData) { self.presentationData = presentationData self.previewNode = CameraPreviewNode() diff --git a/submodules/WalletUI/Sources/WalletQrViewScreen.swift b/submodules/WalletUI/Sources/WalletQrViewScreen.swift index 8df02d1081..543cab2298 100644 --- a/submodules/WalletUI/Sources/WalletQrViewScreen.swift +++ b/submodules/WalletUI/Sources/WalletQrViewScreen.swift @@ -2,8 +2,6 @@ import Foundation import UIKit import SwiftSignalKit import AppBundle -import AccountContext -import TelegramPresentationData import AsyncDisplayKit import Display import Postbox @@ -11,7 +9,7 @@ import QrCode import ShareController import AnimationUI -func shareInvoiceQrCode(context: AccountContext, invoice: String) { +func shareInvoiceQrCode(context: WalletContext, invoice: String) { let _ = (qrCode(string: invoice, color: .black, backgroundColor: .white, icon: .custom(UIImage(bundleImageName: "Wallet/QrGem"))) |> map { generator -> UIImage? in let imageSize = CGSize(width: 768.0, height: 768.0) @@ -24,40 +22,40 @@ func shareInvoiceQrCode(context: AccountContext, invoice: String) { } let activityController = UIActivityViewController(activityItems: [image], applicationActivities: nil) - context.sharedContext.applicationBindings.presentNativeController(activityController) + context.presentNativeController(activityController) }) } public final class WalletQrViewScreen: ViewController { - private let context: AccountContext + private let context: WalletContext private let invoice: String - private var presentationData: PresentationData + private var presentationData: WalletPresentationData private var previousScreenBrightness: CGFloat? private var displayLinkAnimator: DisplayLinkAnimator? private let idleTimerExtensionDisposable: Disposable - public init(context: AccountContext, invoice: String) { + public init(context: WalletContext, invoice: String) { self.context = context self.invoice = invoice - self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + self.presentationData = context.presentationData - let defaultNavigationPresentationData = NavigationBarPresentationData(presentationTheme: self.presentationData.theme, presentationStrings: self.presentationData.strings) - let navigationBarTheme = NavigationBarTheme(buttonColor: defaultNavigationPresentationData.theme.buttonColor, disabledButtonColor: defaultNavigationPresentationData.theme.disabledButtonColor, primaryTextColor: defaultNavigationPresentationData.theme.primaryTextColor, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: defaultNavigationPresentationData.theme.badgeBackgroundColor, badgeStrokeColor: defaultNavigationPresentationData.theme.badgeStrokeColor, badgeTextColor: defaultNavigationPresentationData.theme.badgeTextColor) + let defaultTheme = self.presentationData.theme.navigationBar + let navigationBarTheme = NavigationBarTheme(buttonColor: defaultTheme.buttonColor, disabledButtonColor: defaultTheme.disabledButtonColor, primaryTextColor: defaultTheme.primaryTextColor, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: defaultTheme.badgeBackgroundColor, badgeStrokeColor: defaultTheme.badgeStrokeColor, badgeTextColor: defaultTheme.badgeTextColor) - self.idleTimerExtensionDisposable = context.sharedContext.applicationBindings.pushIdleTimerExtension() + self.idleTimerExtensionDisposable = context.idleTimerExtension() - super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: navigationBarTheme, strings: defaultNavigationPresentationData.strings)) + super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: navigationBarTheme, strings: NavigationBarStrings(back: self.presentationData.strings.Wallet_Navigation_Back, close: self.presentationData.strings.Wallet_Navigation_Close))) self.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait) self.navigationBar?.intrinsicCanTransitionInline = false self.title = self.presentationData.strings.Wallet_Qr_Title - self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_Back, style: .plain, target: nil, action: nil) + self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Wallet_Navigation_Back, style: .plain, target: nil, action: nil) - self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: PresentationResourcesRootController.navigationShareIcon(self.presentationData.theme), style: .plain, target: self, action: #selector(self.shareButtonPressed)) + self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: navigationShareIcon(self.presentationData.theme), style: .plain, target: self, action: #selector(self.shareButtonPressed)) } deinit { @@ -113,13 +111,13 @@ public final class WalletQrViewScreen: ViewController { } private final class WalletQrViewScreenNode: ViewControllerTracingNode { - private var presentationData: PresentationData + private var presentationData: WalletPresentationData private let invoice: String private let imageNode: TransformImageNode private let iconNode: AnimatedStickerNode - init(context: AccountContext, presentationData: PresentationData, message: String) { + init(context: WalletContext, presentationData: WalletPresentationData, message: String) { self.presentationData = presentationData self.invoice = message @@ -129,7 +127,7 @@ private final class WalletQrViewScreenNode: ViewControllerTracingNode { self.iconNode = AnimatedStickerNode() if let path = getAppBundle().path(forResource: "WalletIntroStatic", ofType: "tgs") { - self.iconNode.setup(account: context.account, resource: .localFile(path), width: 240, height: 240, mode: .direct) + self.iconNode.setup(resource: .localFile(path), width: 240, height: 240, mode: .direct) self.iconNode.visibility = true } diff --git a/submodules/WalletUI/Sources/WalletReceiveScreen.swift b/submodules/WalletUI/Sources/WalletReceiveScreen.swift index c38de6db32..fbc47c55e9 100644 --- a/submodules/WalletUI/Sources/WalletReceiveScreen.swift +++ b/submodules/WalletUI/Sources/WalletReceiveScreen.swift @@ -1,26 +1,23 @@ import Foundation import UIKit import AppBundle -import AccountContext -import TelegramPresentationData import AsyncDisplayKit import Display import Postbox import TelegramCore -import ItemListUI import SwiftSignalKit import OverlayStatusController import ShareController private final class WalletReceiveScreenArguments { - let context: AccountContext + let context: WalletContext let copyAddress: () -> Void let shareAddressLink: () -> Void let openQrCode: () -> Void let displayQrCodeContextMenu: () -> Void let openCreateInvoice: () -> Void - init(context: AccountContext, copyAddress: @escaping () -> Void, shareAddressLink: @escaping () -> Void, openQrCode: @escaping () -> Void, displayQrCodeContextMenu: @escaping () -> Void, openCreateInvoice: @escaping () -> Void) { + init(context: WalletContext, copyAddress: @escaping () -> Void, shareAddressLink: @escaping () -> Void, openQrCode: @escaping () -> Void, displayQrCodeContextMenu: @escaping () -> Void, openCreateInvoice: @escaping () -> Void) { self.context = context self.copyAddress = copyAddress self.shareAddressLink = shareAddressLink @@ -36,14 +33,14 @@ private enum WalletReceiveScreenSection: Int32 { } private enum WalletReceiveScreenEntry: ItemListNodeEntry { - case addressCode(PresentationTheme, String) - case addressHeader(PresentationTheme, String) - case address(PresentationTheme, String, Bool) - case copyAddress(PresentationTheme, String) - case shareAddressLink(PresentationTheme, String) - case addressInfo(PresentationTheme, String) - case invoice(PresentationTheme, String) - case invoiceInfo(PresentationTheme, String) + case addressCode(WalletTheme, String) + case addressHeader(WalletTheme, String) + case address(WalletTheme, String, Bool) + case copyAddress(WalletTheme, String) + case shareAddressLink(WalletTheme, String) + case addressInfo(WalletTheme, String) + case invoice(WalletTheme, String) + case invoiceInfo(WalletTheme, String) var section: ItemListSectionId { switch self { @@ -165,7 +162,7 @@ private enum WalletReceiveScreenEntry: ItemListNodeEntry { } } -private func walletReceiveScreenEntries(presentationData: PresentationData, address: String) -> [WalletReceiveScreenEntry] { +private func walletReceiveScreenEntries(presentationData: WalletPresentationData, address: String) -> [WalletReceiveScreenEntry] { var entries: [WalletReceiveScreenEntry] = [] entries.append(.addressCode(presentationData.theme, walletInvoiceUrl(address: address))) entries.append(.addressHeader(presentationData.theme, presentationData.strings.Wallet_Receive_AddressHeader)) @@ -189,7 +186,7 @@ private final class WalletReceiveScreenImpl: ItemListController, WalletReceiveSc } -func walletReceiveScreen(context: AccountContext, address: String) -> ViewController { +func walletReceiveScreen(context: WalletContext, address: String) -> ViewController { var presentControllerImpl: ((ViewController, Any?) -> Void)? var pushImpl: ((ViewController) -> Void)? var dismissImpl: (() -> Void)? @@ -197,19 +194,17 @@ func walletReceiveScreen(context: AccountContext, address: String) -> ViewContro weak var currentStatusController: ViewController? let arguments = WalletReceiveScreenArguments(context: context, copyAddress: { - let presentationData = context.sharedContext.currentPresentationData.with { $0 } + let presentationData = context.presentationData UIPasteboard.general.string = address if currentStatusController == nil { - let statusController = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .genericSuccess(presentationData.strings.Wallet_Receive_AddressCopied, false)) + let statusController = OverlayStatusController(theme: presentationData.theme, type: .genericSuccess(presentationData.strings.Wallet_Receive_AddressCopied, false)) presentControllerImpl?(statusController, nil) currentStatusController = statusController } }, shareAddressLink: { - let url = walletInvoiceUrl(address: address) - let controller = ShareController(context: context, subject: .url(url), preferredAction: .default) - presentControllerImpl?(controller, nil) + context.shareUrl(walletInvoiceUrl(address: address)) }, openQrCode: { let url = walletInvoiceUrl(address: address) pushImpl?(WalletQrViewScreen(context: context, invoice: url)) @@ -219,20 +214,20 @@ func walletReceiveScreen(context: AccountContext, address: String) -> ViewContro pushImpl?(walletCreateInvoiceScreen(context: context, address: address)) }) - let signal = context.sharedContext.presentationData + let signal = Signal.single(context.presentationData) |> deliverOnMainQueue |> map { presentationData -> (ItemListControllerState, (ItemListNodeState, Any)) in - let rightNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Done), style: .bold, enabled: true, action: { + let rightNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Wallet_Navigation_Done), style: .bold, enabled: true, action: { dismissImpl?() }) - let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.Wallet_Receive_Title), leftNavigationButton: ItemListNavigationButton(content: .none, style: .regular, enabled: false, action: {}), rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: false) + let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.Wallet_Receive_Title), leftNavigationButton: ItemListNavigationButton(content: .none, style: .regular, enabled: false, action: {}), rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Wallet_Navigation_Back), animateChanges: false) let listState = ItemListNodeState(entries: walletReceiveScreenEntries(presentationData: presentationData, address: address), style: .blocks, animateChanges: false) return (controllerState, (listState, arguments)) } - let controller = WalletReceiveScreenImpl(context: context, state: signal) + let controller = WalletReceiveScreenImpl(theme: context.presentationData.theme, strings: context.presentationData.strings, updatedPresentationData: .single((context.presentationData.theme, context.presentationData.strings)), state: signal, tabBarItem: nil) controller.navigationPresentation = .modal controller.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait) presentControllerImpl = { [weak controller] c, a in diff --git a/submodules/WalletUI/Sources/WalletRefreshNode.swift b/submodules/WalletUI/Sources/WalletRefreshNode.swift index 333bb3775b..ecbdc161ea 100644 --- a/submodules/WalletUI/Sources/WalletRefreshNode.swift +++ b/submodules/WalletUI/Sources/WalletRefreshNode.swift @@ -2,29 +2,80 @@ import Foundation import UIKit import Display import AsyncDisplayKit -import TelegramPresentationData import AppBundle -import TelegramStringFormatting -private func stringForRelativeUpdateTime(strings: PresentationStrings, day: RelativeTimestampFormatDay, dateTimeFormat: PresentationDateTimeFormat, hours: Int32, minutes: Int32) -> String { +func stringForShortTimestamp(hours: Int32, minutes: Int32, dateTimeFormat: WalletPresentationDateTimeFormat) -> String { + switch dateTimeFormat.timeFormat { + case .regular: + let hourString: String + if hours == 0 { + hourString = "12" + } else if hours > 12 { + hourString = "\(hours - 12)" + } else { + hourString = "\(hours)" + } + + let periodString: String + if hours >= 12 { + periodString = "PM" + } else { + periodString = "AM" + } + if minutes >= 10 { + return "\(hourString):\(minutes) \(periodString)" + } else { + return "\(hourString):0\(minutes) \(periodString)" + } + case .military: + return String(format: "%02d:%02d", arguments: [Int(hours), Int(minutes)]) + } +} + +private func stringForTimestamp(day: Int32, month: Int32, year: Int32, dateTimeFormat: WalletPresentationDateTimeFormat) -> String { + let separator = dateTimeFormat.dateSeparator + switch dateTimeFormat.dateFormat { + case .monthFirst: + return String(format: "%d%@%d%@%02d", month, separator, day, separator, year - 100) + case .dayFirst: + return String(format: "%d%@%02d%@%02d", day, separator, month, separator, year - 100) + } +} + +private func stringForTimestamp(day: Int32, month: Int32, dateTimeFormat: WalletPresentationDateTimeFormat) -> String { + let separator = dateTimeFormat.dateSeparator + switch dateTimeFormat.dateFormat { + case .monthFirst: + return String(format: "%d%@%d", month, separator, day) + case .dayFirst: + return String(format: "%d%@%02d", day, separator, month) + } +} + +private enum RelativeTimestampFormatDay { + case today + case yesterday +} + +private func stringForRelativeUpdateTime(strings: WalletStrings, day: RelativeTimestampFormatDay, dateTimeFormat: WalletPresentationDateTimeFormat, hours: Int32, minutes: Int32) -> String { let dayString: String switch day { case .today: - dayString = strings.Updated_TodayAt(stringForShortTimestamp(hours: hours, minutes: minutes, dateTimeFormat: dateTimeFormat)).0 + dayString = strings.Wallet_Updated_TodayAt(stringForShortTimestamp(hours: hours, minutes: minutes, dateTimeFormat: dateTimeFormat)).0 case .yesterday: - dayString = strings.Updated_YesterdayAt(stringForShortTimestamp(hours: hours, minutes: minutes, dateTimeFormat: dateTimeFormat)).0 + dayString = strings.Wallet_Updated_YesterdayAt(stringForShortTimestamp(hours: hours, minutes: minutes, dateTimeFormat: dateTimeFormat)).0 } return dayString } -private func lastUpdateTimestampString(strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, statusTimestamp: Int32, relativeTo timestamp: Int32) -> String { +private func lastUpdateTimestampString(strings: WalletStrings, dateTimeFormat: WalletPresentationDateTimeFormat, statusTimestamp: Int32, relativeTo timestamp: Int32) -> String { let difference = timestamp - statusTimestamp let expanded = true if difference < 60 { - return strings.Updated_JustNow + return strings.Wallet_Updated_JustNow } else if difference < 60 * 60 && !expanded { let minutes = difference / 60 - return strings.Updated_MinutesAgo(minutes) + return strings.Wallet_Updated_MinutesAgo(minutes) } else { var t: time_t = time_t(statusTimestamp) var timeinfo: tm = tm() @@ -35,7 +86,7 @@ private func lastUpdateTimestampString(strings: PresentationStrings, dateTimeFor localtime_r(&now, &timeinfoNow) if timeinfo.tm_year != timeinfoNow.tm_year { - return strings.Updated_AtDate(stringForTimestamp(day: timeinfo.tm_mday, month: timeinfo.tm_mon + 1, year: timeinfo.tm_year, dateTimeFormat: dateTimeFormat)).0 + return strings.Wallet_Updated_AtDate(stringForTimestamp(day: timeinfo.tm_mday, month: timeinfo.tm_mon + 1, year: timeinfo.tm_year, dateTimeFormat: dateTimeFormat)).0 } let dayDifference = timeinfo.tm_yday - timeinfoNow.tm_yday @@ -46,14 +97,14 @@ private func lastUpdateTimestampString(strings: PresentationStrings, dateTimeFor day = .today } else { let minutes = difference / (60 * 60) - return strings.Updated_HoursAgo(minutes) + return strings.Wallet_Updated_HoursAgo(minutes) } } else { day = .yesterday } return stringForRelativeUpdateTime(strings: strings, day: day, dateTimeFormat: dateTimeFormat, hours: timeinfo.tm_hour, minutes: timeinfo.tm_min) } else { - return strings.Updated_AtDate(stringForTimestamp(day: timeinfo.tm_mday, month: timeinfo.tm_mon + 1, year: timeinfo.tm_year, dateTimeFormat: dateTimeFormat)).0 + return strings.Wallet_Updated_AtDate(stringForTimestamp(day: timeinfo.tm_mday, month: timeinfo.tm_mon + 1, year: timeinfo.tm_year, dateTimeFormat: dateTimeFormat)).0 } } } @@ -64,8 +115,8 @@ enum WalletRefreshState: Equatable { } final class WalletRefreshNode: ASDisplayNode { - private let strings: PresentationStrings - private let dateTimeFormat: PresentationDateTimeFormat + private let strings: WalletStrings + private let dateTimeFormat: WalletPresentationDateTimeFormat private let iconContainer: ASDisplayNode private let iconNode: ASImageNode private let titleNode: ImmediateTextNode @@ -74,7 +125,7 @@ final class WalletRefreshNode: ASDisplayNode { private let animator: ConstantDisplayLinkAnimator - init(strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat) { + init(strings: WalletStrings, dateTimeFormat: WalletPresentationDateTimeFormat) { self.strings = strings self.dateTimeFormat = dateTimeFormat diff --git a/submodules/WalletUI/Sources/WalletSendScreen.swift b/submodules/WalletUI/Sources/WalletSendScreen.swift index 9b3e29c683..3883f7ac52 100644 --- a/submodules/WalletUI/Sources/WalletSendScreen.swift +++ b/submodules/WalletUI/Sources/WalletSendScreen.swift @@ -1,25 +1,20 @@ import Foundation import UIKit import AppBundle -import AccountContext -import TelegramPresentationData import AsyncDisplayKit import Display import Postbox import TelegramCore -import ItemListUI import SwiftSignalKit import AlertUI import TextFormat -import DeviceAccess -import TelegramStringFormatting import UrlHandling import OverlayStatusController private let balanceIcon = UIImage(bundleImageName: "Wallet/TransactionGem")?.precomposed() private final class WalletSendScreenArguments { - let context: AccountContext + let context: WalletContext let updateState: ((WalletSendScreenState) -> WalletSendScreenState) -> Void let updateText: (WalletSendScreenEntryTag, String) -> Void let selectNextInputItem: (WalletSendScreenEntryTag) -> Void @@ -28,7 +23,7 @@ private final class WalletSendScreenArguments { let openQrScanner: () -> Void let proceed: () -> Void - init(context: AccountContext, updateState: @escaping ((WalletSendScreenState) -> WalletSendScreenState) -> Void, updateText: @escaping (WalletSendScreenEntryTag, String) -> Void, selectNextInputItem: @escaping (WalletSendScreenEntryTag) -> Void, scrollToBottom: @escaping () -> Void, dismissInput: @escaping () -> Void, openQrScanner: @escaping () -> Void, proceed: @escaping () -> Void) { + init(context: WalletContext, updateState: @escaping ((WalletSendScreenState) -> WalletSendScreenState) -> Void, updateText: @escaping (WalletSendScreenEntryTag, String) -> Void, selectNextInputItem: @escaping (WalletSendScreenEntryTag) -> Void, scrollToBottom: @escaping () -> Void, dismissInput: @escaping () -> Void, openQrScanner: @escaping () -> Void, proceed: @escaping () -> Void) { self.context = context self.updateState = updateState self.updateText = updateText @@ -61,13 +56,13 @@ private enum WalletSendScreenEntryTag: ItemListItemTag { } private enum WalletSendScreenEntry: ItemListNodeEntry { - case addressHeader(PresentationTheme, String) - case address(PresentationTheme, String, String) - case addressInfo(PresentationTheme, String) - case amountHeader(PresentationTheme, String, String?, Bool) - case amount(PresentationTheme, PresentationStrings, String, String) - case commentHeader(PresentationTheme, String) - case comment(PresentationTheme, String, String) + case addressHeader(WalletTheme, String) + case address(WalletTheme, String, String) + case addressInfo(WalletTheme, String) + case amountHeader(WalletTheme, String, String?, Bool) + case amount(WalletTheme, WalletStrings, String, String) + case commentHeader(WalletTheme, String) + case comment(WalletTheme, String, String) var section: ItemListSectionId { switch self { @@ -167,7 +162,7 @@ private enum WalletSendScreenEntry: ItemListNodeEntry { var state = state state.address = parsedUrl.address if let amount = parsedUrl.amount { - state.amount = formatBalanceText(amount, decimalSeparator: arguments.context.sharedContext.currentPresentationData.with { $0 }.dateTimeFormat.decimalSeparator) + state.amount = formatBalanceText(amount, decimalSeparator: arguments.context.presentationData.dateTimeFormat.decimalSeparator) } else if state.amount.isEmpty { focusItemTag = WalletSendScreenEntryTag.address } @@ -200,20 +195,20 @@ private enum WalletSendScreenEntry: ItemListNodeEntry { return ItemListSectionHeaderItem(theme: theme, text: text, activityIndicator: balance == nil ? .right : .none, accessoryText: balance.flatMap { ItemListSectionHeaderAccessoryText(value: $0, color: insufficient ? .destructive : .generic, icon: balanceIcon) }, sectionId: self.section) case let .amount(theme, strings, placeholder, text): return ItemListSingleLineInputItem(theme: theme, strings: strings, title: NSAttributedString(string: ""), text: text, placeholder: placeholder, type: .decimal, returnKeyType: .next, clearType: .onFocus, tag: WalletSendScreenEntryTag.amount, sectionId: self.section, textUpdated: { text in - let text = formatAmountText(text, decimalSeparator: arguments.context.sharedContext.currentPresentationData.with { $0 }.dateTimeFormat.decimalSeparator) + let text = formatAmountText(text, decimalSeparator: arguments.context.presentationData.dateTimeFormat.decimalSeparator) arguments.updateText(WalletSendScreenEntryTag.amount, text) }, shouldUpdateText: { text in return isValidAmount(text) }, processPaste: { pastedText in if isValidAmount(pastedText) { - let presentationData = arguments.context.sharedContext.currentPresentationData.with { $0 } + let presentationData = arguments.context.presentationData return normalizedStringForGramsString(pastedText, decimalSeparator: presentationData.dateTimeFormat.decimalSeparator) } else { return text } }, updatedFocus: { focus in if !focus { - let presentationData = arguments.context.sharedContext.currentPresentationData.with { $0 } + let presentationData = arguments.context.presentationData arguments.updateState { state in var state = state if !state.amount.isEmpty { @@ -247,7 +242,7 @@ private struct WalletSendScreenState: Equatable { var comment: String } -private func walletSendScreenEntries(presentationData: PresentationData, balance: Int64?, state: WalletSendScreenState) -> [WalletSendScreenEntry] { +private func walletSendScreenEntries(presentationData: WalletPresentationData, balance: Int64?, state: WalletSendScreenState) -> [WalletSendScreenEntry] { if balance == nil { return [] } @@ -275,8 +270,8 @@ private final class WalletSendScreenImpl: ItemListController, WalletSendScreen { } -public func walletSendScreen(context: AccountContext, tonContext: TonContext, randomId: Int64, walletInfo: WalletInfo, address: String? = nil, amount: Int64? = nil, comment: String? = nil) -> ViewController { - let presentationData = context.sharedContext.currentPresentationData.with { $0 } +public func walletSendScreen(context: WalletContext, randomId: Int64, walletInfo: WalletInfo, address: String? = nil, amount: Int64? = nil, comment: String? = nil) -> ViewController { + let presentationData = context.presentationData let initialState = WalletSendScreenState(address: address ?? "", amount: amount.flatMap { formatBalanceText($0, decimalSeparator: presentationData.dateTimeFormat.decimalSeparator) } ?? "", comment: comment ?? "") let statePromise = ValuePromise(initialState, ignoreRepeated: true) @@ -286,7 +281,7 @@ public func walletSendScreen(context: AccountContext, tonContext: TonContext, ra } let serverSaltValue = Promise() - serverSaltValue.set(getServerWalletSalt(network: context.account.network) + serverSaltValue.set(getServerWalletSalt(network: context.network) |> map(Optional.init) |> `catch` { _ -> Signal in return .single(nil) @@ -326,14 +321,7 @@ public func walletSendScreen(context: AccountContext, tonContext: TonContext, ra }, openQrScanner: { dismissInputImpl?() - DeviceAccess.authorizeAccess(to: .camera, presentationData: presentationData, present: { c, a in - presentControllerImpl?(c, a) - }, openSettings: { - context.sharedContext.applicationBindings.openSettings() - }, { granted in - guard granted else { - return - } + context.authorizeAccessToCamera(completion: { pushImpl?(WalletQrScanScreen(context: context, completion: { parsedUrl in var updatedState: WalletSendScreenState? updateState { state in @@ -359,7 +347,7 @@ public func walletSendScreen(context: AccountContext, tonContext: TonContext, ra })) }) }, proceed: { - let presentationData = context.sharedContext.currentPresentationData.with { $0 } + let presentationData = context.presentationData let state = stateValue.with { $0 } let amount = amountValue(state.amount) @@ -369,26 +357,27 @@ public func walletSendScreen(context: AccountContext, tonContext: TonContext, ra return state } - let title = NSAttributedString(string: presentationData.strings.Wallet_Send_Confirmation, font: Font.semibold(17.0), textColor: presentationData.theme.actionSheet.primaryTextColor) + let title = NSAttributedString(string: presentationData.strings.Wallet_Send_Confirmation, font: Font.semibold(17.0), textColor: presentationData.theme.list.itemPrimaryTextColor) let address = state.address[state.address.startIndex.. Void)? - let controller = richTextAlertController(context: context, title: title, text: attributedText, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Common_Cancel, action: { + let theme = context.presentationData.theme + let controller = richTextAlertController(alertContext: AlertControllerContext(theme: theme.alert, themeSignal: .single(theme.alert)), title: title, text: attributedText, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Wallet_Navigation_Cancel, action: { dismissAlertImpl?(true) }), TextAlertAction(type: .defaultAction, title: presentationData.strings.Wallet_Send_ConfirmationConfirm, action: { dismissAlertImpl?(false) dismissInputImpl?() - let presentationData = context.sharedContext.currentPresentationData.with { $0 } + let presentationData = context.presentationData let progressSignal = Signal { subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: nil)) + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) presentControllerImpl?(controller, nil) return ActionDisposable { [weak controller] in Queue.mainQueue().async() { @@ -414,7 +403,7 @@ public func walletSendScreen(context: AccountContext, tonContext: TonContext, ra |> deliverOnMainQueue).start(next: { serverSalt in if let serverSalt = serverSalt { if let commentData = state.comment.data(using: .utf8) { - pushImpl?(WalletSplashScreen(context: context, tonContext: tonContext, mode: .sending(walletInfo, state.address, amount, commentData, randomId, serverSalt), walletCreatedPreloadState: nil)) + pushImpl?(WalletSplashScreen(context: context, mode: .sending(walletInfo, state.address, amount, commentData, randomId, serverSalt), walletCreatedPreloadState: nil)) } } }) @@ -430,7 +419,7 @@ public func walletSendScreen(context: AccountContext, tonContext: TonContext, ra } }) - let walletState: Signal = getCombinedWalletState(postbox: context.account.postbox, subject: .wallet(walletInfo), tonInstance: tonContext.instance, onlyCached: true) + let walletState: Signal = getCombinedWalletState(postbox: context.postbox, subject: .wallet(walletInfo), tonInstance: context.tonInstance, onlyCached: true) |> map { combinedState in var state: WalletState? switch combinedState { @@ -444,7 +433,7 @@ public func walletSendScreen(context: AccountContext, tonContext: TonContext, ra |> `catch` { _ -> Signal in return .single(nil) |> then( - getCombinedWalletState(postbox: context.account.postbox, subject: .wallet(walletInfo), tonInstance: tonContext.instance, onlyCached: false) + getCombinedWalletState(postbox: context.postbox, subject: .wallet(walletInfo), tonInstance: context.tonInstance, onlyCached: false) |> map { combinedState -> WalletState? in var state: WalletState? switch combinedState { @@ -468,9 +457,9 @@ public func walletSendScreen(context: AccountContext, tonContext: TonContext, ra focusItemTag = WalletSendScreenEntryTag.amount } - let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, walletState, statePromise.get()) + let signal = combineLatest(queue: .mainQueue(), .single(context.presentationData), walletState, statePromise.get()) |> map { presentationData, walletState, state -> (ItemListControllerState, (ItemListNodeState, Any)) in - let leftNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Common_Cancel), style: .regular, enabled: true, action: { + let leftNavigationButton = ItemListNavigationButton(content: .text(presentationData.strings.Wallet_Navigation_Cancel), style: .regular, enabled: true, action: { dismissImpl?() }) @@ -491,13 +480,13 @@ public func walletSendScreen(context: AccountContext, tonContext: TonContext, ra emptyItem = ItemListLoadingIndicatorEmptyStateItem(theme: presentationData.theme) } - let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.Wallet_Send_Title), leftNavigationButton: leftNavigationButton, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: false) + let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.Wallet_Send_Title), leftNavigationButton: leftNavigationButton, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Wallet_Navigation_Back), animateChanges: false) let listState = ItemListNodeState(entries: walletSendScreenEntries(presentationData: presentationData, balance: walletState?.balance, state: state), style: .blocks, focusItemTag: focusItemTag, emptyStateItem: emptyItem, animateChanges: false) return (controllerState, (listState, arguments)) } - let controller = WalletSendScreenImpl(context: context, state: signal) + let controller = WalletSendScreenImpl(theme: context.presentationData.theme, strings: context.presentationData.strings, updatedPresentationData: .single((context.presentationData.theme, context.presentationData.strings)), state: signal, tabBarItem: nil) controller.navigationPresentation = .modal controller.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait) presentControllerImpl = { [weak controller] c, a in diff --git a/submodules/WalletUI/Sources/WalletSettingsScreen.swift b/submodules/WalletUI/Sources/WalletSettingsScreen.swift index aac546e85c..43ab4bd2f5 100644 --- a/submodules/WalletUI/Sources/WalletSettingsScreen.swift +++ b/submodules/WalletUI/Sources/WalletSettingsScreen.swift @@ -1,8 +1,6 @@ import Foundation import UIKit import AppBundle -import AccountContext -import TelegramPresentationData import AsyncDisplayKit import Display import Postbox @@ -11,7 +9,6 @@ import SolidRoundedButtonNode import AnimationUI import SwiftSignalKit import OverlayStatusController -import ItemListUI private final class WalletSettingsControllerArguments { let exportWallet: () -> Void @@ -29,9 +26,9 @@ private enum WalletSettingsSection: Int32 { } private enum WalletSettingsEntry: ItemListNodeEntry { - case exportWallet(PresentationTheme, String) - case deleteWallet(PresentationTheme, String) - case deleteWalletInfo(PresentationTheme, String) + case exportWallet(WalletTheme, String) + case deleteWallet(WalletTheme, String) + case deleteWalletInfo(WalletTheme, String) var section: ItemListSectionId { switch self { @@ -77,7 +74,7 @@ private enum WalletSettingsEntry: ItemListNodeEntry { private struct WalletSettingsControllerState: Equatable { } -private func walletSettingsControllerEntries(presentationData: PresentationData, state: WalletSettingsControllerState) -> [WalletSettingsEntry] { +private func walletSettingsControllerEntries(presentationData: WalletPresentationData, state: WalletSettingsControllerState) -> [WalletSettingsEntry] { var entries: [WalletSettingsEntry] = [] entries.append(.exportWallet(presentationData.theme, "Export Wallet")) @@ -88,7 +85,7 @@ private func walletSettingsControllerEntries(presentationData: PresentationData, return entries } -public func walletSettingsController(context: AccountContext, tonContext: TonContext, walletInfo: WalletInfo) -> ViewController { +public func walletSettingsController(context: WalletContext, walletInfo: WalletInfo) -> ViewController { let statePromise = ValuePromise(WalletSettingsControllerState(), ignoreRepeated: true) let stateValue = Atomic(value: WalletSettingsControllerState()) let updateState: ((WalletSettingsControllerState) -> WalletSettingsControllerState) -> Void = { f in @@ -102,17 +99,17 @@ public func walletSettingsController(context: AccountContext, tonContext: TonCon var replaceAllWalletControllersImpl: ((ViewController) -> Void)? let arguments = WalletSettingsControllerArguments(exportWallet: { - let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: nil)) + let presentationData = context.presentationData + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) presentControllerImpl?(controller, nil) - let _ = (tonContext.keychain.decrypt(walletInfo.encryptedSecret) + let _ = (context.keychain.decrypt(walletInfo.encryptedSecret) |> deliverOnMainQueue).start(next: { [weak controller] decryptedSecret in - let _ = (getServerWalletSalt(network: context.account.network) + let _ = (getServerWalletSalt(network: context.network) |> deliverOnMainQueue).start(next: { serverSalt in - let _ = (walletRestoreWords(tonInstance: tonContext.instance, publicKey: walletInfo.publicKey, decryptedSecret: decryptedSecret, localPassword: serverSalt) + let _ = (walletRestoreWords(tonInstance: context.tonInstance, publicKey: walletInfo.publicKey, decryptedSecret: decryptedSecret, localPassword: serverSalt) |> deliverOnMainQueue).start(next: { [weak controller] wordList in controller?.dismiss() - pushControllerImpl?(WalletWordDisplayScreen(context: context, tonContext: tonContext, walletInfo: walletInfo, wordList: wordList, mode: .export, walletCreatedPreloadState: nil)) + pushControllerImpl?(WalletWordDisplayScreen(context: context, walletInfo: walletInfo, wordList: wordList, mode: .export, walletCreatedPreloadState: nil)) }, error: { [weak controller] _ in controller?.dismiss() }) @@ -123,33 +120,33 @@ public func walletSettingsController(context: AccountContext, tonContext: TonCon controller?.dismiss() }) }, deleteWallet: { - let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let actionSheet = ActionSheetController(presentationTheme: presentationData.theme) + let presentationData = context.presentationData + let actionSheet = ActionSheetController(theme: presentationData.theme.actionSheet) actionSheet.setItemGroups([ActionSheetItemGroup(items: [ ActionSheetTextItem(title: presentationData.strings.Wallet_Settings_DeleteWalletInfo), ActionSheetButtonItem(title: presentationData.strings.Wallet_Settings_DeleteWallet, color: .destructive, action: { [weak actionSheet] in actionSheet?.dismissAnimated() - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: nil)) + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) presentControllerImpl?(controller, nil) - let _ = (deleteAllLocalWalletsData(postbox: context.account.postbox, network: context.account.network, tonInstance: tonContext.instance) + let _ = (deleteAllLocalWalletsData(postbox: context.postbox, network: context.network, tonInstance: context.tonInstance) |> deliverOnMainQueue).start(error: { [weak controller] _ in controller?.dismiss() }, completed: { [weak controller] in controller?.dismiss() - replaceAllWalletControllersImpl?(WalletSplashScreen(context: context, tonContext: tonContext, mode: .intro, walletCreatedPreloadState: nil)) + replaceAllWalletControllersImpl?(WalletSplashScreen(context: context, mode: .intro, walletCreatedPreloadState: nil)) }) }) ]), ActionSheetItemGroup(items: [ - ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in + ActionSheetButtonItem(title: presentationData.strings.Wallet_Navigation_Cancel, color: .accent, action: { [weak actionSheet] in actionSheet?.dismissAnimated() }) ])]) presentControllerImpl?(actionSheet, nil) }) - let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, statePromise.get()) + let signal = combineLatest(queue: .mainQueue(), .single(context.presentationData), statePromise.get()) |> map { presentationData, state -> (ItemListControllerState, (ItemListNodeState, Any)) in - let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.Wallet_Settings_Title), leftNavigationButton: nil, rightNavigationButton: nil, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: false) + let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.Wallet_Settings_Title), leftNavigationButton: nil, rightNavigationButton: nil, backNavigationButton: ItemListBackButton(title: presentationData.strings.Wallet_Navigation_Back), animateChanges: false) let listState = ItemListNodeState(entries: walletSettingsControllerEntries(presentationData: presentationData, state: state), style: .blocks, animateChanges: false) return (controllerState, (listState, arguments)) @@ -157,7 +154,7 @@ public func walletSettingsController(context: AccountContext, tonContext: TonCon |> afterDisposed { } - let controller = ItemListController(context: context, state: signal) + let controller = ItemListController(theme: context.presentationData.theme, strings: context.presentationData.strings, updatedPresentationData: .single((context.presentationData.theme, context.presentationData.strings)), state: signal, tabBarItem: nil) controller.navigationPresentation = .modal controller.enableInteractiveDismiss = true dismissImpl = { [weak controller] in diff --git a/submodules/WalletUI/Sources/WalletSplashScreen.swift b/submodules/WalletUI/Sources/WalletSplashScreen.swift index 69d255ccce..e08a4e820f 100644 --- a/submodules/WalletUI/Sources/WalletSplashScreen.swift +++ b/submodules/WalletUI/Sources/WalletSplashScreen.swift @@ -1,8 +1,6 @@ import Foundation import UIKit import AppBundle -import AccountContext -import TelegramPresentationData import AsyncDisplayKit import Display import Postbox @@ -11,7 +9,6 @@ import SolidRoundedButtonNode import AnimationUI import SwiftSignalKit import OverlayStatusController -import ItemListUI import AlertUI import TextFormat import LocalAuth @@ -33,22 +30,20 @@ public enum WalletSplashMode { } public final class WalletSplashScreen: ViewController { - private let context: AccountContext - private let tonContext: TonContext - private var presentationData: PresentationData + private let context: WalletContext + private var presentationData: WalletPresentationData private var mode: WalletSplashMode private let walletCreatedPreloadState: Promise? - public init(context: AccountContext, tonContext: TonContext, mode: WalletSplashMode, walletCreatedPreloadState: Promise?) { + public init(context: WalletContext, mode: WalletSplashMode, walletCreatedPreloadState: Promise?) { self.context = context - self.tonContext = tonContext self.mode = mode - self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + self.presentationData = context.presentationData - let defaultNavigationPresentationData = NavigationBarPresentationData(presentationTheme: self.presentationData.theme, presentationStrings: self.presentationData.strings) - let navigationBarTheme = NavigationBarTheme(buttonColor: defaultNavigationPresentationData.theme.buttonColor, disabledButtonColor: defaultNavigationPresentationData.theme.disabledButtonColor, primaryTextColor: defaultNavigationPresentationData.theme.primaryTextColor, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: defaultNavigationPresentationData.theme.badgeBackgroundColor, badgeStrokeColor: defaultNavigationPresentationData.theme.badgeStrokeColor, badgeTextColor: defaultNavigationPresentationData.theme.badgeTextColor) + let defaultTheme = self.presentationData.theme.navigationBar + let navigationBarTheme = NavigationBarTheme(buttonColor: defaultTheme.buttonColor, disabledButtonColor: defaultTheme.disabledButtonColor, primaryTextColor: defaultTheme.primaryTextColor, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: defaultTheme.badgeBackgroundColor, badgeStrokeColor: defaultTheme.badgeStrokeColor, badgeTextColor: defaultTheme.badgeTextColor) switch mode { case let .created(walletInfo, _): @@ -56,7 +51,7 @@ public final class WalletSplashScreen: ViewController { self.walletCreatedPreloadState = walletCreatedPreloadState } else { self.walletCreatedPreloadState = Promise() - self.walletCreatedPreloadState?.set(getCombinedWalletState(postbox: context.account.postbox, subject: .wallet(walletInfo), tonInstance: tonContext.instance) + self.walletCreatedPreloadState?.set(getCombinedWalletState(postbox: context.postbox, subject: .wallet(walletInfo), tonInstance: context.tonInstance) |> map(Optional.init) |> `catch` { _ -> Signal in return .single(nil) @@ -67,7 +62,7 @@ public final class WalletSplashScreen: ViewController { self.walletCreatedPreloadState = walletCreatedPreloadState } else { self.walletCreatedPreloadState = Promise() - self.walletCreatedPreloadState?.set(getCombinedWalletState(postbox: context.account.postbox, subject: .wallet(walletInfo), tonInstance: tonContext.instance) + self.walletCreatedPreloadState?.set(getCombinedWalletState(postbox: context.postbox, subject: .wallet(walletInfo), tonInstance: context.tonInstance) |> map(Optional.init) |> `catch` { _ -> Signal in return .single(nil) @@ -77,9 +72,9 @@ public final class WalletSplashScreen: ViewController { self.walletCreatedPreloadState = nil } - super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: navigationBarTheme, strings: defaultNavigationPresentationData.strings)) + super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: navigationBarTheme, strings: NavigationBarStrings(back: self.presentationData.strings.Wallet_Navigation_Back, close: self.presentationData.strings.Wallet_Navigation_Close))) - self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style + self.statusBar.statusBarStyle = self.presentationData.theme.statusBarStyle self.navigationPresentation = .modalInLargeLayout self.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait) self.navigationBar?.intrinsicCanTransitionInline = false @@ -90,7 +85,7 @@ public final class WalletSplashScreen: ViewController { self.navigationItem.setRightBarButton(UIBarButtonItem(title: self.presentationData.strings.Wallet_Intro_ImportExisting, style: .plain, target: self, action: #selector(self.importPressed)), animated: false) case let .sending(walletInfo, address, amount, textMessage, randomId, serverSalt): self.navigationItem.setLeftBarButton(UIBarButtonItem(customDisplayNode: ASDisplayNode())!, animated: false) - let _ = (self.tonContext.keychain.decrypt(walletInfo.encryptedSecret) + let _ = (self.context.keychain.decrypt(walletInfo.encryptedSecret) |> deliverOnMainQueue).start(next: { [weak self] decryptedSecret in guard let strongSelf = self else { return @@ -104,7 +99,8 @@ public final class WalletSplashScreen: ViewController { strongSelf.dismiss() } else { let text = strongSelf.presentationData.strings.Wallet_Send_ErrorDecryptionFailed - let controller = textAlertController(context: strongSelf.context, title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: { + let theme = strongSelf.context.presentationData.theme + let controller = textAlertController(alertContext: AlertControllerContext(theme: theme.alert, themeSignal: .single(theme.alert)), title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Wallet_Alert_OK, action: { self?.dismiss() })]) strongSelf.present(controller, in: .window(.root)) @@ -119,7 +115,7 @@ public final class WalletSplashScreen: ViewController { break } - self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_Back, style: .plain, target: nil, action: nil) + self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Wallet_Navigation_Back, style: .plain, target: nil, action: nil) } required init(coder aDecoder: NSCoder) { @@ -131,11 +127,11 @@ public final class WalletSplashScreen: ViewController { } @objc private func importPressed() { - self.push(WalletWordCheckScreen(context: self.context, tonContext: self.tonContext, mode: .import, walletCreatedPreloadState: nil)) + self.push(WalletWordCheckScreen(context: self.context, mode: .import, walletCreatedPreloadState: nil)) } private func sendGrams(walletInfo: WalletInfo, decryptedSecret: Data, address: String, amount: Int64, textMessage: Data, forceIfDestinationNotInitialized: Bool, randomId: Int64, serverSalt: Data) { - let _ = (sendGramsFromWallet(postbox: self.context.account.postbox, network: self.context.account.network, tonInstance: self.tonContext.instance, walletInfo: walletInfo, decryptedSecret: decryptedSecret, localPassword: serverSalt, toAddress: address, amount: amount, textMessage: textMessage, forceIfDestinationNotInitialized: forceIfDestinationNotInitialized, timeout: 0, randomId: randomId) + let _ = (sendGramsFromWallet(postbox: self.context.postbox, network: self.context.network, tonInstance: self.context.tonInstance, walletInfo: walletInfo, decryptedSecret: decryptedSecret, localPassword: serverSalt, toAddress: address, amount: amount, textMessage: textMessage, forceIfDestinationNotInitialized: forceIfDestinationNotInitialized, timeout: 0, randomId: randomId) |> deliverOnMainQueue).start(error: { [weak self] error in guard let strongSelf = self else { return @@ -144,7 +140,7 @@ public final class WalletSplashScreen: ViewController { let text: String switch error { case .generic: - text = strongSelf.presentationData.strings.Login_UnknownError + text = strongSelf.presentationData.strings.Wallet_UnknownError case .network: title = strongSelf.presentationData.strings.Wallet_Send_NetworkErrorTitle text = strongSelf.presentationData.strings.Wallet_Send_NetworkErrorText @@ -152,7 +148,7 @@ public final class WalletSplashScreen: ViewController { title = strongSelf.presentationData.strings.Wallet_Send_ErrorNotEnoughFundsTitle text = strongSelf.presentationData.strings.Wallet_Send_ErrorNotEnoughFundsText case .messageTooLong: - text = strongSelf.presentationData.strings.Login_UnknownError + text = strongSelf.presentationData.strings.Wallet_UnknownError case .invalidAddress: text = strongSelf.presentationData.strings.Wallet_Send_ErrorInvalidAddress case .secretDecryptionFailed: @@ -160,8 +156,9 @@ public final class WalletSplashScreen: ViewController { case .destinationIsNotInitialized: if !forceIfDestinationNotInitialized { text = strongSelf.presentationData.strings.Wallet_Send_UninitializedText - let controller = textAlertController(context: strongSelf.context, title: strongSelf.presentationData.strings.Wallet_Send_UninitializedTitle, text: text, actions: [ - TextAlertAction(type: .genericAction, title: strongSelf.presentationData.strings.Common_Cancel, action: { + let theme = strongSelf.context.presentationData.theme + let controller = textAlertController(alertContext: AlertControllerContext(theme: theme.alert, themeSignal: .single(theme.alert)), title: strongSelf.presentationData.strings.Wallet_Send_UninitializedTitle, text: text, actions: [ + TextAlertAction(type: .genericAction, title: strongSelf.presentationData.strings.Wallet_Navigation_Cancel, action: { if let navigationController = strongSelf.navigationController as? NavigationController { navigationController.popViewController(animated: true) } @@ -173,10 +170,11 @@ public final class WalletSplashScreen: ViewController { strongSelf.present(controller, in: .window(.root)) return } else { - text = strongSelf.presentationData.strings.Login_UnknownError + text = strongSelf.presentationData.strings.Wallet_UnknownError } } - let controller = textAlertController(context: strongSelf.context, title: title, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: { + let theme = strongSelf.presentationData.theme + let controller = textAlertController(alertContext: AlertControllerContext(theme: theme.alert, themeSignal: .single(theme.alert)), title: title, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Wallet_Alert_OK, action: { if let navigationController = strongSelf.navigationController as? NavigationController { navigationController.popViewController(animated: true) } @@ -187,7 +185,7 @@ public final class WalletSplashScreen: ViewController { return } if let navigationController = strongSelf.navigationController as? NavigationController { - let _ = (walletAddress(publicKey: walletInfo.publicKey, tonInstance: strongSelf.tonContext.instance) + let _ = (walletAddress(publicKey: walletInfo.publicKey, tonInstance: strongSelf.context.tonInstance) |> deliverOnMainQueue).start(next: { [weak self] address in guard let strongSelf = self else { return @@ -195,14 +193,14 @@ public final class WalletSplashScreen: ViewController { var controllers: [UIViewController] = [] for controller in navigationController.viewControllers { if let controller = controller as? WalletInfoScreen { - let infoScreen = WalletInfoScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, walletInfo: walletInfo, address: address, enableDebugActions: false) + let infoScreen = WalletInfoScreen(context: strongSelf.context, walletInfo: walletInfo, address: address, enableDebugActions: false) infoScreen.navigationPresentation = controller.navigationPresentation controllers.append(infoScreen) } else { controllers.append(controller) } } - controllers.append(WalletSplashScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, mode: .sent(walletInfo, amount), walletCreatedPreloadState: nil)) + controllers.append(WalletSplashScreen(context: strongSelf.context, mode: .sent(walletInfo, amount), walletCreatedPreloadState: nil)) strongSelf.view.endEditing(true) navigationController.setViewControllers(controllers, animated: true) }) @@ -211,33 +209,33 @@ public final class WalletSplashScreen: ViewController { } override public func loadDisplayNode() { - self.displayNode = WalletSplashScreenNode(account: self.context.account, presentationData: self.presentationData, mode: self.mode, action: { [weak self] in + self.displayNode = WalletSplashScreenNode(context: self.context, presentationData: self.presentationData, mode: self.mode, action: { [weak self] in guard let strongSelf = self else { return } switch strongSelf.mode { case .intro: - let controller = OverlayStatusController(theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, type: .loading(cancelled: nil)) + let controller = OverlayStatusController(theme: strongSelf.presentationData.theme, type: .loading(cancelled: nil)) let displayError: () -> Void = { guard let strongSelf = self else { return } controller.dismiss() - strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: strongSelf.presentationData.strings.Wallet_Intro_CreateErrorTitle, text: strongSelf.presentationData.strings.Wallet_Intro_CreateErrorText, actions: [ - TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: { + strongSelf.present(standardTextAlertController(theme: strongSelf.presentationData.theme.alert, title: strongSelf.presentationData.strings.Wallet_Intro_CreateErrorTitle, text: strongSelf.presentationData.strings.Wallet_Intro_CreateErrorText, actions: [ + TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Wallet_Alert_OK, action: { }) ], actionLayout: .vertical), in: .window(.root)) } strongSelf.present(controller, in: .window(.root)) - let _ = (getServerWalletSalt(network: strongSelf.context.account.network) + let _ = (getServerWalletSalt(network: strongSelf.context.network) |> deliverOnMainQueue).start(next: { serverSalt in - let _ = (createWallet(postbox: strongSelf.context.account.postbox, tonInstance: strongSelf.tonContext.instance, keychain: strongSelf.tonContext.keychain, localPassword: serverSalt) + let _ = (createWallet(postbox: strongSelf.context.postbox, tonInstance: strongSelf.context.tonInstance, keychain: strongSelf.context.keychain, localPassword: serverSalt) |> deliverOnMainQueue).start(next: { walletInfo, wordList in guard let strongSelf = self else { return } controller.dismiss() - (strongSelf.navigationController as? NavigationController)?.replaceController(strongSelf, with: WalletSplashScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, mode: .created(walletInfo, wordList), walletCreatedPreloadState: nil), animated: true) + (strongSelf.navigationController as? NavigationController)?.replaceController(strongSelf, with: WalletSplashScreen(context: strongSelf.context, mode: .created(walletInfo, wordList), walletCreatedPreloadState: nil), animated: true) }, error: { _ in displayError() }) @@ -246,18 +244,17 @@ public final class WalletSplashScreen: ViewController { }) case let .created(walletInfo, wordList): if let wordList = wordList { - strongSelf.push(WalletWordDisplayScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, walletInfo: walletInfo, wordList: wordList, mode: .check, walletCreatedPreloadState: strongSelf.walletCreatedPreloadState)) + strongSelf.push(WalletWordDisplayScreen(context: strongSelf.context, walletInfo: walletInfo, wordList: wordList, mode: .check, walletCreatedPreloadState: strongSelf.walletCreatedPreloadState)) } else { - let controller = OverlayStatusController(theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, type: .loading(cancelled: nil)) + let controller = OverlayStatusController(theme: strongSelf.presentationData.theme, type: .loading(cancelled: nil)) strongSelf.present(controller, in: .window(.root)) let context = strongSelf.context - let tonContext = strongSelf.tonContext - let _ = (strongSelf.tonContext.keychain.decrypt(walletInfo.encryptedSecret) + let _ = (strongSelf.context.keychain.decrypt(walletInfo.encryptedSecret) |> deliverOnMainQueue).start(next: { [weak controller] decryptedSecret in - let _ = (getServerWalletSalt(network: context.account.network) + let _ = (getServerWalletSalt(network: context.network) |> deliverOnMainQueue).start(next: { [weak controller] serverSalt in - let _ = (walletRestoreWords(tonInstance: tonContext.instance, publicKey: walletInfo.publicKey, decryptedSecret: decryptedSecret, localPassword: serverSalt) + let _ = (walletRestoreWords(tonInstance: context.tonInstance, publicKey: walletInfo.publicKey, decryptedSecret: decryptedSecret, localPassword: serverSalt) |> deliverOnMainQueue).start(next: { wordList in controller?.dismiss() @@ -266,7 +263,7 @@ public final class WalletSplashScreen: ViewController { } strongSelf.mode = .created(walletInfo, wordList) - strongSelf.push(WalletWordDisplayScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, walletInfo: walletInfo, wordList: wordList, mode: .check, walletCreatedPreloadState: strongSelf.walletCreatedPreloadState)) + strongSelf.push(WalletWordDisplayScreen(context: strongSelf.context, walletInfo: walletInfo, wordList: wordList, mode: .check, walletCreatedPreloadState: strongSelf.walletCreatedPreloadState)) }, error: { _ in guard let strongSelf = self else { return @@ -274,8 +271,8 @@ public final class WalletSplashScreen: ViewController { controller?.dismiss() - strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: strongSelf.presentationData.strings.Wallet_Created_ExportErrorTitle, text: strongSelf.presentationData.strings.Wallet_Created_ExportErrorText, actions: [ - TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: { + strongSelf.present(standardTextAlertController(theme: strongSelf.presentationData.theme.alert, title: strongSelf.presentationData.strings.Wallet_Created_ExportErrorTitle, text: strongSelf.presentationData.strings.Wallet_Created_ExportErrorText, actions: [ + TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Wallet_Alert_OK, action: { }) ], actionLayout: .vertical), in: .window(.root)) }) @@ -286,8 +283,8 @@ public final class WalletSplashScreen: ViewController { controller?.dismiss() - strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: strongSelf.presentationData.strings.Wallet_Created_ExportErrorTitle, text: strongSelf.presentationData.strings.Wallet_Created_ExportErrorText, actions: [ - TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: { + strongSelf.present(standardTextAlertController(theme: strongSelf.presentationData.theme.alert, title: strongSelf.presentationData.strings.Wallet_Created_ExportErrorTitle, text: strongSelf.presentationData.strings.Wallet_Created_ExportErrorText, actions: [ + TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Wallet_Alert_OK, action: { }) ], actionLayout: .vertical), in: .window(.root)) }) @@ -295,15 +292,15 @@ public final class WalletSplashScreen: ViewController { controller?.dismiss() if case .cancelled = error { } else { - strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: strongSelf.presentationData.strings.Wallet_Created_ExportErrorTitle, text: strongSelf.presentationData.strings.Wallet_Created_ExportErrorText, actions: [ - TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: { + strongSelf.present(standardTextAlertController(theme: strongSelf.presentationData.theme.alert, title: strongSelf.presentationData.strings.Wallet_Created_ExportErrorTitle, text: strongSelf.presentationData.strings.Wallet_Created_ExportErrorText, actions: [ + TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Wallet_Alert_OK, action: { }) ], actionLayout: .vertical), in: .window(.root)) } }) } case let .success(walletInfo): - let _ = (walletAddress(publicKey: walletInfo.publicKey, tonInstance: strongSelf.tonContext.instance) + let _ = (walletAddress(publicKey: walletInfo.publicKey, tonInstance: strongSelf.context.tonInstance) |> deliverOnMainQueue).start(next: { address in guard let strongSelf = self else { return @@ -330,7 +327,7 @@ public final class WalletSplashScreen: ViewController { let presentationData = strongSelf.presentationData let progressSignal = Signal { subscriber in - let controller = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: nil)) + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) self?.present(controller, in: .window(.root)) return ActionDisposable { [weak controller] in Queue.mainQueue().async() { @@ -369,7 +366,7 @@ public final class WalletSplashScreen: ViewController { } return true } - controllers.append(WalletInfoScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, walletInfo: walletInfo, address: address, enableDebugActions: false)) + controllers.append(WalletInfoScreen(context: strongSelf.context, walletInfo: walletInfo, address: address, enableDebugActions: false)) strongSelf.view.endEditing(true) navigationController.setViewControllers(controllers, animated: true) } @@ -394,14 +391,14 @@ public final class WalletSplashScreen: ViewController { return true } - let _ = (walletAddress(publicKey: walletInfo.publicKey, tonInstance: strongSelf.tonContext.instance) + let _ = (walletAddress(publicKey: walletInfo.publicKey, tonInstance: strongSelf.context.tonInstance) |> deliverOnMainQueue).start(next: { [weak self] address in guard let strongSelf = self else { return } if !controllers.contains(where: { $0 is WalletInfoScreen }) { - let infoScreen = WalletInfoScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, walletInfo: walletInfo, address: address, enableDebugActions: false) + let infoScreen = WalletInfoScreen(context: strongSelf.context, walletInfo: walletInfo, address: address, enableDebugActions: false) infoScreen.navigationPresentation = .modal controllers.append(infoScreen) } @@ -424,7 +421,7 @@ public final class WalletSplashScreen: ViewController { } return true } - controllers.append(WalletSplashScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, mode: .intro, walletCreatedPreloadState: nil)) + controllers.append(WalletSplashScreen(context: strongSelf.context, mode: .intro, walletCreatedPreloadState: nil)) strongSelf.view.endEditing(true) navigationController.setViewControllers(controllers, animated: true) } @@ -437,7 +434,7 @@ public final class WalletSplashScreen: ViewController { case .notAvailable: strongSelf.dismiss() case .changed: - strongSelf.push(WalletWordCheckScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, mode: .import, walletCreatedPreloadState: nil)) + strongSelf.push(WalletWordCheckScreen(context: strongSelf.context, mode: .import, walletCreatedPreloadState: nil)) } } }, secondaryAction: { [weak self] in @@ -460,12 +457,12 @@ public final class WalletSplashScreen: ViewController { } return true } - controllers.append(WalletSplashScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, mode: .intro, walletCreatedPreloadState: nil)) + controllers.append(WalletSplashScreen(context: strongSelf.context, mode: .intro, walletCreatedPreloadState: nil)) strongSelf.view.endEditing(true) navigationController.setViewControllers(controllers, animated: true) } default: - strongSelf.push(WalletWordCheckScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, mode: .import, walletCreatedPreloadState: nil)) + strongSelf.push(WalletWordCheckScreen(context: strongSelf.context, mode: .import, walletCreatedPreloadState: nil)) } }, openTerms: { [weak self] in guard let strongSelf = self else { @@ -475,7 +472,7 @@ public final class WalletSplashScreen: ViewController { if url.isEmpty { url = "https://telegram.org/tos/wallet" } - strongSelf.context.sharedContext.openExternalUrl(context: strongSelf.context, urlContext: .generic, url: url, forceExternal: true, presentationData: strongSelf.presentationData, navigationController: strongSelf.navigationController as? NavigationController, dismissInput: {}) + strongSelf.context.openUrl(url) }) self.displayNodeDidLoad() @@ -489,7 +486,7 @@ public final class WalletSplashScreen: ViewController { } private final class WalletSplashScreenNode: ViewControllerTracingNode { - private var presentationData: PresentationData + private var presentationData: WalletPresentationData private let mode: WalletSplashMode private let secondaryAction: () -> Void @@ -511,7 +508,7 @@ private final class WalletSplashScreenNode: ViewControllerTracingNode { } } - init(account: Account, presentationData: PresentationData, mode: WalletSplashMode, action: @escaping () -> Void, secondaryAction: @escaping () -> Void, openTerms: @escaping () -> Void) { + init(context: WalletContext, presentationData: WalletPresentationData, mode: WalletSplashMode, action: @escaping () -> Void, secondaryAction: @escaping () -> Void, openTerms: @escaping () -> Void) { self.presentationData = presentationData self.mode = mode self.secondaryAction = secondaryAction @@ -542,7 +539,7 @@ private final class WalletSplashScreenNode: ViewControllerTracingNode { termsText = parseMarkdownIntoAttributedString(self.presentationData.strings.Wallet_Intro_Terms, attributes: MarkdownAttributes(body: body, bold: body, link: link, linkAttribute: { _ in nil }), textAlignment: .center) self.iconNode.image = nil if let path = getAppBundle().path(forResource: "WalletIntroLoading", ofType: "tgs") { - self.animationNode.setup(account: account, resource: .localFile(path), width: 248, height: 248, mode: .direct) + self.animationNode.setup(resource: .localFile(path), width: 248, height: 248, mode: .direct) self.animationSize = CGSize(width: 124.0, height: 124.0) self.animationNode.visibility = true } @@ -554,7 +551,7 @@ private final class WalletSplashScreenNode: ViewControllerTracingNode { termsText = NSAttributedString(string: "") self.iconNode.image = nil if let path = getAppBundle().path(forResource: "WalletCreated", ofType: "tgs") { - self.animationNode.setup(account: account, resource: .localFile(path), width: 250, height: 250, playbackMode: .once, mode: .direct) + self.animationNode.setup(resource: .localFile(path), width: 250, height: 250, playbackMode: .once, mode: .direct) self.animationSize = CGSize(width: 125.0, height: 125.0) self.animationNode.visibility = true } @@ -566,7 +563,7 @@ private final class WalletSplashScreenNode: ViewControllerTracingNode { termsText = NSAttributedString(string: "") self.iconNode.image = nil if let path = getAppBundle().path(forResource: "WalletDone", ofType: "tgs") { - self.animationNode.setup(account: account, resource: .localFile(path), width: 260, height: 260, playbackMode: .once, mode: .direct) + self.animationNode.setup(resource: .localFile(path), width: 260, height: 260, playbackMode: .once, mode: .direct) self.animationSize = CGSize(width: 130.0, height: 130.0) self.animationNode.visibility = true } @@ -578,7 +575,7 @@ private final class WalletSplashScreenNode: ViewControllerTracingNode { termsText = NSAttributedString(string: "") self.iconNode.image = nil if let path = getAppBundle().path(forResource: "WalletNotAvailable", ofType: "tgs") { - self.animationNode.setup(account: account, resource: .localFile(path), width: 260, height: 260, playbackMode: .once, mode: .direct) + self.animationNode.setup(resource: .localFile(path), width: 260, height: 260, playbackMode: .once, mode: .direct) self.animationSize = CGSize(width: 130.0, height: 130.0) self.animationNode.visibility = true } @@ -590,7 +587,7 @@ private final class WalletSplashScreenNode: ViewControllerTracingNode { termsText = NSAttributedString(string: "") self.iconNode.image = nil if let path = getAppBundle().path(forResource: "SendingGrams", ofType: "tgs") { - self.animationNode.setup(account: account, resource: .localFile(path), width: 260, height: 260, mode: .direct) + self.animationNode.setup(resource: .localFile(path), width: 260, height: 260, mode: .direct) self.animationSize = CGSize(width: 130.0, height: 130.0) self.animationNode.visibility = true } @@ -604,7 +601,7 @@ private final class WalletSplashScreenNode: ViewControllerTracingNode { termsText = NSAttributedString(string: "") self.iconNode.image = nil if let path = getAppBundle().path(forResource: "WalletDone", ofType: "tgs") { - self.animationNode.setup(account: account, resource: .localFile(path), width: 260, height: 260, playbackMode: .once, mode: .direct) + self.animationNode.setup(resource: .localFile(path), width: 260, height: 260, playbackMode: .once, mode: .direct) self.animationSize = CGSize(width: 130.0, height: 130.0) self.animationNode.visibility = true } @@ -612,11 +609,11 @@ private final class WalletSplashScreenNode: ViewControllerTracingNode { case .secureStorageNotAvailable: title = self.presentationData.strings.Wallet_SecureStorageNotAvailable_Title text = NSAttributedString(string: self.presentationData.strings.Wallet_SecureStorageNotAvailable_Text, font: textFont, textColor: textColor) - buttonText = self.presentationData.strings.Common_OK + buttonText = self.presentationData.strings.Wallet_Alert_OK termsText = NSAttributedString(string: "") self.iconNode.image = nil if let path = getAppBundle().path(forResource: "WalletKeyLock", ofType: "tgs") { - self.animationNode.setup(account: account, resource: .localFile(path), width: 280, height: 280, playbackMode: .once, mode: .direct) + self.animationNode.setup(resource: .localFile(path), width: 280, height: 280, playbackMode: .once, mode: .direct) self.animationSize = CGSize(width: 140.0, height: 140.0) self.animationNode.visibility = true } @@ -645,7 +642,7 @@ private final class WalletSplashScreenNode: ViewControllerTracingNode { string = self.presentationData.strings.Wallet_SecureStorageReset_PasscodeText } text = NSAttributedString(string: string, font: textFont, textColor: textColor) - buttonText = self.presentationData.strings.Common_OK + buttonText = self.presentationData.strings.Wallet_Alert_OK secondaryActionText = "" case .changed: let string: String @@ -661,7 +658,7 @@ private final class WalletSplashScreenNode: ViewControllerTracingNode { termsText = NSAttributedString(string: "") self.iconNode.image = nil if let path = getAppBundle().path(forResource: "WalletNotAvailable", ofType: "tgs") { - self.animationNode.setup(account: account, resource: .localFile(path), width: 260, height: 260, playbackMode: .once, mode: .direct) + self.animationNode.setup(resource: .localFile(path), width: 260, height: 260, playbackMode: .once, mode: .direct) self.animationSize = CGSize(width: 130.0, height: 130.0) self.animationNode.visibility = true } @@ -692,7 +689,7 @@ private final class WalletSplashScreenNode: ViewControllerTracingNode { self.secondaryActionButtonNode = HighlightTrackingButtonNode() - self.buttonNode = SolidRoundedButtonNode(title: buttonText, theme: SolidRoundedButtonTheme(theme: self.presentationData.theme), height: 50.0, cornerRadius: 10.0, gloss: false) + self.buttonNode = SolidRoundedButtonNode(title: buttonText, theme: SolidRoundedButtonTheme(backgroundColor: self.presentationData.theme.setup.buttonFillColor, foregroundColor: self.presentationData.theme.setup.buttonForegroundColor), height: 50.0, cornerRadius: 10.0, gloss: false) self.buttonNode.isHidden = buttonText.isEmpty super.init() diff --git a/submodules/WalletUI/Sources/WalletStrings.swift b/submodules/WalletUI/Sources/WalletStrings.swift new file mode 100644 index 0000000000..8e476626cd --- /dev/null +++ b/submodules/WalletUI/Sources/WalletStrings.swift @@ -0,0 +1,484 @@ +import Foundation +import AppBundle +import StringPluralization + +private let fallbackDict: [String: String] = { + guard let mainPath = getAppBundle().path(forResource: "en", ofType: "lproj"), let bundle = Bundle(path: mainPath) else { + return [:] + } + guard let path = bundle.path(forResource: "Localizable", ofType: "strings") else { + return [:] + } + guard let dict = NSDictionary(contentsOf: URL(fileURLWithPath: path)) as? [String: String] else { + return [:] + } + return dict +}() + +private extension PluralizationForm { + var canonicalSuffix: String { + switch self { + case .zero: + return "_0" + case .one: + return "_1" + case .two: + return "_2" + case .few: + return "_3_10" + case .many: + return "_many" + case .other: + return "_any" + } + } +} + +public final class WalletStringsComponent { + public let languageCode: String + public let localizedName: String + public let pluralizationRulesCode: String? + public let dict: [String: String] + + public init(languageCode: String, localizedName: String, pluralizationRulesCode: String?, dict: [String: String]) { + self.languageCode = languageCode + self.localizedName = localizedName + self.pluralizationRulesCode = pluralizationRulesCode + self.dict = dict + } +} + +private func getValue(_ primaryComponent: WalletStringsComponent, _ secondaryComponent: WalletStringsComponent?, _ key: String) -> String { + if let value = primaryComponent.dict[key] { + return value + } else if let secondaryComponent = secondaryComponent, let value = secondaryComponent.dict[key] { + return value + } else if let value = fallbackDict[key] { + return value + } else { + return key + } +} + +private func getValueWithForm(_ primaryComponent: WalletStringsComponent, _ secondaryComponent: WalletStringsComponent?, _ key: String, _ form: PluralizationForm) -> String { + let builtKey = key + form.canonicalSuffix + if let value = primaryComponent.dict[builtKey] { + return value + } else if let secondaryComponent = secondaryComponent, let value = secondaryComponent.dict[builtKey] { + return value + } else if let value = fallbackDict[builtKey] { + return value + } + return key +} + +private let argumentRegex = try! NSRegularExpression(pattern: "%(((\\d+)\\$)?)([@df])", options: []) +private func extractArgumentRanges(_ value: String) -> [(Int, NSRange)] { + var result: [(Int, NSRange)] = [] + let string = value as NSString + let matches = argumentRegex.matches(in: string as String, options: [], range: NSRange(location: 0, length: string.length)) + var index = 0 + for match in matches { + var currentIndex = index + if match.range(at: 3).location != NSNotFound { + currentIndex = Int(string.substring(with: match.range(at: 3)))! - 1 + } + result.append((currentIndex, match.range(at: 0))) + index += 1 + } + result.sort(by: { $0.1.location < $1.1.location }) + return result +} + +public func formatWithArgumentRanges(_ value: String, _ ranges: [(Int, NSRange)], _ arguments: [String]) -> (String, [(Int, NSRange)]) { + let string = value as NSString + + var resultingRanges: [(Int, NSRange)] = [] + + var currentLocation = 0 + + let result = NSMutableString() + for (index, range) in ranges { + if currentLocation < range.location { + result.append(string.substring(with: NSRange(location: currentLocation, length: range.location - currentLocation))) + } + resultingRanges.append((index, NSRange(location: result.length, length: (arguments[index] as NSString).length))) + result.append(arguments[index]) + currentLocation = range.location + range.length + } + if currentLocation != string.length { + result.append(string.substring(with: NSRange(location: currentLocation, length: string.length - currentLocation))) + } + return (result as String, resultingRanges) +} + +private final class DataReader { + private let data: Data + private var ptr: Int = 0 + + init(_ data: Data) { + self.data = data + } + + func readInt32() -> Int32 { + assert(self.ptr + 4 <= self.data.count) + let result = self.data.withUnsafeBytes { (bytes: UnsafePointer) -> Int32 in + var value: Int32 = 0 + memcpy(&value, bytes.advanced(by: self.ptr), 4) + return value + } + self.ptr += 4 + return result + } + + func readString() -> String { + let length = Int(self.readInt32()) + assert(self.ptr + length <= self.data.count) + let value = String(data: self.data.subdata(in: self.ptr ..< self.ptr + length), encoding: .utf8)! + self.ptr += length + return value + } +} + +private func loadMapping() -> ([Int], [String], [Int], [Int], [String]) { + guard let filePath = getAppBundle().path(forResource: "WalletStrings", ofType: "mapping") else { + fatalError() + } + guard let data = try? Data(contentsOf: URL(fileURLWithPath: filePath)) else { + fatalError() + } + + let reader = DataReader(data) + + let idCount = Int(reader.readInt32()) + var sIdList: [Int] = [] + var sKeyList: [String] = [] + var sArgIdList: [Int] = [] + for _ in 0 ..< idCount { + let id = Int(reader.readInt32()) + sIdList.append(id) + sKeyList.append(reader.readString()) + if reader.readInt32() != 0 { + sArgIdList.append(id) + } + } + + let pCount = Int(reader.readInt32()) + var pIdList: [Int] = [] + var pKeyList: [String] = [] + for _ in 0 ..< Int(pCount) { + pIdList.append(Int(reader.readInt32())) + pKeyList.append(reader.readString()) + } + + return (sIdList, sKeyList, sArgIdList, pIdList, pKeyList) +} + +private let keyMapping: ([Int], [String], [Int], [Int], [String]) = loadMapping() + +public final class WalletStrings: Equatable { + public let lc: UInt32 + + public let primaryComponent: WalletStringsComponent + public let secondaryComponent: WalletStringsComponent? + public let baseLanguageCode: String + public let groupingSeparator: String + + private let _s: [Int: String] + private let _r: [Int: [(Int, NSRange)]] + private let _ps: [Int: String] + public var Wallet_Updated_JustNow: String { return self._s[0]! } + public var Wallet_WordCheck_IncorrectText: String { return self._s[1]! } + public var Wallet_Month_ShortNovember: String { return self._s[2]! } + public var Wallet_Info_Send: String { return self._s[3]! } + public var Wallet_TransactionInfo_SendGrams: String { return self._s[4]! } + public func Wallet_Info_TransactionBlockchainFee(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[5]!, self._r[5]!, [_0]) + } + public var Wallet_Sent_Title: String { return self._s[6]! } + public var Wallet_Receive_ShareUrlInfo: String { return self._s[7]! } + public var Wallet_RestoreFailed_Title: String { return self._s[8]! } + public var Wallet_TransactionInfo_CopyAddress: String { return self._s[10]! } + public var Wallet_Send_NetworkErrorTitle: String { return self._s[11]! } + public var Wallet_Month_ShortJune: String { return self._s[12]! } + public var Wallet_TransactionInfo_StorageFeeInfo: String { return self._s[13]! } + public var Wallet_Created_Title: String { return self._s[14]! } + public var Wallet_Info_YourBalance: String { return self._s[15]! } + public var Wallet_TransactionInfo_CommentHeader: String { return self._s[16]! } + public var Wallet_TransactionInfo_OtherFeeHeader: String { return self._s[17]! } + public func Wallet_Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[18]!, self._r[18]!, [_1, _2, _3]) + } + public var Wallet_WordImport_IncorrectText: String { return self._s[19]! } + public var Wallet_Month_GenJanuary: String { return self._s[20]! } + public var Wallet_Receive_ShareAddress: String { return self._s[21]! } + public var Wallet_WordImport_Title: String { return self._s[22]! } + public var Wallet_TransactionInfo_Title: String { return self._s[23]! } + public var Wallet_Words_NotDoneText: String { return self._s[25]! } + public var Wallet_RestoreFailed_EnterWords: String { return self._s[26]! } + public var Wallet_WordImport_Text: String { return self._s[27]! } + public var Wallet_RestoreFailed_Text: String { return self._s[29]! } + public var Wallet_TransactionInfo_NoAddress: String { return self._s[30]! } + public var Wallet_Navigation_Back: String { return self._s[31]! } + public var Wallet_Intro_Terms: String { return self._s[32]! } + public func Wallet_Send_Balance(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[33]!, self._r[33]!, [_0]) + } + public func Wallet_Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[34]!, self._r[34]!, [_1, _2, _3]) + } + public var Wallet_TransactionInfo_AddressCopied: String { return self._s[35]! } + public func Wallet_Info_TransactionDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[36]!, self._r[36]!, [_1, _2, _3]) + } + public var Wallet_Send_NetworkErrorText: String { return self._s[37]! } + public var Wallet_VoiceOver_Editing_ClearText: String { return self._s[38]! } + public var Wallet_Intro_ImportExisting: String { return self._s[39]! } + public var Wallet_Receive_CommentInfo: String { return self._s[40]! } + public var Wallet_WordCheck_Continue: String { return self._s[41]! } + public var Wallet_Receive_InvoiceUrlCopied: String { return self._s[42]! } + public var Wallet_Completed_Text: String { return self._s[43]! } + public var Wallet_WordCheck_IncorrectHeader: String { return self._s[45]! } + public var Wallet_Receive_Title: String { return self._s[46]! } + public var Wallet_Info_WalletCreated: String { return self._s[47]! } + public var Wallet_Navigation_Cancel: String { return self._s[48]! } + public var Wallet_CreateInvoice_Title: String { return self._s[49]! } + public func Wallet_WordCheck_Text(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[50]!, self._r[50]!, [_1, _2, _3]) + } + public var Wallet_TransactionInfo_SenderHeader: String { return self._s[51]! } + public func Wallet_Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[52]!, self._r[52]!, [_1, _2, _3]) + } + public var Wallet_Month_GenAugust: String { return self._s[53]! } + public var Wallet_Info_UnknownTransaction: String { return self._s[54]! } + public var Wallet_Receive_CreateInvoice: String { return self._s[55]! } + public var Wallet_Month_GenSeptember: String { return self._s[56]! } + public var Wallet_Month_GenJuly: String { return self._s[57]! } + public var Wallet_Receive_AddressHeader: String { return self._s[58]! } + public var Wallet_Send_AmountText: String { return self._s[59]! } + public var Wallet_SecureStorageNotAvailable_Text: String { return self._s[60]! } + public func Wallet_Time_PreciseDate_m12(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[61]!, self._r[61]!, [_1, _2, _3]) + } + public func Wallet_Updated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[62]!, self._r[62]!, [_0]) + } + public var Wallet_Words_Title: String { return self._s[64]! } + public var Wallet_Month_ShortMay: String { return self._s[65]! } + public var Wallet_WordCheck_Title: String { return self._s[66]! } + public var Wallet_Words_NotDoneResponse: String { return self._s[67]! } + public var Wallet_Send_ErrorNotEnoughFundsText: String { return self._s[68]! } + public var Wallet_Receive_CreateInvoiceInfo: String { return self._s[69]! } + public func Wallet_Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[70]!, self._r[70]!, [_1, _2, _3]) + } + public var Wallet_Info_Address: String { return self._s[71]! } + public var Wallet_Intro_CreateWallet: String { return self._s[72]! } + public var Wallet_SecureStorageChanged_PasscodeText: String { return self._s[73]! } + public func Wallet_SecureStorageReset_BiometryText(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[74]!, self._r[74]!, [_0]) + } + public var Wallet_Send_SendAnyway: String { return self._s[75]! } + public var Wallet_UnknownError: String { return self._s[76]! } + public var Wallet_SecureStorageChanged_ImportWallet: String { return self._s[77]! } + public var Wallet_SecureStorageChanged_CreateWallet: String { return self._s[79]! } + public var Wallet_Words_NotDoneOk: String { return self._s[80]! } + public var Wallet_Intro_Title: String { return self._s[81]! } + public var Wallet_Info_Receive: String { return self._s[82]! } + public var Wallet_Completed_ViewWallet: String { return self._s[83]! } + public var Wallet_Month_ShortJuly: String { return self._s[84]! } + public var Wallet_Month_ShortApril: String { return self._s[85]! } + public func Wallet_Info_TransactionDateHeader(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[86]!, self._r[86]!, [_1, _2]) + } + public var Wallet_Receive_ShareInvoiceUrl: String { return self._s[87]! } + public func Wallet_Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[88]!, self._r[88]!, [_1, _2, _3]) + } + public var Wallet_Send_UninitializedText: String { return self._s[90]! } + public func Wallet_Sent_Text(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[91]!, self._r[91]!, [_0]) + } + public var Wallet_Month_GenNovember: String { return self._s[92]! } + public func Wallet_Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[93]!, self._r[93]!, [_1, _2, _3]) + } + public var Wallet_Month_GenApril: String { return self._s[94]! } + public var Wallet_Month_ShortMarch: String { return self._s[95]! } + public var Wallet_Month_GenFebruary: String { return self._s[96]! } + public var Wallet_Qr_ScanCode: String { return self._s[97]! } + public var Wallet_Receive_AddressCopied: String { return self._s[98]! } + public var Wallet_Send_UninitializedTitle: String { return self._s[99]! } + public var Wallet_Send_Send: String { return self._s[100]! } + public var Wallet_Info_RefreshErrorTitle: String { return self._s[101]! } + public var Wallet_Month_GenJune: String { return self._s[102]! } + public var Wallet_Send_AddressHeader: String { return self._s[103]! } + public var Wallet_SecureStorageReset_BiometryTouchId: String { return self._s[104]! } + public var Wallet_Send_Confirmation: String { return self._s[105]! } + public var Wallet_Completed_Title: String { return self._s[106]! } + public var Wallet_Alert_OK: String { return self._s[107]! } + public var Wallet_Settings_DeleteWallet: String { return self._s[108]! } + public var Wallet_SecureStorageReset_PasscodeText: String { return self._s[109]! } + public var Wallet_Month_ShortSeptember: String { return self._s[110]! } + public var Wallet_Info_TransactionTo: String { return self._s[111]! } + public var Wallet_Send_ConfirmationConfirm: String { return self._s[112]! } + public var Wallet_TransactionInfo_OtherFeeInfo: String { return self._s[113]! } + public var Wallet_Receive_AmountText: String { return self._s[114]! } + public var Wallet_Receive_CopyAddress: String { return self._s[115]! } + public var Wallet_Intro_Text: String { return self._s[117]! } + public func Wallet_SecureStorageChanged_BiometryText(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[118]!, self._r[118]!, [_0]) + } + public var Wallet_TransactionInfo_FeeInfoURL: String { return self._s[119]! } + public func Wallet_Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[120]!, self._r[120]!, [_1, _2, _3]) + } + public var Wallet_RestoreFailed_CreateWallet: String { return self._s[121]! } + public var Wallet_Weekday_Yesterday: String { return self._s[122]! } + public var Wallet_Receive_AmountHeader: String { return self._s[123]! } + public var Wallet_Month_ShortFebruary: String { return self._s[124]! } + public var Wallet_Alert_Cancel: String { return self._s[125]! } + public var Wallet_TransactionInfo_RecipientHeader: String { return self._s[126]! } + public var Wallet_Info_TransactionFrom: String { return self._s[127]! } + public var Wallet_Send_ErrorDecryptionFailed: String { return self._s[128]! } + public var Wallet_Words_NotDoneTitle: String { return self._s[129]! } + public var Wallet_Month_ShortOctober: String { return self._s[130]! } + public var Wallet_Month_GenMay: String { return self._s[131]! } + public var Wallet_Intro_CreateErrorTitle: String { return self._s[132]! } + public var Wallet_SecureStorageReset_BiometryFaceId: String { return self._s[133]! } + public var Wallet_Month_ShortJanuary: String { return self._s[134]! } + public var Wallet_Month_GenMarch: String { return self._s[135]! } + public var Wallet_Sending_Text: String { return self._s[136]! } + public var Wallet_Month_GenOctober: String { return self._s[137]! } + public var Wallet_Receive_CopyInvoiceUrl: String { return self._s[138]! } + public var Wallet_ContextMenuCopy: String { return self._s[139]! } + public func Wallet_Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[140]!, self._r[140]!, [_1, _2, _3]) + } + public var Wallet_Info_Updating: String { return self._s[142]! } + public var Wallet_Intro_TermsUrl: String { return self._s[143]! } + public var Wallet_Created_ExportErrorTitle: String { return self._s[144]! } + public var Wallet_SecureStorageNotAvailable_Title: String { return self._s[145]! } + public var Wallet_Sending_Title: String { return self._s[146]! } + public var Wallet_Navigation_Done: String { return self._s[147]! } + public var Wallet_Settings_Title: String { return self._s[148]! } + public var Wallet_Info_RefreshErrorNetworkText: String { return self._s[149]! } + public var Wallet_Weekday_Today: String { return self._s[151]! } + public var Wallet_Month_ShortDecember: String { return self._s[152]! } + public var Wallet_Words_Text: String { return self._s[153]! } + public var Wallet_WordCheck_ViewWords: String { return self._s[154]! } + public var Wallet_Send_AddressInfo: String { return self._s[155]! } + public func Wallet_Updated_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[156]!, self._r[156]!, [_0]) + } + public var Wallet_Intro_NotNow: String { return self._s[157]! } + public var Wallet_Navigation_Close: String { return self._s[158]! } + public var Wallet_Month_GenDecember: String { return self._s[160]! } + public var Wallet_Send_ErrorNotEnoughFundsTitle: String { return self._s[161]! } + public var Wallet_WordImport_IncorrectTitle: String { return self._s[162]! } + public var Wallet_Send_AddressText: String { return self._s[163]! } + public var Wallet_Receive_AmountInfo: String { return self._s[164]! } + public func Wallet_Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[165]!, self._r[165]!, [_1, _2, _3]) + } + public var Wallet_Month_ShortAugust: String { return self._s[166]! } + public var Wallet_Qr_Title: String { return self._s[167]! } + public var Wallet_WordCheck_TryAgain: String { return self._s[168]! } + public var Wallet_Info_TransactionPendingHeader: String { return self._s[169]! } + public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[170]! } + public var Wallet_Created_Text: String { return self._s[171]! } + public var Wallet_Created_Proceed: String { return self._s[172]! } + public var Wallet_Words_Done: String { return self._s[173]! } + public var Wallet_WordImport_Continue: String { return self._s[174]! } + public var Wallet_TransactionInfo_StorageFeeHeader: String { return self._s[175]! } + public var Wallet_WordImport_CanNotRemember: String { return self._s[176]! } + public func Wallet_Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[177]!, self._r[177]!, [_1, _2, _3]) + } + public func Wallet_Send_ConfirmationText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[178]!, self._r[178]!, [_1, _2]) + } + public var Wallet_Created_ExportErrorText: String { return self._s[180]! } + public func Wallet_Updated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[181]!, self._r[181]!, [_0]) + } + public var Wallet_Settings_DeleteWalletInfo: String { return self._s[182]! } + public var Wallet_Intro_CreateErrorText: String { return self._s[183]! } + public var Wallet_Sent_ViewWallet: String { return self._s[184]! } + public var Wallet_Send_ErrorInvalidAddress: String { return self._s[185]! } + public func Wallet_Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[186]!, self._r[186]!, [_1, _2, _3]) + } + public var Wallet_Send_Title: String { return self._s[187]! } + public var Wallet_Info_RefreshErrorText: String { return self._s[188]! } + public var Wallet_SecureStorageReset_Title: String { return self._s[189]! } + public var Wallet_Receive_CommentHeader: String { return self._s[190]! } + public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = walletStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = walletStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) + } + + public init(primaryComponent: WalletStringsComponent, secondaryComponent: WalletStringsComponent?, groupingSeparator: String) { + self.primaryComponent = primaryComponent + self.secondaryComponent = secondaryComponent + self.groupingSeparator = groupingSeparator + + self.baseLanguageCode = secondaryComponent?.languageCode ?? primaryComponent.languageCode + + let languageCode = primaryComponent.pluralizationRulesCode ?? primaryComponent.languageCode + var rawCode = languageCode as NSString + var range = rawCode.range(of: "_") + if range.location != NSNotFound { + rawCode = rawCode.substring(to: range.location) as NSString + } + range = rawCode.range(of: "-") + if range.location != NSNotFound { + rawCode = rawCode.substring(to: range.location) as NSString + } + rawCode = rawCode.lowercased as NSString + var lc: UInt32 = 0 + for i in 0 ..< rawCode.length { + lc = (lc << 8) + UInt32(rawCode.character(at: i)) + } + self.lc = lc + + var _s: [Int: String] = [:] + var _r: [Int: [(Int, NSRange)]] = [:] + + let loadedKeyMapping = keyMapping + + let sIdList: [Int] = loadedKeyMapping.0 + let sKeyList: [String] = loadedKeyMapping.1 + let sArgIdList: [Int] = loadedKeyMapping.2 + for i in 0 ..< sIdList.count { + _s[sIdList[i]] = getValue(primaryComponent, secondaryComponent, sKeyList[i]) + } + for i in 0 ..< sArgIdList.count { + _r[sArgIdList[i]] = extractArgumentRanges(_s[sArgIdList[i]]!) + } + self._s = _s + self._r = _r + + var _ps: [Int: String] = [:] + let pIdList: [Int] = loadedKeyMapping.3 + let pKeyList: [String] = loadedKeyMapping.4 + for i in 0 ..< pIdList.count { + for form in 0 ..< 6 { + _ps[pIdList[i] * 6 + form] = getValueWithForm(primaryComponent, secondaryComponent, pKeyList[i], PluralizationForm(rawValue: Int32(form))!) + } + } + self._ps = _ps + } + + public static func ==(lhs: WalletStrings, rhs: WalletStrings) -> Bool { + return lhs === rhs + } +} + diff --git a/submodules/WalletUI/Sources/WalletTransactionInfoScreen.swift b/submodules/WalletUI/Sources/WalletTransactionInfoScreen.swift index 1677f8ece3..47fac86e61 100644 --- a/submodules/WalletUI/Sources/WalletTransactionInfoScreen.swift +++ b/submodules/WalletUI/Sources/WalletTransactionInfoScreen.swift @@ -1,8 +1,6 @@ import Foundation import UIKit import AppBundle -import AccountContext -import TelegramPresentationData import AsyncDisplayKit import Display import Postbox @@ -11,8 +9,41 @@ import SolidRoundedButtonNode import AnimationUI import SwiftSignalKit import OverlayStatusController -import ItemListUI -import TelegramStringFormatting + +private func stringForFullDate(timestamp: Int32, strings: WalletStrings, dateTimeFormat: WalletPresentationDateTimeFormat) -> String { + var t: time_t = Int(timestamp) + var timeinfo = tm() + localtime_r(&t, &timeinfo); + + switch timeinfo.tm_mon + 1 { + case 1: + return strings.Wallet_Time_PreciseDate_m1("\(timeinfo.tm_mday)", "\(2000 + timeinfo.tm_year - 100)", stringForShortTimestamp(hours: Int32(timeinfo.tm_hour), minutes: Int32(timeinfo.tm_min), dateTimeFormat: dateTimeFormat)).0 + case 2: + return strings.Wallet_Time_PreciseDate_m2("\(timeinfo.tm_mday)", "\(2000 + timeinfo.tm_year - 100)", stringForShortTimestamp(hours: Int32(timeinfo.tm_hour), minutes: Int32(timeinfo.tm_min), dateTimeFormat: dateTimeFormat)).0 + case 3: + return strings.Wallet_Time_PreciseDate_m3("\(timeinfo.tm_mday)", "\(2000 + timeinfo.tm_year - 100)", stringForShortTimestamp(hours: Int32(timeinfo.tm_hour), minutes: Int32(timeinfo.tm_min), dateTimeFormat: dateTimeFormat)).0 + case 4: + return strings.Wallet_Time_PreciseDate_m4("\(timeinfo.tm_mday)", "\(2000 + timeinfo.tm_year - 100)", stringForShortTimestamp(hours: Int32(timeinfo.tm_hour), minutes: Int32(timeinfo.tm_min), dateTimeFormat: dateTimeFormat)).0 + case 5: + return strings.Wallet_Time_PreciseDate_m5("\(timeinfo.tm_mday)", "\(2000 + timeinfo.tm_year - 100)", stringForShortTimestamp(hours: Int32(timeinfo.tm_hour), minutes: Int32(timeinfo.tm_min), dateTimeFormat: dateTimeFormat)).0 + case 6: + return strings.Wallet_Time_PreciseDate_m6("\(timeinfo.tm_mday)", "\(2000 + timeinfo.tm_year - 100)", stringForShortTimestamp(hours: Int32(timeinfo.tm_hour), minutes: Int32(timeinfo.tm_min), dateTimeFormat: dateTimeFormat)).0 + case 7: + return strings.Wallet_Time_PreciseDate_m7("\(timeinfo.tm_mday)", "\(2000 + timeinfo.tm_year - 100)", stringForShortTimestamp(hours: Int32(timeinfo.tm_hour), minutes: Int32(timeinfo.tm_min), dateTimeFormat: dateTimeFormat)).0 + case 8: + return strings.Wallet_Time_PreciseDate_m8("\(timeinfo.tm_mday)", "\(2000 + timeinfo.tm_year - 100)", stringForShortTimestamp(hours: Int32(timeinfo.tm_hour), minutes: Int32(timeinfo.tm_min), dateTimeFormat: dateTimeFormat)).0 + case 9: + return strings.Wallet_Time_PreciseDate_m9("\(timeinfo.tm_mday)", "\(2000 + timeinfo.tm_year - 100)", stringForShortTimestamp(hours: Int32(timeinfo.tm_hour), minutes: Int32(timeinfo.tm_min), dateTimeFormat: dateTimeFormat)).0 + case 10: + return strings.Wallet_Time_PreciseDate_m10("\(timeinfo.tm_mday)", "\(2000 + timeinfo.tm_year - 100)", stringForShortTimestamp(hours: Int32(timeinfo.tm_hour), minutes: Int32(timeinfo.tm_min), dateTimeFormat: dateTimeFormat)).0 + case 11: + return strings.Wallet_Time_PreciseDate_m11("\(timeinfo.tm_mday)", "\(2000 + timeinfo.tm_year - 100)", stringForShortTimestamp(hours: Int32(timeinfo.tm_hour), minutes: Int32(timeinfo.tm_min), dateTimeFormat: dateTimeFormat)).0 + case 12: + return strings.Wallet_Time_PreciseDate_m12("\(timeinfo.tm_mday)", "\(2000 + timeinfo.tm_year - 100)", stringForShortTimestamp(hours: Int32(timeinfo.tm_hour), minutes: Int32(timeinfo.tm_min), dateTimeFormat: dateTimeFormat)).0 + default: + return "" + } +} private final class WalletTransactionInfoControllerArguments { let copyWalletAddress: () -> Void @@ -50,19 +81,19 @@ private enum WalletTransactionInfoEntryTag: ItemListItemTag { } private enum WalletTransactionInfoEntry: ItemListNodeEntry { - case amount(PresentationTheme, PresentationStrings, PresentationDateTimeFormat, WalletInfoTransaction) - case infoHeader(PresentationTheme, String) - case infoAddress(PresentationTheme, String, String?) - case infoCopyAddress(PresentationTheme, String) - case infoSendGrams(PresentationTheme, String) - case storageFeeHeader(PresentationTheme, String) - case storageFee(PresentationTheme, String) - case storageFeeInfo(PresentationTheme, String) - case otherFeeHeader(PresentationTheme, String) - case otherFee(PresentationTheme, String) - case otherFeeInfo(PresentationTheme, String) - case commentHeader(PresentationTheme, String) - case comment(PresentationTheme, String) + case amount(WalletTheme, WalletStrings, WalletPresentationDateTimeFormat, WalletInfoTransaction) + case infoHeader(WalletTheme, String) + case infoAddress(WalletTheme, String, String?) + case infoCopyAddress(WalletTheme, String) + case infoSendGrams(WalletTheme, String) + case storageFeeHeader(WalletTheme, String) + case storageFee(WalletTheme, String) + case storageFeeInfo(WalletTheme, String) + case otherFeeHeader(WalletTheme, String) + case otherFee(WalletTheme, String) + case otherFeeInfo(WalletTheme, String) + case commentHeader(WalletTheme, String) + case comment(WalletTheme, String) var section: ItemListSectionId { switch self { @@ -176,7 +207,7 @@ private enum WalletTransactionAddress { case unknown } -private func stringForAddress(strings: PresentationStrings, address: WalletTransactionAddress) -> String { +private func stringForAddress(strings: WalletStrings, address: WalletTransactionAddress) -> String { switch address { case let .list(addresses): return addresses.map { formatAddress($0) }.joined(separator: "\n\n") @@ -237,7 +268,7 @@ private func extractDescription(_ walletTransaction: WalletInfoTransaction) -> S } } -private func walletTransactionInfoControllerEntries(presentationData: PresentationData, walletTransaction: WalletInfoTransaction, state: WalletTransactionInfoControllerState, walletInfo: WalletInfo?) -> [WalletTransactionInfoEntry] { +private func walletTransactionInfoControllerEntries(presentationData: WalletPresentationData, walletTransaction: WalletInfoTransaction, state: WalletTransactionInfoControllerState, walletInfo: WalletInfo?) -> [WalletTransactionInfoEntry] { var entries: [WalletTransactionInfoEntry] = [] entries.append(.amount(presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, walletTransaction)) @@ -290,7 +321,7 @@ private func walletTransactionInfoControllerEntries(presentationData: Presentati return entries } -func walletTransactionInfoController(context: AccountContext, tonContext: TonContext, walletInfo: WalletInfo?, walletTransaction: WalletInfoTransaction, enableDebugActions: Bool) -> ViewController { +func walletTransactionInfoController(context: WalletContext, walletInfo: WalletInfo?, walletTransaction: WalletInfoTransaction, enableDebugActions: Bool) -> ViewController { let statePromise = ValuePromise(WalletTransactionInfoControllerState(), ignoreRepeated: true) let stateValue = Atomic(value: WalletTransactionInfoControllerState()) let updateState: ((WalletTransactionInfoControllerState) -> WalletTransactionInfoControllerState) -> Void = { f in @@ -306,8 +337,8 @@ func walletTransactionInfoController(context: AccountContext, tonContext: TonCon let address = extractAddress(walletTransaction) if case let .list(addresses) = address, let address = addresses.first { UIPasteboard.general.string = address - let presentationData = context.sharedContext.currentPresentationData.with { $0 } - presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .genericSuccess(presentationData.strings.Wallet_TransactionInfo_AddressCopied, false)), nil) + let presentationData = context.presentationData + presentControllerImpl?(OverlayStatusController(theme: presentationData.theme, type: .genericSuccess(presentationData.strings.Wallet_TransactionInfo_AddressCopied, false)), nil) } }, sendGrams: { guard let walletInfo = walletInfo else { @@ -316,18 +347,18 @@ func walletTransactionInfoController(context: AccountContext, tonContext: TonCon let address = extractAddress(walletTransaction) if case let .list(addresses) = address, let address = addresses.first { dismissImpl?() - pushImpl?(walletSendScreen(context: context, tonContext: tonContext, randomId: arc4random64(), walletInfo: walletInfo, address: address)) + pushImpl?(walletSendScreen(context: context, randomId: arc4random64(), walletInfo: walletInfo, address: address)) } }, displayContextMenu: { tag, text in displayContextMenuImpl?(tag, text) }, openFeeInfo: { - let presentationData = context.sharedContext.currentPresentationData.with { $0 } - context.sharedContext.openExternalUrl(context: context, urlContext: .generic, url: presentationData.strings.Wallet_TransactionInfo_FeeInfoURL, forceExternal: true, presentationData: presentationData, navigationController: nil, dismissInput: {}) + let presentationData = context.presentationData + context.openUrl(presentationData.strings.Wallet_TransactionInfo_FeeInfoURL) }) - let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, statePromise.get()) + let signal = combineLatest(queue: .mainQueue(), .single(context.presentationData), statePromise.get()) |> map { presentationData, state -> (ItemListControllerState, (ItemListNodeState, Any)) in - let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.Wallet_TransactionInfo_Title), leftNavigationButton: nil, rightNavigationButton: nil, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: false) + let controllerState = ItemListControllerState(theme: presentationData.theme, title: .text(presentationData.strings.Wallet_TransactionInfo_Title), leftNavigationButton: nil, rightNavigationButton: nil, backNavigationButton: ItemListBackButton(title: presentationData.strings.Wallet_Navigation_Back), animateChanges: false) let listState = ItemListNodeState(entries: walletTransactionInfoControllerEntries(presentationData: presentationData, walletTransaction: walletTransaction, state: state, walletInfo: walletInfo), style: .blocks, animateChanges: false) return (controllerState, (listState, arguments)) @@ -335,7 +366,7 @@ func walletTransactionInfoController(context: AccountContext, tonContext: TonCon |> afterDisposed { } - let controller = ItemListController(context: context, state: signal) + let controller = ItemListController(theme: context.presentationData.theme, strings: context.presentationData.strings, updatedPresentationData: .single((context.presentationData.theme, context.presentationData.strings)), state: signal, tabBarItem: nil) controller.navigationPresentation = .modal controller.enableInteractiveDismiss = true dismissImpl = { [weak controller] in @@ -350,7 +381,7 @@ func walletTransactionInfoController(context: AccountContext, tonContext: TonCon } displayContextMenuImpl = { [weak controller] tag, value in if let strongController = controller { - let presentationData = context.sharedContext.currentPresentationData.with { $0 } + let presentationData = context.presentationData var resultItemNode: ListViewItemNode? let _ = strongController.frameForItemNode({ itemNode in if let itemNode = itemNode as? ItemListMultilineTextItemNode { @@ -365,14 +396,13 @@ func walletTransactionInfoController(context: AccountContext, tonContext: TonCon }) if let resultItemNode = resultItemNode { var actions: [ContextMenuAction] = [] - actions.append(ContextMenuAction(content: .text(title: presentationData.strings.Conversation_ContextMenuCopy, accessibilityLabel: presentationData.strings.Conversation_ContextMenuCopy), action: { + actions.append(ContextMenuAction(content: .text(title: presentationData.strings.Wallet_ContextMenuCopy, accessibilityLabel: presentationData.strings.Wallet_ContextMenuCopy), action: { UIPasteboard.general.string = value })) if enableDebugActions { if case .address = tag { actions.append(ContextMenuAction(content: .text(title: "View Transactions", accessibilityLabel: "View Transactions"), action: { - pushImpl?(WalletInfoScreen(context: context, tonContext: tonContext, walletInfo: nil, address: value, enableDebugActions: enableDebugActions)) - //dismissImpl?() + pushImpl?(WalletInfoScreen(context: context, walletInfo: nil, address: value, enableDebugActions: enableDebugActions)) })) } } @@ -392,14 +422,14 @@ func walletTransactionInfoController(context: AccountContext, tonContext: TonCon } class WalletTransactionHeaderItem: ListViewItem, ItemListItem { - let theme: PresentationTheme - let strings: PresentationStrings - let dateTimeFormat: PresentationDateTimeFormat + let theme: WalletTheme + let strings: WalletStrings + let dateTimeFormat: WalletPresentationDateTimeFormat let walletTransaction: WalletInfoTransaction let sectionId: ItemListSectionId let isAlwaysPlain: Bool = true - init(theme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, walletTransaction: WalletInfoTransaction, sectionId: ItemListSectionId) { + init(theme: WalletTheme, strings: WalletStrings, dateTimeFormat: WalletPresentationDateTimeFormat, walletTransaction: WalletInfoTransaction, sectionId: ItemListSectionId) { self.theme = theme self.strings = strings self.dateTimeFormat = dateTimeFormat @@ -512,11 +542,11 @@ private class WalletTransactionHeaderItemNode: ListViewItemNode { if transferredValue <= 0 { signString = "" balanceString = "\(formatBalanceText(-transferredValue, decimalSeparator: item.dateTimeFormat.decimalSeparator))" - titleColor = item.theme.list.itemDestructiveColor + titleColor = item.theme.info.outgoingFundsTitleColor } else { signString = "" balanceString = "\(formatBalanceText(transferredValue, decimalSeparator: item.dateTimeFormat.decimalSeparator))" - titleColor = item.theme.chatList.secretTitleColor + titleColor = item.theme.info.incomingFundsTitleColor } let title = NSMutableAttributedString() diff --git a/submodules/WalletUI/Sources/WalletUtils.swift b/submodules/WalletUI/Sources/WalletUtils.swift index 2e0e6eb811..f9ceebd325 100644 --- a/submodules/WalletUI/Sources/WalletUtils.swift +++ b/submodules/WalletUI/Sources/WalletUtils.swift @@ -1,5 +1,4 @@ import Foundation -import TelegramStringFormatting import UrlEscaping let walletAddressLength: Int = 48 @@ -36,6 +35,45 @@ func formatBalanceText(_ value: Int64, decimalSeparator: String) -> String { return balanceText } +private enum ArabicNumeralStringType { + case western + case arabic + case persian +} + +private func normalizeArabicNumeralString(_ string: String, type: ArabicNumeralStringType) -> String { + var string = string + + let numerals = [ + ("0", "٠", "۰"), + ("1", "١", "۱"), + ("2", "٢", "۲"), + ("3", "٣", "۳"), + ("4", "٤", "۴"), + ("5", "٥", "۵"), + ("6", "٦", "۶"), + ("7", "٧", "۷"), + ("8", "٨", "۸"), + ("9", "٩", "۹"), + (",", "٫", "٫") + ] + for (western, arabic, persian) in numerals { + switch type { + case .western: + string = string.replacingOccurrences(of: arabic, with: western) + string = string.replacingOccurrences(of: persian, with: western) + case .arabic: + string = string.replacingOccurrences(of: western, with: arabic) + string = string.replacingOccurrences(of: persian, with: arabic) + case .persian: + string = string.replacingOccurrences(of: western, with: persian) + string = string.replacingOccurrences(of: arabic, with: persian) + } + + } + return string +} + private let invalidAmountCharacters = CharacterSet(charactersIn: "01234567890.,").inverted func isValidAmount(_ amount: String) -> Bool { let amount = normalizeArabicNumeralString(amount, type: .western) diff --git a/submodules/WalletUI/Sources/WalletWordCheckScreen.swift b/submodules/WalletUI/Sources/WalletWordCheckScreen.swift index c79baaeef7..4d28ad4794 100644 --- a/submodules/WalletUI/Sources/WalletWordCheckScreen.swift +++ b/submodules/WalletUI/Sources/WalletWordCheckScreen.swift @@ -1,8 +1,6 @@ import Foundation import UIKit import AppBundle -import AccountContext -import TelegramPresentationData import AsyncDisplayKit import Display import Postbox @@ -2071,36 +2069,34 @@ public enum WalletWordCheckMode { } public final class WalletWordCheckScreen: ViewController { - private let context: AccountContext - private let tonContext: TonContext - private var presentationData: PresentationData + private let context: WalletContext + private var presentationData: WalletPresentationData private let mode: WalletWordCheckMode private let startTime: Double private let walletCreatedPreloadState: Promise? - public init(context: AccountContext, tonContext: TonContext, mode: WalletWordCheckMode, walletCreatedPreloadState: Promise?) { + public init(context: WalletContext, mode: WalletWordCheckMode, walletCreatedPreloadState: Promise?) { self.context = context - self.tonContext = tonContext self.mode = mode self.walletCreatedPreloadState = walletCreatedPreloadState - self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + self.presentationData = context.presentationData - let defaultNavigationPresentationData = NavigationBarPresentationData(presentationTheme: self.presentationData.theme, presentationStrings: self.presentationData.strings) - let navigationBarTheme = NavigationBarTheme(buttonColor: defaultNavigationPresentationData.theme.buttonColor, disabledButtonColor: defaultNavigationPresentationData.theme.disabledButtonColor, primaryTextColor: defaultNavigationPresentationData.theme.primaryTextColor, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: defaultNavigationPresentationData.theme.badgeBackgroundColor, badgeStrokeColor: defaultNavigationPresentationData.theme.badgeStrokeColor, badgeTextColor: defaultNavigationPresentationData.theme.badgeTextColor) + let defaultTheme = self.presentationData.theme.navigationBar + let navigationBarTheme = NavigationBarTheme(buttonColor: defaultTheme.buttonColor, disabledButtonColor: defaultTheme.disabledButtonColor, primaryTextColor: defaultTheme.primaryTextColor, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: defaultTheme.badgeBackgroundColor, badgeStrokeColor: defaultTheme.badgeStrokeColor, badgeTextColor: defaultTheme.badgeTextColor) self.startTime = Date().timeIntervalSince1970 - super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: navigationBarTheme, strings: defaultNavigationPresentationData.strings)) + super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: navigationBarTheme, strings: NavigationBarStrings(back: self.presentationData.strings.Wallet_Navigation_Back, close: self.presentationData.strings.Wallet_Navigation_Close))) - self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style + self.statusBar.statusBarStyle = self.presentationData.theme.statusBarStyle self.navigationPresentation = .modalInLargeLayout self.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait) self.navigationBar?.intrinsicCanTransitionInline = false - self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_Back, style: .plain, target: nil, action: nil) + self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Wallet_Navigation_Back, style: .plain, target: nil, action: nil) } required init(coder aDecoder: NSCoder) { @@ -2112,7 +2108,7 @@ public final class WalletWordCheckScreen: ViewController { } override public func loadDisplayNode() { - self.displayNode = WalletWordCheckScreenNode(account: self.context.account, presentationData: self.presentationData, mode: self.mode, possibleWordList: possibleWordList, action: { [weak self] in + self.displayNode = WalletWordCheckScreenNode(presentationData: self.presentationData, mode: self.mode, possibleWordList: possibleWordList, action: { [weak self] in guard let strongSelf = self else { return } @@ -2142,14 +2138,14 @@ public final class WalletWordCheckScreen: ViewController { } return true } - let _ = confirmWalletExported(postbox: strongSelf.context.account.postbox, walletInfo: walletInfo).start() - controllers.append(WalletSplashScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, mode: .success(walletInfo), walletCreatedPreloadState: strongSelf.walletCreatedPreloadState)) + let _ = confirmWalletExported(postbox: strongSelf.context.postbox, walletInfo: walletInfo).start() + controllers.append(WalletSplashScreen(context: strongSelf.context, mode: .success(walletInfo), walletCreatedPreloadState: strongSelf.walletCreatedPreloadState)) strongSelf.view.endEditing(true) navigationController.setViewControllers(controllers, animated: true) } } else { strongSelf.view.endEditing(true) - strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: strongSelf.presentationData.strings.Wallet_WordCheck_IncorrectHeader, text: strongSelf.presentationData.strings.Wallet_WordCheck_IncorrectText, actions: [ + strongSelf.present(standardTextAlertController(theme: strongSelf.presentationData.theme.alert, title: strongSelf.presentationData.strings.Wallet_WordCheck_IncorrectHeader, text: strongSelf.presentationData.strings.Wallet_WordCheck_IncorrectText, actions: [ TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Wallet_WordCheck_TryAgain, action: { }), TextAlertAction(type: .genericAction, title: strongSelf.presentationData.strings.Wallet_WordCheck_ViewWords, action: { @@ -2172,8 +2168,8 @@ public final class WalletWordCheckScreen: ViewController { } if !allWordsAreValid { strongSelf.view.endEditing(true) - strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: strongSelf.presentationData.strings.Wallet_WordImport_IncorrectTitle, text: strongSelf.presentationData.strings.Wallet_WordImport_IncorrectText, actions: [ - TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: { + strongSelf.present(standardTextAlertController(theme: strongSelf.presentationData.theme.alert, title: strongSelf.presentationData.strings.Wallet_WordImport_IncorrectTitle, text: strongSelf.presentationData.strings.Wallet_WordImport_IncorrectText, actions: [ + TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Wallet_Alert_OK, action: { }) ], actionLayout: .vertical), in: .window(.root)) return @@ -2184,15 +2180,15 @@ public final class WalletWordCheckScreen: ViewController { return } strongSelf.view.endEditing(true) - strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: strongSelf.presentationData.strings.Wallet_WordImport_IncorrectTitle, text: strongSelf.presentationData.strings.Wallet_WordImport_IncorrectText, actions: [ - TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: { + strongSelf.present(standardTextAlertController(theme: strongSelf.presentationData.theme.alert, title: strongSelf.presentationData.strings.Wallet_WordImport_IncorrectTitle, text: strongSelf.presentationData.strings.Wallet_WordImport_IncorrectText, actions: [ + TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Wallet_Alert_OK, action: { }) ], actionLayout: .vertical), in: .window(.root)) } - let _ = (getServerWalletSalt(network: strongSelf.context.account.network) + let _ = (getServerWalletSalt(network: strongSelf.context.network) |> deliverOnMainQueue).start(next: { serverSalt in - let _ = (importWallet(postbox: strongSelf.context.account.postbox, tonInstance: strongSelf.tonContext.instance, keychain: strongSelf.tonContext.keychain, wordList: enteredWords, localPassword: serverSalt) + let _ = (importWallet(postbox: strongSelf.context.postbox, tonInstance: strongSelf.context.tonInstance, keychain: strongSelf.context.keychain, wordList: enteredWords, localPassword: serverSalt) |> deliverOnMainQueue).start(next: { walletInfo in guard let strongSelf = self else { return @@ -2211,7 +2207,7 @@ public final class WalletWordCheckScreen: ViewController { } return true } - controllers.append(WalletSplashScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, mode: .success(walletInfo), walletCreatedPreloadState: strongSelf.walletCreatedPreloadState)) + controllers.append(WalletSplashScreen(context: strongSelf.context, mode: .success(walletInfo), walletCreatedPreloadState: strongSelf.walletCreatedPreloadState)) strongSelf.view.endEditing(true) navigationController.setViewControllers(controllers, animated: true) } @@ -2238,7 +2234,7 @@ public final class WalletWordCheckScreen: ViewController { } return true } - controllers.append(WalletSplashScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, mode: .restoreFailed, walletCreatedPreloadState: nil)) + controllers.append(WalletSplashScreen(context: strongSelf.context, mode: .restoreFailed, walletCreatedPreloadState: nil)) navigationController.setViewControllers(controllers, animated: true) } }) @@ -2279,7 +2275,7 @@ private final class WordCheckInputNode: ASDisplayNode, UITextFieldDelegate { } } - init(theme: PresentationTheme, index: Int, possibleWordList: [String], previous: @escaping (WordCheckInputNode) -> Void, next: @escaping (WordCheckInputNode, Bool) -> Void, isLast: Bool, focused: @escaping (WordCheckInputNode) -> Void, pasteWords: @escaping ([String]) -> Void) { + init(theme: WalletTheme, index: Int, possibleWordList: [String], previous: @escaping (WordCheckInputNode) -> Void, next: @escaping (WordCheckInputNode, Bool) -> Void, isLast: Bool, focused: @escaping (WordCheckInputNode) -> Void, pasteWords: @escaping ([String]) -> Void) { self.previous = previous self.next = next self.focused = focused @@ -2289,15 +2285,15 @@ private final class WordCheckInputNode: ASDisplayNode, UITextFieldDelegate { self.backgroundNode = ASImageNode() self.backgroundNode.displaysAsynchronously = false self.backgroundNode.displayWithoutProcessing = true - self.backgroundNode.image = generateStretchableFilledCircleImage(diameter: 10.0, color: theme.actionSheet.inputBackgroundColor) + self.backgroundNode.image = generateStretchableFilledCircleImage(diameter: 10.0, color: theme.setup.inputBackgroundColor) self.labelNode = ImmediateTextNode() - self.labelNode.attributedText = NSAttributedString(string: "\(index + 1):", font: Font.regular(17.0), textColor: theme.actionSheet.inputPlaceholderColor) + self.labelNode.attributedText = NSAttributedString(string: "\(index + 1):", font: Font.regular(17.0), textColor: theme.setup.inputPlaceholderColor) self.labelNode.textAlignment = .right self.inputNode = TextFieldNode() self.inputNode.textField.font = Font.regular(17.0) - self.inputNode.textField.textColor = theme.actionSheet.inputTextColor + self.inputNode.textField.textColor = theme.setup.inputTextColor var wordTapped: ((String) -> Void)? self.inputNode.textField.inputAccessoryView = WordCheckInputAccesssoryView(theme: theme, wordList: possibleWordList, wordTapped: { word in wordTapped?(word) @@ -2316,10 +2312,10 @@ private final class WordCheckInputNode: ASDisplayNode, UITextFieldDelegate { } else { self.inputNode.textField.returnKeyType = .next } - self.inputNode.textField.keyboardAppearance = theme.rootController.keyboardColor.keyboardAppearance + self.inputNode.textField.keyboardAppearance = theme.keyboardAppearance self.clearButtonNode = HighlightableButtonNode() - self.clearButtonNode.setImage(generateClearIcon(color: theme.actionSheet.inputClearButtonColor.withAlphaComponent(0.7)), for: []) + self.clearButtonNode.setImage(generateClearIcon(color: theme.setup.inputClearButtonColor), for: []) self.clearButtonNode.isHidden = true super.init() @@ -2414,17 +2410,17 @@ private final class WordView: UIView { let textNode: ImmediateTextNode let separator: UIView - init(theme: PresentationTheme, string: String, tapped: @escaping () -> Void) { + init(theme: WalletTheme, string: String, tapped: @escaping () -> Void) { self.string = string self.tapped = tapped let separatorColor: UIColor let textColor: UIColor - switch theme.rootController.keyboardColor { - case .light: + switch theme.keyboardAppearance { + case .light, .default: separatorColor = UIColor(rgb: 0x9e9f9f) textColor = .black - case .dark: + default: separatorColor = UIColor(rgb: 0x9e9f9f) textColor = .white } @@ -2465,7 +2461,7 @@ private final class WordView: UIView { } private final class WordCheckInputAccesssoryView: UIInputView { - private let theme: PresentationTheme + private let theme: WalletTheme private let wordList: [String] private let wordTapped: (String) -> Void @@ -2477,7 +2473,7 @@ private final class WordCheckInputAccesssoryView: UIInputView { return CGSize(width: 100.0, height: 44.0) } - init(theme: PresentationTheme, wordList: [String], wordTapped: @escaping (String) -> Void) { + init(theme: WalletTheme, wordList: [String], wordTapped: @escaping (String) -> Void) { self.theme = theme self.wordList = wordList self.wordTapped = wordTapped @@ -2569,7 +2565,7 @@ private final class WordCheckInputAccesssoryView: UIInputView { } private final class WalletWordCheckScreenNode: ViewControllerTracingNode, UIScrollViewDelegate { - private var presentationData: PresentationData + private var presentationData: WalletPresentationData private let mode: WalletWordCheckMode private let action: () -> Void private let secondaryAction: () -> Void @@ -2592,17 +2588,17 @@ private final class WalletWordCheckScreenNode: ViewControllerTracingNode, UIScro return self.inputNodes.map { $0.text } } - init(account: Account, presentationData: PresentationData, mode: WalletWordCheckMode, possibleWordList: [String], action: @escaping () -> Void, secondaryAction: @escaping () -> Void) { + init(presentationData: WalletPresentationData, mode: WalletWordCheckMode, possibleWordList: [String], action: @escaping () -> Void, secondaryAction: @escaping () -> Void) { self.presentationData = presentationData self.mode = mode self.action = action self.secondaryAction = secondaryAction self.navigationBackgroundNode = ASDisplayNode() - self.navigationBackgroundNode.backgroundColor = self.presentationData.theme.rootController.navigationBar.backgroundColor + self.navigationBackgroundNode.backgroundColor = self.presentationData.theme.navigationBar.backgroundColor self.navigationBackgroundNode.alpha = 0.0 self.navigationSeparatorNode = ASDisplayNode() - self.navigationSeparatorNode.backgroundColor = self.presentationData.theme.rootController.navigationBar.separatorColor + self.navigationSeparatorNode.backgroundColor = self.presentationData.theme.navigationBar.separatorColor self.scrollNode = ASScrollNode() self.scrollNode.canCancelAllTouchesInViews = true @@ -2628,7 +2624,7 @@ private final class WalletWordCheckScreenNode: ViewControllerTracingNode, UIScro buttonText = self.presentationData.strings.Wallet_WordCheck_Continue secondaryActionText = "" if let path = getAppBundle().path(forResource: "WalletWordCheck", ofType: "tgs") { - self.animationNode.setup(account: account, resource: .localFile(path), width: 238, height: 238, playbackMode: .once, mode: .direct) + self.animationNode.setup(resource: .localFile(path), width: 238, height: 238, playbackMode: .once, mode: .direct) self.animationNode.visibility = true } case .import: @@ -2682,7 +2678,7 @@ private final class WalletWordCheckScreenNode: ViewControllerTracingNode, UIScro self.inputNodes = inputNodes - self.buttonNode = SolidRoundedButtonNode(title: buttonText, theme: SolidRoundedButtonTheme(theme: self.presentationData.theme), height: 50.0, cornerRadius: 10.0, gloss: false) + self.buttonNode = SolidRoundedButtonNode(title: buttonText, theme: SolidRoundedButtonTheme(backgroundColor: self.presentationData.theme.setup.buttonFillColor, foregroundColor: self.presentationData.theme.setup.buttonForegroundColor), height: 50.0, cornerRadius: 10.0, gloss: false) super.init() diff --git a/submodules/WalletUI/Sources/WalletWordDisplayScreen.swift b/submodules/WalletUI/Sources/WalletWordDisplayScreen.swift index fe64d88b6a..fdac4921bf 100644 --- a/submodules/WalletUI/Sources/WalletWordDisplayScreen.swift +++ b/submodules/WalletUI/Sources/WalletWordDisplayScreen.swift @@ -1,9 +1,7 @@ import Foundation import UIKit import AppBundle -import AccountContext import SwiftSignalKit -import TelegramPresentationData import AsyncDisplayKit import Display import Postbox @@ -19,9 +17,8 @@ public enum WalletWordDisplayScreenMode { } public final class WalletWordDisplayScreen: ViewController { - private let context: AccountContext - private let tonContext: TonContext - private var presentationData: PresentationData + private let context: WalletContext + private var presentationData: WalletPresentationData private let walletInfo: WalletInfo private let wordList: [String] private let mode: WalletWordDisplayScreenMode @@ -31,30 +28,29 @@ public final class WalletWordDisplayScreen: ViewController { private let walletCreatedPreloadState: Promise? - public init(context: AccountContext, tonContext: TonContext, walletInfo: WalletInfo, wordList: [String], mode: WalletWordDisplayScreenMode, walletCreatedPreloadState: Promise?) { + public init(context: WalletContext, walletInfo: WalletInfo, wordList: [String], mode: WalletWordDisplayScreenMode, walletCreatedPreloadState: Promise?) { self.context = context - self.tonContext = tonContext self.walletInfo = walletInfo self.wordList = wordList self.mode = mode self.walletCreatedPreloadState = walletCreatedPreloadState - self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + self.presentationData = context.presentationData - let defaultNavigationPresentationData = NavigationBarPresentationData(presentationTheme: self.presentationData.theme, presentationStrings: self.presentationData.strings) - let navigationBarTheme = NavigationBarTheme(buttonColor: defaultNavigationPresentationData.theme.buttonColor, disabledButtonColor: defaultNavigationPresentationData.theme.disabledButtonColor, primaryTextColor: defaultNavigationPresentationData.theme.primaryTextColor, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: defaultNavigationPresentationData.theme.badgeBackgroundColor, badgeStrokeColor: defaultNavigationPresentationData.theme.badgeStrokeColor, badgeTextColor: defaultNavigationPresentationData.theme.badgeTextColor) + let defaultTheme = self.presentationData.theme.navigationBar + let navigationBarTheme = NavigationBarTheme(buttonColor: defaultTheme.buttonColor, disabledButtonColor: defaultTheme.disabledButtonColor, primaryTextColor: defaultTheme.primaryTextColor, backgroundColor: .clear, separatorColor: .clear, badgeBackgroundColor: defaultTheme.badgeBackgroundColor, badgeStrokeColor: defaultTheme.badgeStrokeColor, badgeTextColor: defaultTheme.badgeTextColor) self.startTime = Date().timeIntervalSince1970 - self.idleTimerExtensionDisposable = context.sharedContext.applicationBindings.pushIdleTimerExtension() + self.idleTimerExtensionDisposable = context.idleTimerExtension() - super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: navigationBarTheme, strings: defaultNavigationPresentationData.strings)) + super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: navigationBarTheme, strings: NavigationBarStrings(back: self.presentationData.strings.Wallet_Navigation_Back, close: self.presentationData.strings.Wallet_Navigation_Close))) - self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style + self.statusBar.statusBarStyle = self.presentationData.theme.statusBarStyle self.navigationPresentation = .modalInLargeLayout self.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait) self.navigationBar?.intrinsicCanTransitionInline = false - self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Common_Back, style: .plain, target: nil, action: nil) + self.navigationItem.backBarButtonItem = UIBarButtonItem(title: self.presentationData.strings.Wallet_Navigation_Back, style: .plain, target: nil, action: nil) } required init(coder aDecoder: NSCoder) { @@ -70,7 +66,7 @@ public final class WalletWordDisplayScreen: ViewController { } override public func loadDisplayNode() { - self.displayNode = WalletWordDisplayScreenNode(account: self.context.account, presentationData: self.presentationData, wordList: self.wordList, action: { [weak self] in + self.displayNode = WalletWordDisplayScreenNode(presentationData: self.presentationData, wordList: self.wordList, action: { [weak self] in guard let strongSelf = self else { return } @@ -88,12 +84,13 @@ public final class WalletWordDisplayScreen: ViewController { minimalTimeout = 60.0 #endif if deltaTime < minimalTimeout { - strongSelf.present(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: strongSelf.presentationData.theme), title: strongSelf.presentationData.strings.Wallet_Words_NotDoneTitle, text: strongSelf.presentationData.strings.Wallet_Words_NotDoneText, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Wallet_Words_NotDoneOk, action: { + strongSelf.present(standardTextAlertController(theme: strongSelf.presentationData.theme.alert, title: strongSelf.presentationData.strings.Wallet_Words_NotDoneTitle, text: strongSelf.presentationData.strings.Wallet_Words_NotDoneText, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Wallet_Words_NotDoneOk, action: { guard let strongSelf = self else { return } if let path = getAppBundle().path(forResource: "thumbsup", ofType: "tgs") { - strongSelf.present(UndoOverlayController(context: strongSelf.context, content: UndoOverlayContent.emoji(account: strongSelf.context.account, path: path, text: strongSelf.presentationData.strings.Wallet_Words_NotDoneResponse), elevatedLayout: false, animateInAsReplacement: false, action: { _ in }), in: .current) + let controller = UndoOverlayController(presentationData: strongSelf.presentationData, content: UndoOverlayContent.emoji(path: path, text: strongSelf.presentationData.strings.Wallet_Words_NotDoneResponse), elevatedLayout: false, animateInAsReplacement: false, action: { _ in }) + strongSelf.present(controller, in: .current) } })]), in: .window(.root)) } else { @@ -105,7 +102,7 @@ public final class WalletWordDisplayScreen: ViewController { } } wordIndices.sort() - strongSelf.push(WalletWordCheckScreen(context: strongSelf.context, tonContext: strongSelf.tonContext, mode: .verify(strongSelf.walletInfo, strongSelf.wordList, wordIndices), walletCreatedPreloadState: strongSelf.walletCreatedPreloadState)) + strongSelf.push(WalletWordCheckScreen(context: strongSelf.context, mode: .verify(strongSelf.walletInfo, strongSelf.wordList, wordIndices), walletCreatedPreloadState: strongSelf.walletCreatedPreloadState)) } }) @@ -120,7 +117,7 @@ public final class WalletWordDisplayScreen: ViewController { } private final class WalletWordDisplayScreenNode: ViewControllerTracingNode, UIScrollViewDelegate { - private var presentationData: PresentationData + private var presentationData: WalletPresentationData private let wordList: [String] private let action: () -> Void @@ -136,22 +133,22 @@ private final class WalletWordDisplayScreenNode: ViewControllerTracingNode, UISc private var navigationHeight: CGFloat? - init(account: Account, presentationData: PresentationData, wordList: [String], action: @escaping () -> Void) { + init(presentationData: WalletPresentationData, wordList: [String], action: @escaping () -> Void) { self.presentationData = presentationData self.wordList = wordList self.action = action self.navigationBackgroundNode = ASDisplayNode() - self.navigationBackgroundNode.backgroundColor = self.presentationData.theme.rootController.navigationBar.backgroundColor + self.navigationBackgroundNode.backgroundColor = self.presentationData.theme.navigationBar.backgroundColor self.navigationBackgroundNode.alpha = 0.0 self.navigationSeparatorNode = ASDisplayNode() - self.navigationSeparatorNode.backgroundColor = self.presentationData.theme.rootController.navigationBar.separatorColor + self.navigationSeparatorNode.backgroundColor = self.presentationData.theme.navigationBar.separatorColor self.scrollNode = ASScrollNode() self.animationNode = AnimatedStickerNode() if let path = getAppBundle().path(forResource: "WalletWordList", ofType: "tgs") { - self.animationNode.setup(account: account, resource: .localFile(path), width: 264, height: 264, playbackMode: .once, mode: .direct) + self.animationNode.setup(resource: .localFile(path), width: 264, height: 264, playbackMode: .once, mode: .direct) self.animationNode.visibility = true } @@ -200,7 +197,7 @@ private final class WalletWordDisplayScreenNode: ViewControllerTracingNode, UISc self.wordNodes = wordNodes - self.buttonNode = SolidRoundedButtonNode(title: buttonText, theme: SolidRoundedButtonTheme(theme: self.presentationData.theme), height: 50.0, cornerRadius: 10.0, gloss: false) + self.buttonNode = SolidRoundedButtonNode(title: buttonText, theme: SolidRoundedButtonTheme(backgroundColor: self.presentationData.theme.setup.buttonFillColor, foregroundColor: self.presentationData.theme.setup.buttonForegroundColor), height: 50.0, cornerRadius: 10.0, gloss: false) super.init() diff --git a/submodules/WebSearchUI/Sources/WebSearchRecentQueryItem.swift b/submodules/WebSearchUI/Sources/WebSearchRecentQueryItem.swift index 0f73c66038..e59a6f6a00 100644 --- a/submodules/WebSearchUI/Sources/WebSearchRecentQueryItem.swift +++ b/submodules/WebSearchUI/Sources/WebSearchRecentQueryItem.swift @@ -7,6 +7,7 @@ import SwiftSignalKit import TelegramCore import TelegramPresentationData import ItemListUI +import PresentationDataUtils private enum RevealOptionKey: Int32 { case delete diff --git a/tools/GenerateLocalization.sh b/tools/GenerateLocalization.sh index e87ceb8210..326e5ce5b8 100644 --- a/tools/GenerateLocalization.sh +++ b/tools/GenerateLocalization.sh @@ -1,3 +1,7 @@ #!/bin/sh swift -swift-version 4 tools/GenerateLocalization.swift Telegram-iOS/en.lproj/Localizable.strings submodules/TelegramPresentationData/Sources/PresentationStrings.swift submodules/TelegramUI/TelegramUI/Resources/PresentationStrings.mapping + +mkdir -p submodules/WalletUI/Resources +swift -swift-version 4 tools/GenerateLocalization.swift Telegram-iOS/en.lproj/Localizable.strings submodules/WalletUI/Sources/WalletStrings.swift submodules/WalletUI/Resources/WalletStrings.mapping "Wallet." + diff --git a/tools/GenerateLocalization.swift b/tools/GenerateLocalization.swift index 5e26783c77..112f256c8e 100644 --- a/tools/GenerateLocalization.swift +++ b/tools/GenerateLocalization.swift @@ -199,11 +199,21 @@ final class WriteBuffer { } } -if CommandLine.arguments.count != 4 { - print("Usage: swift GenerateLocalization.swift Localizable.strings Strings.swift Strings.mapping") +if CommandLine.arguments.count < 4 { + print("Usage: swift GenerateLocalization.swift Localizable.strings Strings.swift Strings.mapping [prefix]") } else { + var filterPrefix: String? + if CommandLine.arguments.count > 4 { + filterPrefix = CommandLine.arguments[4] + } + + let mappingFileUrl = URL(fileURLWithPath: CommandLine.arguments[3]) + let mappingFileName = mappingFileUrl.lastPathComponent + let mappingFileBaseName = String(mappingFileName[mappingFileName.startIndex ..< mappingFileName.index(mappingFileName.endIndex, offsetBy: -1 - mappingFileUrl.pathExtension.count)]) + let snakeCaseMappingFileBaseName = mappingFileBaseName.prefix(1).lowercased() + mappingFileBaseName.dropFirst() + if let rawDict = NSDictionary(contentsOfFile: CommandLine.arguments[1]) { - var result = "import Foundation\nimport AppBundle\n\n" + var result = "import Foundation\nimport AppBundle\nimport StringPluralization\n\n" result += """ @@ -239,7 +249,7 @@ private extension PluralizationForm { } } -public final class PresentationStringsComponent { +public final class \(mappingFileBaseName)Component { public let languageCode: String public let localizedName: String public let pluralizationRulesCode: String? @@ -253,7 +263,7 @@ public final class PresentationStringsComponent { } } -private func getValue(_ primaryComponent: PresentationStringsComponent, _ secondaryComponent: PresentationStringsComponent?, _ key: String) -> String { +private func getValue(_ primaryComponent: \(mappingFileBaseName)Component, _ secondaryComponent: \(mappingFileBaseName)Component?, _ key: String) -> String { if let value = primaryComponent.dict[key] { return value } else if let secondaryComponent = secondaryComponent, let value = secondaryComponent.dict[key] { @@ -265,7 +275,7 @@ private func getValue(_ primaryComponent: PresentationStringsComponent, _ second } } -private func getValueWithForm(_ primaryComponent: PresentationStringsComponent, _ secondaryComponent: PresentationStringsComponent?, _ key: String, _ form: PluralizationForm) -> String { +private func getValueWithForm(_ primaryComponent: \(mappingFileBaseName)Component, _ secondaryComponent: \(mappingFileBaseName)Component?, _ key: String, _ form: PluralizationForm) -> String { let builtKey = key + form.canonicalSuffix if let value = primaryComponent.dict[builtKey] { return value @@ -346,7 +356,7 @@ private final class DataReader { } private func loadMapping() -> ([Int], [String], [Int], [Int], [String]) { - guard let filePath = getAppBundle().path(forResource: "PresentationStrings", ofType: "mapping") else { + guard let filePath = getAppBundle().path(forResource: "\(mappingFileBaseName)", ofType: "mapping") else { fatalError() } guard let data = try? Data(contentsOf: URL(fileURLWithPath: filePath)) else { @@ -381,11 +391,11 @@ private func loadMapping() -> ([Int], [String], [Int], [Int], [String]) { private let keyMapping: ([Int], [String], [Int], [Int], [String]) = loadMapping() -public final class PresentationStrings { +public final class \(mappingFileBaseName): Equatable { public let lc: UInt32 - public let primaryComponent: PresentationStringsComponent - public let secondaryComponent: PresentationStringsComponent? + public let primaryComponent: \(mappingFileBaseName)Component + public let secondaryComponent: \(mappingFileBaseName)Component? public let baseLanguageCode: String public let groupingSeparator: String @@ -394,7 +404,13 @@ public final class PresentationStrings { private let _ps: [Int: String] """ - let rawKeyPairs = rawDict.map({ ($0 as! String, $1 as! String) }) + var rawKeyPairs = rawDict.map({ ($0 as! String, $1 as! String) }) + if let filterPrefix = filterPrefix { + rawKeyPairs = rawKeyPairs.filter { + $0.0.hasPrefix(filterPrefix) + } + } + let idKeyPairs = zip(rawKeyPairs, 0 ..< rawKeyPairs.count).map({ pair, index in (pair.0, pair.1, index) }) var pluralizationKeys = Set() @@ -479,7 +495,7 @@ public final class PresentationStrings { result += """ public func \(escapedIdentifier(key))(_ selector: Int32, \(argList)) -> String { - let form = presentationStringsPluralizationForm(self.lc, selector) + let form = getPluralizationForm(self.lc, selector) return String(format: self._ps[\(id) * \(PluralizationForm.formCount) + Int(form.rawValue)]!, \(argListAccessor)) } @@ -488,8 +504,8 @@ public final class PresentationStrings { result += """ public func \(escapedIdentifier(key))(_ value: Int32) -> String { - let form = presentationStringsPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + let form = getPluralizationForm(self.lc, value) + let stringValue = \(snakeCaseMappingFileBaseName)FormattedNumber(value, self.groupingSeparator) return String(format: self._ps[\(id) * \(PluralizationForm.formCount) + Int(form.rawValue)]!, stringValue) } @@ -503,7 +519,7 @@ public final class PresentationStrings { result += """ - public init(primaryComponent: PresentationStringsComponent, secondaryComponent: PresentationStringsComponent?, groupingSeparator: String) { + public init(primaryComponent: \(mappingFileBaseName)Component, secondaryComponent: \(mappingFileBaseName)Component?, groupingSeparator: String) { self.primaryComponent = primaryComponent self.secondaryComponent = secondaryComponent self.groupingSeparator = groupingSeparator @@ -579,7 +595,14 @@ public final class PresentationStrings { """ result += " }\n" - result += "}\n\n" + result += +""" + + public static func ==(lhs: \(mappingFileBaseName), rhs: \(mappingFileBaseName)) -> Bool { + return lhs === rhs + } +""" + result += "\n}\n\n" let _ = try? FileManager.default.removeItem(atPath: CommandLine.arguments[2]) let _ = try? FileManager.default.removeItem(atPath: CommandLine.arguments[3]) let _ = try? result.write(toFile: CommandLine.arguments[2], atomically: true, encoding: .utf8)