mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
UI improvements
This commit is contained in:
parent
df5fba7d51
commit
b65d4c2243
@ -8746,3 +8746,101 @@ Sorry for the inconvenience.";
|
|||||||
"Premium.Translation.Proceed" = "About Telegram Premium";
|
"Premium.Translation.Proceed" = "About Telegram Premium";
|
||||||
|
|
||||||
"Settings.PauseMusicOnRecording" = "Pause Music While Recoding";
|
"Settings.PauseMusicOnRecording" = "Pause Music While Recoding";
|
||||||
|
|
||||||
|
"Settings.SuggestSetupPasswordTitle" = "Protect Your Account";
|
||||||
|
"Settings.SuggestSetupPasswordText" = "Set a password that will be required each time you log in with this phone number.";
|
||||||
|
"Settings.SuggestSetupPasswordAction" = "Set Additional Password";
|
||||||
|
|
||||||
|
"Chat.SendNotAllowedText" = "Sending messages is not allowed in this group";
|
||||||
|
"Chat.SendNotAllowedPeerText" = "Sending messages is not allowed in %@";
|
||||||
|
"Chat.SendNotAllowedPhoto" = "Sending photos is not allowed in this group";
|
||||||
|
"Chat.SendNotAllowedVideo" = "Sending videos is not allowed in this group";
|
||||||
|
"Chat.SendNotAllowedFile" = "Sending files is not allowed in this group";
|
||||||
|
"Chat.SendNotAllowedAudioMessage" = "Sending audio messages is not allowed in this group";
|
||||||
|
"Chat.SendNotAllowedVideoMessage" = "Sending video messages is not allowed in this group";
|
||||||
|
"Chat.SendNotAllowedMusic" = "Sending music is not allowed in this group";
|
||||||
|
|
||||||
|
"Chat.SendAllowedContentText" = "The admins of this group only allow to send %1$@.";
|
||||||
|
"Chat.SendAllowedContentPeerText" = "The admins of %1$@ only allow to send %2$@.";
|
||||||
|
|
||||||
|
"Chat.SendAllowedContentTypeText" = "text messages";
|
||||||
|
"Chat.SendAllowedContentTypePhoto" = "photos";
|
||||||
|
"Chat.SendAllowedContentTypeVideo" = "videos";
|
||||||
|
"Chat.SendAllowedContentTypeVoiceMessage" = "voice messages";
|
||||||
|
"Chat.SendAllowedContentTypeVideoMessage" = "video messages";
|
||||||
|
"Chat.SendAllowedContentTypeFile" = "files";
|
||||||
|
"Chat.SendAllowedContentTypeMusic" = "music";
|
||||||
|
"Chat.SendAllowedContentTypeSticker" = "stickers & GIFs";
|
||||||
|
|
||||||
|
"Channel.BanUser.PermissionSendPhoto" = "Send Photos";
|
||||||
|
"Channel.BanUser.PermissionSendVideo" = "Send Videos";
|
||||||
|
"Channel.BanUser.PermissionSendMusic" = "Send Music";
|
||||||
|
"Channel.BanUser.PermissionSendVoiceMessage" = "Send Audio Messages";
|
||||||
|
"Channel.BanUser.PermissionSendVideoMessage" = "Send Video Messages";
|
||||||
|
"Channel.BanUser.PermissionSendFile" = "Send Files";
|
||||||
|
|
||||||
|
"GroupPermission.NoSendPhoto" = "no photos";
|
||||||
|
"GroupPermission.NoSendVideo" = "no videos";
|
||||||
|
"GroupPermission.NoSendMusic" = "no music";
|
||||||
|
"GroupPermission.NoSendVoiceMessage" = "no audio messages";
|
||||||
|
"GroupPermission.NoSendVideoMessage" = "no video messages";
|
||||||
|
"GroupPermission.NoSendFile" = "no files";
|
||||||
|
|
||||||
|
"Settings.AutosaveMediaOn" = "On";
|
||||||
|
"Settings.AutosaveMediaOff" = "Off";
|
||||||
|
"Settings.AutosaveMediaOn" = "On";
|
||||||
|
"Settings.AutosaveMediaAllMedia" = "All Media (%@)";
|
||||||
|
"Settings.AutosaveMediaPhoto" = "Photos";
|
||||||
|
"Settings.AutosaveMediaNoPhoto" = "No Photos";
|
||||||
|
"Settings.AutosaveMediaVideo" = "Videos up to %@";
|
||||||
|
"Settings.AutosaveMediaNoVideo" = "No Videos";
|
||||||
|
|
||||||
|
"Settings.SaveToCameraRollSection" = "SAVE TO CAMERA ROLL";
|
||||||
|
"Settings.SaveToCameraRollInfo" = "Automatically save all new photos and videos from these chats to your Cameral Roll.";
|
||||||
|
|
||||||
|
"Autosave.TypesSection" = "SAVE TO CAMERA ROLL";
|
||||||
|
"Autosave.TypePhoto" = "Photos";
|
||||||
|
"Autosave.TypeVideo" = "Videos";
|
||||||
|
"Autosave.TypesInfo" = "Automatically save all new media from private chats to your Cameral Roll.";
|
||||||
|
"Autosave.VideoSizeSection" = "MAXIMUM VIDEO SIZE";
|
||||||
|
"Autosave.VideoInfo" = "All downloaded videos in private chats less than %@ will be saved to Cameral Roll.";
|
||||||
|
"Autosave.ExceptionsSection" = "EXCEPTIONS";
|
||||||
|
"Autosave.AddException" = "Add Exception";
|
||||||
|
"Autosave.Exception" = "Exception";
|
||||||
|
"Autosave.DeleteAllExceptions" = "Delete All Exceptions";
|
||||||
|
|
||||||
|
"Chat.ErrorInvoiceNotFound" = "Invoice not found.";
|
||||||
|
|
||||||
|
"EmojiStatus.AppliedText" = "Your emoji status has been updated.";
|
||||||
|
"EmojiPreview.SendEmoji" = "Send Emoji";
|
||||||
|
"EmojiPreview.SetAsStatus" = "Set as Status";
|
||||||
|
"EmojiPreview.CopyEmoji" = "Copy Emoji";
|
||||||
|
|
||||||
|
"EmojiSearch.SearchStickersEmptyResult" = "No emoji found";
|
||||||
|
|
||||||
|
"DataUsage.MediaDirectionIncoming" = "Incoming";
|
||||||
|
"DataUsage.MediaDirectionOutgoing" = "Outgoing";
|
||||||
|
"DataUsage.InfoTotalUsageSinceTime" = "Your data usage since %@";
|
||||||
|
"DataUsage.InfoMobileUsageSinceTime" = "Your mobile data usage since %@";
|
||||||
|
"DataUsage.InfoWifiUsageSinceTime" = "Your Wi-Fi data usage since %@";
|
||||||
|
"DataUsage.SectionsInfo" = "Tap on each section for detailed view.";
|
||||||
|
"DataUsage.SectionUsageTotal" = "TOTAL NETWORK USAGE";
|
||||||
|
"DataUsage.SectionUsageMobile" = "MOBILE NETWORK USAGE";
|
||||||
|
"DataUsage.SectionUsageWifi" = "WI-FI NETWORK USAGE";
|
||||||
|
"DataUsage.AutoDownloadSettings" = "Auto-Download Settings";
|
||||||
|
|
||||||
|
"StorageManagement.SectionMessages" = "Messages";
|
||||||
|
"StorageManagement.SectionVoiceMessages" = "Voice Messages";
|
||||||
|
"StorageManagement.SectionCalls" = "Calls";
|
||||||
|
|
||||||
|
"DataUsage.SectionTotalIncoming" = "Data Received";
|
||||||
|
"DataUsage.SectionTotalOutgoing" = "Data Sent";
|
||||||
|
|
||||||
|
"EmojiInput.TabMasks" = "Masks";
|
||||||
|
"EmojiInput.TabGifs" = "GIFs";
|
||||||
|
"EmojiInput.TabStickers" = "Stickers";
|
||||||
|
"EmojiInput.TabEmoji" = "Emoji";
|
||||||
|
|
||||||
|
"EmojiInput.TrendingEmoji" = "TRENDING EMOJI";
|
||||||
|
|
||||||
|
"Chat.PlaceholderTextNotAllowed" = "Text not allowed";
|
||||||
|
@ -138,9 +138,8 @@ class ChatListStorageInfoItemNode: ListViewItemNode {
|
|||||||
|
|
||||||
textString = NSAttributedString(string: item.strings.ChatList_StorageHintText, font: textFont, textColor: item.theme.rootController.navigationBar.secondaryTextColor)
|
textString = NSAttributedString(string: item.strings.ChatList_StorageHintText, font: textFont, textColor: item.theme.rootController.navigationBar.secondaryTextColor)
|
||||||
case .setupPassword:
|
case .setupPassword:
|
||||||
//TODO:localize
|
titleString = NSAttributedString(string: item.strings.Settings_SuggestSetupPasswordTitle, font: titleFont, textColor: item.theme.rootController.navigationBar.primaryTextColor)
|
||||||
titleString = NSAttributedString(string: "Protect Your Account", font: titleFont, textColor: item.theme.rootController.navigationBar.primaryTextColor)
|
textString = NSAttributedString(string: item.strings.Settings_SuggestSetupPasswordText, font: textFont, textColor: item.theme.rootController.navigationBar.secondaryTextColor)
|
||||||
textString = NSAttributedString(string: "Set a password that will be required each time you log in with this phone number.", font: textFont, textColor: item.theme.rootController.navigationBar.secondaryTextColor)
|
|
||||||
case let .premiumUpgrade(discount):
|
case let .premiumUpgrade(discount):
|
||||||
let discountString = "\(discount)%"
|
let discountString = "\(discount)%"
|
||||||
let rawTitleString = item.strings.ChatList_PremiumAnnualUpgradeTitle(discountString)
|
let rawTitleString = item.strings.ChatList_PremiumAnnualUpgradeTitle(discountString)
|
||||||
|
@ -1178,30 +1178,26 @@ public final class MediaPickerScreen: ViewController, AttachmentContainable {
|
|||||||
}
|
}
|
||||||
if let _ = item as? TGMediaPickerGalleryPhotoItem {
|
if let _ = item as? TGMediaPickerGalleryPhotoItem {
|
||||||
if self.bannedSendPhotos != nil {
|
if self.bannedSendPhotos != nil {
|
||||||
//TODO:localize
|
self.present(standardTextAlertController(theme: AlertControllerTheme(presentationData: self.presentationData), title: nil, text: self.presentationData.strings.Chat_SendNotAllowedPhoto, actions: [TextAlertAction(type: .defaultAction, title: self.presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
||||||
self.present(standardTextAlertController(theme: AlertControllerTheme(presentationData: self.presentationData), title: nil, text: "Sending photos is not allowed", actions: [TextAlertAction(type: .defaultAction, title: self.presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
} else if let _ = item as? TGMediaPickerGalleryVideoItem {
|
} else if let _ = item as? TGMediaPickerGalleryVideoItem {
|
||||||
if self.bannedSendVideos != nil {
|
if self.bannedSendVideos != nil {
|
||||||
//TODO:localize
|
self.present(standardTextAlertController(theme: AlertControllerTheme(presentationData: self.presentationData), title: nil, text: self.presentationData.strings.Chat_SendNotAllowedVideo, actions: [TextAlertAction(type: .defaultAction, title: self.presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
||||||
self.present(standardTextAlertController(theme: AlertControllerTheme(presentationData: self.presentationData), title: nil, text: "Sending videos is not allowed", actions: [TextAlertAction(type: .defaultAction, title: self.presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
} else if let asset = item as? TGMediaAsset {
|
} else if let asset = item as? TGMediaAsset {
|
||||||
if asset.isVideo {
|
if asset.isVideo {
|
||||||
if self.bannedSendVideos != nil {
|
if self.bannedSendVideos != nil {
|
||||||
//TODO:localize
|
self.present(standardTextAlertController(theme: AlertControllerTheme(presentationData: self.presentationData), title: nil, text: self.presentationData.strings.Chat_SendNotAllowedVideo, actions: [TextAlertAction(type: .defaultAction, title: self.presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
||||||
self.present(standardTextAlertController(theme: AlertControllerTheme(presentationData: self.presentationData), title: nil, text: "Sending videos is not allowed", actions: [TextAlertAction(type: .defaultAction, title: self.presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if self.bannedSendPhotos != nil {
|
if self.bannedSendPhotos != nil {
|
||||||
//TODO:localize
|
self.present(standardTextAlertController(theme: AlertControllerTheme(presentationData: self.presentationData), title: nil, text: self.presentationData.strings.Chat_SendNotAllowedPhoto, actions: [TextAlertAction(type: .defaultAction, title: self.presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
||||||
self.present(standardTextAlertController(theme: AlertControllerTheme(presentationData: self.presentationData), title: nil, text: "Sending photos is not allowed", actions: [TextAlertAction(type: .defaultAction, title: self.presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@ -1280,30 +1276,26 @@ public final class MediaPickerScreen: ViewController, AttachmentContainable {
|
|||||||
if let self = self, let selectionState = self.interaction?.selectionState {
|
if let self = self, let selectionState = self.interaction?.selectionState {
|
||||||
if let _ = item as? TGMediaPickerGalleryPhotoItem {
|
if let _ = item as? TGMediaPickerGalleryPhotoItem {
|
||||||
if self.bannedSendPhotos != nil {
|
if self.bannedSendPhotos != nil {
|
||||||
//TODO:localize
|
self.present(standardTextAlertController(theme: AlertControllerTheme(presentationData: self.presentationData), title: nil, text: self.presentationData.strings.Chat_SendNotAllowedPhoto, actions: [TextAlertAction(type: .defaultAction, title: self.presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
||||||
self.present(standardTextAlertController(theme: AlertControllerTheme(presentationData: self.presentationData), title: nil, text: "Sending photos is not allowed", actions: [TextAlertAction(type: .defaultAction, title: self.presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
} else if let _ = item as? TGMediaPickerGalleryVideoItem {
|
} else if let _ = item as? TGMediaPickerGalleryVideoItem {
|
||||||
if self.bannedSendVideos != nil {
|
if self.bannedSendVideos != nil {
|
||||||
//TODO:localize
|
self.present(standardTextAlertController(theme: AlertControllerTheme(presentationData: self.presentationData), title: nil, text: self.presentationData.strings.Chat_SendNotAllowedVideo, actions: [TextAlertAction(type: .defaultAction, title: self.presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
||||||
self.present(standardTextAlertController(theme: AlertControllerTheme(presentationData: self.presentationData), title: nil, text: "Sending videos is not allowed", actions: [TextAlertAction(type: .defaultAction, title: self.presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
} else if let asset = item as? TGMediaAsset {
|
} else if let asset = item as? TGMediaAsset {
|
||||||
if asset.isVideo {
|
if asset.isVideo {
|
||||||
if self.bannedSendVideos != nil {
|
if self.bannedSendVideos != nil {
|
||||||
//TODO:localize
|
self.present(standardTextAlertController(theme: AlertControllerTheme(presentationData: self.presentationData), title: nil, text: self.presentationData.strings.Chat_SendNotAllowedVideo, actions: [TextAlertAction(type: .defaultAction, title: self.presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
||||||
self.present(standardTextAlertController(theme: AlertControllerTheme(presentationData: self.presentationData), title: nil, text: "Sending videos is not allowed", actions: [TextAlertAction(type: .defaultAction, title: self.presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if self.bannedSendPhotos != nil {
|
if self.bannedSendPhotos != nil {
|
||||||
//TODO:localize
|
self.present(standardTextAlertController(theme: AlertControllerTheme(presentationData: self.presentationData), title: nil, text: self.presentationData.strings.Chat_SendNotAllowedPhoto, actions: [TextAlertAction(type: .defaultAction, title: self.presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
||||||
self.present(standardTextAlertController(theme: AlertControllerTheme(presentationData: self.presentationData), title: nil, text: "Sending photos is not allowed", actions: [TextAlertAction(type: .defaultAction, title: self.presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -379,7 +379,6 @@ private struct ChannelPermissionsControllerState: Equatable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func stringForGroupPermission(strings: PresentationStrings, right: TelegramChatBannedRightsFlags, isForum: Bool) -> String {
|
func stringForGroupPermission(strings: PresentationStrings, right: TelegramChatBannedRightsFlags, isForum: Bool) -> String {
|
||||||
//TODO:localize
|
|
||||||
if right.contains(.banSendText) {
|
if right.contains(.banSendText) {
|
||||||
return strings.Channel_BanUser_PermissionSendMessages
|
return strings.Channel_BanUser_PermissionSendMessages
|
||||||
} else if right.contains(.banSendMedia) {
|
} else if right.contains(.banSendMedia) {
|
||||||
@ -399,19 +398,19 @@ func stringForGroupPermission(strings: PresentationStrings, right: TelegramChatB
|
|||||||
} else if right.contains(.banManageTopics) {
|
} else if right.contains(.banManageTopics) {
|
||||||
return strings.Channel_EditAdmin_PermissionCreateTopics
|
return strings.Channel_EditAdmin_PermissionCreateTopics
|
||||||
} else if right.contains(.banSendPhotos) {
|
} else if right.contains(.banSendPhotos) {
|
||||||
return "Send Photos"
|
return strings.Channel_BanUser_PermissionSendPhoto
|
||||||
} else if right.contains(.banSendVideos) {
|
} else if right.contains(.banSendVideos) {
|
||||||
return "Send Videos"
|
return strings.Channel_BanUser_PermissionSendVideo
|
||||||
} else if right.contains(.banSendStickers) {
|
} else if right.contains(.banSendStickers) {
|
||||||
return strings.Channel_BanUser_PermissionSendStickersAndGifs
|
return strings.Channel_BanUser_PermissionSendStickersAndGifs
|
||||||
} else if right.contains(.banSendMusic) {
|
} else if right.contains(.banSendMusic) {
|
||||||
return "Send Music"
|
return strings.Channel_BanUser_PermissionSendMusic
|
||||||
} else if right.contains(.banSendFiles) {
|
} else if right.contains(.banSendFiles) {
|
||||||
return "Send Files"
|
return strings.Channel_BanUser_PermissionSendFile
|
||||||
} else if right.contains(.banSendVoice) {
|
} else if right.contains(.banSendVoice) {
|
||||||
return "Send Voice Messages"
|
return strings.Channel_BanUser_PermissionSendVoiceMessage
|
||||||
} else if right.contains(.banSendInstantVideos) {
|
} else if right.contains(.banSendInstantVideos) {
|
||||||
return "Send Video Messages"
|
return strings.Channel_BanUser_PermissionSendVideoMessage
|
||||||
} else {
|
} else {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
@ -423,17 +422,17 @@ func compactStringForGroupPermission(strings: PresentationStrings, right: Telegr
|
|||||||
} else if right.contains(.banSendMedia) {
|
} else if right.contains(.banSendMedia) {
|
||||||
return strings.GroupPermission_NoSendMedia
|
return strings.GroupPermission_NoSendMedia
|
||||||
} else if right.contains(.banSendPhotos) {
|
} else if right.contains(.banSendPhotos) {
|
||||||
return "no photos"
|
return strings.GroupPermission_NoSendPhoto
|
||||||
} else if right.contains(.banSendVideos) {
|
} else if right.contains(.banSendVideos) {
|
||||||
return "no videos"
|
return strings.GroupPermission_NoSendVideo
|
||||||
} else if right.contains(.banSendMusic) {
|
} else if right.contains(.banSendMusic) {
|
||||||
return "no music"
|
return strings.GroupPermission_NoSendMusic
|
||||||
} else if right.contains(.banSendFiles) {
|
} else if right.contains(.banSendFiles) {
|
||||||
return "no files"
|
return strings.GroupPermission_NoSendFile
|
||||||
} else if right.contains(.banSendVoice) {
|
} else if right.contains(.banSendVoice) {
|
||||||
return "no voice messages"
|
return strings.GroupPermission_NoSendVoiceMessage
|
||||||
} else if right.contains(.banSendInstantVideos) {
|
} else if right.contains(.banSendInstantVideos) {
|
||||||
return "no video messages"
|
return strings.GroupPermission_NoSendVideoMessage
|
||||||
} else if right.contains(.banSendGifs) {
|
} else if right.contains(.banSendGifs) {
|
||||||
return strings.GroupPermission_NoSendGifs
|
return strings.GroupPermission_NoSendGifs
|
||||||
} else if right.contains(.banEmbedLinks) {
|
} else if right.contains(.banEmbedLinks) {
|
||||||
|
@ -253,7 +253,11 @@ public final class ReactionContextNode: ASDisplayNode, UIScrollViewDelegate {
|
|||||||
|
|
||||||
private let emojiSearchDisposable = MetaDisposable()
|
private let emojiSearchDisposable = MetaDisposable()
|
||||||
private let emojiSearchState = Promise<EmojiSearchState>(EmojiSearchState(result: nil, isSearching: false))
|
private let emojiSearchState = Promise<EmojiSearchState>(EmojiSearchState(result: nil, isSearching: false))
|
||||||
private var emojiSearchStateValue: EmojiSearchState = EmojiSearchState(result: nil, isSearching: false)
|
private var emojiSearchStateValue = EmojiSearchState(result: nil, isSearching: false) {
|
||||||
|
didSet {
|
||||||
|
self.emojiSearchState.set(.single(self.emojiSearchStateValue))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private var emptyResultEmojis: [TelegramMediaFile] = []
|
private var emptyResultEmojis: [TelegramMediaFile] = []
|
||||||
private var stableEmptyResultEmoji: TelegramMediaFile?
|
private var stableEmptyResultEmoji: TelegramMediaFile?
|
||||||
|
@ -574,28 +574,27 @@ private func autosaveLabelAndValue(presentationData: PresentationData, settings:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO:localize
|
|
||||||
let value: String
|
let value: String
|
||||||
if configuration.photo || configuration.video {
|
if configuration.photo || configuration.video {
|
||||||
value = "On"
|
value = presentationData.strings.Settings_AutosaveMediaOn
|
||||||
} else {
|
} else {
|
||||||
value = "Off"
|
value = presentationData.strings.Settings_AutosaveMediaOff
|
||||||
}
|
}
|
||||||
|
|
||||||
var label = ""
|
var label = ""
|
||||||
if configuration.photo && configuration.video {
|
if configuration.photo && configuration.video {
|
||||||
label.append("All Media (\(dataSizeString(Int(configuration.maximumVideoSize), formatting: DataSizeStringFormatting(presentationData: presentationData))))")
|
label.append(presentationData.strings.Settings_AutosaveMediaAllMedia(dataSizeString(Int(configuration.maximumVideoSize), formatting: DataSizeStringFormatting(presentationData: presentationData))).string)
|
||||||
} else {
|
} else {
|
||||||
if configuration.photo {
|
if configuration.photo {
|
||||||
if !label.isEmpty {
|
if !label.isEmpty {
|
||||||
label.append(", ")
|
label.append(", ")
|
||||||
}
|
}
|
||||||
label.append("Photos")
|
label.append(presentationData.strings.Settings_AutosaveMediaPhoto)
|
||||||
} else if configuration.video {
|
} else if configuration.video {
|
||||||
if !label.isEmpty {
|
if !label.isEmpty {
|
||||||
label.append(", ")
|
label.append(", ")
|
||||||
}
|
}
|
||||||
label.append("Videos up to \(dataSizeString(Int(configuration.maximumVideoSize), formatting: DataSizeStringFormatting(presentationData: presentationData)))")
|
label.append(presentationData.strings.Settings_AutosaveMediaVideo(dataSizeString(Int(configuration.maximumVideoSize), formatting: DataSizeStringFormatting(presentationData: presentationData))).string)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -622,17 +621,16 @@ private func dataAndStorageControllerEntries(state: DataAndStorageControllerStat
|
|||||||
let defaultSettings = MediaAutoDownloadSettings.defaultSettings
|
let defaultSettings = MediaAutoDownloadSettings.defaultSettings
|
||||||
entries.append(.automaticDownloadReset(presentationData.theme, presentationData.strings.ChatSettings_AutoDownloadReset, data.automaticMediaDownloadSettings.cellular != defaultSettings.cellular || data.automaticMediaDownloadSettings.wifi != defaultSettings.wifi))
|
entries.append(.automaticDownloadReset(presentationData.theme, presentationData.strings.ChatSettings_AutoDownloadReset, data.automaticMediaDownloadSettings.cellular != defaultSettings.cellular || data.automaticMediaDownloadSettings.wifi != defaultSettings.wifi))
|
||||||
|
|
||||||
//TODO:localize
|
entries.append(.autoSaveHeader(presentationData.strings.Settings_SaveToCameraRollSection))
|
||||||
entries.append(.autoSaveHeader("SAVE TO CAMERA ROLL"))
|
|
||||||
|
|
||||||
let privateLabelAndValue = autosaveLabelAndValue(presentationData: presentationData, settings: mediaAutoSaveSettings, peerType: .privateChats, exceptionPeers: autosaveExceptionPeers)
|
let privateLabelAndValue = autosaveLabelAndValue(presentationData: presentationData, settings: mediaAutoSaveSettings, peerType: .privateChats, exceptionPeers: autosaveExceptionPeers)
|
||||||
let groupsLabelAndValue = autosaveLabelAndValue(presentationData: presentationData, settings: mediaAutoSaveSettings, peerType: .groups, exceptionPeers: autosaveExceptionPeers)
|
let groupsLabelAndValue = autosaveLabelAndValue(presentationData: presentationData, settings: mediaAutoSaveSettings, peerType: .groups, exceptionPeers: autosaveExceptionPeers)
|
||||||
let channelsLabelAndValue = autosaveLabelAndValue(presentationData: presentationData, settings: mediaAutoSaveSettings, peerType: .channels, exceptionPeers: autosaveExceptionPeers)
|
let channelsLabelAndValue = autosaveLabelAndValue(presentationData: presentationData, settings: mediaAutoSaveSettings, peerType: .channels, exceptionPeers: autosaveExceptionPeers)
|
||||||
|
|
||||||
entries.append(.autoSaveItem(index: 0, type: .privateChats, title: "Private Chats", label: privateLabelAndValue.label, value: privateLabelAndValue.value))
|
entries.append(.autoSaveItem(index: 0, type: .privateChats, title: presentationData.strings.Notifications_PrivateChats, label: privateLabelAndValue.label, value: privateLabelAndValue.value))
|
||||||
entries.append(.autoSaveItem(index: 1, type: .groups, title: "Groups", label: groupsLabelAndValue.label, value: groupsLabelAndValue.value))
|
entries.append(.autoSaveItem(index: 1, type: .groups, title: presentationData.strings.Notifications_GroupChats, label: groupsLabelAndValue.label, value: groupsLabelAndValue.value))
|
||||||
entries.append(.autoSaveItem(index: 2, type: .channels, title: "Channels", label: channelsLabelAndValue.label, value: channelsLabelAndValue.value))
|
entries.append(.autoSaveItem(index: 2, type: .channels, title: presentationData.strings.Notifications_Channels, label: channelsLabelAndValue.label, value: channelsLabelAndValue.value))
|
||||||
entries.append(.autoSaveInfo("Automatically save all new photos and videos from these chats to your Cameral Roll."))
|
entries.append(.autoSaveInfo(presentationData.strings.Settings_SaveToCameraRollInfo))
|
||||||
|
|
||||||
|
|
||||||
let dataSaving = effectiveDataSaving(for: data.voiceCallSettings, autodownloadSettings: data.autodownloadSettings)
|
let dataSaving = effectiveDataSaving(for: data.voiceCallSettings, autodownloadSettings: data.autodownloadSettings)
|
||||||
|
@ -258,12 +258,11 @@ private func saveIncomingMediaControllerEntries(presentationData: PresentationDa
|
|||||||
entries.append(.peer(peer: peer, presence: peerPresence))
|
entries.append(.peer(peer: peer, presence: peerPresence))
|
||||||
}
|
}
|
||||||
|
|
||||||
entries.append(.typesHeader("SAVE TO CAMERA ROLL"))
|
entries.append(.typesHeader(presentationData.strings.Autosave_TypesSection))
|
||||||
|
|
||||||
//TODO:localize
|
entries.append(.typePhotos(presentationData.strings.Autosave_TypePhoto, configuration.photo))
|
||||||
entries.append(.typePhotos("Photos", configuration.photo))
|
entries.append(.typeVideos(presentationData.strings.Autosave_TypeVideo, configuration.video))
|
||||||
entries.append(.typeVideos("Videos", configuration.video))
|
entries.append(.typesInfo(presentationData.strings.Autosave_TypesInfo))
|
||||||
entries.append(.typesInfo("Automatically save all new media from private chats to your Cameral Roll."))
|
|
||||||
|
|
||||||
if configuration.video {
|
if configuration.video {
|
||||||
let sizeText: String
|
let sizeText: String
|
||||||
@ -275,9 +274,9 @@ private func saveIncomingMediaControllerEntries(presentationData: PresentationDa
|
|||||||
|
|
||||||
let text = presentationData.strings.AutoDownloadSettings_UpTo(sizeText).string
|
let text = presentationData.strings.AutoDownloadSettings_UpTo(sizeText).string
|
||||||
|
|
||||||
entries.append(.videoSizeHeader("MAXIMUM VIDEO SIZE"))
|
entries.append(.videoSizeHeader(presentationData.strings.Autosave_VideoSizeSection))
|
||||||
entries.append(.videoSize(decimalSeparator: presentationData.dateTimeFormat.decimalSeparator, text: text, value: configuration.maximumVideoSize))
|
entries.append(.videoSize(decimalSeparator: presentationData.dateTimeFormat.decimalSeparator, text: text, value: configuration.maximumVideoSize))
|
||||||
entries.append(.videoInfo("All downloaded videos in private chats less than \(sizeText) will be saved to Cameral Roll."))
|
entries.append(.videoInfo(presentationData.strings.Autosave_VideoInfo(sizeText).string))
|
||||||
}
|
}
|
||||||
|
|
||||||
if case let .peerType(peerType) = scope {
|
if case let .peerType(peerType) = scope {
|
||||||
@ -306,13 +305,12 @@ private func saveIncomingMediaControllerEntries(presentationData: PresentationDa
|
|||||||
}
|
}
|
||||||
|
|
||||||
if filteredExceptions.isEmpty {
|
if filteredExceptions.isEmpty {
|
||||||
//TODO:localize
|
entries.append(.exceptionsHeader(presentationData.strings.Autosave_ExceptionsSection))
|
||||||
entries.append(.exceptionsHeader("EXCEPTIONS"))
|
|
||||||
} else {
|
} else {
|
||||||
entries.append(.exceptionsHeader(presentationData.strings.Notifications_CategoryExceptions(Int32(filteredExceptions.count)).uppercased()))
|
entries.append(.exceptionsHeader(presentationData.strings.Notifications_CategoryExceptions(Int32(filteredExceptions.count)).uppercased()))
|
||||||
}
|
}
|
||||||
|
|
||||||
entries.append(.addException("Add Exception"))
|
entries.append(.addException(presentationData.strings.Autosave_AddException))
|
||||||
|
|
||||||
var index = 0
|
var index = 0
|
||||||
for (exceptionPeer, exceptionConfiguration) in filteredExceptions {
|
for (exceptionPeer, exceptionConfiguration) in filteredExceptions {
|
||||||
@ -321,23 +319,23 @@ private func saveIncomingMediaControllerEntries(presentationData: PresentationDa
|
|||||||
if !label.isEmpty {
|
if !label.isEmpty {
|
||||||
label.append(", ")
|
label.append(", ")
|
||||||
}
|
}
|
||||||
label.append("Photos")
|
label.append(presentationData.strings.Settings_AutosaveMediaPhoto)
|
||||||
} else {
|
} else {
|
||||||
if !label.isEmpty {
|
if !label.isEmpty {
|
||||||
label.append(", ")
|
label.append(", ")
|
||||||
}
|
}
|
||||||
label.append("No Photos")
|
label.append(presentationData.strings.Settings_AutosaveMediaNoPhoto)
|
||||||
}
|
}
|
||||||
if exceptionConfiguration.video {
|
if exceptionConfiguration.video {
|
||||||
if !label.isEmpty {
|
if !label.isEmpty {
|
||||||
label.append(", ")
|
label.append(", ")
|
||||||
}
|
}
|
||||||
label.append("Videos up to \(dataSizeString(Int(exceptionConfiguration.maximumVideoSize), formatting: DataSizeStringFormatting(presentationData: presentationData)))")
|
label.append(presentationData.strings.Settings_AutosaveMediaVideo(dataSizeString(Int(exceptionConfiguration.maximumVideoSize), formatting: DataSizeStringFormatting(presentationData: presentationData))).string)
|
||||||
} else {
|
} else {
|
||||||
if !label.isEmpty {
|
if !label.isEmpty {
|
||||||
label.append(", ")
|
label.append(", ")
|
||||||
}
|
}
|
||||||
label.append("No Videos")
|
label.append(presentationData.strings.Settings_AutosaveMediaNoVideo)
|
||||||
}
|
}
|
||||||
|
|
||||||
entries.append(.exceptionItem(index: index, peer: exceptionPeer, label: label))
|
entries.append(.exceptionItem(index: index, peer: exceptionPeer, label: label))
|
||||||
@ -345,7 +343,7 @@ private func saveIncomingMediaControllerEntries(presentationData: PresentationDa
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !filteredExceptions.isEmpty {
|
if !filteredExceptions.isEmpty {
|
||||||
entries.append(.deleteAllExceptions("Delete All Exceptions"))
|
entries.append(.deleteAllExceptions(presentationData.strings.Autosave_DeleteAllExceptions))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -588,8 +586,7 @@ func saveIncomingMediaController(context: AccountContext, scope: SaveIncomingMed
|
|||||||
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
||||||
let actionSheet = ActionSheetController(presentationData: presentationData)
|
let actionSheet = ActionSheetController(presentationData: presentationData)
|
||||||
actionSheet.setItemGroups([ActionSheetItemGroup(items: [
|
actionSheet.setItemGroups([ActionSheetItemGroup(items: [
|
||||||
//ActionSheetTextItem(title: presentationData.strings.AutoDownloadSettings_ResetHelp),
|
ActionSheetButtonItem(title: presentationData.strings.Autosave_DeleteAllExceptions, color: .destructive, action: { [weak actionSheet] in
|
||||||
ActionSheetButtonItem(title: "Delete All Exceptions", color: .destructive, action: { [weak actionSheet] in
|
|
||||||
actionSheet?.dismissAnimated()
|
actionSheet?.dismissAnimated()
|
||||||
|
|
||||||
let _ = updateMediaAutoSaveSettingsInteractively(account: context.account, { settings in
|
let _ = updateMediaAutoSaveSettingsInteractively(account: context.account, { settings in
|
||||||
@ -674,28 +671,27 @@ func saveIncomingMediaController(context: AccountContext, scope: SaveIncomingMed
|
|||||||
let title: String
|
let title: String
|
||||||
switch scope {
|
switch scope {
|
||||||
case let .peer(id):
|
case let .peer(id):
|
||||||
//TODO:localize
|
|
||||||
if let data = mediaAutoSaveSettings.exceptions.first(where: { $0.id == id }) {
|
if let data = mediaAutoSaveSettings.exceptions.first(where: { $0.id == id }) {
|
||||||
configuration = data.configuration
|
configuration = data.configuration
|
||||||
} else {
|
} else {
|
||||||
configuration = .default
|
configuration = .default
|
||||||
}
|
}
|
||||||
title = "Exception"
|
title = presentationData.strings.Autosave_Exception
|
||||||
case .addPeer:
|
case .addPeer:
|
||||||
configuration = state.pendingConfiguration
|
configuration = state.pendingConfiguration
|
||||||
title = "Add Exception"
|
title = presentationData.strings.Autosave_AddException
|
||||||
case let .peerType(peerType):
|
case let .peerType(peerType):
|
||||||
exceptions = mediaAutoSaveSettings.exceptions
|
exceptions = mediaAutoSaveSettings.exceptions
|
||||||
switch peerType {
|
switch peerType {
|
||||||
case .privateChats:
|
case .privateChats:
|
||||||
configuration = mediaAutoSaveSettings.configurations[.users] ?? .default
|
configuration = mediaAutoSaveSettings.configurations[.users] ?? .default
|
||||||
title = "Private Chats"
|
title = presentationData.strings.Notifications_PrivateChats
|
||||||
case .groups:
|
case .groups:
|
||||||
configuration = mediaAutoSaveSettings.configurations[.groups] ?? .default
|
configuration = mediaAutoSaveSettings.configurations[.groups] ?? .default
|
||||||
title = "Groups"
|
title = presentationData.strings.Notifications_GroupChats
|
||||||
case .channels:
|
case .channels:
|
||||||
configuration = mediaAutoSaveSettings.configurations[.channels] ?? .default
|
configuration = mediaAutoSaveSettings.configurations[.channels] ?? .default
|
||||||
title = "Channels"
|
title = presentationData.strings.Notifications_Channels
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1743,7 +1743,6 @@ public func presentExternalShare(context: AccountContext, text: String, parentCo
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func restrictedSendingContentsText(peer: EnginePeer, presentationData: PresentationData) -> String {
|
private func restrictedSendingContentsText(peer: EnginePeer, presentationData: PresentationData) -> String {
|
||||||
//TODO:localize
|
|
||||||
var itemList: [String] = []
|
var itemList: [String] = []
|
||||||
|
|
||||||
let order: [TelegramChatBannedRightsFlags] = [
|
let order: [TelegramChatBannedRightsFlags] = [
|
||||||
@ -1771,21 +1770,21 @@ private func restrictedSendingContentsText(peer: EnginePeer, presentationData: P
|
|||||||
var title: String?
|
var title: String?
|
||||||
switch right {
|
switch right {
|
||||||
case .banSendText:
|
case .banSendText:
|
||||||
title = "text messages"
|
title = presentationData.strings.Chat_SendAllowedContentTypeText
|
||||||
case .banSendPhotos:
|
case .banSendPhotos:
|
||||||
title = "photos"
|
title = presentationData.strings.Chat_SendAllowedContentTypePhoto
|
||||||
case .banSendVideos:
|
case .banSendVideos:
|
||||||
title = "videos"
|
title = presentationData.strings.Chat_SendAllowedContentTypeVideo
|
||||||
case .banSendVoice:
|
case .banSendVoice:
|
||||||
title = "voice messages"
|
title = presentationData.strings.Chat_SendAllowedContentTypeVoiceMessage
|
||||||
case .banSendInstantVideos:
|
case .banSendInstantVideos:
|
||||||
title = "video messages"
|
title = presentationData.strings.Chat_SendAllowedContentTypeVideoMessage
|
||||||
case .banSendFiles:
|
case .banSendFiles:
|
||||||
title = "files"
|
title = presentationData.strings.Chat_SendAllowedContentTypeFile
|
||||||
case .banSendMusic:
|
case .banSendMusic:
|
||||||
title = "music"
|
title = presentationData.strings.Chat_SendAllowedContentTypeMusic
|
||||||
case .banSendStickers:
|
case .banSendStickers:
|
||||||
title = "Stickers & GIFs"
|
title = presentationData.strings.Chat_SendAllowedContentTypeSticker
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -1795,19 +1794,27 @@ private func restrictedSendingContentsText(peer: EnginePeer, presentationData: P
|
|||||||
}
|
}
|
||||||
|
|
||||||
if itemList.isEmpty {
|
if itemList.isEmpty {
|
||||||
return "Sending messages is disabled in \(peer.compactDisplayTitle)"
|
return presentationData.strings.Chat_SendNotAllowedPeerText(peer.compactDisplayTitle).string
|
||||||
}
|
}
|
||||||
|
|
||||||
var itemListString = ""
|
var itemListString = ""
|
||||||
|
|
||||||
|
if #available(iOS 13.0, *) {
|
||||||
|
let listFormatter = ListFormatter()
|
||||||
|
listFormatter.locale = localeWithStrings(presentationData.strings)
|
||||||
|
if let value = listFormatter.string(from: itemList) {
|
||||||
|
itemListString = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if itemListString.isEmpty {
|
||||||
for i in 0 ..< itemList.count {
|
for i in 0 ..< itemList.count {
|
||||||
if i != 0 {
|
if i != 0 {
|
||||||
itemListString.append(", ")
|
itemListString.append(", ")
|
||||||
}
|
}
|
||||||
if i == itemList.count - 1 && i != 0 {
|
|
||||||
itemListString.append("and ")
|
|
||||||
}
|
|
||||||
itemListString.append(itemList[i])
|
itemListString.append(itemList[i])
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return "The admins of \(peer.compactDisplayTitle) group only allow to send \(itemListString)."
|
|
||||||
|
return presentationData.strings.Chat_SendAllowedContentPeerText(peer.compactDisplayTitle, itemListString).string
|
||||||
}
|
}
|
||||||
|
@ -619,8 +619,7 @@ private final class StickerPackContainer: ASDisplayNode {
|
|||||||
|
|
||||||
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
||||||
|
|
||||||
//TODO:localize
|
let undoController = UndoOverlayController(presentationData: presentationData, content: .sticker(context: context, file: file, title: nil, text: presentationData.strings.EmojiStatus_AppliedText, undoText: nil, customAction: nil), elevatedLayout: false, animateInAsReplacement: animateInAsReplacement, action: { _ in return false })
|
||||||
let undoController = UndoOverlayController(presentationData: presentationData, content: .sticker(context: context, file: file, title: nil, text: "Your emoji status has been updated.", undoText: nil, customAction: nil), elevatedLayout: false, animateInAsReplacement: animateInAsReplacement, action: { _ in return false })
|
|
||||||
controller.present(undoController, in: .window(.root))
|
controller.present(undoController, in: .window(.root))
|
||||||
}
|
}
|
||||||
let copyEmoji: (TelegramMediaFile) -> Void = { file in
|
let copyEmoji: (TelegramMediaFile) -> Void = { file in
|
||||||
@ -643,9 +642,8 @@ private final class StickerPackContainer: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO:localize
|
|
||||||
if strongSelf.sendEmoji != nil {
|
if strongSelf.sendEmoji != nil {
|
||||||
menuItems.append(.action(ContextMenuActionItem(text: "Send Emoji", icon: { theme in
|
menuItems.append(.action(ContextMenuActionItem(text: presentationData.strings.EmojiPreview_SendEmoji, icon: { theme in
|
||||||
if let image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Download"), color: theme.actionSheet.primaryTextColor) {
|
if let image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Download"), color: theme.actionSheet.primaryTextColor) {
|
||||||
return generateImage(image.size, rotatedContext: { size, context in
|
return generateImage(image.size, rotatedContext: { size, context in
|
||||||
context.clear(CGRect(origin: CGPoint(), size: size))
|
context.clear(CGRect(origin: CGPoint(), size: size))
|
||||||
@ -663,8 +661,7 @@ private final class StickerPackContainer: ASDisplayNode {
|
|||||||
})))
|
})))
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO:localize
|
menuItems.append(.action(ContextMenuActionItem(text: presentationData.strings.EmojiPreview_SetAsStatus, icon: { theme in
|
||||||
menuItems.append(.action(ContextMenuActionItem(text: "Set as Status", icon: { theme in
|
|
||||||
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Smile"), color: theme.actionSheet.primaryTextColor)
|
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Smile"), color: theme.actionSheet.primaryTextColor)
|
||||||
}, action: { _, f in
|
}, action: { _, f in
|
||||||
f(.default)
|
f(.default)
|
||||||
@ -688,8 +685,7 @@ private final class StickerPackContainer: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
})))
|
})))
|
||||||
|
|
||||||
//TODO:localize
|
menuItems.append(.action(ContextMenuActionItem(text: presentationData.strings.EmojiPreview_CopyEmoji, icon: { theme in
|
||||||
menuItems.append(.action(ContextMenuActionItem(text: "Copy Emoji", icon: { theme in
|
|
||||||
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.actionSheet.primaryTextColor)
|
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.actionSheet.primaryTextColor)
|
||||||
}, action: { _, f in
|
}, action: { _, f in
|
||||||
copyEmoji(file)
|
copyEmoji(file)
|
||||||
|
@ -230,7 +230,11 @@ final class AvatarEditorScreenComponent: Component {
|
|||||||
|
|
||||||
private let emojiSearchDisposable = MetaDisposable()
|
private let emojiSearchDisposable = MetaDisposable()
|
||||||
private let emojiSearchState = Promise<EmojiSearchState>(EmojiSearchState(result: nil, isSearching: false))
|
private let emojiSearchState = Promise<EmojiSearchState>(EmojiSearchState(result: nil, isSearching: false))
|
||||||
private var emojiSearchStateValue: EmojiSearchState = EmojiSearchState(result: nil, isSearching: false)
|
private var emojiSearchStateValue = EmojiSearchState(result: nil, isSearching: false) {
|
||||||
|
didSet {
|
||||||
|
self.emojiSearchState.set(.single(self.emojiSearchStateValue))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private var scheduledEmojiContentAnimationHint: EmojiPagerContentComponent.ContentAnimation?
|
private var scheduledEmojiContentAnimationHint: EmojiPagerContentComponent.ContentAnimation?
|
||||||
|
|
||||||
|
@ -637,8 +637,7 @@ public final class ChatEntityKeyboardInputNode: ChatInputNode {
|
|||||||
|
|
||||||
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
||||||
|
|
||||||
//TODO:localize
|
let controller = UndoOverlayController(presentationData: presentationData, content: .sticker(context: context, file: file, title: nil, text: presentationData.strings.EmojiStatus_AppliedText, undoText: nil, customAction: nil), elevatedLayout: false, animateInAsReplacement: animateInAsReplacement, action: { _ in return false })
|
||||||
let controller = UndoOverlayController(presentationData: presentationData, content: .sticker(context: context, file: file, title: nil, text: "Your emoji status has been updated.", undoText: nil, customAction: nil), elevatedLayout: false, animateInAsReplacement: animateInAsReplacement, action: { _ in return false })
|
|
||||||
strongSelf.currentUndoOverlayController = controller
|
strongSelf.currentUndoOverlayController = controller
|
||||||
controllerInteraction.presentController(controller, nil)
|
controllerInteraction.presentController(controller, nil)
|
||||||
},
|
},
|
||||||
@ -673,8 +672,7 @@ public final class ChatEntityKeyboardInputNode: ChatInputNode {
|
|||||||
|
|
||||||
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
||||||
|
|
||||||
//TODO:localize
|
let controller = UndoOverlayController(presentationData: presentationData, content: .sticker(context: context, file: file, title: nil, text: presentationData.strings.EmojiPreview_CopyEmoji, undoText: nil, customAction: nil), elevatedLayout: false, animateInAsReplacement: animateInAsReplacement, action: { _ in return false })
|
||||||
let controller = UndoOverlayController(presentationData: presentationData, content: .sticker(context: context, file: file, title: nil, text: "Emoji copied to clipboard.", undoText: nil, customAction: nil), elevatedLayout: false, animateInAsReplacement: animateInAsReplacement, action: { _ in return false })
|
|
||||||
strongSelf.currentUndoOverlayController = controller
|
strongSelf.currentUndoOverlayController = controller
|
||||||
controllerInteraction.presentController(controller, nil)
|
controllerInteraction.presentController(controller, nil)
|
||||||
}
|
}
|
||||||
@ -1488,9 +1486,8 @@ public final class ChatEntityKeyboardInputNode: ChatInputNode {
|
|||||||
if let stickerSearchResult = stickerSearchState.result {
|
if let stickerSearchResult = stickerSearchState.result {
|
||||||
var stickerSearchResults: EmojiPagerContentComponent.EmptySearchResults?
|
var stickerSearchResults: EmojiPagerContentComponent.EmptySearchResults?
|
||||||
if !stickerSearchResult.groups.contains(where: { !$0.items.isEmpty }) {
|
if !stickerSearchResult.groups.contains(where: { !$0.items.isEmpty }) {
|
||||||
//TODO:localize
|
|
||||||
stickerSearchResults = EmojiPagerContentComponent.EmptySearchResults(
|
stickerSearchResults = EmojiPagerContentComponent.EmptySearchResults(
|
||||||
text: "No stickers found",
|
text: presentationData.strings.EmojiSearch_SearchStickersEmptyResult,
|
||||||
iconFile: nil
|
iconFile: nil
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -2506,8 +2503,7 @@ public final class EmojiContentPeekBehaviorImpl: EmojiContentPeekBehavior {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let _ = strongSelf.chatPeerId {
|
if let _ = strongSelf.chatPeerId {
|
||||||
//TODO:localize
|
menuItems.append(.action(ContextMenuActionItem(text: presentationData.strings.EmojiPreview_SendEmoji, icon: { theme in
|
||||||
menuItems.append(.action(ContextMenuActionItem(text: "Send Emoji", icon: { theme in
|
|
||||||
if let image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Download"), color: theme.actionSheet.primaryTextColor) {
|
if let image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Download"), color: theme.actionSheet.primaryTextColor) {
|
||||||
return generateImage(image.size, rotatedContext: { size, context in
|
return generateImage(image.size, rotatedContext: { size, context in
|
||||||
context.clear(CGRect(origin: CGPoint(), size: size))
|
context.clear(CGRect(origin: CGPoint(), size: size))
|
||||||
@ -2524,8 +2520,7 @@ public final class EmojiContentPeekBehaviorImpl: EmojiContentPeekBehavior {
|
|||||||
f(.default)
|
f(.default)
|
||||||
})))
|
})))
|
||||||
|
|
||||||
//TODO:localize
|
menuItems.append(.action(ContextMenuActionItem(text: presentationData.strings.EmojiPreview_SetAsStatus, icon: { theme in
|
||||||
menuItems.append(.action(ContextMenuActionItem(text: "Set as Status", icon: { theme in
|
|
||||||
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Smile"), color: theme.actionSheet.primaryTextColor)
|
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Smile"), color: theme.actionSheet.primaryTextColor)
|
||||||
}, action: { _, f in
|
}, action: { _, f in
|
||||||
f(.default)
|
f(.default)
|
||||||
@ -2549,8 +2544,7 @@ public final class EmojiContentPeekBehaviorImpl: EmojiContentPeekBehavior {
|
|||||||
}
|
}
|
||||||
})))
|
})))
|
||||||
|
|
||||||
//TODO:localize
|
menuItems.append(.action(ContextMenuActionItem(text: presentationData.strings.EmojiPreview_CopyEmoji, icon: { theme in
|
||||||
menuItems.append(.action(ContextMenuActionItem(text: "Copy Emoji", icon: { theme in
|
|
||||||
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.actionSheet.primaryTextColor)
|
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.actionSheet.primaryTextColor)
|
||||||
}, action: { _, f in
|
}, action: { _, f in
|
||||||
copyEmoji(file)
|
copyEmoji(file)
|
||||||
|
@ -672,7 +672,6 @@ final class EmojiStatusPreviewScreenComponent: Component {
|
|||||||
}
|
}
|
||||||
))))
|
))))
|
||||||
}
|
}
|
||||||
//TODO:localize
|
|
||||||
menuItems.append(AnyComponentWithIdentity(id: "Other", component: AnyComponent(ContextMenuActionItem(
|
menuItems.append(AnyComponentWithIdentity(id: "Other", component: AnyComponent(ContextMenuActionItem(
|
||||||
title: component.strings.EmojiStatusSetup_TimerOther,
|
title: component.strings.EmojiStatusSetup_TimerOther,
|
||||||
action: { [weak self] in
|
action: { [weak self] in
|
||||||
|
@ -276,7 +276,11 @@ public final class EmojiStatusSelectionController: ViewController {
|
|||||||
|
|
||||||
private let emojiSearchDisposable = MetaDisposable()
|
private let emojiSearchDisposable = MetaDisposable()
|
||||||
private let emojiSearchState = Promise<EmojiSearchState>(EmojiSearchState(result: nil, isSearching: false))
|
private let emojiSearchState = Promise<EmojiSearchState>(EmojiSearchState(result: nil, isSearching: false))
|
||||||
private var emojiSearchStateValue: EmojiSearchState = EmojiSearchState(result: nil, isSearching: false)
|
private var emojiSearchStateValue = EmojiSearchState(result: nil, isSearching: false) {
|
||||||
|
didSet {
|
||||||
|
self.emojiSearchState.set(.single(self.emojiSearchStateValue))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private var emptyResultEmojis: [TelegramMediaFile] = []
|
private var emptyResultEmojis: [TelegramMediaFile] = []
|
||||||
private var stableEmptyResultEmoji: TelegramMediaFile?
|
private var stableEmptyResultEmoji: TelegramMediaFile?
|
||||||
|
@ -6977,8 +6977,7 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
} else {
|
} else {
|
||||||
itemGroupIndexById[groupId] = itemGroups.count
|
itemGroupIndexById[groupId] = itemGroups.count
|
||||||
|
|
||||||
//TODO:localize
|
let title = context.sharedContext.currentPresentationData.with({ $0 }).strings.EmojiInput_TrendingEmoji
|
||||||
let title = "TRENDING EMOJI"
|
|
||||||
itemGroups.append(ItemGroup(supergroupId: groupId, id: groupId, title: title, subtitle: nil, isPremiumLocked: false, isFeatured: false, collapsedLineCount: 0, isClearable: false, headerItem: nil, items: [resultItem]))
|
itemGroups.append(ItemGroup(supergroupId: groupId, id: groupId, title: title, subtitle: nil, isPremiumLocked: false, isFeatured: false, collapsedLineCount: 0, isClearable: false, headerItem: nil, items: [resultItem]))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -7668,8 +7667,7 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
} else if isEmojiSelection {
|
} else if isEmojiSelection {
|
||||||
displaySearchWithPlaceholder = strings.EmojiSearch_SearchEmojiPlaceholder
|
displaySearchWithPlaceholder = strings.EmojiSearch_SearchEmojiPlaceholder
|
||||||
} else if isProfilePhotoEmojiSelection || isGroupPhotoEmojiSelection {
|
} else if isProfilePhotoEmojiSelection || isGroupPhotoEmojiSelection {
|
||||||
//TODO:localize
|
displaySearchWithPlaceholder = strings.Common_Search
|
||||||
displaySearchWithPlaceholder = "Search"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,7 +59,11 @@ public final class EmojiSearchContent: ASDisplayNode, EntitySearchContainerNode
|
|||||||
|
|
||||||
private let emojiSearchDisposable = MetaDisposable()
|
private let emojiSearchDisposable = MetaDisposable()
|
||||||
private let emojiSearchState = Promise<EmojiSearchState>(EmojiSearchState(result: nil, isSearching: false))
|
private let emojiSearchState = Promise<EmojiSearchState>(EmojiSearchState(result: nil, isSearching: false))
|
||||||
private var emojiSearchStateValue: EmojiSearchState = EmojiSearchState(result: nil, isSearching: false)
|
private var emojiSearchStateValue = EmojiSearchState(result: nil, isSearching: false) {
|
||||||
|
didSet {
|
||||||
|
self.emojiSearchState.set(.single(self.emojiSearchStateValue))
|
||||||
|
}
|
||||||
|
}
|
||||||
private var immediateEmojiSearchState: EmojiSearchState = EmojiSearchState(result: nil, isSearching: false)
|
private var immediateEmojiSearchState: EmojiSearchState = EmojiSearchState(result: nil, isSearching: false)
|
||||||
|
|
||||||
private var dataDisposable: Disposable?
|
private var dataDisposable: Disposable?
|
||||||
@ -106,13 +110,12 @@ public final class EmojiSearchContent: ASDisplayNode, EntitySearchContainerNode
|
|||||||
groupItems.append(resultItem)
|
groupItems.append(resultItem)
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO:localize
|
|
||||||
self.itemGroups.append(EmojiPagerContentComponent.ItemGroup(
|
self.itemGroups.append(EmojiPagerContentComponent.ItemGroup(
|
||||||
supergroupId: AnyHashable(groupItem.info.id),
|
supergroupId: AnyHashable(groupItem.info.id),
|
||||||
groupId: AnyHashable(groupItem.info.id),
|
groupId: AnyHashable(groupItem.info.id),
|
||||||
title: groupItem.info.title,
|
title: groupItem.info.title,
|
||||||
subtitle: nil,
|
subtitle: nil,
|
||||||
actionButtonTitle: "Add \(groupItem.info.title)",
|
actionButtonTitle: self.presentationData.strings.EmojiInput_AddPack(groupItem.info.title).string,
|
||||||
isFeatured: true,
|
isFeatured: true,
|
||||||
isPremiumLocked: !self.hasPremiumForInstallation,
|
isPremiumLocked: !self.hasPremiumForInstallation,
|
||||||
isEmbedded: false,
|
isEmbedded: false,
|
||||||
@ -413,7 +416,6 @@ public final class EmojiSearchContent: ASDisplayNode, EntitySearchContainerNode
|
|||||||
let params = Params(size: size, leftInset: leftInset, rightInset: rightInset, bottomInset: bottomInset, inputHeight: inputHeight, deviceMetrics: deviceMetrics)
|
let params = Params(size: size, leftInset: leftInset, rightInset: rightInset, bottomInset: bottomInset, inputHeight: inputHeight, deviceMetrics: deviceMetrics)
|
||||||
self.params = params
|
self.params = params
|
||||||
|
|
||||||
//TODO:localize
|
|
||||||
var emojiContent = EmojiPagerContentComponent(
|
var emojiContent = EmojiPagerContentComponent(
|
||||||
id: "emoji",
|
id: "emoji",
|
||||||
context: self.context,
|
context: self.context,
|
||||||
@ -427,7 +429,7 @@ public final class EmojiSearchContent: ASDisplayNode, EntitySearchContainerNode
|
|||||||
itemContentUniqueId: EmojiPagerContentComponent.ContentId(id: "main", version: 0),
|
itemContentUniqueId: EmojiPagerContentComponent.ContentId(id: "main", version: 0),
|
||||||
searchState: .empty(hasResults: false),
|
searchState: .empty(hasResults: false),
|
||||||
warpContentsOnEdges: false,
|
warpContentsOnEdges: false,
|
||||||
displaySearchWithPlaceholder: "Search Emoji",
|
displaySearchWithPlaceholder: self.presentationData.strings.EmojiSearch_SearchEmojiPlaceholder,
|
||||||
searchCategories: nil,
|
searchCategories: nil,
|
||||||
searchInitiallyHidden: false,
|
searchInitiallyHidden: false,
|
||||||
searchAlwaysActive: true,
|
searchAlwaysActive: true,
|
||||||
|
@ -377,8 +377,7 @@ public final class EntityKeyboardComponent: Component {
|
|||||||
strongSelf.reorderPacks(category: .masks, items: items)
|
strongSelf.reorderPacks(category: .masks, items: items)
|
||||||
}
|
}
|
||||||
))))
|
))))
|
||||||
//TODO:localize
|
contentIcons.append(PagerComponentContentIcon(id: "masks", imageName: "Chat/Input/Media/EntityInputMasksIcon", title: component.strings.EmojiInput_TabMasks))
|
||||||
contentIcons.append(PagerComponentContentIcon(id: "masks", imageName: "Chat/Input/Media/EntityInputMasksIcon", title: "Masks"))
|
|
||||||
if let _ = component.maskContent?.inputInteractionHolder.inputInteraction?.openStickerSettings {
|
if let _ = component.maskContent?.inputInteractionHolder.inputInteraction?.openStickerSettings {
|
||||||
contentAccessoryRightButtons.append(AnyComponentWithIdentity(id: "masks", component: AnyComponent(Button(
|
contentAccessoryRightButtons.append(AnyComponentWithIdentity(id: "masks", component: AnyComponent(Button(
|
||||||
content: AnyComponent(BundleIconComponent(
|
content: AnyComponent(BundleIconComponent(
|
||||||
@ -464,8 +463,7 @@ public final class EntityKeyboardComponent: Component {
|
|||||||
reorderItems: { _ in
|
reorderItems: { _ in
|
||||||
}
|
}
|
||||||
))))*/
|
))))*/
|
||||||
//TODO:localize
|
contentIcons.append(PagerComponentContentIcon(id: "gifs", imageName: "Chat/Input/Media/EntityInputGifsIcon", title: component.strings.EmojiInput_TabGifs))
|
||||||
contentIcons.append(PagerComponentContentIcon(id: "gifs", imageName: "Chat/Input/Media/EntityInputGifsIcon", title: "GIFs"))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if let stickerContent = component.stickerContent {
|
if let stickerContent = component.stickerContent {
|
||||||
@ -571,8 +569,7 @@ public final class EntityKeyboardComponent: Component {
|
|||||||
strongSelf.reorderPacks(category: .stickers, items: items)
|
strongSelf.reorderPacks(category: .stickers, items: items)
|
||||||
}
|
}
|
||||||
))))
|
))))
|
||||||
//TODO:localize
|
contentIcons.append(PagerComponentContentIcon(id: "stickers", imageName: "Chat/Input/Media/EntityInputStickersIcon", title: component.strings.EmojiInput_TabStickers))
|
||||||
contentIcons.append(PagerComponentContentIcon(id: "stickers", imageName: "Chat/Input/Media/EntityInputStickersIcon", title: "Stickers"))
|
|
||||||
if let _ = component.stickerContent?.inputInteractionHolder.inputInteraction?.openStickerSettings {
|
if let _ = component.stickerContent?.inputInteractionHolder.inputInteraction?.openStickerSettings {
|
||||||
contentAccessoryRightButtons.append(AnyComponentWithIdentity(id: "stickers", component: AnyComponent(Button(
|
contentAccessoryRightButtons.append(AnyComponentWithIdentity(id: "stickers", component: AnyComponent(Button(
|
||||||
content: AnyComponent(BundleIconComponent(
|
content: AnyComponent(BundleIconComponent(
|
||||||
@ -671,8 +668,7 @@ public final class EntityKeyboardComponent: Component {
|
|||||||
strongSelf.reorderPacks(category: .emoji, items: items)
|
strongSelf.reorderPacks(category: .emoji, items: items)
|
||||||
}
|
}
|
||||||
))))
|
))))
|
||||||
//TODO:localize
|
contentIcons.append(PagerComponentContentIcon(id: "emoji", imageName: "Chat/Input/Media/EntityInputEmojiIcon", title: component.strings.EmojiInput_TabEmoji))
|
||||||
contentIcons.append(PagerComponentContentIcon(id: "emoji", imageName: "Chat/Input/Media/EntityInputEmojiIcon", title: "Emoji"))
|
|
||||||
if let _ = deleteBackwards {
|
if let _ = deleteBackwards {
|
||||||
contentAccessoryLeftButtons.append(AnyComponentWithIdentity(id: "emoji", component: AnyComponent(Button(
|
contentAccessoryLeftButtons.append(AnyComponentWithIdentity(id: "emoji", component: AnyComponent(Button(
|
||||||
content: AnyComponent(BundleIconComponent(
|
content: AnyComponent(BundleIconComponent(
|
||||||
|
@ -169,10 +169,9 @@ private final class SubItemComponent: Component {
|
|||||||
)
|
)
|
||||||
availableWidth = max(1.0, availableWidth - titleValueSize.width - 4.0)
|
availableWidth = max(1.0, availableWidth - titleValueSize.width - 4.0)
|
||||||
|
|
||||||
//TODO:localize
|
|
||||||
let titleSize = self.title.update(
|
let titleSize = self.title.update(
|
||||||
transition: transition,
|
transition: transition,
|
||||||
component: AnyComponent(MultilineTextComponent(text: .plain(NSAttributedString(string: component.isIncoming ? "Incoming" : "Outgoing", font: Font.regular(17.0), textColor: component.theme.list.itemPrimaryTextColor)))),
|
component: AnyComponent(MultilineTextComponent(text: .plain(NSAttributedString(string: component.isIncoming ? component.strings.DataUsage_MediaDirectionIncoming : component.strings.DataUsage_MediaDirectionOutgoing, font: Font.regular(17.0), textColor: component.theme.list.itemPrimaryTextColor)))),
|
||||||
environment: {},
|
environment: {},
|
||||||
containerSize: CGSize(width: availableWidth, height: 100.0)
|
containerSize: CGSize(width: availableWidth, height: 100.0)
|
||||||
)
|
)
|
||||||
|
@ -266,18 +266,17 @@ final class DataUsageScreenComponent: Component {
|
|||||||
case .music:
|
case .music:
|
||||||
return strings.StorageManagement_SectionMusic
|
return strings.StorageManagement_SectionMusic
|
||||||
case .messages:
|
case .messages:
|
||||||
//TODO:localize
|
return strings.StorageManagement_SectionMessages
|
||||||
return "Messages"
|
|
||||||
case .stickers:
|
case .stickers:
|
||||||
return strings.StorageManagement_SectionStickers
|
return strings.StorageManagement_SectionStickers
|
||||||
case .voiceMessages:
|
case .voiceMessages:
|
||||||
return "Voice Messages"
|
return strings.StorageManagement_SectionVoiceMessages
|
||||||
case .calls:
|
case .calls:
|
||||||
return "Calls"
|
return strings.StorageManagement_SectionCalls
|
||||||
case .totalIn:
|
case .totalIn:
|
||||||
return "Data Received"
|
return strings.DataUsage_SectionTotalIncoming
|
||||||
case .totalOut:
|
case .totalOut:
|
||||||
return "Data Sent"
|
return strings.DataUsage_SectionTotalOutgoing
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -809,17 +808,16 @@ final class DataUsageScreenComponent: Component {
|
|||||||
let body = MarkdownAttributeSet(font: Font.regular(13.0), textColor: environment.theme.list.freeTextColor)
|
let body = MarkdownAttributeSet(font: Font.regular(13.0), textColor: environment.theme.list.freeTextColor)
|
||||||
let bold = MarkdownAttributeSet(font: Font.semibold(13.0), textColor: environment.theme.list.freeTextColor)
|
let bold = MarkdownAttributeSet(font: Font.semibold(13.0), textColor: environment.theme.list.freeTextColor)
|
||||||
|
|
||||||
//TODO:localize
|
|
||||||
let timestampString: String
|
let timestampString: String
|
||||||
if let allStats = self.allStats, allStats.resetTimestamp != 0 {
|
if let allStats = self.allStats, allStats.resetTimestamp != 0 {
|
||||||
let dateStringPlain = stringForFullDate(timestamp: allStats.resetTimestamp, strings: environment.strings, dateTimeFormat: PresentationDateTimeFormat())
|
let dateStringPlain = stringForFullDate(timestamp: allStats.resetTimestamp, strings: environment.strings, dateTimeFormat: PresentationDateTimeFormat())
|
||||||
switch self.selectedStats {
|
switch self.selectedStats {
|
||||||
case .all:
|
case .all:
|
||||||
timestampString = "Your data usage since \(dateStringPlain)"
|
timestampString = environment.strings.DataUsage_InfoTotalUsageSinceTime(dateStringPlain).string
|
||||||
case .mobile:
|
case .mobile:
|
||||||
timestampString = "Your mobile data usage since \(dateStringPlain)"
|
timestampString = environment.strings.DataUsage_InfoMobileUsageSinceTime(dateStringPlain).string
|
||||||
case .wifi:
|
case .wifi:
|
||||||
timestampString = "Your Wi-Fi data usage since \(dateStringPlain)"
|
timestampString = environment.strings.DataUsage_InfoWifiUsageSinceTime(dateStringPlain).string
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
timestampString = ""
|
timestampString = ""
|
||||||
@ -972,10 +970,9 @@ final class DataUsageScreenComponent: Component {
|
|||||||
contentHeight += categoriesSize.height
|
contentHeight += categoriesSize.height
|
||||||
contentHeight += 8.0
|
contentHeight += 8.0
|
||||||
|
|
||||||
//TODO:localize
|
|
||||||
let categoriesDescriptionSize = self.categoriesDescriptionView.update(
|
let categoriesDescriptionSize = self.categoriesDescriptionView.update(
|
||||||
transition: transition,
|
transition: transition,
|
||||||
component: AnyComponent(MultilineTextComponent(text: .markdown(text: "Tap on each section for detailed view.", attributes: MarkdownAttributes(
|
component: AnyComponent(MultilineTextComponent(text: .markdown(text: environment.strings.DataUsage_SectionsInfo, attributes: MarkdownAttributes(
|
||||||
body: body,
|
body: body,
|
||||||
bold: bold,
|
bold: bold,
|
||||||
link: body,
|
link: body,
|
||||||
@ -996,15 +993,14 @@ final class DataUsageScreenComponent: Component {
|
|||||||
contentHeight += categoriesDescriptionSize.height
|
contentHeight += categoriesDescriptionSize.height
|
||||||
contentHeight += 40.0
|
contentHeight += 40.0
|
||||||
|
|
||||||
//TODO:localize
|
|
||||||
let totalTitle: String
|
let totalTitle: String
|
||||||
switch self.selectedStats {
|
switch self.selectedStats {
|
||||||
case .all:
|
case .all:
|
||||||
totalTitle = "TOTAL NETWORK USAGE"
|
totalTitle = environment.strings.DataUsage_SectionUsageTotal
|
||||||
case .mobile:
|
case .mobile:
|
||||||
totalTitle = "MOBILE NETWORK USAGE"
|
totalTitle = environment.strings.DataUsage_SectionUsageMobile
|
||||||
case .wifi:
|
case .wifi:
|
||||||
totalTitle = "WI-FI NETWORK USAGE"
|
totalTitle = environment.strings.DataUsage_SectionUsageWifi
|
||||||
}
|
}
|
||||||
let totalCategoriesTitleSize = self.totalCategoriesTitleView.update(
|
let totalCategoriesTitleSize = self.totalCategoriesTitleView.update(
|
||||||
transition: transition,
|
transition: transition,
|
||||||
@ -1053,7 +1049,6 @@ final class DataUsageScreenComponent: Component {
|
|||||||
contentHeight += 40.0
|
contentHeight += 40.0
|
||||||
|
|
||||||
var autoDownloadSettingsContentHeight: CGFloat = 0.0
|
var autoDownloadSettingsContentHeight: CGFloat = 0.0
|
||||||
//TODO:localize
|
|
||||||
let autoDownloadSettingsSize: CGSize
|
let autoDownloadSettingsSize: CGSize
|
||||||
if case .all = self.selectedStats, let autoDownloadSettingsComponentView = self.autoDownloadSettingsView.view {
|
if case .all = self.selectedStats, let autoDownloadSettingsComponentView = self.autoDownloadSettingsView.view {
|
||||||
autoDownloadSettingsSize = autoDownloadSettingsComponentView.bounds.size
|
autoDownloadSettingsSize = autoDownloadSettingsComponentView.bounds.size
|
||||||
@ -1063,7 +1058,7 @@ final class DataUsageScreenComponent: Component {
|
|||||||
component: AnyComponent(StoragePeerTypeItemComponent(
|
component: AnyComponent(StoragePeerTypeItemComponent(
|
||||||
theme: environment.theme,
|
theme: environment.theme,
|
||||||
iconName: self.selectedStats == .mobile ? "Settings/Menu/Cellular" : "Settings/Menu/WiFi",
|
iconName: self.selectedStats == .mobile ? "Settings/Menu/Cellular" : "Settings/Menu/WiFi",
|
||||||
title: "Auto-Download Settings",
|
title: environment.strings.DataUsage_AutoDownloadSettings,
|
||||||
subtitle: stringForAutoDownloadSetting(strings: environment.strings, decimalSeparator: environment.dateTimeFormat.decimalSeparator, settings: self.mediaAutoDownloadSettings, isCellular: self.selectedStats == .mobile),
|
subtitle: stringForAutoDownloadSetting(strings: environment.strings, decimalSeparator: environment.dateTimeFormat.decimalSeparator, settings: self.mediaAutoDownloadSettings, isCellular: self.selectedStats == .mobile),
|
||||||
value: "",
|
value: "",
|
||||||
hasNext: false,
|
hasNext: false,
|
||||||
@ -1215,9 +1210,8 @@ final class DataUsageScreenComponent: Component {
|
|||||||
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
||||||
let actionSheet = ActionSheetController(presentationData: presentationData)
|
let actionSheet = ActionSheetController(presentationData: presentationData)
|
||||||
|
|
||||||
//TODO:localize
|
|
||||||
actionSheet.setItemGroups([ActionSheetItemGroup(items: [
|
actionSheet.setItemGroups([ActionSheetItemGroup(items: [
|
||||||
ActionSheetButtonItem(title: "Reset Statistics", color: .destructive, action: { [weak self, weak actionSheet] in
|
ActionSheetButtonItem(title: presentationData.strings.NetworkUsageSettings_ResetStats, color: .destructive, action: { [weak self, weak actionSheet] in
|
||||||
actionSheet?.dismissAnimated()
|
actionSheet?.dismissAnimated()
|
||||||
|
|
||||||
self?.commitClear()
|
self?.commitClear()
|
||||||
|
@ -18219,9 +18219,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
}
|
}
|
||||||
|
|
||||||
func restrictedSendingContentsText() -> String {
|
func restrictedSendingContentsText() -> String {
|
||||||
//TODO:localize
|
|
||||||
guard let peer = self.presentationInterfaceState.renderedPeer?.peer else {
|
guard let peer = self.presentationInterfaceState.renderedPeer?.peer else {
|
||||||
return "Sending messages is disabled in this chat"
|
return self.presentationData.strings.Chat_SendNotAllowedText
|
||||||
}
|
}
|
||||||
|
|
||||||
var itemList: [String] = []
|
var itemList: [String] = []
|
||||||
@ -18251,21 +18250,21 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
var title: String?
|
var title: String?
|
||||||
switch right {
|
switch right {
|
||||||
case .banSendText:
|
case .banSendText:
|
||||||
title = "text messages"
|
title = self.presentationData.strings.Chat_SendAllowedContentTypeText
|
||||||
case .banSendPhotos:
|
case .banSendPhotos:
|
||||||
title = "photos"
|
title = self.presentationData.strings.Chat_SendAllowedContentTypePhoto
|
||||||
case .banSendVideos:
|
case .banSendVideos:
|
||||||
title = "videos"
|
title = self.presentationData.strings.Chat_SendAllowedContentTypeVideo
|
||||||
case .banSendVoice:
|
case .banSendVoice:
|
||||||
title = "voice messages"
|
title = self.presentationData.strings.Chat_SendAllowedContentTypeVoiceMessage
|
||||||
case .banSendInstantVideos:
|
case .banSendInstantVideos:
|
||||||
title = "video messages"
|
title = self.presentationData.strings.Chat_SendAllowedContentTypeVideoMessage
|
||||||
case .banSendFiles:
|
case .banSendFiles:
|
||||||
title = "files"
|
title = self.presentationData.strings.Chat_SendAllowedContentTypeFile
|
||||||
case .banSendMusic:
|
case .banSendMusic:
|
||||||
title = "music"
|
title = self.presentationData.strings.Chat_SendAllowedContentTypeMusic
|
||||||
case .banSendStickers:
|
case .banSendStickers:
|
||||||
title = "Stickers & GIFs"
|
title = self.presentationData.strings.Chat_SendAllowedContentTypeSticker
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -18275,21 +18274,28 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
}
|
}
|
||||||
|
|
||||||
if itemList.isEmpty {
|
if itemList.isEmpty {
|
||||||
return "Sending messages is disabled in this chat"
|
return self.presentationData.strings.Chat_SendNotAllowedText
|
||||||
}
|
}
|
||||||
|
|
||||||
var itemListString = ""
|
var itemListString = ""
|
||||||
|
if #available(iOS 13.0, *) {
|
||||||
|
let listFormatter = ListFormatter()
|
||||||
|
listFormatter.locale = localeWithStrings(presentationData.strings)
|
||||||
|
if let value = listFormatter.string(from: itemList) {
|
||||||
|
itemListString = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if itemListString.isEmpty {
|
||||||
for i in 0 ..< itemList.count {
|
for i in 0 ..< itemList.count {
|
||||||
if i != 0 {
|
if i != 0 {
|
||||||
itemListString.append(", ")
|
itemListString.append(", ")
|
||||||
}
|
}
|
||||||
if i == itemList.count - 1 && i != 0 {
|
|
||||||
itemListString.append("and ")
|
|
||||||
}
|
|
||||||
itemListString.append(itemList[i])
|
itemListString.append(itemList[i])
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return "The admins of this group only allow to send \(itemListString)."
|
return self.presentationData.strings.Chat_SendAllowedContentText(itemListString).string
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1017,8 +1017,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode {
|
|||||||
}), in: .current)*/
|
}), in: .current)*/
|
||||||
}), ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
|
}), ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
|
||||||
} else {
|
} else {
|
||||||
//TODO:localize
|
strongSelf.controllerInteraction.presentController(textAlertController(context: strongSelf.context, updatedPresentationData: strongSelf.controller?.updatedPresentationData, title: nil, text: strongSelf.presentationData.strings.Chat_ErrorInvoiceNotFound, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), nil)
|
||||||
strongSelf.controllerInteraction.presentController(textAlertController(context: strongSelf.context, updatedPresentationData: strongSelf.controller?.updatedPresentationData, title: nil, text: "Invoice not found", actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), nil)
|
|
||||||
}
|
}
|
||||||
case let .instantView(webpage, anchor):
|
case let .instantView(webpage, anchor):
|
||||||
strongSelf.pushController(InstantPageController(context: strongSelf.context, webPage: webpage, sourceLocation: InstantPageSourceLocation(userLocation: .peer(strongSelf.peer.id), peerType: .channel), anchor: anchor))
|
strongSelf.pushController(InstantPageController(context: strongSelf.context, webPage: webpage, sourceLocation: InstantPageSourceLocation(userLocation: .peer(strongSelf.peer.id), peerType: .channel), anchor: anchor))
|
||||||
|
@ -932,7 +932,6 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate {
|
|||||||
guard let controller = strongSelf.interfaceInteraction?.chatController() as? ChatControllerImpl else {
|
guard let controller = strongSelf.interfaceInteraction?.chatController() as? ChatControllerImpl else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
//TODO:localize
|
|
||||||
controller.controllerInteraction?.displayUndo(.universal(animation: "premium_unlock", scale: 1.0, colors: ["__allcolors__": UIColor(white: 1.0, alpha: 1.0)], title: nil, text: controller.restrictedSendingContentsText(), customUndoText: nil))
|
controller.controllerInteraction?.displayUndo(.universal(animation: "premium_unlock", scale: 1.0, colors: ["__allcolors__": UIColor(white: 1.0, alpha: 1.0)], title: nil, text: controller.restrictedSendingContentsText(), customUndoText: nil))
|
||||||
} else {
|
} else {
|
||||||
strongSelf.ensureFocused()
|
strongSelf.ensureFocused()
|
||||||
@ -1384,8 +1383,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if sendingTextDisabled {
|
if sendingTextDisabled {
|
||||||
//TODO:localize
|
placeholder = interfaceState.strings.Chat_PlaceholderTextNotAllowed
|
||||||
placeholder = "Text not allowed"
|
|
||||||
} else {
|
} else {
|
||||||
if let channel = peer as? TelegramChannel, case .group = channel.info, channel.hasPermission(.canBeAnonymous) {
|
if let channel = peer as? TelegramChannel, case .group = channel.info, channel.hasPermission(.canBeAnonymous) {
|
||||||
placeholder = interfaceState.strings.Conversation_InputTextAnonymousPlaceholder
|
placeholder = interfaceState.strings.Conversation_InputTextAnonymousPlaceholder
|
||||||
@ -2865,8 +2863,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate {
|
|||||||
|
|
||||||
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
||||||
|
|
||||||
//TODO:localize
|
let undoController = UndoOverlayController(presentationData: presentationData, content: .sticker(context: context, file: file, title: nil, text: presentationData.strings.EmojiStatus_AppliedText, undoText: nil, customAction: nil), elevatedLayout: false, animateInAsReplacement: animateInAsReplacement, action: { _ in return false })
|
||||||
let undoController = UndoOverlayController(presentationData: presentationData, content: .sticker(context: context, file: file, title: nil, text: "Your emoji status has been updated.", undoText: nil, customAction: nil), elevatedLayout: false, animateInAsReplacement: animateInAsReplacement, action: { _ in return false })
|
|
||||||
//strongSelf.currentUndoOverlayController = controller
|
//strongSelf.currentUndoOverlayController = controller
|
||||||
controller.controllerInteraction?.presentController(undoController, nil)
|
controller.controllerInteraction?.presentController(undoController, nil)
|
||||||
}
|
}
|
||||||
@ -2890,8 +2887,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO:localize
|
menuItems.append(.action(ContextMenuActionItem(text: presentationData.strings.EmojiPreview_SendEmoji, icon: { theme in
|
||||||
menuItems.append(.action(ContextMenuActionItem(text: "Send Emoji", icon: { theme in
|
|
||||||
if let image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Download"), color: theme.actionSheet.primaryTextColor) {
|
if let image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Download"), color: theme.actionSheet.primaryTextColor) {
|
||||||
return generateImage(image.size, rotatedContext: { size, context in
|
return generateImage(image.size, rotatedContext: { size, context in
|
||||||
context.clear(CGRect(origin: CGPoint(), size: size))
|
context.clear(CGRect(origin: CGPoint(), size: size))
|
||||||
@ -2908,8 +2904,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate {
|
|||||||
f(.default)
|
f(.default)
|
||||||
})))
|
})))
|
||||||
|
|
||||||
//TODO:localize
|
menuItems.append(.action(ContextMenuActionItem(text: presentationData.strings.EmojiPreview_SetAsStatus, icon: { theme in
|
||||||
menuItems.append(.action(ContextMenuActionItem(text: "Set as Status", icon: { theme in
|
|
||||||
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Smile"), color: theme.actionSheet.primaryTextColor)
|
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Smile"), color: theme.actionSheet.primaryTextColor)
|
||||||
}, action: { _, f in
|
}, action: { _, f in
|
||||||
f(.default)
|
f(.default)
|
||||||
@ -2933,8 +2928,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate {
|
|||||||
}
|
}
|
||||||
})))
|
})))
|
||||||
|
|
||||||
//TODO:localize
|
menuItems.append(.action(ContextMenuActionItem(text: presentationData.strings.EmojiPreview_CopyEmoji, icon: { theme in
|
||||||
menuItems.append(.action(ContextMenuActionItem(text: "Copy Emoji", icon: { theme in
|
|
||||||
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.actionSheet.primaryTextColor)
|
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.actionSheet.primaryTextColor)
|
||||||
}, action: { _, f in
|
}, action: { _, f in
|
||||||
copyEmoji(file)
|
copyEmoji(file)
|
||||||
|
@ -342,8 +342,7 @@ final class EmojisChatInputContextPanelNode: ChatInputContextPanelNode {
|
|||||||
|
|
||||||
let presentationData = self.context.sharedContext.currentPresentationData.with { $0 }
|
let presentationData = self.context.sharedContext.currentPresentationData.with { $0 }
|
||||||
|
|
||||||
//TODO:localize
|
let undoController = UndoOverlayController(presentationData: presentationData, content: .sticker(context: self.context, file: file, title: nil, text: presentationData.strings.EmojiStatus_AppliedText, undoText: nil, customAction: nil), elevatedLayout: false, animateInAsReplacement: animateInAsReplacement, action: { _ in return false })
|
||||||
let undoController = UndoOverlayController(presentationData: presentationData, content: .sticker(context: self.context, file: file, title: nil, text: "Your emoji status has been updated.", undoText: nil, customAction: nil), elevatedLayout: false, animateInAsReplacement: animateInAsReplacement, action: { _ in return false })
|
|
||||||
//strongSelf.currentUndoOverlayController = controller
|
//strongSelf.currentUndoOverlayController = controller
|
||||||
controller.controllerInteraction?.presentController(undoController, nil)
|
controller.controllerInteraction?.presentController(undoController, nil)
|
||||||
}
|
}
|
||||||
@ -367,8 +366,7 @@ final class EmojisChatInputContextPanelNode: ChatInputContextPanelNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO:localize
|
menuItems.append(.action(ContextMenuActionItem(text: presentationData.strings.EmojiPreview_SendEmoji, icon: { theme in
|
||||||
menuItems.append(.action(ContextMenuActionItem(text: "Send Emoji", icon: { theme in
|
|
||||||
if let image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Download"), color: theme.actionSheet.primaryTextColor) {
|
if let image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Download"), color: theme.actionSheet.primaryTextColor) {
|
||||||
return generateImage(image.size, rotatedContext: { size, context in
|
return generateImage(image.size, rotatedContext: { size, context in
|
||||||
context.clear(CGRect(origin: CGPoint(), size: size))
|
context.clear(CGRect(origin: CGPoint(), size: size))
|
||||||
@ -385,8 +383,7 @@ final class EmojisChatInputContextPanelNode: ChatInputContextPanelNode {
|
|||||||
f(.default)
|
f(.default)
|
||||||
})))
|
})))
|
||||||
|
|
||||||
//TODO:localize
|
menuItems.append(.action(ContextMenuActionItem(text: presentationData.strings.EmojiPreview_SetAsStatus, icon: { theme in
|
||||||
menuItems.append(.action(ContextMenuActionItem(text: "Set as Status", icon: { theme in
|
|
||||||
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Smile"), color: theme.actionSheet.primaryTextColor)
|
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Smile"), color: theme.actionSheet.primaryTextColor)
|
||||||
}, action: { _, f in
|
}, action: { _, f in
|
||||||
f(.default)
|
f(.default)
|
||||||
@ -410,8 +407,7 @@ final class EmojisChatInputContextPanelNode: ChatInputContextPanelNode {
|
|||||||
}
|
}
|
||||||
})))
|
})))
|
||||||
|
|
||||||
//TODO:localize
|
menuItems.append(.action(ContextMenuActionItem(text: presentationData.strings.EmojiPreview_CopyEmoji, icon: { theme in
|
||||||
menuItems.append(.action(ContextMenuActionItem(text: "Copy Emoji", icon: { theme in
|
|
||||||
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.actionSheet.primaryTextColor)
|
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.actionSheet.primaryTextColor)
|
||||||
}, action: { _, f in
|
}, action: { _, f in
|
||||||
copyEmoji(file)
|
copyEmoji(file)
|
||||||
|
@ -713,8 +713,7 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur
|
|||||||
navigationController.pushViewController(checkoutController)
|
navigationController.pushViewController(checkoutController)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//TODO:localize
|
present(textAlertController(context: context, updatedPresentationData: updatedPresentationData, title: nil, text: presentationData.strings.Chat_ErrorInvoiceNotFound, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil)
|
||||||
present(textAlertController(context: context, updatedPresentationData: updatedPresentationData, title: nil, text: "Invoice not found", actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -727,10 +727,9 @@ private func settingsItems(data: PeerInfoScreenData?, context: AccountContext, p
|
|||||||
interaction.openSettings(.rememberPassword)
|
interaction.openSettings(.rememberPassword)
|
||||||
}))
|
}))
|
||||||
} else if settings.suggestPasswordSetup {
|
} else if settings.suggestPasswordSetup {
|
||||||
//TODO:localize
|
items[.phone]!.append(PeerInfoScreenInfoItem(id: 0, title: presentationData.strings.Settings_SuggestSetupPasswordTitle, text: .markdown(presentationData.strings.Settings_SuggestSetupPasswordText), linkAction: { _ in
|
||||||
items[.phone]!.append(PeerInfoScreenInfoItem(id: 0, title: "Protect Your Account", text: .markdown("Set a password that will be required each time log in with this phone number."), linkAction: { _ in
|
|
||||||
}))
|
}))
|
||||||
items[.phone]!.append(PeerInfoScreenActionItem(id: 2, text: "Set Additional Password", action: {
|
items[.phone]!.append(PeerInfoScreenActionItem(id: 2, text: presentationData.strings.Settings_SuggestSetupPasswordAction, action: {
|
||||||
interaction.openSettings(.passwordSetup)
|
interaction.openSettings(.passwordSetup)
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user