Group permissions fixes

This commit is contained in:
Peter 2019-01-04 22:35:17 +01:00
parent 4e6000da1e
commit e8a3ab4f61
14 changed files with 507 additions and 384 deletions

View File

@ -677,38 +677,50 @@ public func channelAdminController(account: Account, peerId: PeerId, adminId: Pe
updateFlags = defaultFlags updateFlags = defaultFlags
} }
if let updateFlags = updateFlags, updateFlags != defaultFlags { if let updateFlags = updateFlags {
let signal = convertGroupToSupergroup(account: account, peerId: peerId) if initialParticipant?.adminInfo == nil && updateFlags == defaultFlags {
|> map(Optional.init) updateState { current in
|> `catch` { _ -> Signal<PeerId?, NoError> in return current.withUpdatedUpdating(true)
return .single(nil) }
} updateRightsDisposable.set((addGroupAdmin(account: account, peerId: peerId, adminId: adminId)
|> mapToSignal { upgradedPeerId -> Signal<PeerId?, NoError> in |> deliverOnMainQueue).start(completed: {
guard let upgradedPeerId = upgradedPeerId else { dismissImpl?()
}))
} else if updateFlags != defaultFlags {
let signal = convertGroupToSupergroup(account: account, peerId: peerId)
|> map(Optional.init)
|> `catch` { _ -> Signal<PeerId?, NoError> in
return .single(nil) return .single(nil)
} }
return account.telegramApplicationContext.peerChannelMemberCategoriesContextsManager.updateMemberAdminRights(account: account, peerId: upgradedPeerId, memberId: adminId, adminRights: TelegramChatAdminRights(flags: updateFlags)) |> mapToSignal { upgradedPeerId -> Signal<PeerId?, NoError> in
|> mapToSignal { _ -> Signal<PeerId?, NoError> in guard let upgradedPeerId = upgradedPeerId else {
return .complete() return .single(nil)
}
return account.telegramApplicationContext.peerChannelMemberCategoriesContextsManager.updateMemberAdminRights(account: account, peerId: upgradedPeerId, memberId: adminId, adminRights: TelegramChatAdminRights(flags: updateFlags))
|> mapToSignal { _ -> Signal<PeerId?, NoError> in
return .complete()
}
|> then(.single(upgradedPeerId))
} }
|> then(.single(upgradedPeerId)) |> deliverOnMainQueue
}
|> deliverOnMainQueue
updateState { current in
return current.withUpdatedUpdating(true)
}
updateRightsDisposable.set(signal.start(next: { upgradedPeerId in
if let upgradedPeerId = upgradedPeerId {
upgradedToSupergroup(upgradedPeerId, {
dismissImpl?()
})
}
}, error: { _ in
updateState { current in updateState { current in
return current.withUpdatedUpdating(false) return current.withUpdatedUpdating(true)
} }
})) updateRightsDisposable.set(signal.start(next: { upgradedPeerId in
if let upgradedPeerId = upgradedPeerId {
upgradedToSupergroup(upgradedPeerId, {
dismissImpl?()
})
}
}, error: { _ in
updateState { current in
return current.withUpdatedUpdating(false)
}
}))
} else {
dismissImpl?()
}
} else { } else {
dismissImpl?() dismissImpl?()
} }

View File

@ -490,6 +490,9 @@ public func channelAdminsController(account: Account, peerId: PeerId, loadComple
upgradedToSupergroupImpl?(upgradedPeerId, f) upgradedToSupergroupImpl?(upgradedPeerId, f)
} }
let peerView = Promise<PeerView>()
peerView.set(account.viewTracker.peerView(peerId))
let arguments = ChannelAdminsControllerArguments(account: account, openRecentActions: { let arguments = ChannelAdminsControllerArguments(account: account, openRecentActions: {
let _ = (account.postbox.loadedPeerWithId(peerId) let _ = (account.postbox.loadedPeerWithId(peerId)
|> deliverOnMainQueue).start(next: { peer in |> deliverOnMainQueue).start(next: { peer in
@ -526,21 +529,12 @@ public func channelAdminsController(account: Account, peerId: PeerId, loadComple
})) }))
} }
}, addAdmin: { }, addAdmin: {
updateState { current in let _ = (peerView.get()
var dismissController: (() -> Void)? |> take(1)
let controller = ChannelMembersSearchController(account: account, peerId: peerId, mode: .promote, filters: [], openPeer: { peer, participant in |> deliverOnMainQueue).start(next: { peerView in
if peerId.namespace == Namespaces.Peer.CloudGroup { updateState { current in
let presentationData = account.telegramApplicationContext.currentPresentationData.with { $0 } var dismissController: (() -> Void)?
let progress = OverlayStatusController(theme: presentationData.theme, strings: presentationData.strings, type: .loading(cancelled: nil)) let controller = ChannelMembersSearchController(account: account, peerId: peerId, mode: .promote, filters: [], openPeer: { peer, participant in
presentControllerImpl?(progress, nil)
addAdminDisposable.set((addGroupAdmin(account: account, peerId: peerId, adminId: peer.id)
|> deliverOnMainQueue).start(completed: {
[weak progress] in
dismissController?()
progress?.dismiss()
}))
} else {
dismissController?() dismissController?()
let presentationData = account.telegramApplicationContext.currentPresentationData.with { $0 } let presentationData = account.telegramApplicationContext.currentPresentationData.with { $0 }
if peer.id == account.peerId { if peer.id == account.peerId {
@ -551,32 +545,39 @@ public func channelAdminsController(account: Account, peerId: PeerId, loadComple
case .creator: case .creator:
return return
case let .member(_, _, _, banInfo): case let .member(_, _, _, banInfo):
if let banInfo = banInfo, banInfo.restrictedBy != account.peerId { if let banInfo = banInfo {
presentControllerImpl?(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: presentationData.theme), title: nil, text: presentationData.strings.Channel_Members_AddAdminErrorBlacklisted, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil) var canUnban = false
return if banInfo.restrictedBy != account.peerId {
canUnban = true
}
if let channel = peerView.peers[peerId] as? TelegramChannel {
if channel.hasPermission(.banMembers) {
canUnban = true
}
}
if !canUnban {
presentControllerImpl?(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: presentationData.theme), title: nil, text: presentationData.strings.Channel_Members_AddAdminErrorBlacklisted, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil)
return
}
} }
} }
} }
presentControllerImpl?(channelAdminController(account: account, peerId: peerId, adminId: peer.id, initialParticipant: participant?.participant, updated: { _ in presentControllerImpl?(channelAdminController(account: account, peerId: peerId, adminId: peer.id, initialParticipant: participant?.participant, updated: { _ in
}, upgradedToSupergroup: upgradedToSupergroup), ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) }, upgradedToSupergroup: upgradedToSupergroup), ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
})
dismissController = { [weak controller] in
controller?.dismiss()
} }
}) presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
dismissController = { [weak controller] in
controller?.dismiss() return current
} }
presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) })
return current
}
}, openAdmin: { participant in }, openAdmin: { participant in
presentControllerImpl?(channelAdminController(account: account, peerId: peerId, adminId: participant.peerId, initialParticipant: participant, updated: { _ in presentControllerImpl?(channelAdminController(account: account, peerId: peerId, adminId: participant.peerId, initialParticipant: participant, updated: { _ in
}, upgradedToSupergroup: upgradedToSupergroup), ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) }, upgradedToSupergroup: upgradedToSupergroup), ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
}) })
let peerView = Promise<PeerView>()
peerView.set(account.viewTracker.peerView(peerId))
let membersAndLoadMoreControl: (Disposable, PeerChannelMemberCategoryControl?) let membersAndLoadMoreControl: (Disposable, PeerChannelMemberCategoryControl?)
if peerId.namespace == Namespaces.Peer.CloudChannel { if peerId.namespace == Namespaces.Peer.CloudChannel {
var didReportLoadCompleted = false var didReportLoadCompleted = false

View File

@ -451,7 +451,7 @@ private func channelInfoEntries(account: Account, presentationData: Presentation
} }
if let cachedChannelData = view.cachedData as? CachedChannelData { if let cachedChannelData = view.cachedData as? CachedChannelData {
if state.editingState != nil && canEditMembers { if canEditMembers {
if peer.adminRights != nil || peer.flags.contains(.isCreator) { if peer.adminRights != nil || peer.flags.contains(.isCreator) {
let adminCount = cachedChannelData.participantsSummary.adminCount ?? 0 let adminCount = cachedChannelData.participantsSummary.adminCount ?? 0
entries.append(.admins(theme: presentationData.theme, text: presentationData.strings.GroupInfo_Administrators, value: "\(adminCount == 0 ? "" : "\(adminCount)")")) entries.append(.admins(theme: presentationData.theme, text: presentationData.strings.GroupInfo_Administrators, value: "\(adminCount == 0 ? "" : "\(adminCount)")"))

View File

@ -14,8 +14,9 @@ private final class ChannelPermissionsControllerArguments {
let openPeer: (ChannelParticipant) -> Void let openPeer: (ChannelParticipant) -> Void
let openPeerInfo: (Peer) -> Void let openPeerInfo: (Peer) -> Void
let openKicked: () -> Void let openKicked: () -> Void
let presentRestrictedPublicGroupPermissionsAlert: () -> Void
init(account: Account, updatePermission: @escaping (TelegramChatBannedRightsFlags, Bool) -> Void, setPeerIdWithRevealedOptions: @escaping (PeerId?, PeerId?) -> Void, addPeer: @escaping () -> Void, removePeer: @escaping (PeerId) -> Void, openPeer: @escaping (ChannelParticipant) -> Void, openPeerInfo: @escaping (Peer) -> Void, openKicked: @escaping () -> Void) { init(account: Account, updatePermission: @escaping (TelegramChatBannedRightsFlags, Bool) -> Void, setPeerIdWithRevealedOptions: @escaping (PeerId?, PeerId?) -> Void, addPeer: @escaping () -> Void, removePeer: @escaping (PeerId) -> Void, openPeer: @escaping (ChannelParticipant) -> Void, openPeerInfo: @escaping (Peer) -> Void, openKicked: @escaping () -> Void, presentRestrictedPublicGroupPermissionsAlert: @escaping () -> Void) {
self.account = account self.account = account
self.updatePermission = updatePermission self.updatePermission = updatePermission
self.addPeer = addPeer self.addPeer = addPeer
@ -24,6 +25,7 @@ private final class ChannelPermissionsControllerArguments {
self.openPeer = openPeer self.openPeer = openPeer
self.openPeerInfo = openPeerInfo self.openPeerInfo = openPeerInfo
self.openKicked = openKicked self.openKicked = openKicked
self.presentRestrictedPublicGroupPermissionsAlert = presentRestrictedPublicGroupPermissionsAlert
} }
} }
@ -40,7 +42,7 @@ private enum ChannelPermissionsEntryStableId: Hashable {
private enum ChannelPermissionsEntry: ItemListNodeEntry { private enum ChannelPermissionsEntry: ItemListNodeEntry {
case permissionsHeader(PresentationTheme, String) case permissionsHeader(PresentationTheme, String)
case permission(PresentationTheme, Int, String, Bool, TelegramChatBannedRightsFlags, Bool) case permission(PresentationTheme, Int, String, Bool, TelegramChatBannedRightsFlags, Bool?)
case kicked(PresentationTheme, String, String) case kicked(PresentationTheme, String, String)
case exceptionsHeader(PresentationTheme, String) case exceptionsHeader(PresentationTheme, String)
case add(PresentationTheme, String) case add(PresentationTheme, String)
@ -173,8 +175,12 @@ private enum ChannelPermissionsEntry: ItemListNodeEntry {
case let .permissionsHeader(theme, text): case let .permissionsHeader(theme, text):
return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section) return ItemListSectionHeaderItem(theme: theme, text: text, sectionId: self.section)
case let .permission(theme, _, title, value, rights, enabled): case let .permission(theme, _, title, value, rights, enabled):
return ItemListSwitchItem(theme: theme, title: title, value: value, type: .icon, enabled: enabled, sectionId: self.section, style: .blocks, updated: { value in return ItemListSwitchItem(theme: theme, title: title, value: value, type: .icon, enabled: enabled ?? true, sectionId: self.section, style: .blocks, updated: { value in
arguments.updatePermission(rights, value) if let _ = enabled {
arguments.updatePermission(rights, value)
} else {
arguments.presentRestrictedPublicGroupPermissionsAlert()
}
}) })
case let .kicked(theme, text, value): case let .kicked(theme, text, value):
return ItemListDisclosureItem(theme: theme, title: text, label: value, sectionId: self.section, style: .blocks, action: { return ItemListDisclosureItem(theme: theme, title: text, label: value, sectionId: self.section, style: .blocks, action: {
@ -341,9 +347,9 @@ private func channelPermissionsControllerEntries(presentationData: PresentationD
entries.append(.permissionsHeader(presentationData.theme, presentationData.strings.GroupInfo_Permissions_SectionTitle)) entries.append(.permissionsHeader(presentationData.theme, presentationData.strings.GroupInfo_Permissions_SectionTitle))
var rightIndex: Int = 0 var rightIndex: Int = 0
for rights in allGroupPermissionList { for rights in allGroupPermissionList {
var enabled = true var enabled: Bool? = true
if channel.addressName != nil { if channel.addressName != nil && !publicGroupRestrictedPermissions.contains(rights) {
enabled = !publicGroupRestrictedPermissions.contains(rights) enabled = nil
} }
entries.append(.permission(presentationData.theme, rightIndex, stringForGroupPermission(strings: presentationData.strings, right: rights), !effectiveRightsFlags.contains(rights), rights, enabled)) entries.append(.permission(presentationData.theme, rightIndex, stringForGroupPermission(strings: presentationData.strings, right: rights), !effectiveRightsFlags.contains(rights), rights, enabled))
rightIndex += 1 rightIndex += 1
@ -566,6 +572,9 @@ public func channelPermissionsController(account: Account, peerId: PeerId, loadC
} }
}, openKicked: { }, openKicked: {
pushControllerImpl?(channelBlacklistController(account: account, peerId: peerId)) pushControllerImpl?(channelBlacklistController(account: account, peerId: peerId))
}, presentRestrictedPublicGroupPermissionsAlert: {
let presentationData = account.telegramApplicationContext.currentPresentationData.with { $0 }
presentControllerImpl?(standardTextAlertController(theme: AlertControllerTheme(presentationTheme: presentationData.theme), title: nil, text: presentationData.strings.GroupPermission_NotAvailableInPublicGroups, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil)
}) })
let previousParticipants = Atomic<[RenderedChannelParticipant]?>(value: nil) let previousParticipants = Atomic<[RenderedChannelParticipant]?>(value: nil)

View File

@ -2578,8 +2578,10 @@ public final class ChatController: TelegramController, KeyShortcutResponder, Gal
let banDescription: String let banDescription: String
switch subject { switch subject {
case .stickers: case .stickers:
if personal { if untilDate != 0 && untilDate != Int32.max {
banDescription = strongSelf.presentationInterfaceState.strings.Group_ErrorSendRestrictedStickers banDescription = strongSelf.presentationInterfaceState.strings.Conversation_RestrictedStickersTimed(stringForFullDate(timestamp: untilDate, strings: strongSelf.presentationInterfaceState.strings, dateTimeFormat: strongSelf.presentationInterfaceState.dateTimeFormat)).0
} else if personal {
banDescription = strongSelf.presentationInterfaceState.strings.Conversation_RestrictedStickers
} else { } else {
banDescription = strongSelf.presentationInterfaceState.strings.Conversation_DefaultRestrictedStickers banDescription = strongSelf.presentationInterfaceState.strings.Conversation_DefaultRestrictedStickers
} }
@ -3739,10 +3741,21 @@ public final class ChatController: TelegramController, KeyShortcutResponder, Gal
strongSelf.chatDisplayNode.dismissInput() strongSelf.chatDisplayNode.dismissInput()
var bannedSendMedia: (Int32, Bool)? var bannedSendMedia: (Int32, Bool)?
if let channel = peer as? TelegramChannel, let value = channel.hasBannedPermission(.banSendMedia) { var canSendPolls = true
bannedSendMedia = value if let channel = peer as? TelegramChannel {
} else if let group = peer as? TelegramGroup, group.hasBannedPermission(.banSendMedia) { if let value = channel.hasBannedPermission(.banSendMedia) {
bannedSendMedia = (Int32.max, false) bannedSendMedia = value
}
if channel.hasBannedPermission(.banSendPolls) != nil {
canSendPolls = false
}
} else if let group = peer as? TelegramGroup {
if group.hasBannedPermission(.banSendMedia) {
bannedSendMedia = (Int32.max, false)
}
if group.hasBannedPermission(.banSendPolls) {
canSendPolls = false
}
} }
if editMediaOptions == nil, let (untilDate, personal) = bannedSendMedia { if editMediaOptions == nil, let (untilDate, personal) = bannedSendMedia {
@ -3756,16 +3769,24 @@ public final class ChatController: TelegramController, KeyShortcutResponder, Gal
} }
let actionSheet = ActionSheetController(presentationTheme: strongSelf.presentationData.theme) let actionSheet = ActionSheetController(presentationTheme: strongSelf.presentationData.theme)
var items: [ActionSheetItem] = []
items.append(ActionSheetTextItem(title: banDescription))
items.append(ActionSheetButtonItem(title: strongSelf.presentationData.strings.Conversation_Location, color: .accent, action: { [weak actionSheet] in
actionSheet?.dismissAnimated()
self?.presentMapPicker(editingMessage: false)
}))
if canSendPolls {
items.append(ActionSheetButtonItem(title: strongSelf.presentationData.strings.AttachmentMenu_Poll, color: .accent, action: { [weak actionSheet] in
actionSheet?.dismissAnimated()
self?.presentPollCreation()
}))
}
items.append(ActionSheetButtonItem(title: strongSelf.presentationData.strings.Conversation_Contact, color: .accent, action: { [weak actionSheet] in
actionSheet?.dismissAnimated()
self?.presentContactPicker()
}))
actionSheet.setItemGroups([ActionSheetItemGroup(items: [ actionSheet.setItemGroups([ActionSheetItemGroup(items: [
ActionSheetTextItem(title: banDescription),
ActionSheetButtonItem(title: strongSelf.presentationData.strings.Conversation_Location, color: .accent, action: { [weak actionSheet] in
actionSheet?.dismissAnimated()
self?.presentMapPicker(editingMessage: false)
}),
ActionSheetButtonItem(title: strongSelf.presentationData.strings.Conversation_Contact, color: .accent, action: { [weak actionSheet] in
actionSheet?.dismissAnimated()
self?.presentContactPicker()
})
]), ActionSheetItemGroup(items: [ ]), ActionSheetItemGroup(items: [
ActionSheetButtonItem(title: strongSelf.presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in ActionSheetButtonItem(title: strongSelf.presentationData.strings.Common_Cancel, color: .accent, action: { [weak actionSheet] in
actionSheet?.dismissAnimated() actionSheet?.dismissAnimated()

View File

@ -17,7 +17,7 @@ func chatHistoryEntriesForView(location: ChatLocation, view: MessageHistoryView,
} }
var groupBucket: [(Message, Bool, ChatHistoryMessageSelection, Bool)] = [] var groupBucket: [(Message, Bool, ChatHistoryMessageSelection, Bool)] = []
for entry in view.entries { loop: for entry in view.entries {
switch entry { switch entry {
case let .HoleEntry(hole, _): case let .HoleEntry(hole, _):
if !groupBucket.isEmpty { if !groupBucket.isEmpty {
@ -28,6 +28,19 @@ func chatHistoryEntriesForView(location: ChatLocation, view: MessageHistoryView,
entries.append(.HoleEntry(hole, presentationData)) entries.append(.HoleEntry(hole, presentationData))
} }
case let .MessageEntry(message, read, _, monthLocation): case let .MessageEntry(message, read, _, monthLocation):
if message.id.peerId.namespace == Namespaces.Peer.CloudChannel {
for media in message.media {
if let action = media as? TelegramMediaAction {
switch action.action {
case .channelMigratedFromGroup, .groupMigratedToChannel:
continue loop
default:
break
}
}
}
}
var isAdmin = false var isAdmin = false
if let author = message.author { if let author = message.author {
isAdmin = adminIds.contains(author.id) isAdmin = adminIds.contains(author.id)

View File

@ -585,12 +585,6 @@ private func canPerformEditingActions(limits: LimitsConfiguration, accountPeerId
return true return true
} }
if let peer = message.peers[message.id.peerId] as? TelegramChannel {
if peer.hasPermission(.pinMessages) {
return true
}
}
return false return false
} }

View File

@ -969,7 +969,7 @@ public class ChatListController: TelegramController, KeyShortcutResponder, UIVie
let signal: Signal<Void, NoError> = strongSelf.account.postbox.transaction { transaction -> Void in let signal: Signal<Void, NoError> = strongSelf.account.postbox.transaction { transaction -> Void in
for peerId in peerIds { for peerId in peerIds {
removePeerChat(transaction: transaction, mediaBox: account.postbox.mediaBox, peerId: peerId, reportChatSpam: false) removePeerChat(transaction: transaction, mediaBox: account.postbox.mediaBox, peerId: peerId, reportChatSpam: false, deleteGloballyIfPossible: false)
} }
} }
|> afterDisposed { |> afterDisposed {

View File

@ -20,11 +20,17 @@ private let searchLayoutProgressImage = generateImage(CGSize(width: 22.0, height
private let accessoryButtonFont = Font.medium(14.0) private let accessoryButtonFont = Font.medium(14.0)
private final class AccessoryItemIconButton: HighlightableButton { private final class AccessoryItemIconButton: HighlightTrackingButton {
private let item: ChatTextInputAccessoryItem private let item: ChatTextInputAccessoryItem
private var width: CGFloat private var width: CGFloat
private let imageNode: ASImageNode
init(item: ChatTextInputAccessoryItem, theme: PresentationTheme, strings: PresentationStrings) { init(item: ChatTextInputAccessoryItem, theme: PresentationTheme, strings: PresentationStrings) {
self.imageNode = ASImageNode()
self.imageNode.isLayerBacked = true
self.imageNode.displaysAsynchronously = false
self.imageNode.displayWithoutProcessing = true
self.item = item self.item = item
let (image, text, alpha, insets) = AccessoryItemIconButton.imageAndInsets(item: item, theme: theme, strings: strings) let (image, text, alpha, insets) = AccessoryItemIconButton.imageAndInsets(item: item, theme: theme, strings: strings)
@ -33,15 +39,29 @@ private final class AccessoryItemIconButton: HighlightableButton {
super.init(frame: CGRect()) super.init(frame: CGRect())
self.addSubnode(self.imageNode)
if let text = text { if let text = text {
self.titleLabel?.font = accessoryButtonFont self.titleLabel?.font = accessoryButtonFont
self.setTitleColor(theme.chat.inputPanel.inputControlColor, for: []) self.setTitleColor(theme.chat.inputPanel.inputControlColor, for: [])
self.setTitle(text, for: []) self.setTitle(text, for: [])
} }
self.setImage(image, for: []) self.imageNode.image = image
self.imageNode.alpha = alpha
self.imageEdgeInsets = insets self.imageEdgeInsets = insets
self.imageView?.alpha = alpha
self.highligthedChanged = { [weak self] highlighted in
if let strongSelf = self {
if highlighted {
strongSelf.layer.removeAnimation(forKey: "opacity")
strongSelf.alpha = 0.4
} else {
strongSelf.alpha = 1.0
strongSelf.layer.animateAlpha(from: 0.4, to: 1.0, duration: 0.2)
}
}
}
} }
func updateThemeAndStrings(theme: PresentationTheme, strings: PresentationStrings) { func updateThemeAndStrings(theme: PresentationTheme, strings: PresentationStrings) {
@ -57,9 +77,9 @@ private final class AccessoryItemIconButton: HighlightableButton {
self.setTitle("", for: []) self.setTitle("", for: [])
} }
self.setImage(image, for: []) self.imageNode.image = image
self.imageEdgeInsets = insets self.imageEdgeInsets = insets
self.imageView?.alpha = alpha self.imageNode.alpha = alpha
} }
required init?(coder aDecoder: NSCoder) { required init?(coder aDecoder: NSCoder) {
@ -105,6 +125,12 @@ private final class AccessoryItemIconButton: HighlightableButton {
} }
} }
func updateLayout(size: CGSize) {
if let image = self.imageNode.image {
self.imageNode.frame = CGRect(origin: CGPoint(x: floor((size.width - image.size.width) / 2.0), y: floor((size.width - image.size.width) / 2.0) - self.imageEdgeInsets.bottom), size: image.size)
}
}
var buttonWidth: CGFloat { var buttonWidth: CGFloat {
return self.width return self.width
} }
@ -984,6 +1010,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate {
var nextButtonTopRight = CGPoint(x: width - rightInset - textFieldInsets.right - accessoryButtonInset, y: panelHeight - textFieldInsets.bottom - minimalInputHeight + audioRecordingItemsVerticalOffset) var nextButtonTopRight = CGPoint(x: width - rightInset - textFieldInsets.right - accessoryButtonInset, y: panelHeight - textFieldInsets.bottom - minimalInputHeight + audioRecordingItemsVerticalOffset)
for (_, button) in self.accessoryItemButtons.reversed() { for (_, button) in self.accessoryItemButtons.reversed() {
let buttonSize = CGSize(width: button.buttonWidth, height: minimalInputHeight) let buttonSize = CGSize(width: button.buttonWidth, height: minimalInputHeight)
button.updateLayout(size: buttonSize)
let buttonFrame = CGRect(origin: CGPoint(x: nextButtonTopRight.x - buttonSize.width, y: nextButtonTopRight.y + floor((minimalInputHeight - buttonSize.height) / 2.0)), size: buttonSize) let buttonFrame = CGRect(origin: CGPoint(x: nextButtonTopRight.x - buttonSize.width, y: nextButtonTopRight.y + floor((minimalInputHeight - buttonSize.height) / 2.0)), size: buttonSize)
if button.superview == nil { if button.superview == nil {
self.view.addSubview(button) self.view.addSubview(button)

View File

@ -730,6 +730,9 @@ final class ContactListNode: ASDisplayNode {
self.selectionStatePromise.set(.single(self.selectionStateValue)) self.selectionStatePromise.set(.single(self.selectionStateValue))
} }
} }
var selectionState: ContactListNodeGroupSelectionState? {
return self.selectionStateValue
}
private var enableUpdatesValue = false private var enableUpdatesValue = false
var enableUpdates: Bool { var enableUpdates: Bool {

View File

@ -131,7 +131,8 @@ class ContactMultiselectionController: ViewController {
switch self.mode { switch self.mode {
case .groupCreation: case .groupCreation:
let maxCount: Int32 = self.limitsConfiguration?.maxSupergroupMemberCount ?? 5000 let maxCount: Int32 = self.limitsConfiguration?.maxSupergroupMemberCount ?? 5000
self.titleView.title = CounterContollerTitle(title: self.presentationData.strings.Compose_NewGroupTitle, counter: "0/\(maxCount)") let count = self.contactsNode.contactListNode.selectionState?.selectedPeerIndices.count ?? 0
self.titleView.title = CounterContollerTitle(title: self.presentationData.strings.Compose_NewGroupTitle, counter: "\(count)/\(maxCount)")
let rightNavigationButton = UIBarButtonItem(title: self.presentationData.strings.Common_Next, style: .done, target: self, action: #selector(self.rightNavigationButtonPressed)) let rightNavigationButton = UIBarButtonItem(title: self.presentationData.strings.Common_Next, style: .done, target: self, action: #selector(self.rightNavigationButtonPressed))
self.rightNavigationButton = rightNavigationButton self.rightNavigationButton = rightNavigationButton
self.navigationItem.rightBarButtonItem = self.rightNavigationButton self.navigationItem.rightBarButtonItem = self.rightNavigationButton

View File

@ -698,9 +698,7 @@ private func groupInfoEntries(account: Account, presentationData: PresentationDa
var canAddMembers = false var canAddMembers = false
var isPublic = false var isPublic = false
var isCreator = false var isCreator = false
var isGroup = false
if let group = view.peers[view.peerId] as? TelegramGroup { if let group = view.peers[view.peerId] as? TelegramGroup {
isGroup = true
if case .creator = group.role { if case .creator = group.role {
isCreator = true isCreator = true
} }
@ -713,10 +711,13 @@ private func groupInfoEntries(account: Account, presentationData: PresentationDa
case .member: case .member:
break break
} }
} else if let channel = view.peers[view.peerId] as? TelegramChannel { if !group.hasBannedPermission(.banChangeInfo) {
if case .group = channel.info { canEditGroupInfo = true
isGroup = true
} }
if !group.hasBannedPermission(.banAddMembers) {
canAddMembers = true
}
} else if let channel = view.peers[view.peerId] as? TelegramChannel {
highlightAdmins = true highlightAdmins = true
isPublic = channel.username != nil isPublic = channel.username != nil
isCreator = channel.flags.contains(.isCreator) isCreator = channel.flags.contains(.isCreator)
@ -1074,8 +1075,18 @@ private func groupInfoEntries(account: Account, presentationData: PresentationDa
entries.append(.leave(presentationData.theme, presentationData.strings.Group_LeaveGroup)) entries.append(.leave(presentationData.theme, presentationData.strings.Group_LeaveGroup))
} }
} else if let channel = view.peers[view.peerId] as? TelegramChannel { } else if let channel = view.peers[view.peerId] as? TelegramChannel {
if case .member = channel.participationStatus, let cachedChannelData = view.cachedData as? CachedChannelData, let memberCount = cachedChannelData.participantsSummary.memberCount, memberCount <= 200 { if case .member = channel.participationStatus {
entries.append(.leave(presentationData.theme, presentationData.strings.Group_LeaveGroup)) if channel.flags.contains(.isCreator) {
if let cachedChannelData = view.cachedData as? CachedChannelData, let memberCount = cachedChannelData.participantsSummary.memberCount, memberCount <= 200 {
if state.editingState != nil {
entries.append(.leave(presentationData.theme, presentationData.strings.ChannelInfo_DeleteGroup))
} else {
entries.append(.leave(presentationData.theme, presentationData.strings.Group_LeaveGroup))
}
}
} else {
entries.append(.leave(presentationData.theme, presentationData.strings.Group_LeaveGroup))
}
} }
} }
@ -1177,6 +1188,9 @@ public func groupInfoController(account: Account, peerId: PeerId) -> ViewControl
var upgradedToSupergroupImpl: ((PeerId, @escaping () -> Void) -> Void)? var upgradedToSupergroupImpl: ((PeerId, @escaping () -> Void) -> Void)?
let peerView = Promise<PeerView>()
peerView.set(account.viewTracker.peerView(peerId))
let arguments = GroupInfoArguments(account: account, peerId: peerId, avatarAndNameInfoContext: avatarAndNameInfoContext, tapAvatarAction: { let arguments = GroupInfoArguments(account: account, peerId: peerId, avatarAndNameInfoContext: avatarAndNameInfoContext, tapAvatarAction: {
let _ = (account.postbox.loadedPeerWithId(peerId) let _ = (account.postbox.loadedPeerWithId(peerId)
|> take(1) |> take(1)
@ -1427,7 +1441,7 @@ public func groupInfoController(account: Account, peerId: PeerId) -> ViewControl
return account.telegramApplicationContext.peerChannelMemberCategoriesContextsManager.addMember(account: account, peerId: peerId, memberId: memberId) return account.telegramApplicationContext.peerChannelMemberCategoriesContextsManager.addMember(account: account, peerId: peerId, memberId: memberId)
} }
return account.postbox.peerView(id: memberId) return peerView.get()
|> take(1) |> take(1)
|> deliverOnMainQueue |> deliverOnMainQueue
|> mapToSignal { view -> Signal<Void, NoError> in |> mapToSignal { view -> Signal<Void, NoError> in
@ -1648,28 +1662,55 @@ public func groupInfoController(account: Account, peerId: PeerId) -> ViewControl
}, convertToSupergroup: { }, convertToSupergroup: {
pushControllerImpl?(convertToSupergroupController(account: account, peerId: peerId)) pushControllerImpl?(convertToSupergroupController(account: account, peerId: peerId))
}, leave: { }, leave: {
let presentationData = account.telegramApplicationContext.currentPresentationData.with { $0 } let _ = (peerView.get()
let controller = ActionSheetController(presentationTheme: presentationData.theme) |> take(1)
let dismissAction: () -> Void = { [weak controller] in |> deliverOnMainQueue).start(next: { peerView in
controller?.dismissAnimated() let presentationData = account.telegramApplicationContext.currentPresentationData.with { $0 }
}
var items: [ActionSheetItem] = [] if let channel = peerView.peers[peerId] as? TelegramChannel, channel.flags.contains(.isCreator), stateValue.with({ $0 }).editingState != nil {
if peerId.namespace == Namespaces.Peer.CloudGroup { let controller = ActionSheetController(presentationTheme: presentationData.theme)
items.append(ActionSheetTextItem(title: presentationData.strings.GroupInfo_DeleteAndExitConfirmation)) let dismissAction: () -> Void = { [weak controller] in
} controller?.dismissAnimated()
items.append(ActionSheetButtonItem(title: presentationData.strings.Group_LeaveGroup, color: .destructive, action: { }
dismissAction()
let _ = (removePeerChat(postbox: account.postbox, peerId: peerId, reportChatSpam: false) var items: [ActionSheetItem] = []
|> deliverOnMainQueue).start(completed: { items.append(ActionSheetTextItem(title: presentationData.strings.ChannelInfo_DeleteGroupConfirmation))
popToRootImpl?() items.append(ActionSheetButtonItem(title: presentationData.strings.ChannelInfo_DeleteGroup, color: .destructive, action: {
}) dismissAction()
})) let _ = (removePeerChat(postbox: account.postbox, peerId: peerId, reportChatSpam: false, deleteGloballyIfPossible: true)
controller.setItemGroups([ |> deliverOnMainQueue).start(completed: {
ActionSheetItemGroup(items: items), popToRootImpl?()
ActionSheetItemGroup(items: [ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, action: { dismissAction() })]) })
]) }))
presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) controller.setItemGroups([
ActionSheetItemGroup(items: items),
ActionSheetItemGroup(items: [ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, action: { dismissAction() })])
])
presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
} else {
let controller = ActionSheetController(presentationTheme: presentationData.theme)
let dismissAction: () -> Void = { [weak controller] in
controller?.dismissAnimated()
}
var items: [ActionSheetItem] = []
if peerId.namespace == Namespaces.Peer.CloudGroup {
items.append(ActionSheetTextItem(title: presentationData.strings.GroupInfo_DeleteAndExitConfirmation))
}
items.append(ActionSheetButtonItem(title: presentationData.strings.Group_LeaveGroup, color: .destructive, action: {
dismissAction()
let _ = (removePeerChat(postbox: account.postbox, peerId: peerId, reportChatSpam: false)
|> deliverOnMainQueue).start(completed: {
popToRootImpl?()
})
}))
controller.setItemGroups([
ActionSheetItemGroup(items: items),
ActionSheetItemGroup(items: [ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, action: { dismissAction() })])
])
presentControllerImpl?(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
}
})
}, displayUsernameShareMenu: { text in }, displayUsernameShareMenu: { text in
let shareController = ShareController(account: account, subject: .url(text)) let shareController = ShareController(account: account, subject: .url(text))
presentControllerImpl?(shareController, nil) presentControllerImpl?(shareController, nil)
@ -1709,7 +1750,7 @@ public func groupInfoController(account: Account, peerId: PeerId) -> ViewControl
let previousChannelMembers = Atomic<[PeerId]?>(value: nil) let previousChannelMembers = Atomic<[PeerId]?>(value: nil)
let globalNotificationsKey: PostboxViewKey = .preferences(keys: Set<ValueBoxKey>([PreferencesKeys.globalNotifications])) let globalNotificationsKey: PostboxViewKey = .preferences(keys: Set<ValueBoxKey>([PreferencesKeys.globalNotifications]))
let signal = combineLatest(queue: .mainQueue(), (account.applicationContext as! TelegramApplicationContext).presentationData, statePromise.get(), account.viewTracker.peerView(peerId), account.postbox.combinedView(keys: [globalNotificationsKey]), channelMembersPromise.get()) let signal = combineLatest(queue: .mainQueue(), (account.applicationContext as! TelegramApplicationContext).presentationData, statePromise.get(), peerView.get(), account.postbox.combinedView(keys: [globalNotificationsKey]), channelMembersPromise.get())
|> map { presentationData, state, view, combinedView, channelMembers -> (ItemListControllerState, (ItemListNodeState<GroupInfoEntry>, GroupInfoEntry.ItemGenerationArguments)) in |> map { presentationData, state, view, combinedView, channelMembers -> (ItemListControllerState, (ItemListNodeState<GroupInfoEntry>, GroupInfoEntry.ItemGenerationArguments)) in
let peer = peerViewMainPeer(view) let peer = peerViewMainPeer(view)

View File

@ -3322,509 +3322,510 @@ public final class PresentationStrings {
return formatWithArgumentRanges(self._s[2858]!, self._r[2858]!, [_1, _2]) return formatWithArgumentRanges(self._s[2858]!, self._r[2858]!, [_1, _2])
} }
public var Group_Info_AdminLog: String { return self._s[2859]! } public var Group_Info_AdminLog: String { return self._s[2859]! }
public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[2860]! } public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[2860]! }
public var Conversation_Admin: String { return self._s[2862]! } public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[2861]! }
public var Conversation_GifTooltip: String { return self._s[2863]! } public var Conversation_Admin: String { return self._s[2863]! }
public var Passport_NotLoggedInMessage: String { return self._s[2864]! } public var Conversation_GifTooltip: String { return self._s[2864]! }
public var Profile_MessageLifetimeForever: String { return self._s[2865]! } public var Passport_NotLoggedInMessage: String { return self._s[2865]! }
public var Profile_MessageLifetimeForever: String { return self._s[2866]! }
public func MESSAGE_POLL_SEPARATED(_ _1: String) -> (String, [(Int, NSRange)]) { public func MESSAGE_POLL_SEPARATED(_ _1: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2867]!, self._r[2867]!, [_1]) return formatWithArgumentRanges(self._s[2868]!, self._r[2868]!, [_1])
} }
public var SharedMedia_EmptyTitle: String { return self._s[2868]! } public var SharedMedia_EmptyTitle: String { return self._s[2869]! }
public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[2869]! } public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[2870]! }
public var Username_Help: String { return self._s[2870]! } public var Username_Help: String { return self._s[2871]! }
public var DialogList_LanguageTooltip: String { return self._s[2872]! } public var DialogList_LanguageTooltip: String { return self._s[2873]! }
public var Map_LoadError: String { return self._s[2873]! } public var Map_LoadError: String { return self._s[2874]! }
public var Notification_Exceptions_NewException: String { return self._s[2874]! } public var Notification_Exceptions_NewException: String { return self._s[2875]! }
public var TwoStepAuth_EmailTitle: String { return self._s[2875]! } public var TwoStepAuth_EmailTitle: String { return self._s[2876]! }
public var WatchRemote_AlertText: String { return self._s[2876]! } public var WatchRemote_AlertText: String { return self._s[2877]! }
public var ChatSettings_ConnectionType_Title: String { return self._s[2878]! } public var ChatSettings_ConnectionType_Title: String { return self._s[2879]! }
public func CHANNEL_MESSAGE_GEOLIVE_SEPARATED(_ _1: String) -> (String, [(Int, NSRange)]) { public func CHANNEL_MESSAGE_GEOLIVE_SEPARATED(_ _1: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2879]!, self._r[2879]!, [_1])
}
public func LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2880]!, self._r[2880]!, [_1]) return formatWithArgumentRanges(self._s[2880]!, self._r[2880]!, [_1])
} }
public var Passport_Address_CountryPlaceholder: String { return self._s[2881]! } public func LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2881]!, self._r[2881]!, [_1])
}
public var Passport_Address_CountryPlaceholder: String { return self._s[2882]! }
public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2882]!, self._r[2882]!, [_0]) return formatWithArgumentRanges(self._s[2883]!, self._r[2883]!, [_0])
} }
public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2883]!, self._r[2883]!, [_1, _2, _3]) return formatWithArgumentRanges(self._s[2884]!, self._r[2884]!, [_1, _2, _3])
} }
public var Group_AdminLog_EmptyText: String { return self._s[2884]! } public var Group_AdminLog_EmptyText: String { return self._s[2885]! }
public var AccessDenied_VideoMicrophone: String { return self._s[2886]! } public var AccessDenied_VideoMicrophone: String { return self._s[2887]! }
public var Conversation_ContextMenuStickerPackAdd: String { return self._s[2887]! } public var Conversation_ContextMenuStickerPackAdd: String { return self._s[2888]! }
public var Cache_ClearNone: String { return self._s[2888]! } public var Cache_ClearNone: String { return self._s[2889]! }
public var SocksProxySetup_FailedToConnect: String { return self._s[2889]! } public var SocksProxySetup_FailedToConnect: String { return self._s[2890]! }
public var Permissions_NotificationsTitle_v0: String { return self._s[2890]! } public var Permissions_NotificationsTitle_v0: String { return self._s[2891]! }
public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) { public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2891]!, self._r[2891]!, [_0]) return formatWithArgumentRanges(self._s[2892]!, self._r[2892]!, [_0])
} }
public var Passport_Identity_Country: String { return self._s[2892]! } public var Passport_Identity_Country: String { return self._s[2893]! }
public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2893]!, self._r[2893]!, [_0]) return formatWithArgumentRanges(self._s[2894]!, self._r[2894]!, [_0])
} }
public var AccessDenied_Settings: String { return self._s[2894]! } public var AccessDenied_Settings: String { return self._s[2895]! }
public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[2895]! } public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[2896]! }
public var Month_ShortMay: String { return self._s[2896]! } public var Month_ShortMay: String { return self._s[2897]! }
public var Compose_NewGroup: String { return self._s[2897]! } public var Compose_NewGroup: String { return self._s[2898]! }
public var Group_Setup_TypePrivate: String { return self._s[2899]! } public var Group_Setup_TypePrivate: String { return self._s[2900]! }
public var Login_PadPhoneHelpTitle: String { return self._s[2900]! } public var Login_PadPhoneHelpTitle: String { return self._s[2901]! }
public var Appearance_ThemeDayClassic: String { return self._s[2901]! } public var Appearance_ThemeDayClassic: String { return self._s[2902]! }
public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[2902]! } public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[2903]! }
public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[2903]! } public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[2904]! }
public var Conversation_typing: String { return self._s[2905]! } public var Conversation_typing: String { return self._s[2906]! }
public var Paint_Masks: String { return self._s[2906]! } public var Paint_Masks: String { return self._s[2907]! }
public func PINNED_DOC_SEPARATED(_ _1: String) -> (String, [(Int, NSRange)]) { public func PINNED_DOC_SEPARATED(_ _1: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2907]!, self._r[2907]!, [_1]) return formatWithArgumentRanges(self._s[2908]!, self._r[2908]!, [_1])
} }
public var Username_InvalidTaken: String { return self._s[2908]! } public var Username_InvalidTaken: String { return self._s[2909]! }
public func CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { public func CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2909]!, self._r[2909]!, [_1, _2]) return formatWithArgumentRanges(self._s[2910]!, self._r[2910]!, [_1, _2])
} }
public var Call_StatusNoAnswer: String { return self._s[2910]! } public var Call_StatusNoAnswer: String { return self._s[2911]! }
public var TwoStepAuth_EmailAddSuccess: String { return self._s[2911]! } public var TwoStepAuth_EmailAddSuccess: String { return self._s[2912]! }
public var Passport_Identity_Selfie: String { return self._s[2912]! } public var Passport_Identity_Selfie: String { return self._s[2913]! }
public var Login_InfoLastNamePlaceholder: String { return self._s[2913]! } public var Login_InfoLastNamePlaceholder: String { return self._s[2914]! }
public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[2914]! } public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[2915]! }
public var Conversation_ClearSecretHistory: String { return self._s[2915]! } public var Conversation_ClearSecretHistory: String { return self._s[2916]! }
public var NetworkUsageSettings_Title: String { return self._s[2917]! } public var NetworkUsageSettings_Title: String { return self._s[2918]! }
public var Your_cards_security_code_is_invalid: String { return self._s[2919]! } public var Your_cards_security_code_is_invalid: String { return self._s[2920]! }
public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) { public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2921]!, self._r[2921]!, [_0]) return formatWithArgumentRanges(self._s[2922]!, self._r[2922]!, [_0])
} }
public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2922]!, self._r[2922]!, [_1, _2]) return formatWithArgumentRanges(self._s[2923]!, self._r[2923]!, [_1, _2])
} }
public var SaveIncomingPhotosSettings_From: String { return self._s[2924]! } public var SaveIncomingPhotosSettings_From: String { return self._s[2925]! }
public var Map_LiveLocationTitle: String { return self._s[2925]! } public var Map_LiveLocationTitle: String { return self._s[2926]! }
public var Login_InfoAvatarAdd: String { return self._s[2926]! } public var Login_InfoAvatarAdd: String { return self._s[2927]! }
public var Passport_Identity_FilesView: String { return self._s[2927]! } public var Passport_Identity_FilesView: String { return self._s[2928]! }
public var UserInfo_GenericPhoneLabel: String { return self._s[2928]! } public var UserInfo_GenericPhoneLabel: String { return self._s[2929]! }
public var Privacy_Calls_NeverAllow: String { return self._s[2929]! } public var Privacy_Calls_NeverAllow: String { return self._s[2930]! }
public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2930]!, self._r[2930]!, [_0]) return formatWithArgumentRanges(self._s[2931]!, self._r[2931]!, [_0])
} }
public var TwoStepAuth_ConfirmationText: String { return self._s[2931]! } public var TwoStepAuth_ConfirmationText: String { return self._s[2932]! }
public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[2932]! } public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[2933]! }
public var Channel_AdminLogFilter_AdminsAll: String { return self._s[2933]! } public var Channel_AdminLogFilter_AdminsAll: String { return self._s[2934]! }
public var Tour_Title2: String { return self._s[2934]! } public var Tour_Title2: String { return self._s[2935]! }
public var Conversation_FileOpenIn: String { return self._s[2935]! } public var Conversation_FileOpenIn: String { return self._s[2936]! }
public var Checkout_ErrorPrecheckoutFailed: String { return self._s[2936]! } public var Checkout_ErrorPrecheckoutFailed: String { return self._s[2937]! }
public var Wallpaper_Set: String { return self._s[2937]! } public var Wallpaper_Set: String { return self._s[2938]! }
public var Passport_Identity_Translations: String { return self._s[2939]! } public var Passport_Identity_Translations: String { return self._s[2940]! }
public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2940]!, self._r[2940]!, [_0]) return formatWithArgumentRanges(self._s[2941]!, self._r[2941]!, [_0])
} }
public var Channel_LeaveChannel: String { return self._s[2941]! } public var Channel_LeaveChannel: String { return self._s[2942]! }
public func MESSAGE_NOTEXT_SEPARATED(_ _1: String) -> (String, [(Int, NSRange)]) { public func MESSAGE_NOTEXT_SEPARATED(_ _1: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2942]!, self._r[2942]!, [_1])
}
public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2943]!, self._r[2943]!, [_1]) return formatWithArgumentRanges(self._s[2943]!, self._r[2943]!, [_1])
} }
public var PhotoEditor_HighlightsTint: String { return self._s[2944]! } public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) {
public var Passport_Email_Delete: String { return self._s[2945]! } return formatWithArgumentRanges(self._s[2944]!, self._r[2944]!, [_1])
public var Conversation_Mute: String { return self._s[2947]! } }
public var Channel_AdminLog_CanSendMessages: String { return self._s[2949]! } public var PhotoEditor_HighlightsTint: String { return self._s[2945]! }
public var Passport_Email_Delete: String { return self._s[2946]! }
public var Conversation_Mute: String { return self._s[2948]! }
public var Channel_AdminLog_CanSendMessages: String { return self._s[2950]! }
public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2950]!, self._r[2950]!, [_1, _2]) return formatWithArgumentRanges(self._s[2951]!, self._r[2951]!, [_1, _2])
} }
public var Calls_CallTabDescription: String { return self._s[2951]! } public var Calls_CallTabDescription: String { return self._s[2952]! }
public var Passport_Identity_NativeNameHelp: String { return self._s[2952]! } public var Passport_Identity_NativeNameHelp: String { return self._s[2953]! }
public var Common_No: String { return self._s[2953]! } public var Common_No: String { return self._s[2954]! }
public var Weekday_Sunday: String { return self._s[2954]! } public var Weekday_Sunday: String { return self._s[2955]! }
public var Notification_Reply: String { return self._s[2955]! } public var Notification_Reply: String { return self._s[2956]! }
public var Conversation_ViewMessage: String { return self._s[2956]! } public var Conversation_ViewMessage: String { return self._s[2957]! }
public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) { public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2957]!, self._r[2957]!, [_0])
}
public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2958]!, self._r[2958]!, [_0]) return formatWithArgumentRanges(self._s[2958]!, self._r[2958]!, [_0])
} }
public var Message_PinnedDocumentMessage: String { return self._s[2959]! } public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) {
public var DialogList_TabTitle: String { return self._s[2961]! } return formatWithArgumentRanges(self._s[2959]!, self._r[2959]!, [_0])
public var Passport_FieldEmail: String { return self._s[2962]! }
public var Conversation_UnpinMessageAlert: String { return self._s[2963]! }
public var Passport_Address_TypeBankStatement: String { return self._s[2964]! }
public var Passport_Identity_ExpiryDate: String { return self._s[2965]! }
public var Privacy_Calls_P2P: String { return self._s[2966]! }
public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2968]!, self._r[2968]!, [_0])
} }
public var SocksProxySetup_UseForCallsHelp: String { return self._s[2969]! } public var Message_PinnedDocumentMessage: String { return self._s[2960]! }
public var EnterPasscode_ChangeTitle: String { return self._s[2970]! } public var DialogList_TabTitle: String { return self._s[2962]! }
public var Passport_InfoText: String { return self._s[2971]! } public var Passport_FieldEmail: String { return self._s[2963]! }
public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[2972]! } public var Conversation_UnpinMessageAlert: String { return self._s[2964]! }
public var Passport_Address_TypeBankStatement: String { return self._s[2965]! }
public var Passport_Identity_ExpiryDate: String { return self._s[2966]! }
public var Privacy_Calls_P2P: String { return self._s[2967]! }
public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2969]!, self._r[2969]!, [_0])
}
public var SocksProxySetup_UseForCallsHelp: String { return self._s[2970]! }
public var EnterPasscode_ChangeTitle: String { return self._s[2971]! }
public var Passport_InfoText: String { return self._s[2972]! }
public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[2973]! }
public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2973]!, self._r[2973]!, [_0]) return formatWithArgumentRanges(self._s[2974]!, self._r[2974]!, [_0])
} }
public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2974]!, self._r[2974]!, [_1, _2, _3]) return formatWithArgumentRanges(self._s[2975]!, self._r[2975]!, [_1, _2, _3])
} }
public var Passport_Identity_EditDriversLicense: String { return self._s[2975]! } public var Passport_Identity_EditDriversLicense: String { return self._s[2976]! }
public var Conversation_TapAndHoldToRecord: String { return self._s[2977]! } public var Conversation_TapAndHoldToRecord: String { return self._s[2978]! }
public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2978]!, self._r[2978]!, [_1, _2]) return formatWithArgumentRanges(self._s[2979]!, self._r[2979]!, [_1, _2])
} }
public func MESSAGE_ROUND_SEPARATED(_ _1: String) -> (String, [(Int, NSRange)]) { public func MESSAGE_ROUND_SEPARATED(_ _1: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2979]!, self._r[2979]!, [_1]) return formatWithArgumentRanges(self._s[2980]!, self._r[2980]!, [_1])
} }
public func PHONE_CALL_MISSED_SEPARATED(_ _1: String) -> (String, [(Int, NSRange)]) { public func PHONE_CALL_MISSED_SEPARATED(_ _1: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2981]!, self._r[2981]!, [_1]) return formatWithArgumentRanges(self._s[2982]!, self._r[2982]!, [_1])
} }
public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2983]!, self._r[2983]!, [_0]) return formatWithArgumentRanges(self._s[2984]!, self._r[2984]!, [_0])
} }
public var DialogList_Unread: String { return self._s[2984]! } public var DialogList_Unread: String { return self._s[2985]! }
public var User_DeletedAccount: String { return self._s[2985]! } public var User_DeletedAccount: String { return self._s[2986]! }
public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2986]!, self._r[2986]!, [_0]) return formatWithArgumentRanges(self._s[2987]!, self._r[2987]!, [_0])
} }
public var UserInfo_NotificationsDefault: String { return self._s[2987]! } public var UserInfo_NotificationsDefault: String { return self._s[2988]! }
public var SharedMedia_CategoryMedia: String { return self._s[2988]! } public var SharedMedia_CategoryMedia: String { return self._s[2989]! }
public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[2989]! } public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[2990]! }
public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[2990]! } public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[2991]! }
public var Watch_ChatList_Compose: String { return self._s[2991]! } public var Watch_ChatList_Compose: String { return self._s[2992]! }
public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[2992]! } public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[2993]! }
public var Watch_Microphone_Access: String { return self._s[2993]! } public var Watch_Microphone_Access: String { return self._s[2994]! }
public var Group_Setup_HistoryHeader: String { return self._s[2994]! } public var Group_Setup_HistoryHeader: String { return self._s[2995]! }
public var Activity_UploadingPhoto: String { return self._s[2995]! } public var Activity_UploadingPhoto: String { return self._s[2996]! }
public func MESSAGE_VIDEO_SECRET_SEPARATED(_ _1: String) -> (String, [(Int, NSRange)]) { public func MESSAGE_VIDEO_SECRET_SEPARATED(_ _1: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[2997]!, self._r[2997]!, [_1]) return formatWithArgumentRanges(self._s[2998]!, self._r[2998]!, [_1])
} }
public var Conversation_Edit: String { return self._s[2998]! } public var Conversation_Edit: String { return self._s[2999]! }
public var Group_ErrorSendRestrictedMedia: String { return self._s[2999]! } public var Group_ErrorSendRestrictedMedia: String { return self._s[3000]! }
public var Login_TermsOfServiceDecline: String { return self._s[3000]! } public var Login_TermsOfServiceDecline: String { return self._s[3001]! }
public var Message_PinnedContactMessage: String { return self._s[3001]! } public var Message_PinnedContactMessage: String { return self._s[3002]! }
public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[3002]!, self._r[3002]!, [_1, _2]) return formatWithArgumentRanges(self._s[3003]!, self._r[3003]!, [_1, _2])
} }
public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[3003]!, self._r[3003]!, [_1, _2, _3, _4, _5]) return formatWithArgumentRanges(self._s[3004]!, self._r[3004]!, [_1, _2, _3, _4, _5])
} }
public var TwoStepAuth_AdditionalPassword: String { return self._s[3005]! } public var TwoStepAuth_AdditionalPassword: String { return self._s[3006]! }
public var Passport_Phone_EnterOtherNumber: String { return self._s[3006]! } public var Passport_Phone_EnterOtherNumber: String { return self._s[3007]! }
public var Message_PinnedPhotoMessage: String { return self._s[3007]! } public var Message_PinnedPhotoMessage: String { return self._s[3008]! }
public var Passport_FieldPhone: String { return self._s[3008]! } public var Passport_FieldPhone: String { return self._s[3009]! }
public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3009]! } public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[3010]! }
public var InfoPlist_NSCameraUsageDescription: String { return self._s[3011]! } public var InfoPlist_NSCameraUsageDescription: String { return self._s[3012]! }
public var Conversation_Call: String { return self._s[3012]! } public var Conversation_Call: String { return self._s[3013]! }
public var Common_TakePhoto: String { return self._s[3014]! } public var Common_TakePhoto: String { return self._s[3015]! }
public var Channel_NotificationLoading: String { return self._s[3015]! } public var Channel_NotificationLoading: String { return self._s[3016]! }
public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[3016]!, self._r[3016]!, [_0]) return formatWithArgumentRanges(self._s[3017]!, self._r[3017]!, [_0])
} }
public var Permissions_SiriTitle_v0: String { return self._s[3017]! } public var Permissions_SiriTitle_v0: String { return self._s[3018]! }
public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[3018]!, self._r[3018]!, [_0]) return formatWithArgumentRanges(self._s[3019]!, self._r[3019]!, [_0])
} }
public var Channel_MessagePhotoRemoved: String { return self._s[3019]! } public var Channel_MessagePhotoRemoved: String { return self._s[3020]! }
public var Common_edit: String { return self._s[3020]! } public var Common_edit: String { return self._s[3021]! }
public var PrivacySettings_AuthSessions: String { return self._s[3021]! } public var PrivacySettings_AuthSessions: String { return self._s[3022]! }
public var Month_ShortJune: String { return self._s[3022]! } public var Month_ShortJune: String { return self._s[3023]! }
public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3023]! } public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[3024]! }
public var Call_ReportSend: String { return self._s[3024]! } public var Call_ReportSend: String { return self._s[3025]! }
public var Watch_LastSeen_JustNow: String { return self._s[3025]! } public var Watch_LastSeen_JustNow: String { return self._s[3026]! }
public var Notifications_MessageNotifications: String { return self._s[3026]! } public var Notifications_MessageNotifications: String { return self._s[3027]! }
public var BroadcastListInfo_AddRecipient: String { return self._s[3028]! } public var BroadcastListInfo_AddRecipient: String { return self._s[3029]! }
public var Group_Status: String { return self._s[3029]! } public var Group_Status: String { return self._s[3030]! }
public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[3030]!, self._r[3030]!, [_0, _1]) return formatWithArgumentRanges(self._s[3031]!, self._r[3031]!, [_0, _1])
} }
public var ShareMenu_ShareTo: String { return self._s[3031]! } public var ShareMenu_ShareTo: String { return self._s[3032]! }
public var Conversation_Moderate_Ban: String { return self._s[3032]! } public var Conversation_Moderate_Ban: String { return self._s[3033]! }
public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[3033]!, self._r[3033]!, [_0]) return formatWithArgumentRanges(self._s[3034]!, self._r[3034]!, [_0])
} }
public var SharedMedia_ViewInChat: String { return self._s[3034]! } public var SharedMedia_ViewInChat: String { return self._s[3035]! }
public var Map_LiveLocationFor8Hours: String { return self._s[3035]! } public var Map_LiveLocationFor8Hours: String { return self._s[3036]! }
public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) {
return formatWithArgumentRanges(self._s[3037]!, self._r[3037]!, [_0]) return formatWithArgumentRanges(self._s[3038]!, self._r[3038]!, [_0])
} }
public var Appearance_ReduceMotion: String { return self._s[3038]! } public var Appearance_ReduceMotion: String { return self._s[3039]! }
public var Map_OpenInHereMaps: String { return self._s[3039]! } public var Map_OpenInHereMaps: String { return self._s[3040]! }
public var Channel_Setup_TypePublicHelp: String { return self._s[3040]! } public var Channel_Setup_TypePublicHelp: String { return self._s[3041]! }
public var Passport_Identity_EditInternalPassport: String { return self._s[3041]! } public var Passport_Identity_EditInternalPassport: String { return self._s[3042]! }
public var PhotoEditor_Skip: String { return self._s[3042]! } public var PhotoEditor_Skip: String { return self._s[3043]! }
public func LastSeen_MinutesAgo(_ value: Int32) -> String { public func CHANNEL_MESSAGE_PHOTOS_SEPARATED(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func ForwardedVideos(_ value: Int32) -> String { public func MessageTimer_Minutes(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func ForwardedGifs(_ value: Int32) -> String { public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { public func Call_ShortSeconds(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func CHANNEL_MESSAGES_SEPARATED(_ value: Int32) -> String { public func Call_Minutes(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { public func StickerPack_RemoveMaskCount(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { public func Notifications_Exceptions(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { public func CHANNEL_MESSAGE_FWDS_SEPARATED(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func CHAT_MESSAGES_SEPARATED(_ value: Int32) -> String { public func ForwardedPhotos(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func MESSAGE_PHOTOS_SEPARATED(_ value: Int32) -> String { public func MessageTimer_Years(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func SharedMedia_Generic(_ value: Int32) -> String { public func Map_ETAHours(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func StickerPack_StickerCount(_ value: Int32) -> String { public func Conversation_StatusOnline(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Media_SharePhoto(_ value: Int32) -> String { public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func LastSeen_HoursAgo(_ value: Int32) -> String { public func ForwardedPolls(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Conversation_StatusOnline(_ value: Int32) -> String { public func MuteExpires_Hours(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { public func UserCount(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func ForwardedMessages(_ value: Int32) -> String { public func Call_Seconds(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { public func MessageTimer_Days(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { public func Call_ShortMinutes(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func ForwardedAuthorsOthers(_ value: Int32) -> String { public func MuteFor_Hours(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Notification_GameScoreExtended(_ value: Int32) -> String { public func CHANNEL_MESSAGES_SEPARATED(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func MessageTimer_Days(_ value: Int32) -> String { public func ForwardedAudios(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { public func InviteText_ContactsCountText(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func SharedMedia_Photo(_ value: Int32) -> String { public func Watch_UserInfo_Mute(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Contacts_ImportersCount(_ value: Int32) -> String { public func CreatePoll_AddMoreOptions(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func CHAT_MESSAGE_FWDS_SEPARATED(_ value: Int32) -> String { public func Notification_GameScoreSelfExtended(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Call_Minutes(_ value: Int32) -> String { public func AttachmentMenu_SendPhoto(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func AttachmentMenu_SendVideo(_ value: Int32) -> String { public func MESSAGE_FWDS_SEPARATED(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Map_ETAMinutes(_ value: Int32) -> String { public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func InviteText_ContactsCountText(_ value: Int32) -> String { public func SharedMedia_Video(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func ChatList_DeleteConfirmation(_ value: Int32) -> String { public func ForwardedVideoMessages(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { public func MessageTimer_Seconds(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func MessageTimer_ShortSeconds(_ value: Int32) -> String { public func Passport_Scans(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func CHANNEL_MESSAGE_PHOTOS_SEPARATED(_ value: Int32) -> String { public func AttachmentMenu_SendItem(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Notifications_Exceptions(_ value: Int32) -> String { public func MuteExpires_Minutes(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Invitation_Members(_ value: Int32) -> String { public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func MessageTimer_ShortHours(_ value: Int32) -> String { public func StickerPack_RemoveStickerCount(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func MuteExpires_Minutes(_ value: Int32) -> String { public func CHAT_MESSAGES_SEPARATED(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func MessageTimer_ShortWeeks(_ value: Int32) -> String { public func MessageTimer_ShortSeconds(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func AttachmentMenu_SendGif(_ value: Int32) -> String { public func ForwardedGifs(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func ForwardedVideoMessages(_ value: Int32) -> String { public func SharedMedia_Link(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { public func ChatList_DeleteConfirmation(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { public func ForwardedAuthorsOthers(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { public func Media_SharePhoto(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func SharedMedia_File(_ value: Int32) -> String { public func ForwardedStickers(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Watch_UserInfo_Mute(_ value: Int32) -> String { public func MessageTimer_Weeks(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func MESSAGES_SEPARATED(_ value: Int32) -> String { public func LastSeen_MinutesAgo(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func StickerPack_AddMaskCount(_ value: Int32) -> String { public func GroupInfo_ParticipantCount(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { public func ForwardedLocations(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Media_ShareVideo(_ value: Int32) -> String { public func MessagePoll_VotedCount(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { public func MESSAGES_SEPARATED(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func MuteFor_Hours(_ value: Int32) -> String { public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func MessageTimer_Minutes(_ value: Int32) -> String { public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func MuteFor_Days(_ value: Int32) -> String { public func QuickSend_Photos(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func MessageTimer_ShortDays(_ value: Int32) -> String { public func MessageTimer_ShortWeeks(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Passport_Scans(_ value: Int32) -> String { public func MESSAGE_PHOTOS_SEPARATED(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func StickerPack_AddStickerCount(_ value: Int32) -> String { public func MuteFor_Days(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func UserCount(_ value: Int32) -> String { public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func MessageTimer_Months(_ value: Int32) -> String { public func ForwardedMessages(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func MessageTimer_Seconds(_ value: Int32) -> String { public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func ForwardedAudios(_ value: Int32) -> String { public func Conversation_StatusSubscribers(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func MessageTimer_Hours(_ value: Int32) -> String { public func StickerPack_AddMaskCount(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func MessageTimer_Years(_ value: Int32) -> String { public func Notification_GameScoreSelfSimple(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Call_ShortSeconds(_ value: Int32) -> String { public func SharedMedia_Photo(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func GroupInfo_ParticipantCount(_ value: Int32) -> String { public func MessageTimer_Months(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func ForwardedStickers(_ value: Int32) -> String { public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Notification_GameScoreSimple(_ value: Int32) -> String { public func MuteExpires_Days(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { public func Media_ShareItem(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func QuickSend_Photos(_ value: Int32) -> String { public func ForwardedVideos(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, "\(value)")
} }
@ -3832,115 +3833,115 @@ public final class PresentationStrings {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { public func Notification_GameScoreExtended(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func SharedMedia_Link(_ value: Int32) -> String { public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { public func AttachmentMenu_SendVideo(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Map_ETAHours(_ value: Int32) -> String { public func SharedMedia_Generic(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func MESSAGE_FWDS_SEPARATED(_ value: Int32) -> String { public func MessageTimer_ShortHours(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Call_ShortMinutes(_ value: Int32) -> String { public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Conversation_StatusSubscribers(_ value: Int32) -> String { public func ForwardedFiles(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func CHANNEL_MESSAGE_FWDS_SEPARATED(_ value: Int32) -> String { public func Map_ETAMinutes(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func MessagePoll_VotedCount(_ value: Int32) -> String { public func Invitation_Members(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Conversation_StatusMembers(_ value: Int32) -> String { public func MessageTimer_Hours(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func ForwardedContacts(_ value: Int32) -> String { public func LastSeen_HoursAgo(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func ForwardedPolls(_ value: Int32) -> String { public func StickerPack_StickerCount(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { public func ForwardedContacts(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Call_Seconds(_ value: Int32) -> String { public func Contacts_ImportersCount(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func MessageTimer_ShortMinutes(_ value: Int32) -> String { public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func Media_ShareItem(_ value: Int32) -> String { public func Notification_GameScoreSimple(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { public func MessageTimer_ShortMinutes(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func SharedMedia_Video(_ value: Int32) -> String { public func LiveLocation_MenuChatsCount(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func MessageTimer_Weeks(_ value: Int32) -> String { public func Conversation_StatusMembers(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func ForwardedPhotos(_ value: Int32) -> String { public func SharedMedia_File(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func ForwardedLocations(_ value: Int32) -> String { public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func MuteExpires_Days(_ value: Int32) -> String { public func CHAT_MESSAGE_FWDS_SEPARATED(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func MuteExpires_Hours(_ value: Int32) -> String { public func Media_ShareVideo(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func ForwardedFiles(_ value: Int32) -> String { public func StickerPack_AddStickerCount(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func AttachmentMenu_SendItem(_ value: Int32) -> String { public func AttachmentMenu_SendGif(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { public func MessageTimer_ShortDays(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, "\(value)")
} }
public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String {
let form = presentationStringsPluralizationForm(self.lc, value) let form = presentationStringsPluralizationForm(self.lc, value)
return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, "\(value)") return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, "\(value)")
} }