Signal-iOS/SignalMessaging/utils/CommonStrings.swift
Jordan Rose 39a338aa21 Group calls: separate new/existing member safety number notifications
We've been presenting all safety number mismatches as "someone joined
the call you were already in", but sometimes they were in the call
first. In that case, we should use a different message.

While here, make these messages a little more concise so we can fit in
an explicit "Tap to view", to encourage people to come back to the app
and decide whether they want to stay in the call.
2022-11-14 10:01:04 -08:00

629 lines
21 KiB
Swift

//
// Copyright 2016 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
/**
* Strings re-used in multiple places should be added here.
*/
@objc
public class CommonStrings: NSObject {
@objc
static public var archiveAction: String {
OWSLocalizedString("ARCHIVE_ACTION", comment: "Label for the archive button for conversations list view")
}
@objc
static public var backButton: String {
OWSLocalizedString("BACK_BUTTON", comment: "return to the previous screen")
}
@objc
static public var continueButton: String {
OWSLocalizedString("BUTTON_CONTINUE", comment: "Label for 'continue' button.")
}
@objc
static public var dismissButton: String {
OWSLocalizedString("DISMISS_BUTTON_TEXT",
comment: "Short text to dismiss current modal / actionsheet / screen")
}
@objc
static public var cancelButton: String {
OWSLocalizedString("TXT_CANCEL_TITLE",
comment: "Label for the cancel button in an alert or action sheet.")
}
@objc
static public var selectButton: String {
OWSLocalizedString("BUTTON_SELECT", comment: "Button text to enable batch selection mode")
}
@objc
static public var doneButton: String {
OWSLocalizedString("BUTTON_DONE", comment: "Label for generic done button.")
}
@objc
static public var nextButton: String {
OWSLocalizedString("BUTTON_NEXT", comment: "Label for the 'next' button.")
}
@objc
static public var previousButton: String {
OWSLocalizedString("BUTTON_PREVIOUS", comment: "Label for the 'previous' button.")
}
@objc
static public var skipButton: String {
OWSLocalizedString("NAVIGATION_ITEM_SKIP_BUTTON", comment: "A button to skip a view.")
}
@objc
static public var deleteButton: String {
OWSLocalizedString("TXT_DELETE_TITLE",
comment: "Label for the delete button in an alert or action sheet.")
}
@objc
static public var deleteForMeButton: String {
OWSLocalizedString(
"MESSAGE_ACTION_DELETE_FOR_YOU",
comment: "The title for the action that deletes a message for the local user only.")
}
@objc
static public var retryButton: String {
OWSLocalizedString("RETRY_BUTTON_TEXT",
comment: "Generic text for button that retries whatever the last action was.")
}
@objc
static public var okayButton: String {
OWSLocalizedString("BUTTON_OKAY", comment: "Label for the 'okay' button.")
}
@objc
static public var okButton: String {
OWSLocalizedString("OK", comment: "Label for the 'ok' button.")
}
@objc
static public var copyButton: String {
OWSLocalizedString("BUTTON_COPY", comment: "Label for the 'copy' button.")
}
@objc
static public var setButton: String {
OWSLocalizedString("BUTTON_SET", comment: "Label for the 'set' button.")
}
@objc
static public var editButton: String {
OWSLocalizedString("BUTTON_EDIT", comment: "Label for the 'edit' button.")
}
@objc
static public var saveButton: String {
OWSLocalizedString("ALERT_SAVE",
comment: "The label for the 'save' button in action sheets.")
}
@objc
static public var shareButton: String {
OWSLocalizedString("BUTTON_SHARE", comment: "Label for the 'share' button.")
}
@objc
static public var goToSettingsButton: String {
OWSLocalizedString(
"GO_TO_SETTINGS_BUTTON",
comment: "Label for the 'go to settings' button"
)
}
@objc
static public var help: String {
OWSLocalizedString("SETTINGS_HELP", comment: "Title for help button and help pages in app settings.")
}
@objc
static public var openSettingsButton: String {
OWSLocalizedString("OPEN_SETTINGS_BUTTON", comment: "Button text which opens the settings app")
}
@objc
static public var errorAlertTitle: String {
OWSLocalizedString("ALERT_ERROR_TITLE", comment: "")
}
@objc
static public var searchPlaceholder: String {
OWSLocalizedString("SEARCH_FIELD_PLACE_HOLDER_TEXT",
comment: "placeholder text in an empty search field")
}
@objc
static public var mainPhoneNumberLabel: String {
OWSLocalizedString("PHONE_NUMBER_TYPE_MAIN", comment: "Label for 'Main' phone numbers.")
}
@objc
static public var contactSupport: String {
OWSLocalizedString("CONTACT_SUPPORT",
comment: "Button text to initiate an email to signal support staff")
}
@objc
static public var learnMore: String {
OWSLocalizedString("LEARN_MORE", comment: "Label for the 'learn more' button.")
}
@objc
static public var unarchiveAction: String {
OWSLocalizedString("UNARCHIVE_ACTION",
comment: "Label for the unarchive button for conversations list view")
}
@objc
static public var readAction: String {
OWSLocalizedString("READ_ACTION", comment: "Pressing this button marks a thread as read")
}
@objc
static public var unreadAction: String {
OWSLocalizedString("UNREAD_ACTION", comment: "Pressing this button marks a thread as unread")
}
@objc
static public var pinAction: String {
OWSLocalizedString("PIN_ACTION", comment: "Pressing this button pins a thread")
}
@objc
static public var unpinAction: String {
OWSLocalizedString("UNPIN_ACTION", comment: "Pressing this button un-pins a thread")
}
@objc
static public var switchOn: String {
OWSLocalizedString("SWITCH_ON", comment: "Label for 'on' state of a switch control.")
}
@objc
static public var switchOff: String {
OWSLocalizedString("SWITCH_OFF", comment: "Label for 'off' state of a switch control.")
}
@objc
static public var sendMessage: String {
OWSLocalizedString("ACTION_SEND_MESSAGE",
comment: "Label for button that lets you send a message to a contact.")
}
@objc
static public var yesButton: String {
OWSLocalizedString("BUTTON_YES", comment: "Label for the 'yes' button.")
}
@objc
static public var noButton: String {
OWSLocalizedString("BUTTON_NO", comment: "Label for the 'no' button.")
}
static public var redeemGiftButton: String {
return OWSLocalizedString(
"BADGE_GIFTING_REDEEM",
comment: "Label for a button used to redeem a gift and add the gift's badge to your profile."
)
}
@objc
static public var notNowButton: String {
OWSLocalizedString("BUTTON_NOT_NOW", comment: "Label for the 'not now' button.")
}
@objc
static public var addButton: String {
OWSLocalizedString("BUTTON_ADD", comment: "Label for the 'add' button.")
}
@objc
static public var viewButton: String {
OWSLocalizedString("BUTTON_VIEW", comment: "Label for the 'view' button.")
}
@objc
static public var startButton: String {
OWSLocalizedString("BUTTON_START", comment: "Label for the 'start' button.")
}
@objc
static public var seeAllButton: String {
OWSLocalizedString("SEE_ALL_BUTTON", comment: "Label for the 'see all' button.")
}
@objc
static public var muteButton: String {
OWSLocalizedString("BUTTON_MUTE", comment: "Label for the 'mute' button.")
}
@objc
static public var unmuteButton: String {
OWSLocalizedString("BUTTON_UNMUTE", comment: "Label for the 'unmute' button.")
}
@objc
static public var genericError: String {
OWSLocalizedString("ALERT_ERROR_TITLE", comment: "Generic error indicator.")
}
@objc
static public var attachmentTypePhoto: String {
OWSLocalizedString("ATTACHMENT_TYPE_PHOTO",
comment: "Short text label for a photo attachment, used for thread preview and on the lock screen")
}
@objc
static public var attachmentTypeVideo: String {
OWSLocalizedString("ATTACHMENT_TYPE_VIDEO",
comment: "Short text label for a video attachment, used for thread preview and on the lock screen")
}
@objc
static public var attachmentTypeAnimated: String {
OWSLocalizedString("ATTACHMENT_TYPE_ANIMATED",
comment: "Short text label for an animated attachment, used for thread preview and on the lock screen")
}
@objc
static public var searchBarPlaceholder: String {
OWSLocalizedString("INVITE_FRIENDS_PICKER_SEARCHBAR_PLACEHOLDER", comment: "Search")
}
@objc
static public var you: String {
OWSLocalizedString("YOU", comment: "Second person pronoun to represent the local user.")
}
}
// MARK: -
@objc
public class CommonFormats: NSObject {
@objc
static public func formatUsername(_ username: String) -> String? {
guard let username = username.filterForDisplay else { return nil }
return (OWSLocalizedString("USERNAME_PREFIX",
comment: "A prefix appended to all usernames when displayed")
+ username)
}
}
// MARK: -
@objc
public class MessageStrings: NSObject {
@objc
static public var conversationIsBlocked: String {
OWSLocalizedString("CONTACT_CELL_IS_BLOCKED",
comment: "An indicator that a contact or group has been blocked.")
}
@objc
static public var newGroupDefaultTitle: String {
OWSLocalizedString("NEW_GROUP_DEFAULT_TITLE",
comment: "Used in place of the group name when a group has not yet been named.")
}
@objc
static public var replyNotificationAction: String {
OWSLocalizedString("PUSH_MANAGER_REPLY", comment: "Notification action button title")
}
@objc
static public var markAsReadNotificationAction: String {
OWSLocalizedString("PUSH_MANAGER_MARKREAD", comment: "Notification action button title")
}
@objc
static public var reactWithThumbsUpNotificationAction: String {
OWSLocalizedString("PUSH_MANAGER_REACT_WITH_THUMBS_UP",
comment: "Notification action button title for 'react with thumbs up.'")
}
@objc
static public var sendButton: String {
OWSLocalizedString("SEND_BUTTON_TITLE", comment: "Label for the button to send a message")
}
@objc
static public var noteToSelf: String {
OWSLocalizedString("NOTE_TO_SELF", comment: "Label for 1:1 conversation with yourself.")
}
@objc
static public var viewOnceViewPhoto: String {
OWSLocalizedString("PER_MESSAGE_EXPIRATION_VIEW_PHOTO",
comment: "Label for view-once messages indicating that user can tap to view the message's contents.")
}
@objc
static public var viewOnceViewVideo: String {
OWSLocalizedString("PER_MESSAGE_EXPIRATION_VIEW_VIDEO",
comment: "Label for view-once messages indicating that user can tap to view the message's contents.")
}
@objc
static public var removePreviewButtonLabel: String {
OWSLocalizedString("REMOVE_PREVIEW",
comment: "Accessibility label for a button that removes the preview from a drafted message.")
}
}
// MARK: -
@objc
public class NotificationStrings: NSObject {
@objc
static public var incomingAudioCallBody: String {
OWSLocalizedString("CALL_AUDIO_INCOMING_NOTIFICATION_BODY", comment: "notification body")
}
@objc
static public var incomingVideoCallBody: String {
OWSLocalizedString("CALL_VIDEO_INCOMING_NOTIFICATION_BODY", comment: "notification body")
}
@objc
static public var incomingGroupCallBodyFormat: String {
OWSLocalizedString("CALL_GROUP_INCOMING_NOTIFICATION_BODY_FORMAT", comment: "Body for the repeating notification shown while an incoming group call is ringing. Embeds {{caller name}}")
}
@objc
static public var incomingGroupCallBodyAnonymous: String {
OWSLocalizedString("CALL_GROUP_INCOMING_NOTIFICATION_BODY_ANONYMOUS", comment: "Body for the repeating notification shown while an incoming group call is ringing, if the user has chosen not to include contact names in notifications")
}
@objc
static public var missedCallBecauseOfIdentityChangeBody: String {
OWSLocalizedString("CALL_MISSED_BECAUSE_OF_IDENTITY_CHANGE_NOTIFICATION_BODY",
comment: "notification body")
}
@objc
static public var genericIncomingMessageNotification: String {
OWSLocalizedString("GENERIC_INCOMING_MESSAGE_NOTIFICATION", comment: "notification title indicating the user generically has a new message")
}
/// This is the fallback message used for push notifications
/// when the NSE or main app is unable to process them. We
/// don't use it directly in the app, but need to maintain
/// a reference to it for string generation.
@objc
static public var indeterminateIncomingMessageNotification: String {
OWSLocalizedString("APN_Message", comment: "notification body")
}
@objc
static public var incomingGroupMessageTitleFormat: String {
OWSLocalizedString("NEW_GROUP_MESSAGE_NOTIFICATION_TITLE",
comment: "notification title. Embeds {{author name}} and {{group name}}")
}
@objc
static public var incomingGroupStoryReplyTitleFormat: String {
OWSLocalizedString("NEW_GROUP_STORY_REPLY_NOTIFICATION_TITLE",
comment: "notification title. Embeds {{ %1%@ author name, %2%@ group name}}")
}
@objc
static public var failedToSendBody: String {
OWSLocalizedString("SEND_FAILED_NOTIFICATION_BODY", comment: "notification body")
}
@objc
static public var groupCallSafetyNumberChangeBody: String {
OWSLocalizedString("GROUP_CALL_SAFETY_NUMBER_CHANGE_BODY",
comment: "notification body when a group call participant joins with an untrusted safety number")
}
@objc
static public var groupCallSafetyNumberChangeAtJoinBody: String {
OWSLocalizedString("GROUP_CALL_SAFETY_NUMBER_CHANGE_AT_JOIN_BODY",
comment: "notification body when you join a group call and an already-joined participant has an untrusted safety number")
}
@objc
static public var incomingReactionFormat: String {
OWSLocalizedString("REACTION_INCOMING_NOTIFICATION_BODY_FORMAT",
comment: "notification body. Embeds {{reaction emoji}}")
}
@objc
static public var incomingReactionTextMessageFormat: String {
OWSLocalizedString("REACTION_INCOMING_NOTIFICATION_TO_TEXT_MESSAGE_BODY_FORMAT",
comment: "notification body. Embeds {{reaction emoji}} and {{body text}}")
}
@objc
static public var incomingReactionViewOnceMessageFormat: String {
OWSLocalizedString("REACTION_INCOMING_NOTIFICATION_TO_VIEW_ONCE_MESSAGE_BODY_FORMAT",
comment: "notification body. Embeds {{reaction emoji}}")
}
@objc
static public var incomingReactionStickerMessageFormat: String {
OWSLocalizedString("REACTION_INCOMING_NOTIFICATION_TO_STICKER_MESSAGE_BODY_FORMAT",
comment: "notification body. Embeds {{reaction emoji}}")
}
@objc
static public var incomingReactionContactShareMessageFormat: String {
OWSLocalizedString("REACTION_INCOMING_NOTIFICATION_TO_CONTACT_SHARE_BODY_FORMAT",
comment: "notification body. Embeds {{reaction emoji}}")
}
@objc
static public var incomingReactionAlbumMessageFormat: String {
OWSLocalizedString("REACTION_INCOMING_NOTIFICATION_TO_ALBUM_BODY_FORMAT",
comment: "notification body. Embeds {{reaction emoji}}")
}
@objc
static public var incomingReactionPhotoMessageFormat: String {
OWSLocalizedString("REACTION_INCOMING_NOTIFICATION_TO_PHOTO_BODY_FORMAT",
comment: "notification body. Embeds {{reaction emoji}}")
}
@objc
static public var incomingReactionVideoMessageFormat: String {
OWSLocalizedString("REACTION_INCOMING_NOTIFICATION_TO_VIDEO_BODY_FORMAT",
comment: "notification body. Embeds {{reaction emoji}}")
}
@objc
static public var incomingReactionVoiceMessageFormat: String {
OWSLocalizedString("REACTION_INCOMING_NOTIFICATION_TO_VOICE_MESSAGE_BODY_FORMAT",
comment: "notification body. Embeds {{reaction emoji}}")
}
@objc
static public var incomingReactionAudioMessageFormat: String {
OWSLocalizedString("REACTION_INCOMING_NOTIFICATION_TO_AUDIO_BODY_FORMAT",
comment: "notification body. Embeds {{reaction emoji}}")
}
@objc
static public var incomingReactionGifMessageFormat: String {
OWSLocalizedString("REACTION_INCOMING_NOTIFICATION_TO_GIF_BODY_FORMAT",
comment: "notification body. Embeds {{reaction emoji}}")
}
@objc
static public var incomingReactionFileMessageFormat: String {
OWSLocalizedString("REACTION_INCOMING_NOTIFICATION_TO_FILE_BODY_FORMAT",
comment: "notification body. Embeds {{reaction emoji}}")
}
}
// MARK: -
@objc
public class CallStrings: NSObject {
@objc
static public var callStatusFormat: String {
OWSLocalizedString("CALL_STATUS_FORMAT",
comment: "embeds {{Call Status}} in call screen label. For ongoing calls, {{Call Status}} is a seconds timer like 01:23, otherwise {{Call Status}} is a short text like 'Ringing', 'Busy', or 'Failed Call'")
}
@objc
static public var confirmAndCallButtonTitle: String {
OWSLocalizedString("SAFETY_NUMBER_CHANGED_CONFIRM_CALL_ACTION",
comment: "alert button text to confirm placing an outgoing call after the recipients Safety Number has changed.")
}
@objc
static public var callBackAlertTitle: String {
OWSLocalizedString("CALL_USER_ALERT_TITLE",
comment: "Title for alert offering to call a user.")
}
@objc
static public var callBackAlertMessageFormat: String {
OWSLocalizedString("CALL_USER_ALERT_MESSAGE_FORMAT",
comment: "Message format for alert offering to call a user. Embeds {{the user's display name or phone number}}.")
}
@objc
static public var callBackAlertCallButton: String {
OWSLocalizedString("CALL_USER_ALERT_CALL_BUTTON",
comment: "Label for call button for alert offering to call a user.")
}
// MARK: - Notification actions
@objc
static public var callBackButtonTitle: String {
OWSLocalizedString("CALLBACK_BUTTON_TITLE", comment: "notification action")
}
@objc
static public var showThreadButtonTitle: String {
OWSLocalizedString("SHOW_THREAD_BUTTON_TITLE", comment: "notification action")
}
@objc
static public var answerCallButtonTitle: String {
OWSLocalizedString("ANSWER_CALL_BUTTON_TITLE", comment: "notification action")
}
@objc
static public var declineCallButtonTitle: String {
OWSLocalizedString("REJECT_CALL_BUTTON_TITLE", comment: "notification action")
}
}
// MARK: -
@objc
public class MediaStrings: NSObject {
@objc
static public var allMedia: String {
OWSLocalizedString("MEDIA_DETAIL_VIEW_ALL_MEDIA_BUTTON", comment: "nav bar button item")
}
}
// MARK: -
@objc
public class SafetyNumberStrings: NSObject {
@objc
static public var confirmSendButton: String {
OWSLocalizedString("SAFETY_NUMBER_CHANGED_CONFIRM_SEND_ACTION",
comment: "button title to confirm sending to a recipient whose safety number recently changed")
}
}
// MARK: -
@objc
public class MegaphoneStrings: NSObject {
@objc
static public var remindMeLater: String {
OWSLocalizedString("MEGAPHONE_REMIND_LATER", comment: "button title to snooze a megaphone")
}
@objc
static public var weWillRemindYouLater: String {
OWSLocalizedString("MEGAPHONE_WILL_REMIND_LATER",
comment: "toast indicating that we will remind the user later")
}
}
// MARK: -
@objc
public class StoryStrings: NSObject {
@objc
static public var repliesAndReactionsHeader: String {
OWSLocalizedString(
"STORIES_REPLIES_AND_REACTIONS_HEADER",
comment: "Section header for the 'replies & reactions' section in stories settings")
}
@objc
static public var repliesAndReactionsFooter: String {
OWSLocalizedString(
"STORIES_REPLIES_AND_REACTIONS_FOOTER",
comment: "Section footer for the 'replies & reactions' section in stories settings")
}
@objc
static public var repliesAndReactionsToggle: String {
OWSLocalizedString(
"STORIES_REPLIES_AND_REACTIONS_TOGGLE",
comment: "Toggle text for the 'replies & reactions' switch in stories settings")
}
}