Update localization

This commit is contained in:
Isaac 2024-10-29 15:01:51 +01:00
parent 817e189709
commit d45e58e257
9 changed files with 71 additions and 43 deletions

View File

@ -13164,3 +13164,40 @@ Sorry for the inconvenience.";
"PeerInfo.BotBalance.Title" = "BALANCE"; "PeerInfo.BotBalance.Title" = "BALANCE";
"PeerInfo.BotBalance.Ton" = "Ton"; "PeerInfo.BotBalance.Ton" = "Ton";
"PeerInfo.BotBalance.Stars" = "Stars"; "PeerInfo.BotBalance.Stars" = "Stars";
"Gallery.ToastVideoSpeedSwipe" = "Swipe sideways to adjust speed.";
"Gallery.VideoSettings.QualitySectionTitle" = "QUALITY";
"Gallery.VideoSettings.SpeedSectionTitle" = "PLAYBACK SPEED";
"Gallery.VideoSettings.SpeedControlTitle" = "Speed";
"Gallery.VideoSettings.QualityAuto" = "Auto";
"Gallery.VideoSettings.QualityLow" = "Low";
"Gallery.VideoSettings.QualityMedium" = "Medium";
"Gallery.VideoSettings.QualityHD" = "High";
"Gallery.VideoSettings.QualityFHD" = "Full HD";
"Gallery.VideoSettings.QualityQHD" = "Ultra-High";
"Gallery.VideoSettings.IconQualityLow" = "L";
"Gallery.VideoSettings.IconQualityMedium" = "SD";
"Gallery.VideoSettings.IconQualityHD" = "HD";
"Gallery.VideoSettings.IconQualityFHD" = "FHD";
"Gallery.VideoSettings.IconQualityQHD" = "QHD";
"Gallery.MenuSaveToGallery" = "Save to Gallery";
"Gallery.SaveToGallery.Quality" = "Save in %@p";
"Gallery.SaveToGallery.Original" = "Save Original";
"VideoChat.ScheduleButtonTitle" = "Schedule Video Chat";
"Chat.ToastImprovingVideo.Title" = "Improving video...";
"Chat.ToastImprovingVideo.Text" = "The video will be published after it's optimized for the best viewing experience.";
"Chat.ToastVideoPublished.Title" = "Video Published";
"Chat.ToastVideoPublished.Action" = "View";
"Chat.MessageTooltipVideoProcessing" = "Processing video may take a few minutes.";
"Chat.VideoProcessingServiceMessage_1" = "This video will be published once converted and optimized";
"Chat.VideoProcessingServiceMessage_any" = "These videos will be published once converted and optimized";
"Chat.ScheduledForceSendProcessingVideo.Title" = "Wait!";
"Chat.ScheduledForceSendProcessingVideo.Text" = "This video hasn't been converted and optimized yet. If you send it now, the viewers of the video may experience slow download speed.";
"Chat.ScheduledForceSendProcessingVideo.Action" = "Send Anyway";

View File

@ -600,8 +600,6 @@ final class SettingsHeaderButton: HighlightableButtonNode {
self.dotLayer.bounds = CGRect(origin: CGPoint(), size: dotFrame.size) self.dotLayer.bounds = CGRect(origin: CGPoint(), size: dotFrame.size)
} }
} }
//self.setBadges(speed: "1.5x", quality: "HD", transition: .immediate)
} }
override func didLoad() { override func didLoad() {
@ -1619,12 +1617,11 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
activeEdgeRateIndicatorTransition = .immediate activeEdgeRateIndicatorTransition = .immediate
} }
//TODO:localize
let activeEdgeRateIndicatorSize = activeEdgeRateIndicator.update( let activeEdgeRateIndicatorSize = activeEdgeRateIndicator.update(
transition: ComponentTransition(activeEdgeRateIndicatorTransition), transition: ComponentTransition(activeEdgeRateIndicatorTransition),
component: AnyComponent(GalleryRateToastComponent( component: AnyComponent(GalleryRateToastComponent(
rate: activeEdgeRateState.currentRate, rate: activeEdgeRateState.currentRate,
displayTooltip: "Swipe sideways to adjust speed." displayTooltip: self.presentationData.strings.Gallery_ToastVideoSpeedSwipe
)), )),
environment: {}, environment: {},
containerSize: CGSize(width: layout.size.width - layout.safeInsets.left * 2.0, height: 100.0) containerSize: CGSize(width: layout.size.width - layout.safeInsets.left * 2.0, height: 100.0)
@ -1902,15 +1899,15 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
var qualityString: String? var qualityString: String?
if case let .quality(quality) = videoQuality { if case let .quality(quality) = videoQuality {
if quality <= 360 { if quality <= 360 {
qualityString = "SD" qualityString = self.presentationData.strings.Gallery_VideoSettings_IconQualityLow
} else if quality <= 480 { } else if quality <= 480 {
qualityString = "SD" qualityString = self.presentationData.strings.Gallery_VideoSettings_IconQualityMedium
} else if quality <= 720 { } else if quality <= 720 {
qualityString = "HD" qualityString = self.presentationData.strings.Gallery_VideoSettings_IconQualityHD
} else if quality <= 1080 { } else if quality <= 1080 {
qualityString = "FHD" qualityString = self.presentationData.strings.Gallery_VideoSettings_IconQualityFHD
} else { } else {
qualityString = "UHD" qualityString = self.presentationData.strings.Gallery_VideoSettings_IconQualityQHD
} }
} }
@ -3474,7 +3471,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
if isSettings { if isSettings {
let sliderValuePromise = ValuePromise<Double?>(nil) let sliderValuePromise = ValuePromise<Double?>(nil)
topItems.append(.custom(SliderContextItem(title: "Speed", minValue: 0.2, maxValue: 2.5, value: status.baseRate, valueChanged: { [weak self] newValue, _ in topItems.append(.custom(SliderContextItem(title: strongSelf.presentationData.strings.Gallery_VideoSettings_SpeedControlTitle, minValue: 0.2, maxValue: 2.5, value: status.baseRate, valueChanged: { [weak self] newValue, _ in
guard let strongSelf = self, let videoNode = strongSelf.videoNode else { guard let strongSelf = self, let videoNode = strongSelf.videoNode else {
return return
} }
@ -3488,7 +3485,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
if let videoQualityState = strongSelf.videoNode?.videoQualityState(), !videoQualityState.available.isEmpty { if let videoQualityState = strongSelf.videoNode?.videoQualityState(), !videoQualityState.available.isEmpty {
} else { } else {
items.append(.custom(SectionTitleContextItem(text: "PLAYBACK SPEED"), false)) items.append(.custom(SectionTitleContextItem(text: strongSelf.presentationData.strings.Gallery_VideoSettings_SpeedSectionTitle), false))
for (text, _, rate) in strongSelf.speedList(strings: strongSelf.presentationData.strings) { for (text, _, rate) in strongSelf.speedList(strings: strongSelf.presentationData.strings) {
let isSelected = abs(status.baseRate - rate) < 0.01 let isSelected = abs(status.baseRate - rate) < 0.01
items.append(.action(ContextMenuActionItem(text: text, icon: { _ in return nil }, iconSource: ContextMenuActionItemIconSource(size: CGSize(width: 24.0, height: 24.0), signal: sliderValuePromise.get() items.append(.action(ContextMenuActionItem(text: text, icon: { _ in return nil }, iconSource: ContextMenuActionItemIconSource(size: CGSize(width: 24.0, height: 24.0), signal: sliderValuePromise.get()
@ -3514,12 +3511,11 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
} }
if let videoQualityState = strongSelf.videoNode?.videoQualityState(), !videoQualityState.available.isEmpty { if let videoQualityState = strongSelf.videoNode?.videoQualityState(), !videoQualityState.available.isEmpty {
items.append(.custom(SectionTitleContextItem(text: "VIDEO QUALITY"), false)) items.append(.custom(SectionTitleContextItem(text: strongSelf.presentationData.strings.Gallery_VideoSettings_QualitySectionTitle), false))
//TODO:localize
do { do {
let isSelected = videoQualityState.preferred == .auto let isSelected = videoQualityState.preferred == .auto
let qualityText: String = "Auto" let qualityText: String = strongSelf.presentationData.strings.Gallery_VideoSettings_QualityAuto
let textLayout: ContextMenuActionItemTextLayout let textLayout: ContextMenuActionItemTextLayout
if videoQualityState.current != 0 { if videoQualityState.current != 0 {
textLayout = .secondLineWithValue("\(videoQualityState.current)p") textLayout = .secondLineWithValue("\(videoQualityState.current)p")
@ -3551,15 +3547,15 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
let isSelected = videoQualityState.preferred == .quality(quality) let isSelected = videoQualityState.preferred == .quality(quality)
let qualityTitle: String let qualityTitle: String
if quality <= 360 { if quality <= 360 {
qualityTitle = "Low" qualityTitle = strongSelf.presentationData.strings.Gallery_VideoSettings_QualityLow
} else if quality <= 480 { } else if quality <= 480 {
qualityTitle = "Medium" qualityTitle = strongSelf.presentationData.strings.Gallery_VideoSettings_QualityMedium
} else if quality <= 720 { } else if quality <= 720 {
qualityTitle = "High" qualityTitle = strongSelf.presentationData.strings.Gallery_VideoSettings_QualityHD
} else if quality <= 1080 { } else if quality <= 1080 {
qualityTitle = "Full HD" qualityTitle = strongSelf.presentationData.strings.Gallery_VideoSettings_QualityFHD
} else { } else {
qualityTitle = "Ultra HD" qualityTitle = strongSelf.presentationData.strings.Gallery_VideoSettings_QualityQHD
} }
items.append(.action(ContextMenuActionItem(text: qualityTitle, textLayout: .secondLineWithValue("\(quality)p"), icon: { _ in items.append(.action(ContextMenuActionItem(text: qualityTitle, textLayout: .secondLineWithValue("\(quality)p"), icon: { _ in
if isSelected { if isSelected {
@ -3584,7 +3580,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
} }
} else { } else {
if let (message, maybeFile, _) = strongSelf.contentInfo(), let file = maybeFile, !message.isCopyProtected() && !item.peerIsCopyProtected && message.paidContent == nil { if let (message, maybeFile, _) = strongSelf.contentInfo(), let file = maybeFile, !message.isCopyProtected() && !item.peerIsCopyProtected && message.paidContent == nil {
items.append(.action(ContextMenuActionItem(text: "Save to Gallery", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Download"), color: theme.actionSheet.primaryTextColor) }, action: { c, _ in items.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.Gallery_MenuSaveToGallery, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Download"), color: theme.actionSheet.primaryTextColor) }, action: { c, _ in
guard let self else { guard let self else {
c?.dismiss(result: .default, completion: nil) c?.dismiss(result: .default, completion: nil)
return return
@ -3616,9 +3612,9 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
let fileSizeString = dataSizeString(qualityFileSize, formatting: DataSizeStringFormatting(presentationData: self.presentationData)) let fileSizeString = dataSizeString(qualityFileSize, formatting: DataSizeStringFormatting(presentationData: self.presentationData))
let title: String let title: String
if let quality { if let quality {
title = "Save in \(quality)p" title = self.presentationData.strings.Gallery_SaveToGallery_Quality("\(quality)").string
} else { } else {
title = "Save Original" title = self.presentationData.strings.Gallery_SaveToGallery_Original
} }
items.append(.action(ContextMenuActionItem(text: title, textLayout: .secondLineWithValue(fileSizeString), icon: { _ in items.append(.action(ContextMenuActionItem(text: title, textLayout: .secondLineWithValue(fileSizeString), icon: { _ in
return nil return nil

View File

@ -110,9 +110,8 @@ private final class ScheduleVideoChatSheetContentComponent: Component {
var contentHeight: CGFloat = 0.0 var contentHeight: CGFloat = 0.0
contentHeight += 16.0 contentHeight += 16.0
//TODO:localize
let titleString = NSMutableAttributedString() let titleString = NSMutableAttributedString()
titleString.append(NSAttributedString(string: "Schedule Video Chat", font: Font.semibold(17.0), textColor: environment.theme.list.itemPrimaryTextColor)) titleString.append(NSAttributedString(string: environment.strings.VideoChat_ScheduleButtonTitle, font: Font.semibold(17.0), textColor: environment.theme.list.itemPrimaryTextColor))
let titleSize = self.title.update( let titleSize = self.title.update(
transition: .immediate, transition: .immediate,
@ -272,7 +271,7 @@ private final class ScheduleVideoChatSheetContentComponent: Component {
pressedColor: UIColor(rgb: 0x2B2B2F).withMultipliedAlpha(0.8) pressedColor: UIColor(rgb: 0x2B2B2F).withMultipliedAlpha(0.8)
), ),
content: AnyComponentWithIdentity(id: AnyHashable(0 as Int), component: AnyComponent( content: AnyComponentWithIdentity(id: AnyHashable(0 as Int), component: AnyComponent(
Text(text: "Cancel", font: Font.semibold(17.0), color: environment.theme.list.itemPrimaryTextColor) Text(text: environment.strings.Common_Cancel, font: Font.semibold(17.0), color: environment.theme.list.itemPrimaryTextColor)
)), )),
isEnabled: true, isEnabled: true,
tintWhenDisabled: false, tintWhenDisabled: false,

View File

@ -4603,15 +4603,14 @@ extension ChatControllerImpl {
c?.displayProcessingVideoTooltip(messageId: firstEvent.id) c?.displayProcessingVideoTooltip(messageId: firstEvent.id)
} }
//TODO:localize
c.present( c.present(
UndoOverlayController( UndoOverlayController(
presentationData: self.presentationData, presentationData: self.presentationData,
content: .universalImage( content: .universalImage(
image: generateTintedImage(image: UIImage(bundleImageName: "Chat/ToastImprovingVideo"), color: .white)!, image: generateTintedImage(image: UIImage(bundleImageName: "Chat/ToastImprovingVideo"), color: .white)!,
size: nil, size: nil,
title: "Improving video...", title: self.presentationData.strings.Chat_ToastImprovingVideo_Title,
text: "The video will be published after it's optimized for the bese viewing experience.", text: self.presentationData.strings.Chat_ToastImprovingVideo_Text,
customUndoText: nil, customUndoText: nil,
timeout: 5.0 timeout: 5.0
), ),

View File

@ -61,7 +61,7 @@ extension ChatControllerImpl {
context: self.context, context: self.context,
file: .message(message: MessageReference(message._asMessage()), media: file), file: .message(message: MessageReference(message._asMessage()), media: file),
title: nil, title: nil,
text: "Video Published", text: self.presentationData.strings.Chat_ToastVideoPublished_Title,
undoText: nil, undoText: nil,
customAction: nil customAction: nil
), ),
@ -74,15 +74,14 @@ extension ChatControllerImpl {
self.dismiss() self.dismiss()
} }
} else { } else {
//TODO:localize
self.controllerInteraction?.presentControllerInCurrent(UndoOverlayController( self.controllerInteraction?.presentControllerInCurrent(UndoOverlayController(
presentationData: self.presentationData, presentationData: self.presentationData,
content: .media( content: .media(
context: self.context, context: self.context,
file: .message(message: MessageReference(message._asMessage()), media: file), file: .message(message: MessageReference(message._asMessage()), media: file),
title: nil, title: nil,
text: "Video Published", text: self.presentationData.strings.Chat_ToastVideoPublished_Title,
undoText: "View", undoText: self.presentationData.strings.Chat_ToastVideoPublished_Action,
customAction: { [weak self] in customAction: { [weak self] in
guard let self else { guard let self else {
return return

View File

@ -10357,8 +10357,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
let bounds = statusNode.view.convert(statusNode.view.bounds, to: self.chatDisplayNode.view) let bounds = statusNode.view.convert(statusNode.view.bounds, to: self.chatDisplayNode.view)
let location = CGPoint(x: bounds.midX, y: bounds.minY - 8.0) let location = CGPoint(x: bounds.midX, y: bounds.minY - 8.0)
//TODO:localize let tooltipController = TooltipController(content: .text(self.presentationData.strings.Chat_MessageTooltipVideoProcessing), baseFontSize: self.presentationData.listsFontSize.baseDisplaySize, balancedTextLayout: true, isBlurred: true, timeout: 4.5, dismissByTapOutside: true, dismissImmediatelyOnLayoutUpdate: true)
let tooltipController = TooltipController(content: .text("Processing video may take a few minutes."), baseFontSize: self.presentationData.listsFontSize.baseDisplaySize, balancedTextLayout: true, isBlurred: true, timeout: 4.5, dismissByTapOutside: true, dismissImmediatelyOnLayoutUpdate: true)
self.checksTooltipController = tooltipController self.checksTooltipController = tooltipController
tooltipController.dismissed = { [weak self, weak tooltipController] _ in tooltipController.dismissed = { [weak self, weak tooltipController] _ in
if let strongSelf = self, let tooltipController = tooltipController, strongSelf.checksTooltipController === tooltipController { if let strongSelf = self, let tooltipController = tooltipController, strongSelf.checksTooltipController === tooltipController {

View File

@ -297,7 +297,6 @@ func chatHistoryEntriesForView(
} }
let insertPendingProcessingMessage: ([Message], Int) -> Void = { messages, index in let insertPendingProcessingMessage: ([Message], Int) -> Void = { messages, index in
//TODO:localize
let serviceMessage = Message( let serviceMessage = Message(
stableId: UInt32.max - messages[0].stableId, stableId: UInt32.max - messages[0].stableId,
stableVersion: 0, stableVersion: 0,
@ -316,7 +315,7 @@ func chatHistoryEntriesForView(
author: nil, author: nil,
text: "", text: "",
attributes: [], attributes: [],
media: [TelegramMediaAction(action: .customText(text: "This video will be published once converted and optimized", entities: [], additionalAttributes: nil))], media: [TelegramMediaAction(action: .customText(text: presentationData.strings.Chat_VideoProcessingServiceMessage(Int32(messages.count)), entities: [], additionalAttributes: nil))],
peers: SimpleDictionary<PeerId, Peer>(), peers: SimpleDictionary<PeerId, Peer>(),
associatedMessages: SimpleDictionary<MessageId, Message>(), associatedMessages: SimpleDictionary<MessageId, Message>(),
associatedMessageIds: [], associatedMessageIds: [],

View File

@ -1145,13 +1145,12 @@ func contextMenuForChatPresentationInterfaceState(chatPresentationInterfaceState
c?.dismiss(completion: { c?.dismiss(completion: {
let presentationData = context.sharedContext.currentPresentationData.with { $0 } let presentationData = context.sharedContext.currentPresentationData.with { $0 }
//TODO:localize
controllerInteraction.presentController(standardTextAlertController( controllerInteraction.presentController(standardTextAlertController(
theme: AlertControllerTheme(presentationData: presentationData), theme: AlertControllerTheme(presentationData: presentationData),
title: "Wait!", title: presentationData.strings.Chat_ScheduledForceSendProcessingVideo_Title,
text: "This video hasn't been converted and optimized yet. If you send it now, the viewers of the video may experience slow download speed.", text: presentationData.strings.Chat_ScheduledForceSendProcessingVideo_Text,
actions: [ actions: [
TextAlertAction(type: .defaultAction, title: "Send Anyway", action: { TextAlertAction(type: .defaultAction, title: presentationData.strings.Chat_ScheduledForceSendProcessingVideo_Action, action: {
controllerInteraction.sendScheduledMessagesNow(selectAll ? messages.map { $0.id } : [message.id]) controllerInteraction.sendScheduledMessagesNow(selectAll ? messages.map { $0.id } : [message.id])
}), }),
TextAlertAction(type: .genericAction, title: presentationData.strings.Common_Cancel, action: {}) TextAlertAction(type: .genericAction, title: presentationData.strings.Common_Cancel, action: {})
@ -2864,7 +2863,9 @@ private final class ChatReadReportContextItemNode: ASDisplayNode, ContextMenuCus
}) })
} }
item.context.account.viewTracker.updateReactionsForMessageIds(messageIds: [item.message.id], force: true) if !self.item.isEdit {
item.context.account.viewTracker.updateReactionsForMessageIds(messageIds: [item.message.id], force: true)
}
} }
deinit { deinit {
@ -3131,7 +3132,7 @@ private final class ChatReadReportContextItemNode: ASDisplayNode, ContextMenuCus
let placeholderAvatarsContent: AnimatedAvatarSetContext.Content let placeholderAvatarsContent: AnimatedAvatarSetContext.Content
var avatarsPeers: [EnginePeer] = [] var avatarsPeers: [EnginePeer] = []
if self.item.message.id.peerId.namespace == Namespaces.Peer.CloudUser { if self.item.message.id.peerId.namespace == Namespaces.Peer.CloudUser || self.item.isEdit {
} else if let recentPeers = self.item.message.reactionsAttribute?.recentPeers, !recentPeers.isEmpty { } else if let recentPeers = self.item.message.reactionsAttribute?.recentPeers, !recentPeers.isEmpty {
for recentPeer in recentPeers { for recentPeer in recentPeers {
if let peer = self.item.message.peers[recentPeer.peerId] { if let peer = self.item.message.peers[recentPeer.peerId] {

View File

@ -604,7 +604,6 @@ private final class NativeVideoContentNode: ASDisplayNode, UniversalVideoContent
self._status.set(.never()) self._status.set(.never())
self.player.pause() self.player.pause()
//TODO:release coordinate fetchAutomatically
self.player = MediaPlayer(audioSessionManager: self.audioSessionManager, postbox: self.postbox, userLocation: self.userLocation, userContentType: userContentType, resourceReference: updatedFileReference.resourceReference(selectedFile.resource), tempFilePath: nil, streamable: self.streamVideo, video: true, preferSoftwareDecoding: false, playAutomatically: false, enableSound: self.enableSound, baseRate: self.baseRate, fetchAutomatically: true, soundMuted: self.soundMuted, ambient: beginWithAmbientSound, mixWithOthers: mixWithOthers, continuePlayingWithoutSoundOnLostAudioSession: self.continuePlayingWithoutSoundOnLostAudioSession, storeAfterDownload: nil, isAudioVideoMessage: self.isAudioVideoMessage) self.player = MediaPlayer(audioSessionManager: self.audioSessionManager, postbox: self.postbox, userLocation: self.userLocation, userContentType: userContentType, resourceReference: updatedFileReference.resourceReference(selectedFile.resource), tempFilePath: nil, streamable: self.streamVideo, video: true, preferSoftwareDecoding: false, playAutomatically: false, enableSound: self.enableSound, baseRate: self.baseRate, fetchAutomatically: true, soundMuted: self.soundMuted, ambient: beginWithAmbientSound, mixWithOthers: mixWithOthers, continuePlayingWithoutSoundOnLostAudioSession: self.continuePlayingWithoutSoundOnLostAudioSession, storeAfterDownload: nil, isAudioVideoMessage: self.isAudioVideoMessage)
var actionAtEndImpl: (() -> Void)? var actionAtEndImpl: (() -> Void)?