diff --git a/Telegram/NotificationService/Sources/NotificationService.swift b/Telegram/NotificationService/Sources/NotificationService.swift index 20e71ee2d6..2280f1661c 100644 --- a/Telegram/NotificationService/Sources/NotificationService.swift +++ b/Telegram/NotificationService/Sources/NotificationService.swift @@ -1158,32 +1158,14 @@ private final class NotificationServiceHandler { } let _ = messageId - - /*if (peerId != 0 && messageId != 0 && parsedAttachment != nil && attachmentData != nil) { - userInfo[@"peerId"] = @(peerId); - userInfo[@"messageId.namespace"] = @(0); - userInfo[@"messageId.id"] = @(messageId); - - userInfo[@"media"] = [attachmentData base64EncodedStringWithOptions:0]; - - if (isExpandableMedia) { - if ([categoryString isEqualToString:@"r"]) { - _bestAttemptContent.categoryIdentifier = @"withReplyMedia"; - } else if ([categoryString isEqualToString:@"m"]) { - _bestAttemptContent.categoryIdentifier = @"withMuteMedia"; - } - } - }*/ } - /*if (accountInfos.accounts.count > 1) { - if (_bestAttemptContent.title.length != 0 && account.peerName.length != 0) { - _bestAttemptContent.title = [NSString stringWithFormat:@"%@ → %@", _bestAttemptContent.title, account.peerName]; - } - }*/ - if let storyId { - content.category = "st" + if content.category == "t" { + content.category = "str" + } else { + content.category = "st" + } action = .pollStories(peerId: peerId, content: content, storyId: storyId) } else { action = .poll(peerId: peerId, content: content, messageId: messageIdValue) diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index a63185d3cb..c68b778c91 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -267,11 +267,11 @@ "PUSH_MESSAGE_STORY" = "%1$@|shared a story with you"; "PUSH_MESSAGE_STORY_MENTION" = "%1$@|mentioned you in a story"; "PUSH_CHANNEL_MESSAGE_STORY" = "%1$@|shared a story"; +"PUSH_CHAT_MESSAGE_STORY" = "%2$@|%1$@ shared a story to the group"; "PUSH_REACT_HIDDEN" = "New reaction to your message"; "PUSH_REACT_STORY" = "%1$@|%2$@ to your story"; "PUSH_REACT_STORY_HIDDEN" = "New reaction to your story"; -"PUSH_CHAT_REACT_STORY" = "%2$@|%1$@ %3$@ to your story"; "LOCAL_MESSAGE_FWDS" = "%1$@ forwarded you %2$d messages"; "LOCAL_CHANNEL_MESSAGE_FWDS" = "%1$@ posted %2$d forwarded messages"; @@ -11910,3 +11910,94 @@ Sorry for the inconvenience."; "Conversation.ViewEmojis" = "VIEW EMOJIS"; "MediaEditor.StickersTooMuch" = "Sorry, you've reached the maximum number of stickers in this set. Try a different one."; + +"ChatList.ChannelsSection" = "Channels"; +"ChatList.Search.FilterChannels" = "Channels"; +"ChatList.Search.SectionRecommendedChannels" = "RECOMMENDED CHANNELS"; +"ChatList.Search.SectionLocalChannels" = "CHANNELS YOU JOINED"; +"ChatList.Search.SectionActionShowLess" = "Show Less"; +"ChatList.Search.SectionActionShowMore" = "Show More"; +"ChatList.Search.RecommendedChannelsEmpty.Title" = "No Channels Yet..."; +"ChatList.Search.RecommendedChannelsEmpty.Text" = "You are not currently subscribed to any channel."; + +"Notifications.Reactions" = "Reactions"; +"Notifications.Reactions.SubtitleStories" = "Stories"; +"Notifications.Reactions.SubtitleMessages" = "Messages"; + +"Notifications.Stories.SettingsHeader" = "NOTIFY ME ABOUT..."; +"Notifications.Stories.GlobalSetting" = "New Stories"; +"Notifications.Stories.Important" = "Important Stories"; +"Notifications.Stories.DisplayName" = "Show Sender's Name"; + +"Notifications.Reactions.Title" = "Reactions"; +"Notifications.Reactions.SettingsHeader" = "NOTIFY ME ABOUT..."; +"Notifications.Reactions.SubtitleContacts" = "From My Contacts"; +"Notifications.Reactions.SubtitleEveryone" = "From Everyone"; +"Notifications.Reactions.ItemMessages" = "Reactions to my Messages"; +"Notifications.Reactions.ItemStories" = "Reactions to my Stories"; +"Notifications.Reactions.SheetTitleMessages" = "Notify about reactions to my messages from"; +"Notifications.Reactions.SheetTitleStories" = "Notify about reactions to my stories from"; +"Notifications.Reactions.SheetValueEveryone" = "Everyone"; +"Notifications.Reactions.SheetValueContacts" = "My Contacts"; + +"PeerInfo.AllowedReactions.MaxCountSectionTitle" = "MAXIMUM REACTIONS PER POST"; +"PeerInfo.AllowedReactions.MaxCountSectionFooter" = "Limit the number of different reactions that can be added to a post, including already published posts."; +"PeerInfo.AllowedReactions.MaxCountValue_1" = "1 reaction"; +"PeerInfo.AllowedReactions.MaxCountValue_any" = "%d reactions"; + +"PeerInfo.PaneArchivedStories" = "Archived Posts"; + +"StoryList.ItemAction.Archive" = "Archive"; +"StoryList.ItemAction.Unarchive" = "Unarchive"; +"StoryList.ItemAction.Pin" = "Pin"; +"StoryList.ItemAction.Unpin" = "Unpin"; +"StoryList.ItemAction.Forward" = "Forward"; +"StoryList.ItemAction.Edit" = "Edit"; +"StoryList.ItemAction.Delete" = "Delete"; +"StoryList.ToastUnarchived.Text_1" = "Story unarchived."; +"StoryList.ToastUnarchived.Text_any" = "%d stories unarchived."; +"StoryList.ToastArchived.Text_1" = "Story archived."; +"StoryList.ToastArchived.Text_any" = "%d stories archived."; +"StoryList.ToastPinLimit.Text_1" = "You can't pin more than 1 post."; +"StoryList.ToastPinLimit.Text_any" = "You can't pin more than %d posts."; +"StoryList.ToastUnpinned.Text_1" = "Story unpinned."; +"StoryList.ToastUnpinned.Text_any" = "%d stories unpinned."; +"StoryList.ToastPinned.Title_1" = "Story pinned"; +"StoryList.ToastPinned.Title_any" = "%d stories pinned"; +"StoryList.ToastPinned.Text_1" = "Now it will always be shown on the top."; +"StoryList.ToastPinned.Text_any" = "Now they will always be shown on the top."; +"StoryList.DeleteConfirmation.Title_1" = "Delete 1 story?"; +"StoryList.DeleteConfirmation.Title_any" = "Delete %d stories?"; +"StoryList.DeleteConfirmation.Action" = "Delete"; +"StoryList.ActionPanel.Pin" = "Pin"; +"StoryList.ActionPanel.Unpin" = "Unpin"; +"StoryList.ActionPanel.Archive" = "Archive"; +"StoryList.ActionPanel.Unarchive" = "Unarchive"; +"StoryList.ActionPanel.Delete" = "Delete"; + +"Settings.MyProfile" = "My Profile"; + +"MyProfile.UsernameActionEdit" = "Edit Username"; +"MyProfile.UsernameActionCopy" = "Copy Username"; +"MyProfile.BioActionEdit" = "Edit Bio"; +"MyProfile.BioActionCopy" = "Copy Bio"; +"MyProfile.ToastBioCopied" = "Bio copied to clipboard."; +"MyProfile.HoursActionEdit" = "Edit Hours"; +"MyProfile.HoursActionCopy" = "Copy Hours"; +"MyProfile.HoursActionRemove" = "Remove"; +"MyProfile.HoursRemoveConfirmation.Title" = "Are you sure you want to remove business hours?"; +"MyProfile.HoursRemoveConfirmation.Action" = "Remove"; +"MyProfile.ToastHoursCopied" = "Hours copied to clipboard."; +"MyProfile.LocationActionOpen" = "Open in Maps"; +"MyProfile.LocationActionEdit" = "Edit Location"; +"MyProfile.LocationActionCopy" = "Copy Address"; +"MyProfile.LocationActionRemove" = "Remove"; +"MyProfile.LocationRemoveConfirmation.Title" = "Are you sure you want to remove location?"; +"MyProfile.LocationRemoveConfirmation.Action" = "Remove"; +"MyProfile.ToastLocationCopied" = "Location copied to clipboard."; +"MyProfile.BirthdayActionEdit" = "Edit Birthday"; +"MyProfile.BirthdayActionCopy" = "Copy"; +"MyProfile.ToastBirthdayCopied" = "Birthday copied to clipboard."; +"MyProfile.PhoneActionEdit" = "Change Number"; +"MyProfile.PhoneActionCopy" = "Copy Number"; +"MyProfile.ToastPhoneCopied" = "Birthday copied to clipboard."; diff --git a/submodules/ChatListSearchItemHeader/Sources/ChatListSearchItemHeader.swift b/submodules/ChatListSearchItemHeader/Sources/ChatListSearchItemHeader.swift index 4c84542b3b..0fbfa73e98 100644 --- a/submodules/ChatListSearchItemHeader/Sources/ChatListSearchItemHeader.swift +++ b/submodules/ChatListSearchItemHeader/Sources/ChatListSearchItemHeader.swift @@ -64,8 +64,7 @@ public enum ChatListSearchItemHeaderType { case .chats: return strings.Cache_ByPeerHeader case .channels: - //TODO:localize - return "Channels" + return strings.ChatList_ChannelsSection case .chatTypes: return strings.ChatList_ChatTypesSection case .faq: diff --git a/submodules/ChatListUI/Sources/ChatListSearchFiltersContainerNode.swift b/submodules/ChatListUI/Sources/ChatListSearchFiltersContainerNode.swift index c177cf78c1..5a49592739 100644 --- a/submodules/ChatListUI/Sources/ChatListSearchFiltersContainerNode.swift +++ b/submodules/ChatListUI/Sources/ChatListSearchFiltersContainerNode.swift @@ -85,8 +85,7 @@ private final class ItemNode: ASDisplayNode { title = presentationData.strings.ChatList_Search_FilterChats icon = nil case .channels: - //TODO:localize - title = "Channels" + title = presentationData.strings.ChatList_Search_FilterChannels icon = nil case .media: title = presentationData.strings.ChatList_Search_FilterMedia diff --git a/submodules/ChatListUI/Sources/ChatListSearchListPaneNode.swift b/submodules/ChatListUI/Sources/ChatListSearchListPaneNode.swift index 336cc44417..3e197aa17b 100644 --- a/submodules/ChatListUI/Sources/ChatListSearchListPaneNode.swift +++ b/submodules/ChatListUI/Sources/ChatListSearchListPaneNode.swift @@ -238,11 +238,9 @@ private enum ChatListRecentEntry: Comparable, Identifiable { let header: ChatListSearchItemHeader? if case .channels = key { if case .recommendedChannels = section { - //TODO:localize - header = ChatListSearchItemHeader(type: .text("RECOMMENDED CHANNELS", 1), theme: theme, strings: strings) + header = ChatListSearchItemHeader(type: .text(presentationData.strings.ChatList_Search_SectionRecommendedChannels, 1), theme: theme, strings: strings) } else { - //TODO:localize - header = ChatListSearchItemHeader(type: .text("CHANNELS YOU JOINED", 0), theme: theme, strings: strings, actionTitle: isChannelsTabExpanded ? "Show less" : "Show more", action: { + header = ChatListSearchItemHeader(type: .text(presentationData.strings.ChatList_Search_SectionLocalChannels, 0), theme: theme, strings: strings, actionTitle: isChannelsTabExpanded ? presentationData.strings.ChatList_Search_SectionActionShowLess : presentationData.strings.ChatList_Search_SectionActionShowMore, action: { toggleChannelsTabExpanded() }) } @@ -1273,10 +1271,9 @@ final class ChatListSearchListPaneNode: ASDisplayNode, ChatListSearchPaneNode { self.emptyResultsAnimationNode.isHidden = true if key == .channels { - //TODO:localize let emptyRecentTitleNode = ImmediateTextNode() emptyRecentTitleNode.displaysAsynchronously = false - emptyRecentTitleNode.attributedText = NSAttributedString(string: "No Channels Yet...", font: Font.semibold(17.0), textColor: self.presentationData.theme.list.freeTextColor) + emptyRecentTitleNode.attributedText = NSAttributedString(string: presentationData.strings.ChatList_Search_RecommendedChannelsEmpty_Title, font: Font.semibold(17.0), textColor: self.presentationData.theme.list.freeTextColor) emptyRecentTitleNode.textAlignment = .center emptyRecentTitleNode.isHidden = true self.emptyRecentTitleNode = emptyRecentTitleNode @@ -1286,7 +1283,7 @@ final class ChatListSearchListPaneNode: ASDisplayNode, ChatListSearchPaneNode { emptyRecentTextNode.maximumNumberOfLines = 0 emptyRecentTextNode.textAlignment = .center emptyRecentTextNode.isHidden = true - emptyRecentTextNode.attributedText = NSAttributedString(string: "You are not currently subscribed to any channel.", font: Font.regular(15.0), textColor: presentationData.theme.list.freeTextColor) + emptyRecentTextNode.attributedText = NSAttributedString(string: presentationData.strings.ChatList_Search_RecommendedChannelsEmpty_Text, font: Font.regular(15.0), textColor: presentationData.theme.list.freeTextColor) self.emptyRecentTextNode = emptyRecentTextNode let emptyRecentAnimationNode = DefaultAnimatedStickerNodeImpl() diff --git a/submodules/SettingsUI/Sources/Notifications/NotificationsAndSoundsController.swift b/submodules/SettingsUI/Sources/Notifications/NotificationsAndSoundsController.swift index 290afde096..fe492cc6af 100644 --- a/submodules/SettingsUI/Sources/Notifications/NotificationsAndSoundsController.swift +++ b/submodules/SettingsUI/Sources/Notifications/NotificationsAndSoundsController.swift @@ -579,7 +579,6 @@ private func notificationsAndSoundsEntries(authorizationStatus: AccessType, warn entries.append(.stories(presentationData.theme, presentationData.strings.Notifications_Stories, !exceptions.stories.isEmpty ? presentationData.strings.Notifications_CategoryExceptions(Int32(exceptions.stories.peerIds.count)) : "", storiesValue)) - //TODO:localize var reactionsValue: String = "" var hasReactionNotifications = false switch globalSettings.reactionSettings.messages { @@ -590,7 +589,7 @@ private func notificationsAndSoundsEntries(authorizationStatus: AccessType, warn reactionsValue.append(", ") } hasReactionNotifications = true - reactionsValue.append("Messages") + reactionsValue.append(presentationData.strings.Notifications_Reactions_SubtitleMessages) } switch globalSettings.reactionSettings.stories { case .nobody: @@ -600,9 +599,9 @@ private func notificationsAndSoundsEntries(authorizationStatus: AccessType, warn reactionsValue.append(", ") } hasReactionNotifications = true - reactionsValue.append("Stories") + reactionsValue.append(presentationData.strings.Notifications_Reactions_SubtitleStories) } - entries.append(.reactions(presentationData.theme, "Reactions", reactionsValue, hasReactionNotifications ? "On" : "Off")) + entries.append(.reactions(presentationData.theme, presentationData.strings.Notifications_Reactions, reactionsValue, hasReactionNotifications ? presentationData.strings.Notifications_On : presentationData.strings.Notifications_Off)) entries.append(.inAppHeader(presentationData.theme, presentationData.strings.Notifications_InAppNotifications.uppercased())) entries.append(.inAppSounds(presentationData.theme, presentationData.strings.Notifications_InAppNotificationsSounds, inAppSettings.playSounds)) diff --git a/submodules/SettingsUI/Sources/NotificationsPeerCategoryController.swift b/submodules/SettingsUI/Sources/NotificationsPeerCategoryController.swift index 3ac514aa21..dda03df3b3 100644 --- a/submodules/SettingsUI/Sources/NotificationsPeerCategoryController.swift +++ b/submodules/SettingsUI/Sources/NotificationsPeerCategoryController.swift @@ -344,8 +344,7 @@ private func notificationsPeerCategoryEntries(category: NotificationsPeerCategor } if case .stories = category { - //TODO:localize - entries.append(.enableHeader("NOTIFY ME ABOUT...")) + entries.append(.enableHeader(presentationData.strings.Notifications_Stories_SettingsHeader)) var allEnabled = false var importantEnabled = false @@ -362,16 +361,16 @@ private func notificationsPeerCategoryEntries(category: NotificationsPeerCategor importantEnabled = true } - entries.append(.enable(presentationData.theme, "New Stories", allEnabled)) + entries.append(.enable(presentationData.theme, presentationData.strings.Notifications_Stories_GlobalSetting, allEnabled)) if !allEnabled { - entries.append(.enableImportant(presentationData.theme, "Important Stories", importantEnabled)) + entries.append(.enableImportant(presentationData.theme, presentationData.strings.Notifications_Stories_Important, importantEnabled)) entries.append(.importantInfo(presentationData.theme, presentationData.strings.NotificationSettings_Stories_ShowImportantFooter)) } if notificationSettings.enabled || !notificationExceptions.isEmpty { entries.append(.optionsHeader(presentationData.theme, presentationData.strings.Notifications_Options.uppercased())) - entries.append(.previews(presentationData.theme, "Show Sender's Name", notificationSettings.storySettings.hideSender != .hide)) + entries.append(.previews(presentationData.theme, presentationData.strings.Notifications_Stories_DisplayName, notificationSettings.storySettings.hideSender != .hide)) entries.append(.sound(presentationData.theme, presentationData.strings.Notifications_MessageNotificationsSound, localizedPeerNotificationSoundString(strings: presentationData.strings, notificationSoundList: notificationSoundList, sound: filteredGlobalSound(notificationSettings.storySettings.sound)), filteredGlobalSound(notificationSettings.storySettings.sound))) } } else { diff --git a/submodules/SettingsUI/Sources/ReactionNotificationSettingsController.swift b/submodules/SettingsUI/Sources/ReactionNotificationSettingsController.swift index 1e5fbe6aa9..4e48dfb494 100644 --- a/submodules/SettingsUI/Sources/ReactionNotificationSettingsController.swift +++ b/submodules/SettingsUI/Sources/ReactionNotificationSettingsController.swift @@ -206,8 +206,7 @@ private func reactionNotificationSettingsEntries( ) -> [ReactionNotificationSettingsEntry] { var entries: [ReactionNotificationSettingsEntry] = [] - //TODO:localize - entries.append(.categoriesHeader("NOTIFY ME ABOUT...")) + entries.append(.categoriesHeader(presentationData.strings.Notifications_Reactions_SettingsHeader)) let messagesText: String? let messagesValue: Bool @@ -216,10 +215,10 @@ private func reactionNotificationSettingsEntries( messagesText = nil messagesValue = false case .contacts: - messagesText = "From My Contacts" + messagesText = presentationData.strings.Notifications_Reactions_SubtitleContacts messagesValue = true case .everyone: - messagesText = "From Everyone" + messagesText = presentationData.strings.Notifications_Reactions_SubtitleEveryone messagesValue = true } @@ -230,21 +229,20 @@ private func reactionNotificationSettingsEntries( storiesText = nil storiesValue = false case .contacts: - storiesText = "From My Contacts" + storiesText = presentationData.strings.Notifications_Reactions_SubtitleContacts storiesValue = true case .everyone: - storiesText = "From Everyone" + storiesText = presentationData.strings.Notifications_Reactions_SubtitleEveryone storiesValue = true } - entries.append(.messages(title: "Reactions to my Messages", text: messagesText, value: messagesValue)) - entries.append(.stories(title: "Reactions to my Stories", text: storiesText, value: storiesValue)) + entries.append(.messages(title: presentationData.strings.Notifications_Reactions_ItemMessages, text: messagesText, value: messagesValue)) + entries.append(.stories(title: presentationData.strings.Notifications_Reactions_ItemStories, text: storiesText, value: storiesValue)) if messagesValue || storiesValue { entries.append(.optionsHeader(presentationData.strings.Notifications_Options.uppercased())) - //TODO:localize - entries.append(.previews("Show Sender's Name", globalSettings.reactionSettings.hideSender != .hide)) + entries.append(.previews(presentationData.strings.Notifications_Stories_DisplayName, globalSettings.reactionSettings.hideSender != .hide)) entries.append(.sound(presentationData.strings.Notifications_MessageNotificationsSound, localizedPeerNotificationSoundString(strings: presentationData.strings, notificationSoundList: notificationSoundList, sound: filteredGlobalSound(globalSettings.reactionSettings.sound)), filteredGlobalSound(globalSettings.reactionSettings.sound))) } @@ -274,19 +272,19 @@ public func reactionNotificationSettingsController( let _ = updateState let openCategory: (Bool) -> Void = { isMessages in - //TODO:localize + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + let text: String if isMessages { - text = "Notify about reactions to my messages from" + text = presentationData.strings.Notifications_Reactions_SheetTitleMessages } else { - text = "Notify about reactions to my stories from" + text = presentationData.strings.Notifications_Reactions_SheetTitleStories } - let presentationData = context.sharedContext.currentPresentationData.with { $0 } let actionSheet = ActionSheetController(presentationData: presentationData) actionSheet.setItemGroups([ActionSheetItemGroup(items: [ ActionSheetTextItem(title: text), - ActionSheetButtonItem(title: "Everyone", color: .accent, action: { [weak actionSheet] in + ActionSheetButtonItem(title: presentationData.strings.Notifications_Reactions_SheetValueEveryone, color: .accent, action: { [weak actionSheet] in actionSheet?.dismissAnimated() let _ = updateGlobalNotificationSettingsInteractively(postbox: context.account.postbox, { settings in @@ -299,7 +297,7 @@ public func reactionNotificationSettingsController( return settings }).start() }), - ActionSheetButtonItem(title: "My Contacts", color: .accent, action: { [weak actionSheet] in + ActionSheetButtonItem(title: presentationData.strings.Notifications_Reactions_SheetValueContacts, color: .accent, action: { [weak actionSheet] in actionSheet?.dismissAnimated() let _ = updateGlobalNotificationSettingsInteractively(postbox: context.account.postbox, { settings in @@ -398,8 +396,7 @@ public func reactionNotificationSettingsController( leftNavigationButton = nil rightNavigationButton = nil - //TODO:localize - let title: String = "Reactions" + let title: String = presentationData.strings.Notifications_Reactions_Title let controllerState = ItemListControllerState(presentationData: ItemListPresentationData(presentationData), title: .text(title), leftNavigationButton: leftNavigationButton, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: true) let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: entries, style: .blocks) diff --git a/submodules/TelegramUI/Components/PeerAllowedReactionsScreen/Sources/PeerAllowedReactionsScreen.swift b/submodules/TelegramUI/Components/PeerAllowedReactionsScreen/Sources/PeerAllowedReactionsScreen.swift index b3ae006ee1..8aed2517b5 100644 --- a/submodules/TelegramUI/Components/PeerAllowedReactionsScreen/Sources/PeerAllowedReactionsScreen.swift +++ b/submodules/TelegramUI/Components/PeerAllowedReactionsScreen/Sources/PeerAllowedReactionsScreen.swift @@ -797,20 +797,14 @@ final class PeerAllowedReactionsScreenComponent: Component { let reactionCountValueList = (1 ... 11).map { i -> String in return "\(i)" } - //TODO:localize - let sliderTitle: String - if self.allowedReactionCount == 1 { - sliderTitle = "1 reaction" - } else { - sliderTitle = "\(self.allowedReactionCount) reactions" - } + let sliderTitle: String = environment.strings.PeerInfo_AllowedReactions_MaxCountValue(Int32(self.allowedReactionCount)) let reactionCountSectionSize = reactionCountSection.update( transition: transition, component: AnyComponent(ListSectionComponent( theme: environment.theme, header: AnyComponent(MultilineTextComponent( text: .plain(NSAttributedString( - string: "MAXIMUM REACTIONS PER POST", + string: environment.strings.PeerInfo_AllowedReactions_MaxCountSectionTitle, font: Font.regular(13.0), textColor: environment.theme.list.freeTextColor )), @@ -818,7 +812,7 @@ final class PeerAllowedReactionsScreenComponent: Component { )), footer: AnyComponent(MultilineTextComponent( text: .plain(NSAttributedString( - string: "Limit the number of different reactions that can be added to a post, including already published posts.", + string: environment.strings.PeerInfo_AllowedReactions_MaxCountSectionFooter, font: Font.regular(13.0), textColor: environment.theme.list.freeTextColor )), diff --git a/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoPaneContainerNode.swift b/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoPaneContainerNode.swift index 08f2ddfbe7..9e57b3cc6d 100644 --- a/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoPaneContainerNode.swift +++ b/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoPaneContainerNode.swift @@ -58,17 +58,6 @@ final class PeerInfoPaneTabsContainerPaneNode: ASDisplayNode { self.addSubnode(self.buttonNode) self.buttonNode.addTarget(self, action: #selector(self.buttonPressed), forControlEvents: .touchUpInside) - /*self.buttonNode.highligthedChanged = { [weak self] highlighted in - if let strongSelf = self { - if highlighted && !strongSelf.isSelected { - strongSelf.titleNode.layer.removeAnimation(forKey: "opacity") - strongSelf.titleNode.alpha = 0.4 - } else { - strongSelf.titleNode.alpha = 1.0 - strongSelf.titleNode.layer.animateAlpha(from: 0.4, to: 1.0, duration: 0.2) - } - } - }*/ } @objc private func buttonPressed() { @@ -1033,7 +1022,6 @@ final class PeerInfoPaneContainerNode: ASDisplayNode, ASGestureRecognizerDelegat if let availablePanes = data?.availablePanes, let currentPaneKey = strongSelf.currentPaneKey, let currentIndex = availablePanes.firstIndex(of: currentPaneKey), let paneIndex = availablePanes.firstIndex(of: key), abs(paneIndex - currentIndex) <= 1 { } else { if let pane = strongSelf.currentPanes.removeValue(forKey: key) { - //print("remove \(key)") pane.node.removeFromSupernode() } } @@ -1097,8 +1085,7 @@ final class PeerInfoPaneContainerNode: ASDisplayNode, ASGestureRecognizerDelegat case .stories: title = presentationData.strings.PeerInfo_PaneStories case .storyArchive: - //TODO:localize - title = "Archived Posts" + title = presentationData.strings.PeerInfo_PaneArchivedStories case .media: title = presentationData.strings.PeerInfo_PaneMedia case .files: diff --git a/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoScreen.swift b/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoScreen.swift index 7940495814..de0cd0c267 100644 --- a/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoScreen.swift +++ b/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoScreen.swift @@ -874,8 +874,7 @@ private func settingsItems(data: PeerInfoScreenData?, context: AccountContext, p })) } - //TODO:localize - items[.myProfile]!.append(PeerInfoScreenDisclosureItem(id: 0, text: "My Profile", icon: PresentationResourcesSettings.myProfile, action: { + items[.myProfile]!.append(PeerInfoScreenDisclosureItem(id: 0, text: presentationData.strings.Settings_MyProfile, icon: PresentationResourcesSettings.myProfile, action: { interaction.openSettings(.profile) })) @@ -6940,14 +6939,13 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro } UIPasteboard.general.string = "@\(username)" - //TODO:localize - self.controller?.present(UndoOverlayController(presentationData: self.presentationData, content: .copy(text: "Username copied"), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current) + self.controller?.present(UndoOverlayController(presentationData: self.presentationData, content: .copy(text: self.presentationData.strings.Conversation_UsernameCopied), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current) } var items: [ContextMenuItem] = [] if self.isMyProfile { - items.append(.action(ContextMenuActionItem(text: "Edit Username", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in + items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_UsernameActionEdit, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in c.dismiss { guard let self else { return @@ -6957,8 +6955,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro }))) } - //TODO:localize - items.append(.action(ContextMenuActionItem(text: "Copy Username", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in + items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_UsernameActionCopy, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in c.dismiss { copyAction() } @@ -6997,15 +6994,13 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro } UIPasteboard.general.string = bioText - //TODO:localize - self.controller?.present(UndoOverlayController(presentationData: self.presentationData, content: .copy(text: "Bio copied"), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current) + self.controller?.present(UndoOverlayController(presentationData: self.presentationData, content: .copy(text: self.presentationData.strings.MyProfile_ToastBioCopied), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current) } var items: [ContextMenuItem] = [] if self.isMyProfile { - //TODO:localize - items.append(.action(ContextMenuActionItem(text: "Edit Bio", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in + items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_BioActionEdit, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in c.dismiss { guard let self else { return @@ -7026,8 +7021,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro }))) } - //TODO:localize - items.append(.action(ContextMenuActionItem(text: "Copy Bio", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in + items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_BioActionCopy, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in c.dismiss { copyAction() } @@ -7062,15 +7056,13 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro } UIPasteboard.general.string = businessHoursTextToCopy(businessHours: businessHours, presentationData: self.presentationData, displayLocalTimezone: false) - //TODO:localize - self.controller?.present(UndoOverlayController(presentationData: self.presentationData, content: .copy(text: "Working hours copied."), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current) + self.controller?.present(UndoOverlayController(presentationData: self.presentationData, content: .copy(text: self.presentationData.strings.MyProfile_ToastHoursCopied), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current) } var items: [ContextMenuItem] = [] if self.isMyProfile { - //TODO:localize - items.append(.action(ContextMenuActionItem(text: "Edit Hours", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in + items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_HoursActionEdit, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in c.dismiss { guard let self else { return @@ -7081,26 +7073,29 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro }))) } - //TODO:localize - items.append(.action(ContextMenuActionItem(text: "Copy Hours", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in + items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_HoursActionCopy, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in c.dismiss { copyAction() } }))) if self.isMyProfile { - //TODO:localize - items.append(.action(ContextMenuActionItem(text: "Remove", textColor: .destructive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.contextMenu.destructiveColor) }, action: { [weak self] c, _ in + items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_HoursActionRemove, textColor: .destructive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.contextMenu.destructiveColor) }, action: { [weak self] c, _ + in + guard let self else { + return + } + var subItems: [ContextMenuItem] = [] let noAction: ((ContextMenuActionItem.Action) -> Void)? = nil subItems.append(.action(ContextMenuActionItem( - text: "Are you sure you want to remove business hours?", + text: self.presentationData.strings.MyProfile_HoursRemoveConfirmation_Title, textLayout: .multiline, textFont: .small, icon: { _ in nil }, action: noAction ))) - subItems.append(.action(ContextMenuActionItem(text: "Remove", textColor: .destructive, icon: { _ in nil }, action: { [weak self] c, _ in + subItems.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_HoursRemoveConfirmation_Action, textColor: .destructive, icon: { _ in nil }, action: { [weak self] c, _ in c.dismiss { guard let self else { return @@ -7141,15 +7136,13 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro } UIPasteboard.general.string = businessLocation.address - //TODO:localize - self.controller?.present(UndoOverlayController(presentationData: self.presentationData, content: .copy(text: "Working hours copied."), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current) + self.controller?.present(UndoOverlayController(presentationData: self.presentationData, content: .copy(text: self.presentationData.strings.MyProfile_ToastLocationCopied), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current) } var items: [ContextMenuItem] = [] if businessLocation.coordinates != nil { - //TODO:localize - items.append(.action(ContextMenuActionItem(text: "Open in Maps", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Media Editor/LocationSmall"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in + items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_LocationActionOpen, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Media Editor/LocationSmall"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in c.dismiss(completion: { guard let self else { return @@ -7160,8 +7153,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro } if !businessLocation.address.isEmpty { - //TODO:localize - items.append(.action(ContextMenuActionItem(text: "Copy Address", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in + items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_LocationActionCopy, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in c.dismiss { copyAction() } @@ -7169,8 +7161,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro } if self.isMyProfile { - //TODO:localize - items.append(.action(ContextMenuActionItem(text: "Edit Location", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in + items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_LocationActionEdit, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in c.dismiss { guard let self else { return @@ -7180,18 +7171,21 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro } }))) - //TODO:localize - items.append(.action(ContextMenuActionItem(text: "Remove", textColor: .destructive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.contextMenu.destructiveColor) }, action: { [weak self] c, _ in + items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_LocationActionRemove, textColor: .destructive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.contextMenu.destructiveColor) }, action: { [weak self] c, _ in + guard let self else { + return + } + var subItems: [ContextMenuItem] = [] let noAction: ((ContextMenuActionItem.Action) -> Void)? = nil subItems.append(.action(ContextMenuActionItem( - text: "Are you sure you want to remove location?", + text: self.presentationData.strings.MyProfile_LocationRemoveConfirmation_Title, textLayout: .multiline, textFont: .small, icon: { _ in nil }, action: noAction ))) - subItems.append(.action(ContextMenuActionItem(text: "Remove", textColor: .destructive, icon: { _ in nil }, action: { [weak self] c, _ in + subItems.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_LocationRemoveConfirmation_Action, textColor: .destructive, icon: { _ in nil }, action: { [weak self] c, _ in c.dismiss { guard let self else { return @@ -7235,15 +7229,13 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro UIPasteboard.general.string = text - //TODO:localize - self.controller?.present(UndoOverlayController(presentationData: self.presentationData, content: .copy(text: "Birthday copied."), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current) + self.controller?.present(UndoOverlayController(presentationData: self.presentationData, content: .copy(text: self.presentationData.strings.MyProfile_ToastBirthdayCopied), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current) } var items: [ContextMenuItem] = [] if self.isMyProfile { - //TODO:localize - items.append(.action(ContextMenuActionItem(text: "Edit Birthday", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in + items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_BirthdayActionEdit, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in c.dismiss { guard let self else { return @@ -7255,8 +7247,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro }))) } - //TODO:localize - items.append(.action(ContextMenuActionItem(text: "Copy", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in + items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.MyProfile_BirthdayActionCopy, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in c.dismiss { copyAction() } @@ -7343,8 +7334,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro var items: [ContextMenuItem] = [] if strongSelf.isMyProfile { - //TODO:localize - items.append(.action(ContextMenuActionItem(text: "Change Number", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in + items.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.MyProfile_PhoneActionEdit, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in c.dismiss { guard let self else { return @@ -7378,8 +7368,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro } else { isAnonymousNumber = true } - //TODO:localize - items.append(.action(ContextMenuActionItem(text: "Copy Number", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in + items.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.MyProfile_PhoneActionCopy, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in c.dismiss { copyAction() } @@ -7398,9 +7387,8 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro } else { isAnonymousNumber = true } - //TODO:localize items.append( - .action(ContextMenuActionItem(text: "Copy Number", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in + .action(ContextMenuActionItem(text: strongSelf.presentationData.strings.MyProfile_PhoneActionCopy, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in c.dismiss { copyAction() } diff --git a/submodules/TelegramUI/Components/PeerInfo/PeerInfoVisualMediaPaneNode/Sources/PeerInfoStoryPaneNode.swift b/submodules/TelegramUI/Components/PeerInfo/PeerInfoVisualMediaPaneNode/Sources/PeerInfoStoryPaneNode.swift index f5ddb1cdd9..a0f7854d50 100644 --- a/submodules/TelegramUI/Components/PeerInfo/PeerInfoVisualMediaPaneNode/Sources/PeerInfoStoryPaneNode.swift +++ b/submodules/TelegramUI/Components/PeerInfo/PeerInfoVisualMediaPaneNode/Sources/PeerInfoStoryPaneNode.swift @@ -1798,10 +1798,8 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr var items: [ContextMenuItem] = [] - //TODO:localize - if canManage { - items.append(.action(ContextMenuActionItem(text: !self.isArchive ? "Archive" : "Unarchive", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: self.isArchive ? "Chat/Context Menu/Archive" : "Chat/Context Menu/Unarchive"), color: theme.contextMenu.primaryColor) }, action: { [weak self] _, f in + items.append(.action(ContextMenuActionItem(text: !self.isArchive ? self.presentationData.strings.StoryList_ItemAction_Archive : self.presentationData.strings.StoryList_ItemAction_Unarchive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: self.isArchive ? "Chat/Context Menu/Archive" : "Chat/Context Menu/Unarchive"), color: theme.contextMenu.primaryColor) }, action: { [weak self] _, f in guard let self else { f(.default) return @@ -1814,12 +1812,12 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr } let _ = self.context.engine.messages.updateStoriesArePinned(peerId: self.peerId, ids: [item.id: item], isPinned: self.isArchive ? true : false).startStandalone() - self.parentController?.present(UndoOverlayController(presentationData: presentationData, content: .actionSucceeded(title: nil, text: self.isArchive ? "Story unarchived." : "Story archived.", cancel: nil, destructive: false), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current) + self.parentController?.present(UndoOverlayController(presentationData: self.presentationData, content: .actionSucceeded(title: nil, text: self.isArchive ? self.presentationData.strings.StoryList_ToastUnarchived_Text(1) : self.presentationData.strings.StoryList_ToastArchived_Text(1), cancel: nil, destructive: false), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current) }))) if !self.isArchive { let isPinned = self.pinnedIds.contains(item.id) - items.append(.action(ContextMenuActionItem(text: isPinned ? "Unpin" : "Pin", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: isPinned ? "Chat/Context Menu/Unpin" : "Chat/Context Menu/Pin"), color: theme.contextMenu.primaryColor) }, action: { [weak self, weak itemLayer] _, f in + items.append(.action(ContextMenuActionItem(text: isPinned ? self.presentationData.strings.StoryList_ItemAction_Unpin : self.presentationData.strings.StoryList_ItemAction_Pin, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: isPinned ? "Chat/Context Menu/Unpin" : "Chat/Context Menu/Pin"), color: theme.contextMenu.primaryColor) }, action: { [weak self, weak itemLayer] _, f in itemLayer?.isHidden = false guard let self else { f(.default) @@ -1830,7 +1828,7 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr f(.default) let presentationData = self.presentationData - self.parentController?.present(UndoOverlayController(presentationData: presentationData, content: .info(title: nil, text: "You can't pin more than 3 posts.", timeout: nil, customUndoText: nil), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current) + self.parentController?.present(UndoOverlayController(presentationData: presentationData, content: .info(title: nil, text: presentationData.strings.StoryList_ToastPinLimit_Text(Int32(3)), timeout: nil, customUndoText: nil), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current) return } @@ -1845,23 +1843,22 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr } let _ = self.context.engine.messages.updatePinnedToTopStories(peerId: self.peerId, ids: Array(updatedPinnedIds)).startStandalone() - //TODO:localize let presentationData = self.presentationData let toastTitle: String? let toastText: String if isPinned { toastTitle = nil - toastText = "Story unpinned." + toastText = presentationData.strings.StoryList_ToastUnpinned_Text(1) } else { - toastTitle = "Story pinned" - toastText = "Now it will always be shown on the top." + toastTitle = presentationData.strings.StoryList_ToastPinned_Title(1) + toastText = presentationData.strings.StoryList_ToastPinned_Text(1) } self.parentController?.present(UndoOverlayController(presentationData: presentationData, content: .universal(animation: isPinned ? "anim_toastunpin" : "anim_toastpin", scale: 0.06, colors: [:], title: toastTitle, text: toastText, customUndoText: nil, timeout: 5), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current) }))) } - /*items.append(.action(ContextMenuActionItem(text: "Edit", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in + /*items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.StoryList_ItemAction_Edit, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Edit"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in c.dismiss(completion: { guard let self else { return @@ -1874,7 +1871,7 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr } if !item.isForwardingDisabled, case .everyone = item.privacy?.base { - items.append(.action(ContextMenuActionItem(text: "Forward", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Forward"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in + items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.StoryList_ItemAction_Forward, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Forward"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, _ in c.dismiss(completion: { guard let self else { return @@ -1916,7 +1913,7 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr } if canManage { - items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.Conversation_ContextMenuDelete, textColor: .destructive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.contextMenu.destructiveColor) }, action: { [weak self] c, _ in + items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.StoryList_ItemAction_Delete, textColor: .destructive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.contextMenu.destructiveColor) }, action: { [weak self] c, _ in c.dismiss(completion: { guard let self else { return @@ -2414,18 +2411,12 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr controller?.dismissAnimated() } - //TODO:localize - let title: String - if ids.count == 1 { - title = "Delete 1 story?" - } else { - title = "Delete \(ids.count) stories?" - } + let title: String = presentationData.strings.StoryList_DeleteConfirmation_Title(Int32(ids.count)) controller.setItemGroups([ ActionSheetItemGroup(items: [ ActionSheetTextItem(title: title), - ActionSheetButtonItem(title: "Delete", color: .destructive, action: { [weak self] in + ActionSheetButtonItem(title: presentationData.strings.StoryList_DeleteConfirmation_Action, color: .destructive, action: { [weak self] in dismissAction() guard let self else { @@ -2465,7 +2456,7 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr selectionItems.append(BottomActionsPanelComponent.Item( id: "pin-unpin", color: .accent, - title: actionIsPin ? "Pin" : "Unpin", + title: actionIsPin ? presentationData.strings.StoryList_ActionPanel_Pin : presentationData.strings.StoryList_ActionPanel_Unpin, isEnabled: !selectedIds.isEmpty, action: { [weak self] in guard let self, let selectedIds = self.itemInteraction.selectedIds else { @@ -2479,23 +2470,16 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr if updatedPinnedIds.count > 3 { let presentationData = self.presentationData let animationBackgroundColor = presentationData.theme.rootController.tabBar.backgroundColor - let toastText = "You can't pin more than 3 posts." + let toastText = presentationData.strings.StoryList_ToastPinLimit_Text(3) self.parentController?.present(UndoOverlayController(presentationData: presentationData, content: .universal(animation: "anim_infotip", scale: 1.0, colors: ["info1.info1.stroke": animationBackgroundColor, "info2.info2.Fill": animationBackgroundColor], title: nil, text: toastText, customUndoText: nil, timeout: 5), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current) } else { let _ = self.context.engine.messages.updatePinnedToTopStories(peerId: self.peerId, ids: Array(updatedPinnedIds)).startStandalone() - //TODO:localize let presentationData = self.presentationData - let toastTitle: String - let toastText: String - if selectedIds.count == 1 { - toastTitle = "Story Pinned" - toastText = "Now it will always be shown on the top." - } else { - toastTitle = "Stories Pinned" - toastText = "Now they will always be shown on the top." - } + let toastTitle = presentationData.strings.StoryList_ToastPinned_Title(Int32(selectedIds.count)) + let toastText = presentationData.strings.StoryList_ToastPinned_Text(Int32(selectedIds.count)) + self.parentController?.present(UndoOverlayController(presentationData: presentationData, content: .universal(animation: "anim_toastpin", scale: 0.06, colors: [:], title: toastTitle, text: toastText, customUndoText: nil, timeout: 5), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current) if let parentController = self.parentController as? PeerInfoScreen { @@ -2509,18 +2493,11 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr } let _ = self.context.engine.messages.updatePinnedToTopStories(peerId: self.peerId, ids: Array(updatedPinnedIds)).startStandalone() - //TODO:localize let presentationData = self.presentationData - let toastTitle: String? - let toastText: String - if selectedIds.count == 1 { - toastTitle = nil - toastText = "Story unpinned." - } else { - toastTitle = nil - toastText = "Stories unpinned." - } + let toastTitle: String? = nil + let toastText: String = presentationData.strings.StoryList_ToastUnpinned_Text(Int32(selectedIds.count)) + self.parentController?.present(UndoOverlayController(presentationData: presentationData, content: .universal(animation: "anim_toastunpin", scale: 0.06, colors: [:], title: toastTitle, text: toastText, customUndoText: nil, timeout: 5), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current) if let parentController = self.parentController as? PeerInfoScreen { @@ -2532,7 +2509,7 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr selectionItems.append(BottomActionsPanelComponent.Item( id: "archive", color: .accent, - title: self.isArchive ? "Unarchive" : "Archive", + title: self.isArchive ? presentationData.strings.StoryList_ActionPanel_Unarchive : presentationData.strings.StoryList_ActionPanel_Archive, isEnabled: !selectedIds.isEmpty, action: { [weak self] in guard let self, let _ = self.itemInteraction.selectedIds else { @@ -2549,17 +2526,9 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr let text: String if self.isArchive { - if items.count == 1 { - text = "Story unarchived." - } else { - text = "Stories unarchived." - } + text = presentationData.strings.StoryList_ToastUnarchived_Text(Int32(items.count)) } else { - if items.count == 1 { - text = "Story archived." - } else { - text = "Stories archived." - } + text = presentationData.strings.StoryList_ToastArchived_Text(Int32(items.count)) } self.parentController?.present(UndoOverlayController(presentationData: presentationData, content: .actionSucceeded(title: nil, text: text, cancel: nil, destructive: false), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current) } @@ -2567,7 +2536,7 @@ public final class PeerInfoStoryPaneNode: ASDisplayNode, PeerInfoPaneNode, ASScr selectionItems.append(BottomActionsPanelComponent.Item( id: "delete", color: .destructive, - title: "Delete", + title: presentationData.strings.StoryList_ActionPanel_Delete, isEnabled: !selectedIds.isEmpty, action: { [weak self] in guard let self, let selectedIds = self.itemInteraction.selectedIds else { diff --git a/submodules/TelegramUI/Sources/AppDelegate.swift b/submodules/TelegramUI/Sources/AppDelegate.swift index 96d9f2f5f5..aa12034a1d 100644 --- a/submodules/TelegramUI/Sources/AppDelegate.swift +++ b/submodules/TelegramUI/Sources/AppDelegate.swift @@ -2565,11 +2565,11 @@ private func extractAccountManagerState(records: AccountRecordsView deliverOnMainQueue).start(next: { displayNames in - self.registerForNotifications(replyString: presentationData.strings.Notification_Reply, messagePlaceholderString: presentationData.strings.Conversation_InputTextPlaceholder, hiddenContentString: presentationData.strings.Watch_MessageView_Title, hiddenReactionContentString: presentationData.strings.Notification_LockScreenReactionPlaceholder, hiddenStoryContentString: presentationData.strings.Notification_LockScreenStoryPlaceholder, includeNames: displayNames, authorize: authorize, completion: completion) + self.registerForNotifications(replyString: presentationData.strings.Notification_Reply, messagePlaceholderString: presentationData.strings.Conversation_InputTextPlaceholder, hiddenContentString: presentationData.strings.Watch_MessageView_Title, hiddenReactionContentString: presentationData.strings.Notification_LockScreenReactionPlaceholder, hiddenStoryContentString: presentationData.strings.Notification_LockScreenStoryPlaceholder, hiddenStoryReactionContentString: presentationData.strings.PUSH_REACT_STORY_HIDDEN, includeNames: displayNames, authorize: authorize, completion: completion) }) } - private func registerForNotifications(replyString: String, messagePlaceholderString: String, hiddenContentString: String, hiddenReactionContentString: String, hiddenStoryContentString: String, includeNames: Bool, authorize: Bool = true, completion: @escaping (Bool) -> Void = { _ in }) { + private func registerForNotifications(replyString: String, messagePlaceholderString: String, hiddenContentString: String, hiddenReactionContentString: String, hiddenStoryContentString: String, hiddenStoryReactionContentString: String, includeNames: Bool, authorize: Bool = true, completion: @escaping (Bool) -> Void = { _ in }) { let notificationCenter = UNUserNotificationCenter.current() Logger.shared.log("App \(self.episodeId)", "register for notifications: get settings (authorize: \(authorize))") notificationCenter.getNotificationSettings(completionHandler: { settings in @@ -2600,6 +2600,7 @@ private func extractAccountManagerState(records: AccountRecordsView