diff --git a/_locales/en/messages.json b/_locales/en/messages.json index cb18652f3..5034640cd 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1,601 +1,591 @@ { - "copyErrorAndQuit": "Copy error and quit", - "unknown": "Unknown", - "databaseError": "Database Error", - "mainMenuFile": "&File", - "mainMenuEdit": "&Edit", - "mainMenuView": "&View", - "mainMenuWindow": "&Window", - "mainMenuHelp": "&Help", + "about": "About", + "accept": "Accept", + "activeMembers": "$count$ active members", + "add": "Add", + "addACaption": "Add a caption...", + "addAsModerator": "Add as Admin", + "addingContacts": "Adding contacts to $name$", + "addModerator": "Add Admin", + "addModerators": "Add Admins", + "anonymous": "Anonymous", + "answeredACall": "Call with $name$", + "appearanceSettingsTitle": "Appearance", "appMenuHide": "Hide", "appMenuHideOthers": "Hide Others", - "appMenuUnhide": "Show All", "appMenuQuit": "Quit Session", - "editMenuUndo": "Undo", - "editMenuRedo": "Redo", - "editMenuCut": "Cut", - "editMenuCopy": "Copy", - "editMenuPaste": "Paste", - "editMenuDeleteContact": "Delete Contact", - "editMenuDeleteGroup": "Delete Group", - "editMenuSelectAll": "Select all", - "windowMenuClose": "Close Window", - "windowMenuMinimize": "Minimize", - "windowMenuZoom": "Zoom", - "viewMenuResetZoom": "Actual Size", - "viewMenuZoomIn": "Zoom In", - "viewMenuZoomOut": "Zoom Out", - "viewMenuToggleFullScreen": "Toggle Full Screen", - "viewMenuToggleDevTools": "Toggle Developer Tools", - "contextMenuNoSuggestions": "No Suggestions", - "openGroupInvitation": "Community invitation", - "joinOpenGroupAfterInvitationConfirmationTitle": "Join $roomName$?", - "joinOpenGroupAfterInvitationConfirmationDesc": "Are you sure you want to join the $roomName$ community?", - "couldntFindServerMatching": "Couldn't find the corresponding Community server", - "enterSessionIDOrONSName": "Enter Session ID or ONS name", - "startNewConversationBy...": "Start a new conversation by entering someone's Session ID or share your Session ID with them.", - "loading": "Loading...", - "done": "Done", - "youLeftTheGroup": "You have left the group.", - "youGotKickedFromGroup": "You were removed from the group.", - "unreadMessages": "Unread Messages", - "debugLogExplanation": "This log will be saved to your desktop.", - "reportIssue": "Report a Bug", - "markAllAsRead": "Mark Read", - "incomingError": "Error handling incoming message", - "media": "Media", - "mediaEmptyState": "No media", - "document": "Document", - "documents": "Documents", - "documentsEmptyState": "No documents", - "today": "Today", - "yesterday": "Yesterday", - "thisWeek": "This week", - "thisMonth": "This Month", - "voiceMessage": "Voice Message", - "stagedPreviewThumbnail": "Draft thumbnail link preview for $domain$", - "previewThumbnail": "Thumbnail link preview for $domain$", - "stagedImageAttachment": "Draft image attachment: $path$", - "oneNonImageAtATimeToast": "Sorry, there is a limit of one non-image attachment per message", - "cannotMixImageAndNonImageAttachments": "Sorry, you cannot mix images with other file types in one message", - "maximumAttachments": "Maximum number of attachments reached. Please send remaining attachments in a separate message.", - "fileSizeWarning": "Attachment exceeds size limits for the type of message you're sending.", - "unableToLoadAttachment": "Sorry, there was an error setting your attachment.", - "offline": "Offline", - "debugLog": "Debug Log", - "showDebugLog": "Export Logs", - "shareBugDetails": "Export your logs, then upload the file though Session's Help Desk.", - "goToReleaseNotes": "Go to Release Notes", - "goToSupportPage": "Go to Support Page", - "about": "About", - "show": "Show", - "sessionMessenger": "Session", - "noSearchResults": "No results found for \"$searchTerm$\"", - "conversationsHeader": "Contacts and Groups: $count$", - "contactsHeader": "Contacts", - "messagesHeader": "Conversations", - "searchMessagesHeader": "Messages: $count$", - "settingsHeader": "Settings", - "typingAlt": "Typing animation for this conversation", - "contactAvatarAlt": "Avatar for contact $name$", - "downloadAttachment": "Download Attachment", - "replyToMessage": "Reply", - "replyingToMessage": "Replying to:", - "originalMessageNotFound": "Original message not found", - "you": "You", - "audioPermissionNeededTitle": "Microphone Access Required", - "audioPermissionNeeded": "You can enable microphone access under: Settings (Gear icon) => Privacy", - "image": "Image", + "appMenuUnhide": "Show All", + "areYouSureClearDevice": "Are you sure you want to clear your device?", + "areYouSureDeleteDeviceOnly": "Are you sure you want to delete your device data only?", + "areYouSureDeleteEntireAccount": "Are you sure you want to delete your data from the network? If you continue, you will not be able to restore your messages or contacts.", "audio": "Audio", - "video": "Video", - "photo": "Photo", + "audioMessageAutoplayDescription": "Autoplay consecutive audio messages.", + "audioMessageAutoplayTitle": "Autoplay Audio Messages", + "audioNotificationsSettingsTitle": "Audio Notifications", + "audioPermissionNeeded": "You can enable microphone access under: Settings (Gear icon) => Privacy", + "audioPermissionNeededTitle": "Microphone Access Required", + "autoUpdateDownloadButtonLabel": "Download", + "autoUpdateDownloadedMessage": "Update has been downloaded.", + "autoUpdateDownloadInstructions": "Would you like to download the update?", + "autoUpdateLaterButtonLabel": "Later", + "autoUpdateNewVersionInstructions": "Press Restart Session to apply the updates.", + "autoUpdateNewVersionMessage": "There is a new version of Session available.", + "autoUpdateNewVersionTitle": "Session update available", + "autoUpdateRestartButtonLabel": "Restart Session", + "autoUpdateSettingDescription": "Automatically check for updates on startup.", + "autoUpdateSettingTitle": "Auto Update", + "banUser": "Ban User", + "banUserAndDeleteAll": "Ban and Delete All", + "blindedMsgReqsSettingDesc": "Allow message requests from Community conversations.", + "blindedMsgReqsSettingTitle": "Community Message Requests", + "block": "Block", + "blocked": "Blocked", + "blockedSettingsTitle": "Blocked Contacts", + "callMediaPermissionsDescription": "Enables voice and video calls to and from other users.", + "callMediaPermissionsDialogContent": "Your IP address is visible to your call partner and an Oxen Foundation server while using beta calls. Are you sure you want to enable Voice and Video Calls?", + "callMediaPermissionsDialogTitle": "Voice and Video Calls (Beta)", + "callMediaPermissionsTitle": "Voice and Video Calls (Beta)", + "callMissed": "Missed call from $name$", + "callMissedCausePermission": "Call missed from '$name$' because you need to enable the 'Voice and video calls' permission in the Privacy Settings.", + "callMissedNotApproved": "Call missed from '$name$' as you haven't approved this conversation yet. Send a message to them first.", + "callMissedTitle": "Call missed", + "cameraPermissionNeeded": "You can enable the 'Voice and video calls' permission in the Privacy Settings.", + "cameraPermissionNeededTitle": "Voice/Video Call permissions required", + "cancel": "Cancel", + "cannotMixImageAndNonImageAttachments": "Sorry, you cannot mix images with other file types in one message", + "cannotRemoveCreatorFromGroup": "Cannot remove this user", + "cannotRemoveCreatorFromGroupDesc": "You cannot remove this user as they are the creator of the group.", "cannotUpdate": "Cannot Update", "cannotUpdateDetail": "Session Desktop failed to update, but there is a new version available. Please go to https://getsession.org/ and install the new version manually, then either contact support or file a bug about this problem.", - "ok": "OK", - "cancel": "Cancel", + "changeAccountPasswordDescription": "Change the password required to unlock Session.", + "changeAccountPasswordTitle": "Change Password", + "changeNickname": "Change Nickname", + "changeNicknameMessage": "Enter a nickname for this user", + "changePassword": "Change Password", + "changePasswordInvalid": "The old password you entered is incorrect", + "changePasswordTitle": "Password Changed", + "changePasswordToastDescription": "Your password has been changed. Please keep it safe.", + "chooseAnAction": "Choose an action to start a conversation", + "classicDarkThemeTitle": "Classic Dark", + "classicLightThemeTitle": "Classic Light", + "clear": "Clear", + "clearAll": "Clear All", + "clearAllConfirmationBody": "Are you sure you want to clear all message requests?", + "clearAllConfirmationTitle": "Clear All Message Requests", + "clearAllData": "Clear All Data", + "clearAllReactions": "Are you sure you want to clear all $emoji$ ?", + "clearDataSettingsTitle": "Clear Data", + "clearDevice": "Clear Device", + "clearNickname": "Clear Nickname", + "clickToTrustContact": "Click to download media", "close": "Close", + "closedGroupInviteFailMessage": "Unable to successfully invite a group member", + "closedGroupInviteFailMessagePlural": "Unable to successfully invite all group members", + "closedGroupInviteFailTitle": "Group Invitation Failed", + "closedGroupInviteFailTitlePlural": "Group Invitations Failed", + "closedGroupInviteOkText": "Retry invitations", + "closedGroupInviteSuccessMessage": "Successfully invited group members", + "closedGroupInviteSuccessTitle": "Group Invitation Succeeded", + "closedGroupInviteSuccessTitlePlural": "Group Invitations Completed", + "closedGroupMaxSize": "A group cannot have more than 100 members", + "confirm": "Confirm", + "confirmNewPassword": "Confirm new password", + "confirmPassword": "Confirm password", + "connectingToServer": "Connecting...", + "connectToServerFail": "Couldn't join community", + "connectToServerSuccess": "Successfully connected to community", + "contactAvatarAlt": "Avatar for contact $name$", + "contactsHeader": "Contacts", + "contextMenuNoSuggestions": "No Suggestions", "continue": "Continue", - "error": "Error", + "conversationsHeader": "Contacts and Groups: $count$", + "conversationsNone": "You don't have any conversations yet", + "conversationsSettingsTitle": "Conversations", + "copiedToClipboard": "Copied", + "copyErrorAndQuit": "Copy error and quit", + "copyMessage": "Copy message text", + "copyOpenGroupURL": "Copy Group URL", + "accountIDCopy": "Copy Account ID", + "couldntFindServerMatching": "Couldn't find the corresponding Community server", + "create": "Create", + "createClosedGroupNamePrompt": "Group Name", + "createClosedGroupPlaceholder": "Enter a group name", + "createConversationNewContact": "Create a conversation with a new contact", + "createConversationNewGroup": "Create a group with existing contacts", + "createGroup": "Create Group", + "createPassword": "Create your password", + "databaseError": "Database Error", + "debugLog": "Debug Log", + "debugLogExplanation": "This log will be saved to your desktop.", + "decline": "Decline", + "declineRequestMessage": "Are you sure you want to decline this message request?", "delete": "Delete", - "hide": "Hide", - "messageDeletionForbidden": "You don’t have permission to delete others’ messages", - "deleteJustForMe": "Delete just for me", - "deleteForEveryone": "Delete for everyone", - "deleteMessagesQuestion": "Delete $count$ messages?", - "deleteMessageQuestion": "Delete this message?", - "deleteMessages": "Delete Messages", - "deleteMessagesConfirmation": "Permanently delete the messages in this conversation?", - "hideConversation": "Hide Conversation", - "hideNoteToSelfConfirmation": "Are you sure you want to hide your Note to Self conversation?", + "deleteAccountFromLogin": "Are you sure you want to clear your device?", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", + "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "deleteConversation": "Delete Conversation", "deleteConversationConfirmation": "Are you sure you want to delete your conversation with $name$?", "deleteConversationFailed": "Failed to delete the Conversation!", "deleteConversationFailedPleaseTryAgain": "Unable to delete the conversation, please try again", - "leaving": "Leaving...", "deleted": "$count$ deleted", - "messageDeletedPlaceholder": "This message has been deleted", - "from": "From:", - "to": "To:", - "sent": "Sent", - "sending": "Sending", - "received": "Received", - "sendMessage": "Message", - "groupMembers": "Members", - "moreInformation": "More information", - "failed": "Failed", - "failedToSendMessage": "Failed to send message", - "read": "Read", - "resend": "Resend", - "clear": "Clear", - "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages and contacts.", - "deleteAccountFromLogin": "Are you sure you want to clear your device?", - "deleteContactConfirmation": "Are you sure you want to delete this conversation?", - "quoteThumbnailAlt": "Thumbnail of image from quoted message", - "imageAttachmentAlt": "Image attached to message", - "videoAttachmentAlt": "Screenshot of video in message", - "lightboxImageAlt": "Image sent in conversation", - "imageCaptionIconAlt": "Icon showing that this image has a caption", - "addACaption": "Add a caption...", - "copySessionID": "Copy Session ID", - "copyOpenGroupURL": "Copy Group URL", - "save": "Save", - "saveLogToDesktop": "Save log to desktop", - "saved": "Saved", - "tookAScreenshot": "$name$ took a screenshot", - "savedTheFile": "Media saved by $name$", - "linkPreviewsTitle": "Send Link Previews", - "linkPreviewDescription": "Generate link previews for supported URLs.", - "linkPreviewsConfirmMessage": "You will not have full metadata protection when sending link previews.", - "mediaPermissionsTitle": "Microphone", - "mediaPermissionsDescription": "Allow access to microphone.", - "spellCheckTitle": "Spell Check", - "spellCheckDescription": "Enable spell check when typing messages.", - "spellCheckDirty": "You must restart Session to apply your new settings", - "readReceiptSettingDescription": "Send read receipts in one-to-one chats.", - "readReceiptSettingTitle": "Read Receipts", - "typingIndicatorsSettingDescription": "See and share typing indicators in one-to-one chats.", - "typingIndicatorsSettingTitle": "Typing Indicators", - "zoomFactorSettingTitle": "Zoom Factor", - "themesSettingTitle": "Themes", - "primaryColor": "Primary Colour", - "primaryColorGreen": "Primary color green", - "primaryColorBlue": "Primary color blue", - "primaryColorYellow": "Primary color yellow", - "primaryColorPink": "Primary color pink", - "primaryColorPurple": "Primary color purple", - "primaryColorOrange": "Primary color orange", - "primaryColorRed": "Primary color red", - "classicDarkThemeTitle": "Classic Dark", - "classicLightThemeTitle": "Classic Light", - "oceanDarkThemeTitle": "Ocean Dark", - "oceanLightThemeTitle": "Ocean Light", - "pruneSettingTitle": "Trim Communities", - "pruneSettingDescription": "Delete messages older than 6 months from Communities that have over 2,000 messages.", - "enable": "Enable", - "keepDisabled": "Keep disabled", - "notificationSettingsDialog": "The information shown in notifications.", - "nameAndMessage": "Name & Content", - "noNameOrMessage": "No name or content", - "nameOnly": "Name Only", - "newMessage": "New Message", - "createConversationNewContact": "Create a conversation with a new contact", - "createConversationNewGroup": "Create a group with existing contacts", - "joinACommunity": "Join a community", - "chooseAnAction": "Choose an action to start a conversation", - "newMessages": "New Messages", - "notificationMostRecentFrom": "Most recent from: $name$", - "notificationFrom": "From:", - "notificationMostRecent": "Most recent:", - "sendFailed": "Send Failed", - "mediaMessage": "Media message", - "messageBodyMissing": "Please enter a message body.", - "messageBody": "Message body", - "unblockToSend": "Unblock this contact to send a message.", - "unblockGroupToSend": "This group is blocked. Unblock it if you would like to send a message.", - "timer": "Timer", - "timerModeRead": "read", - "timerModeSent": "sent", - "confirm": "Confirm", - "messageHash": "Message Hash", - "serverId": "Server ID", - "expirationType": "Expiration Type", - "expirationDuration": "Expiration Duration", - "disappears": "Disappears", - "messageWillDisappear": "Messages will disappear in $countAndUnit$", - "followSetting": "Follow Setting", - "followSettingDisabled": "Messages you send will no longer disappear. Are you sure you want to turn off disappearing messages?", - "followSettingTimeAndType": "Set your messages to disappear $time$ after they have been $type$?", - "youChangedTheTimer": "You have set messages to disappear $time$ after they have been $mode$", - "youChangedTheTimerLegacy": "You set the disappearing message timer to $time$", - "theyChangedTheTimer": "$name$ has set messages to disappear $time$ after they have been $mode$", - "theyChangedTheTimerLegacy": "$name$ set the disappearing message timer to $time$", - "timerOption_0_seconds": "Off", - "timerOption_5_seconds": "5 seconds", - "timerOption_10_seconds": "10 seconds", - "timerOption_30_seconds": "30 seconds", - "timerOption_1_minute": "1 minute", - "timerOption_5_minutes": "5 minutes", - "timerOption_30_minutes": "30 minutes", - "timerOption_1_hour": "1 hour", - "timerOption_6_hours": "6 hours", - "timerOption_12_hours": "12 hours", - "timerOption_1_day": "1 day", - "timerOption_1_week": "1 week", - "timerOption_2_weeks": "2 weeks", - "timerOption_0_seconds_abbreviated": "off", - "timerOption_5_seconds_abbreviated": "5s", - "timerOption_10_seconds_abbreviated": "10s", - "timerOption_30_seconds_abbreviated": "30s", - "timerOption_1_minute_abbreviated": "1m", - "timerOption_5_minutes_abbreviated": "5m", - "timerOption_30_minutes_abbreviated": "30m", - "timerOption_1_hour_abbreviated": "1h", - "timerOption_6_hours_abbreviated": "6h", - "timerOption_12_hours_abbreviated": "12h", - "timerOption_1_day_abbreviated": "1d", - "timerOption_1_week_abbreviated": "1w", - "timerOption_2_weeks_abbreviated": "2w", + "deleteForEveryone": "Delete for everyone", + "deleteJustForMe": "Delete just for me", + "deleteMessageQuestion": "Delete this message?", + "deleteMessages": "Delete Messages", + "deleteMessagesConfirmation": "Permanently delete the messages in this conversation?", + "deleteMessagesQuestion": "Delete $count$ messages?", + "destination": "Destination", + "device": "Device", + "deviceOnly": "Clear Device Only", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionQuestion": "Would you like to clear this device only, or delete your data from the network as well?", + "disabledDisappearingMessages": "$name$ has turned off disappearing messages.", "disappearingMessages": "Disappearing messages", - "disappearingMessagesModeOutdated": "$name$ is using an outdated client. Disappearing messages may not work as expected.", - "disappearingMessagesModeLabel": "Delete Type", - "disappearingMessagesModeOff": "Off", + "disappearingMessagesDisabled": "Disappearing messages disabled", "disappearingMessagesModeAfterRead": "Disappear After Read", "disappearingMessagesModeAfterReadSubtitle": "Messages delete after they have been read.", "disappearingMessagesModeAfterSend": "Disappear After Send", "disappearingMessagesModeAfterSendSubtitle": "Messages delete after they have been sent.", + "disappearingMessagesModeLabel": "Delete Type", "disappearingMessagesModeLegacy": "Legacy", "disappearingMessagesModeLegacySubtitle": "Original version of disappearing messages.", - "disappearingMessagesDisabled": "Disappearing messages disabled", - "disabledDisappearingMessages": "$name$ has turned off disappearing messages.", - "youDisabledDisappearingMessages": "You have turned off disappearing messages.", - "youDisabledYourDisappearingMessages": "You turned off disappearing messages. Messages you send will no longer disappear.", - "youSetYourDisappearingMessages": "You set your messages to disappear $time$ after they have been $type$.", - "theyDisabledTheirDisappearingMessages": "$name$ has turned off disappearing messages. Messages they send will no longer disappear.", - "theySetTheirDisappearingMessages": "$name$ has set their messages to disappear $time$ after they have been $type$.", - "timerSetTo": "Disappearing message time set to $time$", - "set": "Set", - "changeNickname": "Change Nickname", - "clearNickname": "Clear Nickname", - "nicknamePlaceholder": "New Nickname", - "changeNicknameMessage": "Enter a nickname for this user", - "noteToSelf": "Note to Self", - "savedMessages": "Saved Messages", - "hideMenuBarTitle": "Hide Menu Bar", - "hideMenuBarDescription": "Toggle system menu bar visibility.", - "matchThemeSystemSettingTitle": "Auto dark-mode", - "matchThemeSystemSettingDescription": "Match system settings", - "startConversation": "Start New Conversation", - "invalidNumberError": "Please check the Session ID or ONS name and try again", + "disappearingMessagesModeOff": "Off", + "disappearingMessagesModeOutdated": "$name$ is using an outdated client. Disappearing messages may not work as expected.", + "disappears": "Disappears", + "displayName": "Display Name", + "displayNameDescription": "It can be your real name, an alias, or anything else you like — and you can change it any time.", + "displayNameEmpty": "Please enter a display name", + "displayNameErrorDescriptionShorter": "Please pick a shorter display name", + "displayNameErrorNew": "We were unable to load your display name. Please enter a new display name to continue.", + "displayNameNew": "Pick a new display name", + "displayNamePick": "Pick your display name", + "displayNameTooLong": "Display name is too long", + "document": "Document", + "documents": "Documents", + "documentsEmptyState": "No documents", + "done": "Done", + "downloadAttachment": "Download Attachment", + "duration": "Duration", + "editGroup": "Edit group", + "editGroupName": "Edit group name", + "editMenuCopy": "Copy", + "editMenuCut": "Cut", + "editMenuDeleteContact": "Delete Contact", + "editMenuDeleteGroup": "Delete Group", + "editMenuPaste": "Paste", + "editMenuRedo": "Redo", + "editMenuSelectAll": "Select all", + "editMenuUndo": "Undo", + "editProfileModalTitle": "Profile", + "emptyGroupNameError": "Please enter a group name", + "enable": "Enable", + "endCall": "End call", + "enterAnOpenGroupURL": "Enter Community URL", + "enterDisplayName": "Enter a display name", + "enterKeySettingDescription": "Function of the enter key when typing in a conversation.", + "enterKeySettingTitle": "Enter Key", + "enterNewLineDescription": "SHIFT + ENTER sends a message, ENTER starts a new line", + "enterNewPassword": "Please enter your new password", + "enterPassword": "Please enter your password", + "recoveryPasswordEnter": "Enter your recovery password", + "enterSendNewMessageDescription": "ENTER sends a message, SHIFT + ENTER starts a new line", + "accountIdEnter": "Enter Account ID", + "accountIdEnterYourFriends": "Enter your friend's Account ID or ONS", + "entireAccount": "Clear Device and Network", + "error": "Error", + "establishingConnection": "Establishing connection...", + "expandedReactionsText": "Show Less", + "expirationDuration": "Expiration Duration", + "expirationType": "Expiration Type", + "failed": "Failed", "failedResolveOns": "Failed to resolve ONS name", - "autoUpdateSettingTitle": "Auto Update", - "autoUpdateSettingDescription": "Automatically check for updates on startup.", - "autoUpdateNewVersionTitle": "Session update available", - "autoUpdateNewVersionMessage": "There is a new version of Session available.", - "autoUpdateNewVersionInstructions": "Press Restart Session to apply the updates.", - "autoUpdateRestartButtonLabel": "Restart Session", - "autoUpdateLaterButtonLabel": "Later", - "autoUpdateDownloadButtonLabel": "Download", - "autoUpdateDownloadedMessage": "Update has been downloaded.", - "autoUpdateDownloadInstructions": "Would you like to download the update?", - "leftTheGroup": "$name$ has left the group.", - "multipleLeftTheGroup": "$name$ left the group", - "updatedTheGroup": "Group updated", - "titleIsNow": "Group name is now '$name$'.", + "failedToAddAsModerator": "Failed to add user as admin", + "failedToRemoveFromModerator": "Failed to remove user from the admin list", + "failedToSendMessage": "Failed to send message", + "faq": "FAQ", + "fileId": "File ID", + "fileSize": "File Size", + "fileSizeWarning": "Attachment exceeds size limits for the type of message you're sending.", + "fileType": "File Type", + "followSetting": "Follow Setting", + "followSettingDisabled": "Messages you send will no longer disappear. Are you sure you want to turn off disappearing messages?", + "followSettingTimeAndType": "Set your messages to disappear $time$ after they have been $type$?", + "from": "From:", + "getStarted": "Get started", + "goToReleaseNotes": "Go to Release Notes", + "goToSupportPage": "Go to Support Page", + "groupMembers": "Members", + "groupNamePlaceholder": "Group Name", + "helpSettingsTitle": "Help", + "helpUsTranslateSession": "Translate Session", + "hide": "Hide", + "hideBanner": "Hide", + "hideConversation": "Hide Conversation", + "hideMenuBarDescription": "Toggle system menu bar visibility.", + "hideMenuBarTitle": "Hide Menu Bar", + "hideNoteToSelfConfirmation": "Are you sure you want to hide your Note to Self conversation?", + "hideRequestBanner": "Hide Message Request Banner", + "hideRequestBannerDescription": "Hide the Message Request banner until you receive a new message request.", + "iAmSure": "I am sure", + "image": "Image", + "imageAttachmentAlt": "Image attached to message", + "imageCaptionIconAlt": "Icon showing that this image has a caption", + "incomingCallFrom": "Incoming call from '$name$'", + "incomingError": "Error handling incoming message", + "invalidGroupNameTooLong": "Please enter a shorter group name", + "invalidGroupNameTooShort": "Please enter a group name", + "onsErrorNotRecognised": "We couldn't recognise this ONS. Please check it and try again.", + "invalidOldPassword": "Old password is invalid", + "invalidOpenGroupUrl": "Invalid URL", + "invalidPassword": "Invalid password", + "invalidPubkeyFormat": "Invalid Pubkey Format", + "invalidAccountId": "Invalid Account ID", + "inviteContacts": "Invite Contacts", + "join": "Join", + "joinACommunity": "Join a community", "joinedTheGroup": "$name$ joined the group.", - "multipleJoinedTheGroup": "$name$ joined the group.", + "joinOpenGroup": "Join Community", + "joinOpenGroupAfterInvitationConfirmationDesc": "Are you sure you want to join the $roomName$ community?", + "joinOpenGroupAfterInvitationConfirmationTitle": "Join $roomName$?", + "keepDisabled": "Keep disabled", "kickedFromTheGroup": "$name$ was removed from the group.", - "multipleKickedFromTheGroup": "$name$ were removed from the group.", - "block": "Block", - "unblock": "Unblock", - "unblocked": "Unblocked", - "blocked": "Blocked", - "blockedSettingsTitle": "Blocked Contacts", - "conversationsSettingsTitle": "Conversations", - "unbanUser": "Unban User", - "userUnbanned": "User unbanned successfully", - "userUnbanFailed": "Unban failed!", - "banUser": "Ban User", - "banUserAndDeleteAll": "Ban and Delete All", - "userBanned": "Banned successfully", - "userBanFailed": "Ban failed!", + "learnMore": "Learn more", "leave": "Leave", - "leaveGroup": "Leave Group", "leaveAndRemoveForEveryone": "Leave Group and Remove for Everyone", + "leaveCommunity": "Leave Community", + "leaveCommunityFailed": "Failed to leave Community!", + "leaveCommunityFailedPleaseTryAgain": "Unable to leave the Community, please try again", + "leaveGroup": "Leave Group", "leaveGroupConfirmation": "Are you sure you want to leave $name$?", "leaveGroupConfirmationAdmin": "As you are the admin of this group, if you leave it it will be removed for every current members. Are you sure you want to leave this group?", - "leaveGroupConrirmationOnlyAdminLegacy": "Are you sure you want to leave $name$? This will deactivate the group for all members.", "leaveGroupConfirmationOnlyAdmin": "You are the only admin in $name$", "leaveGroupConfirmationOnlyAdminWarning": "Group settings and members cannot be changed without an admin", + "leaveGroupConrirmationOnlyAdminLegacy": "Are you sure you want to leave $name$? This will deactivate the group for all members.", "leaveGroupFailed": "Failed to leave Group!", "leaveGroupFailedPleaseTryAgain": "Unable to leave the Group, please try again", - "leaveCommunity": "Leave Community", - "leaveCommunityFailed": "Failed to leave Community!", - "leaveCommunityFailedPleaseTryAgain": "Unable to leave the Community, please try again", - "cannotRemoveCreatorFromGroup": "Cannot remove this user", - "cannotRemoveCreatorFromGroupDesc": "You cannot remove this user as they are the creator of the group.", - "noContactsForGroup": "You don't have any contacts yet", - "failedToAddAsModerator": "Failed to add user as admin", - "failedToRemoveFromModerator": "Failed to remove user from the admin list", - "copyMessage": "Copy message text", - "selectMessage": "Select message", - "editGroup": "Edit group", - "editGroupName": "Edit group name", - "updateGroupDialogTitle": "Updating $name$...", - "showRecoveryPhrase": "Recovery Phrase", - "yourSessionID": "Your Session ID", - "setAccountPasswordTitle": "Password", - "setAccountPasswordDescription": "Require password to unlock Session.", - "changeAccountPasswordTitle": "Change Password", - "changeAccountPasswordDescription": "Change the password required to unlock Session.", - "removeAccountPasswordTitle": "Remove Password", - "removeAccountPasswordDescription": "Remove the password required to unlock Session.", - "enterPassword": "Please enter your password", - "confirmPassword": "Confirm password", - "enterNewPassword": "Please enter your new password", - "confirmNewPassword": "Confirm new password", - "showRecoveryPhrasePasswordRequest": "Please enter your password", - "recoveryPhraseSavePromptMain": "Your recovery phrase is the master key to your Session ID — you can use it to restore your Session ID if you lose access to your device. Store your recovery phrase in a safe place, and don't give it to anyone.", - "invalidOpenGroupUrl": "Invalid URL", - "copiedToClipboard": "Copied", - "passwordViewTitle": "Enter Password", - "password": "Password", - "setPassword": "Set Password", - "changePassword": "Change Password", - "createPassword": "Create your password", - "removePassword": "Remove Password", + "leaving": "Leaving...", + "leftTheGroup": "$name$ has left the group.", + "lightboxImageAlt": "Image sent in conversation", + "linkPreviewDescription": "Generate link previews for supported URLs.", + "linkPreviewsConfirmMessage": "You will not have full metadata protection when sending link previews.", + "linkPreviewsTitle": "Send Link Previews", + "linkVisitWarningMessage": "Are you sure you want to open $url$ in your browser?", + "linkVisitWarningTitle": "Open this link in your browser?", + "loadAccountProgressMessage": "Loading your account", + "loading": "Loading...", + "mainMenuEdit": "&Edit", + "mainMenuFile": "&File", + "mainMenuHelp": "&Help", + "mainMenuView": "&View", + "mainMenuWindow": "&Window", + "markAllAsRead": "Mark Read", + "markUnread": "Mark Unread", + "matchThemeSystemSettingDescription": "Match system settings", + "matchThemeSystemSettingTitle": "Auto dark-mode", + "maximumAttachments": "Maximum number of attachments reached. Please send remaining attachments in a separate message.", "maxPasswordAttempts": "Invalid Password. Would you like to reset the database?", - "typeInOldPassword": "Please enter your current password", - "invalidOldPassword": "Old password is invalid", - "invalidPassword": "Invalid password", - "noGivenPassword": "Please enter your password", - "passwordsDoNotMatch": "Passwords do not match", - "setPasswordInvalid": "Passwords do not match", - "changePasswordInvalid": "The old password you entered is incorrect", - "removePasswordInvalid": "Incorrect password", - "setPasswordTitle": "Password Set", - "changePasswordTitle": "Password Changed", - "removePasswordTitle": "Password Removed", - "setPasswordToastDescription": "Your password has been set. Please keep it safe.", - "changePasswordToastDescription": "Your password has been changed. Please keep it safe.", - "removePasswordToastDescription": "Your password has been removed.", - "publicChatExists": "You are already connected to this community", - "connectToServerFail": "Couldn't join community", - "connectingToServer": "Connecting...", - "connectToServerSuccess": "Successfully connected to community", - "setPasswordFail": "Failed to set password", - "passwordLengthError": "Password must be between 6 and 64 characters long", - "passwordTypeError": "Password must be a string", - "passwordCharacterError": "Password must only contain letters, numbers and symbols", - "remove": "Remove", - "invalidSessionId": "Invalid Session ID", - "invalidPubkeyFormat": "Invalid Pubkey Format", - "emptyGroupNameError": "Please enter a group name", - "editProfileModalTitle": "Profile", - "groupNamePlaceholder": "Group Name", - "inviteContacts": "Invite Contacts", - "addModerator": "Add Admin", - "addModerators": "Add Admins", - "removeModerators": "Remove Admins", - "addAsModerator": "Add as Admin", - "removeFromModerators": "Remove From Admins", - "add": "Add", - "addingContacts": "Adding contacts to $name$", - "noContactsToAdd": "No contacts to add", - "noMembersInThisGroup": "No other members in this group", - "noModeratorsToRemove": "no admins to remove", - "onlyAdminCanRemoveMembers": "You are not the creator", - "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", - "startInTrayTitle": "Keep in System Tray", - "startInTrayDescription": "Keep Session running in the background when you close the window.", - "yourUniqueSessionID": "Say hello to your Session ID", - "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", - "getStarted": "Get started", - "createSessionID": "Create Session ID", - "recoveryPhrase": "Recovery Phrase", - "enterRecoveryPhrase": "Enter your recovery phrase", - "displayName": "Display Name", - "anonymous": "Anonymous", - "removeResidueMembers": "Clicking ok will also remove those members as they left the group.", - "enterDisplayName": "Enter a display name", - "continueYourSession": "Continue Your Session", - "linkDevice": "Link Device", - "restoreUsingRecoveryPhrase": "Restore your account", - "or": "or", - "welcomeToYourSession": "Welcome to your Session", - "searchFor...": "Search conversations and contacts", - "searchForContactsOnly": "Search for contacts", - "enterSessionID": "Enter Session ID", - "enterSessionIDOfRecipient": "Enter your contact's Session ID or ONS", - "message": "Message", - "appearanceSettingsTitle": "Appearance", - "privacySettingsTitle": "Privacy", - "notificationsSettingsTitle": "Notifications", - "audioNotificationsSettingsTitle": "Audio Notifications", - "notificationsSettingsContent": "Notification Content", - "notificationPreview": "Preview", - "recoveryPhraseEmpty": "Enter your recovery phrase", - "displayNameEmpty": "Please enter a display name", - "displayNameTooLong": "Display name is too long", + "media": "Media", + "mediaEmptyState": "No media", + "mediaMessage": "Media message", + "mediaPermissionsDescription": "Allow access to microphone.", + "mediaPermissionsTitle": "Microphone", "members": "$count$ members", - "activeMembers": "$count$ active members", - "join": "Join", - "joinOpenGroup": "Join Community", - "createGroup": "Create Group", - "create": "Create", - "createClosedGroupNamePrompt": "Group Name", - "createClosedGroupPlaceholder": "Enter a group name", - "openGroupURL": "Community URL", - "enterAnOpenGroupURL": "Enter Community URL", + "message": "Message", + "messageBody": "Message body", + "messageBodyMissing": "Please enter a message body.", + "messageDeletedPlaceholder": "This message has been deleted", + "messageDeletionForbidden": "You don’t have permission to delete others’ messages", + "messageHash": "Message Hash", + "messageInfo": "Message Info", + "messageRequestAccepted": "Your message request has been accepted", + "messageRequestAcceptedOurs": "You have accepted $name$'s message request", + "messageRequestAcceptedOursNoName": "You have accepted the message request", + "messageRequestPending": "Your message request is currently pending", + "messageRequests": "Message Requests", + "messagesHeader": "Conversations", + "messageWillDisappear": "Messages will disappear in $countAndUnit$", + "moreInformation": "More information", + "multipleJoinedTheGroup": "$name$ joined the group.", + "multipleKickedFromTheGroup": "$name$ were removed from the group.", + "multipleLeftTheGroup": "$name$ left the group", + "mustBeApproved": "This conversation must be accepted to use this feature", + "nameAndMessage": "Name & Content", + "nameOnly": "Name Only", + "newMessage": "New Message", + "newMessages": "New Messages", "next": "Next", - "invalidGroupNameTooShort": "Please enter a group name", - "invalidGroupNameTooLong": "Please enter a shorter group name", - "pickClosedGroupMember": "Please pick at least 1 group member", - "closedGroupMaxSize": "A group cannot have more than 100 members", + "nicknamePlaceholder": "New Nickname", + "noAudioInputFound": "No audio input found", + "noAudioOutputFound": "No audio output found", "noBlockedContacts": "You have no blocked contacts.", - "userAddedToModerators": "User added to admin list", - "userRemovedFromModerators": "User removed from admin list", - "orJoinOneOfThese": "Or join one of these...", - "helpUsTranslateSession": "Translate Session", - "closedGroupInviteFailTitle": "Group Invitation Failed", - "closedGroupInviteFailTitlePlural": "Group Invitations Failed", - "closedGroupInviteFailMessage": "Unable to successfully invite a group member", - "closedGroupInviteFailMessagePlural": "Unable to successfully invite all group members", - "closedGroupInviteOkText": "Retry invitations", - "closedGroupInviteSuccessTitlePlural": "Group Invitations Completed", - "closedGroupInviteSuccessTitle": "Group Invitation Succeeded", - "closedGroupInviteSuccessMessage": "Successfully invited group members", + "noCameraFound": "No camera found", + "noContactsForGroup": "You don't have any contacts yet", + "noContactsToAdd": "No contacts to add", + "noGivenPassword": "Please enter your password", + "noMediaUntilApproved": "You cannot send attachments until the conversation is approved", + "noMembersInThisGroup": "No other members in this group", + "noMessageRequestsPending": "No pending message requests", + "noMessagesInBlindedDisabledMsgRequests": "$name$ has message requests from Community conversations turned off, so you cannot send them a message.", + "noMessagesInEverythingElse": "You have no messages from $name$. Send a message to start the conversation!", + "noMessagesInNoteToSelf": "You have no messages in $name$.", + "noMessagesInReadOnly": "There are no messages in $name$.", + "noModeratorsToRemove": "no admins to remove", + "noNameOrMessage": "No name or content", + "noSearchResults": "No results found for \"$searchTerm$\"", + "notApplicable": "N/A", + "noteToSelf": "Note to Self", "notificationForConvo": "Notifications", "notificationForConvo_all": "All", "notificationForConvo_disabled": "Disabled", "notificationForConvo_mentions_only": "Mentions only", - "onionPathIndicatorTitle": "Path", - "onionPathIndicatorDescription": "Session hides your IP by bouncing your messages through several Service Nodes in Session's decentralized network. These are the countries your connection is currently being bounced through:", - "unknownCountry": "Unknown Country", - "device": "Device", - "destination": "Destination", - "learnMore": "Learn more", - "linkVisitWarningTitle": "Open this link in your browser?", - "linkVisitWarningMessage": "Are you sure you want to open $url$ in your browser?", - "open": "Open", - "audioMessageAutoplayTitle": "Autoplay Audio Messages", - "audioMessageAutoplayDescription": "Autoplay consecutive audio messages.", - "enterKeySettingTitle": "Enter Key", - "enterKeySettingDescription": "Function of the enter key when typing in a conversation.", - "enterSendNewMessageDescription": "ENTER sends a message, SHIFT + ENTER starts a new line", - "enterNewLineDescription": "SHIFT + ENTER sends a message, ENTER starts a new line", - "clickToTrustContact": "Click to download media", - "trustThisContactDialogTitle": "Trust $name$?", - "trustThisContactDialogDescription": "Are you sure you want to download media sent by $name$?", - "pinConversation": "Pin Conversation", - "unpinConversation": "Unpin Conversation", - "markUnread": "Mark Unread", - "showUserDetails": "Show User Details", - "sendRecoveryPhraseTitle": "Sending Recovery Phrase", - "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", - "dialogClearAllDataDeletionFailedTitle": "Data not deleted", - "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", - "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", - "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", - "dialogClearAllDataDeletionQuestion": "Would you like to clear this device only, or delete your data from the network as well?", - "clearDevice": "Clear Device", - "tryAgain": "Try Again", - "areYouSureClearDevice": "Are you sure you want to clear your device?", - "deviceOnly": "Clear Device Only", - "entireAccount": "Clear Device and Network", - "areYouSureDeleteDeviceOnly": "Are you sure you want to delete your device data only?", - "areYouSureDeleteEntireAccount": "Are you sure you want to delete your data from the network? If you continue, you will not be able to restore your messages or contacts.", - "iAmSure": "I am sure", + "notificationFrom": "From:", + "notificationMostRecent": "Most recent:", + "notificationMostRecentFrom": "Most recent from: $name$", + "notificationPreview": "Preview", + "notificationSettingsDialog": "The information shown in notifications.", + "notificationsSettingsContent": "Notification Content", + "notificationsSettingsTitle": "Notifications", "notificationSubtitle": "Notifications - $setting$", - "surveyTitle": "We'd Love Your Feedback", - "faq": "FAQ", - "support": "Support", - "clearAll": "Clear All", - "clearDataSettingsTitle": "Clear Data", - "messageRequests": "Message Requests", - "blindedMsgReqsSettingTitle": "Community Message Requests", - "blindedMsgReqsSettingDesc": "Allow message requests from Community conversations.", - "requestsSubtitle": "Pending Requests", - "requestsPlaceholder": "No requests", - "hideRequestBannerDescription": "Hide the Message Request banner until you receive a new message request.", - "incomingCallFrom": "Incoming call from '$name$'", - "ringing": "Ringing...", - "establishingConnection": "Establishing connection...", - "accept": "Accept", - "decline": "Decline", - "endCall": "End call", - "permissionsSettingsTitle": "Permissions", - "helpSettingsTitle": "Help", - "cameraPermissionNeededTitle": "Voice/Video Call permissions required", - "cameraPermissionNeeded": "You can enable the 'Voice and video calls' permission in the Privacy Settings.", - "unableToCall": "Cancel your ongoing call first", - "unableToCallTitle": "Cannot start new call", - "callMissed": "Missed call from $name$", - "callMissedTitle": "Call missed", - "noCameraFound": "No camera found", - "noAudioInputFound": "No audio input found", - "noAudioOutputFound": "No audio output found", - "callMediaPermissionsTitle": "Voice and Video Calls (Beta)", - "callMissedCausePermission": "Call missed from '$name$' because you need to enable the 'Voice and video calls' permission in the Privacy Settings.", - "callMissedNotApproved": "Call missed from '$name$' as you haven't approved this conversation yet. Send a message to them first.", - "callMediaPermissionsDescription": "Enables voice and video calls to and from other users.", - "callMediaPermissionsDialogContent": "Your IP address is visible to your call partner and an Oxen Foundation server while using beta calls. Are you sure you want to enable Voice and Video Calls?", - "callMediaPermissionsDialogTitle": "Voice and Video Calls (Beta)", - "startedACall": "You called $name$", - "answeredACall": "Call with $name$", - "trimDatabase": "Trim Database", - "trimDatabaseDescription": "Reduces your message database size to your last 10,000 messages.", - "trimDatabaseConfirmationBody": "Are you sure you want to delete your $deleteAmount$ oldest received messages?", - "pleaseWaitOpenAndOptimizeDb": "Please wait while your database is opened and optimized...", - "messageRequestPending": "Your message request is currently pending", - "messageRequestAccepted": "Your message request has been accepted", - "messageRequestAcceptedOurs": "You have accepted $name$'s message request", - "messageRequestAcceptedOursNoName": "You have accepted the message request", - "declineRequestMessage": "Are you sure you want to decline this message request?", - "respondingToRequestWarning": "Sending a message to this user will automatically accept their message request and reveal your Session ID.", - "hideRequestBanner": "Hide Message Request Banner", + "oceanDarkThemeTitle": "Ocean Dark", + "oceanLightThemeTitle": "Ocean Light", + "offline": "Offline", + "ok": "OK", + "onboardingAccountCreate": "Create account", + "onboardingAccountCreated": "Account Created", + "onboardingAccountExists": "I have an account", + "onboardingBubbleWelcomeToSession": "Welcome to Session", + "onboardingHitThePlusButton": "Hit the plus button to start a chat, create a group, or join an official community!", + "onboardingRecoveryPassword": "Enter your recovery password to load your account. If you haven't saved it, you can find it in your app settings.", + "onboardingTosPrivacy": "By using this service, you agree to our Terms of Service and Privacy Policy", + "oneNonImageAtATimeToast": "Sorry, there is a limit of one non-image attachment per message", + "onionPathIndicatorDescription": "Session hides your IP by bouncing your messages through several Service Nodes in Session's decentralized network. These are the countries your connection is currently being bounced through:", + "onionPathIndicatorTitle": "Path", + "onlyAdminCanRemoveMembers": "You are not the creator", + "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", + "onlyGroupAdminsCanChange": "Only group admins can change this setting.", + "open": "Open", + "openGroupInvitation": "Community invitation", + "openGroupURL": "Community URL", "openMessageRequestInbox": "Message Requests", - "noMessageRequestsPending": "No pending message requests", - "noMediaUntilApproved": "You cannot send attachments until the conversation is approved", - "mustBeApproved": "This conversation must be accepted to use this feature", - "youHaveANewFriendRequest": "You have a new friend request", - "clearAllConfirmationTitle": "Clear All Message Requests", - "clearAllConfirmationBody": "Are you sure you want to clear all message requests?", - "noMessagesInReadOnly": "There are no messages in $name$.", - "noMessagesInBlindedDisabledMsgRequests": "$name$ has message requests from Community conversations turned off, so you cannot send them a message.", - "noMessagesInNoteToSelf": "You have no messages in $name$.", - "noMessagesInEverythingElse": "You have no messages from $name$. Send a message to start the conversation!", - "hideBanner": "Hide", - "someOfYourDeviceUseOutdatedVersion": "Some of your devices are using outdated versions. Syncing may be unreliable until they are updated.", "openMessageRequestInboxDescription": "View your Message Request inbox", - "clearAllReactions": "Are you sure you want to clear all $emoji$ ?", - "expandedReactionsText": "Show Less", - "reactionNotification": "Reacts to a message with $emoji$", - "rateLimitReactMessage": "Slow down! You've sent too many emoji reacts. Try again soon", - "otherSingular": "$number$ other", + "or": "or", + "originalMessageNotFound": "Original message not found", + "orJoinOneOfThese": "Or join one of these...", "otherPlural": "$number$ others", + "otherSingular": "$number$ other", + "lockApp": "Lock App", + "passwordCharacterError": "Password must only contain letters, numbers and symbols", + "passwordLengthError": "Password must be between 6 and 64 characters long", + "passwordsDoNotMatch": "Passwords do not match", + "passwordTypeError": "Password must be a string", + "passwordViewTitle": "Enter Password", + "permissionsSettingsTitle": "Permissions", + "photo": "Photo", + "pickClosedGroupMember": "Please pick at least 1 group member", + "pinConversation": "Pin Conversation", + "pleaseWaitOpenAndOptimizeDb": "Please wait while your database is opened and optimized...", + "previewThumbnail": "Thumbnail link preview for $domain$", + "primaryColor": "Primary Colour", + "primaryColorBlue": "Primary color blue", + "primaryColorGreen": "Primary color green", + "primaryColorOrange": "Primary color orange", + "primaryColorPink": "Primary color pink", + "primaryColorPurple": "Primary color purple", + "primaryColorRed": "Primary color red", + "primaryColorYellow": "Primary color yellow", + "privacyPolicy": "Privacy Policy", + "privacySettingsTitle": "Privacy", + "pruneSettingDescription": "Delete messages older than 6 months from Communities that have over 2,000 messages.", + "pruneSettingTitle": "Trim Communities", + "publicChatExists": "You are already connected to this community", + "quoteThumbnailAlt": "Thumbnail of image from quoted message", + "rateLimitReactMessage": "Slow down! You've sent too many emoji reacts. Try again soon", + "reactionListCountPlural": "And $otherPlural$ have reacted $emoji$ to this message", + "reactionListCountSingular": "And $otherSingular$ has reacted $emoji$ to this message", + "reactionNotification": "Reacts to a message with $emoji$", "reactionPopup": "reacted with", + "reactionPopupMany": "$name$, $name2$, $name3$ &", "reactionPopupOne": "$name$", - "reactionPopupTwo": "$name$ & $name2$", "reactionPopupThree": "$name$, $name2$ & $name3$", - "reactionPopupMany": "$name$, $name2$, $name3$ &", - "reactionListCountSingular": "And $otherSingular$ has reacted $emoji$ to this message", - "reactionListCountPlural": "And $otherPlural$ have reacted $emoji$ to this message", + "reactionPopupTwo": "$name$ & $name2$", + "read": "Read", + "readReceiptSettingDescription": "Send read receipts in one-to-one chats.", + "readReceiptSettingTitle": "Read Receipts", + "received": "Received", + "recoveryPasswordErrorMessageGeneric": "Please check your recovery password and try again.", + "recoveryPasswordErrorMessageIncorrect": "Some of the words in your Recovery Password are incorrect. Please check and try again.", + "recoveryPasswordErrorMessageShort": "The Recovery Password you entered is not long enough. Please check and try again.", + "recoveryPhraseSavePromptMain": "Your recovery password is the master key to your Account ID — you can use it to restore your Account ID if you lose access to your device. Store your recovery password in a safe place, and don't give it to anyone.", + "remove": "Remove", + "removeAccountPasswordDescription": "Remove the password required to unlock Session.", + "removeAccountPasswordTitle": "Remove Password", + "removeFromModerators": "Remove From Admins", + "removeModerators": "Remove Admins", + "removePassword": "Remove Password", + "removePasswordInvalid": "Incorrect password", + "removePasswordTitle": "Password Removed", + "removePasswordToastDescription": "Your password has been removed.", + "removeResidueMembers": "Clicking ok will also remove those members as they left the group.", + "replyingToMessage": "Replying to:", + "replyToMessage": "Reply", + "reportIssue": "Report a Bug", + "requestsPlaceholder": "No requests", + "requestsSubtitle": "Pending Requests", + "resend": "Resend", + "resolution": "Resolution", + "messageRequestsAcceptDescription": "Sending a message to this user will automatically accept their message request and reveal your Account ID.", + "ringing": "Ringing...", + "save": "Save", + "saved": "Saved", + "savedMessages": "Saved Messages", + "savedTheFile": "Media saved by $name$", + "saveLogToDesktop": "Save log to desktop", + "saveRecoveryPassword": "Save your recovery password", + "saveRecoveryPasswordDescription": "Save your recovery password to make sure you don't lose access to your account.", + "searchFor...": "Search conversations and contacts", + "searchForContactsOnly": "Search for contacts", + "searchMessagesHeader": "Messages: $count$", + "selectMessage": "Select message", + "sendFailed": "Send Failed", + "sending": "Sending", + "sendMessage": "Message", + "recoveryPasswordWarningSendDescription": "This is your recovery password. If you send it to someone they'll have full access to your account.", + "warning": "Warning", + "sent": "Sent", + "serverId": "Server ID", + "sessionMessenger": "Session", + "sessionRecoveryPassword": "Recovery Password", + "set": "Set", + "setAccountPasswordDescription": "Require password to unlock Session.", + "setAccountPasswordTitle": "Password", "setDisplayPicture": "Set Display Picture", + "setPassword": "Set Password", + "setPasswordFail": "Failed to set password", + "setPasswordInvalid": "Passwords do not match", + "setPasswordTitle": "Password Set", + "setPasswordToastDescription": "Your password has been set. Please keep it safe.", "settingAppliesToEveryone": "This setting applies to everyone in this conversation.", "settingAppliesToYourMessages": "This setting applies to messages you send in this conversation.", - "onlyGroupAdminsCanChange": "Only group admins can change this setting.", - "messageInfo": "Message Info", - "fileId": "File ID", - "fileSize": "File Size", - "fileType": "File Type", - "resolution": "Resolution", - "duration": "Duration", - "notApplicable": "N/A", + "settingsHeader": "Settings", + "shareBugDetails": "Export your logs, then upload the file though Session's Help Desk.", + "show": "Show", + "showDebugLog": "Export Logs", + "passwordCreate": "Create your password", + "showUserDetails": "Show User Details", + "someOfYourDeviceUseOutdatedVersion": "Some of your devices are using outdated versions. Syncing may be unreliable until they are updated.", + "spellCheckDescription": "Enable spell check when typing messages.", + "spellCheckDirty": "You must restart Session to apply your new settings", + "spellCheckTitle": "Spell Check", + "stagedImageAttachment": "Draft image attachment: $path$", + "stagedPreviewThumbnail": "Draft thumbnail link preview for $domain$", + "startConversation": "Start New Conversation", + "startedACall": "You called $name$", + "startInTrayDescription": "Keep Session running in the background when you close the window.", + "startInTrayTitle": "Keep in System Tray", + "messageNewDescription": "Start a new conversation by entering someone's Account ID or scanning their QR code.", + "support": "Support", + "surveyTitle": "We'd Love Your Feedback", + "termsOfService": "Terms of Service", + "themesSettingTitle": "Themes", + "theyChangedTheTimer": "$name$ has set messages to disappear $time$ after they have been $mode$", + "theyChangedTheTimerLegacy": "$name$ set the disappearing message timer to $time$", + "theyDisabledTheirDisappearingMessages": "$name$ has turned off disappearing messages. Messages they send will no longer disappear.", + "theySetTheirDisappearingMessages": "$name$ has set their messages to disappear $time$ after they have been $type$.", + "thisMonth": "This Month", + "thisWeek": "This week", + "timer": "Timer", + "timerModeRead": "read", + "timerModeSent": "sent", + "timerOption_0_seconds": "Off", + "timerOption_0_seconds_abbreviated": "off", + "timerOption_10_seconds": "10 seconds", + "timerOption_10_seconds_abbreviated": "10s", + "timerOption_12_hours": "12 hours", + "timerOption_12_hours_abbreviated": "12h", + "timerOption_1_day": "1 day", + "timerOption_1_day_abbreviated": "1d", + "timerOption_1_hour": "1 hour", + "timerOption_1_hour_abbreviated": "1h", + "timerOption_1_minute": "1 minute", + "timerOption_1_minute_abbreviated": "1m", + "timerOption_1_week": "1 week", + "timerOption_1_week_abbreviated": "1w", + "timerOption_2_weeks": "2 weeks", + "timerOption_2_weeks_abbreviated": "2w", + "timerOption_30_minutes": "30 minutes", + "timerOption_30_minutes_abbreviated": "30m", + "timerOption_30_seconds": "30 seconds", + "timerOption_30_seconds_abbreviated": "30s", + "timerOption_5_minutes": "5 minutes", + "timerOption_5_minutes_abbreviated": "5m", + "timerOption_5_seconds": "5 seconds", + "timerOption_5_seconds_abbreviated": "5s", + "timerOption_6_hours": "6 hours", + "timerOption_6_hours_abbreviated": "6h", + "timerSetTo": "Disappearing message time set to $time$", + "titleIsNow": "Group name is now '$name$'.", + "to": "To:", + "today": "Today", + "tookAScreenshot": "$name$ took a screenshot", + "trimDatabase": "Trim Database", + "trimDatabaseConfirmationBody": "Are you sure you want to delete your $deleteAmount$ oldest received messages?", + "trimDatabaseDescription": "Reduces your message database size to your last 10,000 messages.", + "trustThisContactDialogDescription": "Are you sure you want to download media sent by $name$?", + "trustThisContactDialogTitle": "Trust $name$?", + "tryAgain": "Try Again", + "typeInOldPassword": "Please enter your current password", + "typingAlt": "Typing animation for this conversation", + "typingIndicatorsSettingDescription": "See and share typing indicators in one-to-one chats.", + "typingIndicatorsSettingTitle": "Typing Indicators", + "unableToCall": "Cancel your ongoing call first", + "unableToCallTitle": "Cannot start new call", + "unableToLoadAttachment": "Sorry, there was an error setting your attachment.", + "unbanUser": "Unban User", + "unblock": "Unblock", + "unblocked": "Unblocked", + "unblockGroupToSend": "This group is blocked. Unblock it if you would like to send a message.", + "unblockToSend": "Unblock this contact to send a message.", + "unknown": "Unknown", + "unknownCountry": "Unknown Country", "unknownError": "Unknown Error", - "waitOneMoment": "One moment please...", - "loadAccountProgressMessage": "Loading your account", - "onboardingTosPrivacy": "By using this service, you agree to our Terms of Service and Privacy Policy", + "unpinConversation": "Unpin Conversation", + "unreadMessages": "Unread Messages", + "updatedTheGroup": "Group updated", + "updateGroupDialogTitle": "Updating $name$...", "urlOpen": "Open URL", "urlOpenBrowser": "This will open in your browser.", - "termsOfService": "Terms of Service", - "privacyPolicy": "Privacy Policy", - "displayNamePick": "Pick your display name", - "displayNameDescription": "It can be your real name, an alias, or anything else you like — and you can change it any time.", - "displayNameErrorDescriptionShorter": "Please pick a shorter display name", - "displayNameNew": "Pick a new display name", - "displayNameErrorNew": "We were unable to load your display name. Please enter a new display name to continue.", - "onboardingAccountCreated": "Account Created", - "onboardingBubbleWelcomeToSession": "Welcome to Session", - "conversationsNone": "You don't have any conversations yet", - "onboardingHitThePlusButton": "Hit the plus button to start a chat, create a group, or join an official community!", - "saveRecoveryPassword": "Save your recovery password", - "saveRecoveryPasswordDescription": "Save your recovery password to make sure you don't lose access to your account.", - "onboardingAccountCreate": "Create account", - "onboardingAccountExists": "I have an account", - "sessionRecoveryPassword": "Recovery Password", - "onboardingRecoveryPassword": "Enter your recovery password to load your account. If you haven't saved it, you can find it in your app settings.", - "recoveryPasswordErrorMessageShort": "The Recovery Password you entered is not long enough. Please check and try again.", - "recoveryPasswordErrorMessageIncorrect": "Some of the words in your Recovery Password are incorrect. Please check and try again.", - "recoveryPasswordErrorMessageGeneric": "Please check your recovery password and try again." + "userAddedToModerators": "User added to admin list", + "userBanFailed": "Ban failed!", + "userBanned": "Banned successfully", + "userRemovedFromModerators": "User removed from admin list", + "userUnbanFailed": "Unban failed!", + "userUnbanned": "User unbanned successfully", + "video": "Video", + "videoAttachmentAlt": "Screenshot of video in message", + "viewMenuResetZoom": "Actual Size", + "viewMenuToggleDevTools": "Toggle Developer Tools", + "viewMenuToggleFullScreen": "Toggle Full Screen", + "viewMenuZoomIn": "Zoom In", + "viewMenuZoomOut": "Zoom Out", + "voiceMessage": "Voice Message", + "waitOneMoment": "One moment please...", + "welcomeToYourSession": "Welcome to your Session", + "windowMenuClose": "Close Window", + "windowMenuMinimize": "Minimize", + "windowMenuZoom": "Zoom", + "yesterday": "Yesterday", + "you": "You", + "youChangedTheTimer": "You have set messages to disappear $time$ after they have been $mode$", + "youChangedTheTimerLegacy": "You set the disappearing message timer to $time$", + "youDisabledDisappearingMessages": "You have turned off disappearing messages.", + "youDisabledYourDisappearingMessages": "You turned off disappearing messages. Messages you send will no longer disappear.", + "youGotKickedFromGroup": "You were removed from the group.", + "youHaveANewFriendRequest": "You have a new friend request", + "youLeftTheGroup": "You have left the group.", + "accountIdYours": "Your Account ID", + "youSetYourDisappearingMessages": "You set your messages to disappear $time$ after they have been $type$.", + "zoomFactorSettingTitle": "Zoom Factor" } diff --git a/ts/components/basic/YourSessionIDPill.tsx b/ts/components/basic/YourSessionIDPill.tsx index 6ff6a325a..d1ce7e483 100644 --- a/ts/components/basic/YourSessionIDPill.tsx +++ b/ts/components/basic/YourSessionIDPill.tsx @@ -27,7 +27,7 @@ export const YourSessionIDPill = () => { return ( - {window.i18n('yourSessionID')} + {window.i18n('accountIdYours')} ); diff --git a/ts/components/conversation/SessionConversation.tsx b/ts/components/conversation/SessionConversation.tsx index 864bf855d..7ed4aab6a 100644 --- a/ts/components/conversation/SessionConversation.tsx +++ b/ts/components/conversation/SessionConversation.tsx @@ -209,8 +209,8 @@ export class SessionConversation extends Component { if (msg.body.replace(/\s/g, '').includes(recoveryPhrase.replace(/\s/g, ''))) { window.inboxStore?.dispatch( updateConfirmModal({ - title: window.i18n('sendRecoveryPhraseTitle'), - message: window.i18n('sendRecoveryPhraseMessage'), + title: window.i18n('warning'), + message: window.i18n('recoveryPasswordWarningSendDescription'), okTheme: SessionButtonColor.Danger, onClickOk: () => { void sendAndScroll(); diff --git a/ts/components/conversation/SubtleNotification.tsx b/ts/components/conversation/SubtleNotification.tsx index 78260a6f8..336fe03e2 100644 --- a/ts/components/conversation/SubtleNotification.tsx +++ b/ts/components/conversation/SubtleNotification.tsx @@ -46,7 +46,7 @@ export const ConversationRequestExplanation = () => { return ( - {window.i18n('respondingToRequestWarning')} + {window.i18n('messageRequestsAcceptDescription')} ); }; diff --git a/ts/components/conversation/message/message-content/MessageAvatar.tsx b/ts/components/conversation/message/message-content/MessageAvatar.tsx index 5c1a9faa3..d8abf70d7 100644 --- a/ts/components/conversation/message/message-content/MessageAvatar.tsx +++ b/ts/components/conversation/message/message-content/MessageAvatar.tsx @@ -62,7 +62,7 @@ export const MessageAvatar = (props: Props) => { return; } if (isPublic && !PubKey.isBlinded(sender)) { - // public chat but session id not blinded. disable showing user details if we do not have an active convo with that user. + // public chat but account id not blinded. disable showing user details if we do not have an active convo with that user. // an unactive convo with that user means that we never chatted with that id directyly, but only through a sogs const convoWithSender = getConversationController().get(sender); if (!convoWithSender || !convoWithSender.get('active_at')) { diff --git a/ts/components/dialog/BanOrUnbanUserDialog.tsx b/ts/components/dialog/BanOrUnbanUserDialog.tsx index 6d9ada429..7f55b9ca9 100644 --- a/ts/components/dialog/BanOrUnbanUserDialog.tsx +++ b/ts/components/dialog/BanOrUnbanUserDialog.tsx @@ -134,7 +134,7 @@ export const BanOrUnBanUserDialog = (props: { ref={inputRef} type="text" darkMode={darkMode} - placeholder={i18n('enterSessionID')} + placeholder={i18n('accountIdEnter')} dir="auto" onChange={onPubkeyBoxChanges} disabled={inProgress || wasGivenAPubkey} diff --git a/ts/components/dialog/ModeratorsAddDialog.tsx b/ts/components/dialog/ModeratorsAddDialog.tsx index 58e906f44..ef1e95996 100644 --- a/ts/components/dialog/ModeratorsAddDialog.tsx +++ b/ts/components/dialog/ModeratorsAddDialog.tsx @@ -86,7 +86,7 @@ export const AddModeratorsDialog = (props: Props) => { { <> {!loadingSeed && ( diff --git a/ts/components/dialog/TermsOfServicePrivacyDialog.tsx b/ts/components/dialog/TermsOfServicePrivacyDialog.tsx index e7d914e8a..eb79ba62c 100644 --- a/ts/components/dialog/TermsOfServicePrivacyDialog.tsx +++ b/ts/components/dialog/TermsOfServicePrivacyDialog.tsx @@ -48,7 +48,7 @@ export function TermsOfServicePrivacyDialog(props: TermsOfServicePrivacyDialogPr onClick={() => { void shell.openExternal('https://getsession.org/terms-of-service'); }} - dataTestId="session-tos-button" + dataTestId="terms-of-service-button" /> { void shell.openExternal('https://getsession.org/privacy-policy'); }} - dataTestId="session-privacy-policy-button" + dataTestId="privacy-policy-button" /> diff --git a/ts/components/inputs/SessionInput.tsx b/ts/components/inputs/SessionInput.tsx index 09cacf9e3..eb58a9fe9 100644 --- a/ts/components/inputs/SessionInput.tsx +++ b/ts/components/inputs/SessionInput.tsx @@ -62,6 +62,7 @@ const ErrorItem = (props: { id: string; error: string }) => { initial={{ opacity: 0 }} animate={{ opacity: 1 }} transition={{ duration: THEME_GLOBALS['--default-duration-seconds'] }} + data-testid="session-error-message" > {props.error} @@ -89,6 +90,7 @@ const ShowHideButton = (props: { forceShow: boolean; toggleForceShow: Noop; erro transform: 'translateY(-50%)', ...position, }} + dataTestId="reveal-recovery-phrase-toggle" /> ); } @@ -100,6 +102,7 @@ const ShowHideButton = (props: { forceShow: boolean; toggleForceShow: Noop; erro iconSize="medium" onClick={props.toggleForceShow} style={{ position: 'absolute', top: '50%', transform: 'translateY(-50%)', ...position }} + dataTestId="reveal-recovery-phrase-toggle" /> ); }; diff --git a/ts/components/leftpane/ActionsPanel.tsx b/ts/components/leftpane/ActionsPanel.tsx index 4441dbb27..a836ca9e6 100644 --- a/ts/components/leftpane/ActionsPanel.tsx +++ b/ts/components/leftpane/ActionsPanel.tsx @@ -170,7 +170,7 @@ const setupTheme = async () => { await switchThemeTo(themeConfig); }; -// Do this only if we created a new Session ID, or if we already received the initial configuration message +// Do this only if we created a new account id, or if we already received the initial configuration message const triggerSyncIfNeeded = async () => { const us = UserUtils.getOurPubKeyStrFromCache(); await getConversationController().get(us).setDidApproveMe(true, true); diff --git a/ts/components/leftpane/LeftPaneSettingSection.tsx b/ts/components/leftpane/LeftPaneSettingSection.tsx index cfc814359..c3849db44 100644 --- a/ts/components/leftpane/LeftPaneSettingSection.tsx +++ b/ts/components/leftpane/LeftPaneSettingSection.tsx @@ -72,8 +72,8 @@ const getCategories = () => { title: window.i18n('helpSettingsTitle'), }, { - id: SessionSettingCategory.RecoveryPhrase, - title: window.i18n('recoveryPhrase'), + id: SessionSettingCategory.RecoveryPassword, + title: window.i18n('sessionRecoveryPassword'), }, { id: SessionSettingCategory.ClearData, @@ -107,7 +107,7 @@ const LeftPaneSettingsCategoryRow = (props: { dispatch(setLeftOverlayMode('message-requests')); dispatch(resetConversationExternal()); break; - case SessionSettingCategory.RecoveryPhrase: + case SessionSettingCategory.RecoveryPassword: dispatch(recoveryPhraseModal({})); break; case SessionSettingCategory.ClearData: diff --git a/ts/components/leftpane/overlay/OverlayMessage.tsx b/ts/components/leftpane/overlay/OverlayMessage.tsx index b8ba7123b..9f429fc17 100644 --- a/ts/components/leftpane/overlay/OverlayMessage.tsx +++ b/ts/components/leftpane/overlay/OverlayMessage.tsx @@ -51,8 +51,8 @@ export const OverlayMessage = () => { const title = window.i18n('newMessage'); const buttonText = window.i18n('next'); - const subtitle = window.i18n('enterSessionID'); - const placeholder = window.i18n('enterSessionIDOrONSName'); + const subtitle = window.i18n('accountIdEnter'); + const placeholder = window.i18n('accountIdEnterYourFriends'); const disableNextButton = !pubkeyOrOns || loading; @@ -80,7 +80,7 @@ export const OverlayMessage = () => { async function handleMessageButtonClick() { if ((!pubkeyOrOns && !pubkeyOrOns.length) || !pubkeyOrOns.trim().length) { - ToastUtils.pushToastError('invalidPubKey', window.i18n('invalidNumberError')); // or ons name + ToastUtils.pushToastError('invalidPubKey', window.i18n('onsErrorNotRecognised')); // or ons name return; } const pubkeyorOnsTrimmed = pubkeyOrOns.trim(); @@ -93,7 +93,7 @@ export const OverlayMessage = () => { // this might be an ONS, validate the regex first const mightBeOnsName = new RegExp(ONSResolve.onsNameRegex, 'g').test(pubkeyorOnsTrimmed); if (!mightBeOnsName) { - ToastUtils.pushToastError('invalidPubKey', window.i18n('invalidNumberError')); + ToastUtils.pushToastError('invalidPubKey', window.i18n('onsErrorNotRecognised')); return; } setLoading(true); @@ -126,7 +126,7 @@ export const OverlayMessage = () => { - {window.i18n('startNewConversationBy...')} + {window.i18n('messageNewDescription')} diff --git a/ts/components/loading/bar/SessionProgressBar.tsx b/ts/components/loading/bar/SessionProgressBar.tsx index af5b9d0f5..a3dd274a7 100644 --- a/ts/components/loading/bar/SessionProgressBar.tsx +++ b/ts/components/loading/bar/SessionProgressBar.tsx @@ -68,7 +68,7 @@ export function SessionProgressBar(props: Props) { {showPercentage ? {Math.floor(progress)}% : null} {subtitle || showPercentage ? : null} - + { // we want to show the copyId for open groups and private chats only if ((isPrivate && !isBlinded) || isPublic) { - const copyIdLabel = isPublic ? window.i18n('copyOpenGroupURL') : window.i18n('copySessionID'); + const copyIdLabel = isPublic ? window.i18n('copyOpenGroupURL') : window.i18n('accountIDCopy'); return ( { diff --git a/ts/components/registration/RegistrationStages.tsx b/ts/components/registration/RegistrationStages.tsx index 800418cb1..fb19987bf 100644 --- a/ts/components/registration/RegistrationStages.tsx +++ b/ts/components/registration/RegistrationStages.tsx @@ -70,18 +70,20 @@ export const RegistrationStages = () => { iconPadding="4px" iconColor="var(--text-primary-color)" style={{ border: '2px solid var(--text-primary-color)', borderRadius: '9999px' }} + dataTestId="session-faq-link" onClick={() => { void shell.openExternal('https://getsession.org/faq'); }} /> { void shell.openExternal('https://getsession.org'); }} diff --git a/ts/components/registration/TermsAndConditions.tsx b/ts/components/registration/TermsAndConditions.tsx index 8082cd538..acc00f893 100644 --- a/ts/components/registration/TermsAndConditions.tsx +++ b/ts/components/registration/TermsAndConditions.tsx @@ -22,6 +22,7 @@ export const TermsAndConditions = () => { return ( dispatch(updateTermsOfServicePrivacyModal({ show: true }))} + data-testid="terms-of-service-link" > diff --git a/ts/components/registration/hooks/index.tsx b/ts/components/registration/hooks/index.tsx index f071e7c3d..6d8b42aa5 100644 --- a/ts/components/registration/hooks/index.tsx +++ b/ts/components/registration/hooks/index.tsx @@ -44,7 +44,7 @@ export const useRecoveryProgressEffect = (props: UseRecoveryProgressEffectProps) clearInterval(interval); // if we didn't get the display name in time, we need to enter it manually window.log.debug( - `WIP: [continueYourSession] AccountRestoration.Loading We didn't get the display name in time, so we need to enter it manually` + `WIP: [useRecoveryProgressEffect] AccountRestoration.Loading We didn't get the display name in time, so we need to enter it manually` ); dispatch(setAccountRestorationStep(AccountRestoration.DisplayName)); } @@ -57,7 +57,7 @@ export const useRecoveryProgressEffect = (props: UseRecoveryProgressEffectProps) dispatch(setProgress(progress + 1)); } window.log.debug( - `WIP: [continueYourSession] AccountRestoration. Finishing progress ${progress}%` + `WIP: [useRecoveryProgressEffect] AccountRestoration. Finishing progress ${progress}%` ); if (progress >= 100) { @@ -72,13 +72,13 @@ export const useRecoveryProgressEffect = (props: UseRecoveryProgressEffectProps) clearInterval(interval); if (!isEmpty(displayName)) { window.log.debug( - `WIP: [continueYourSession] AccountRestoration.Complete Finished progress` + `WIP: [useRecoveryProgressEffect] AccountRestoration.Complete Finished progress` ); dispatch(setAccountRestorationStep(AccountRestoration.Complete)); } else { dispatch(setAccountRestorationStep(AccountRestoration.DisplayName)); window.log.debug( - `WIP: [continueYourSession] AccountRestoration.DisplayName failed to fetch display name so we need to enter it manually` + `WIP: [useRecoveryProgressEffect] AccountRestoration.DisplayName failed to fetch display name so we need to enter it manually` ); } }, ONBOARDING_TIMES.RECOVERY_FINISHED); @@ -88,7 +88,7 @@ export const useRecoveryProgressEffect = (props: UseRecoveryProgressEffectProps) clearInterval(interval); if (!isEmpty(displayName)) { window.log.debug( - `WIP: [continueYourSession] AccountRestoration.Complete opening inbox for ${displayName}` + `WIP: [useRecoveryProgressEffect] AccountRestoration.Complete opening inbox for ${displayName}` ); dispatch(resetOnboardingState()); trigger('openInbox'); diff --git a/ts/components/registration/stages/CreateAccount.tsx b/ts/components/registration/stages/CreateAccount.tsx index a091d7365..8dd15472f 100644 --- a/ts/components/registration/stages/CreateAccount.tsx +++ b/ts/components/registration/stages/CreateAccount.tsx @@ -158,6 +158,7 @@ export const CreateAccount = () => { onClick={signUpWithDetails} text={window.i18n('continue')} disabled={!(!!displayName && !displayNameError)} + dataTestId="continue-button" /> diff --git a/ts/components/registration/stages/RestoreAccount.tsx b/ts/components/registration/stages/RestoreAccount.tsx index 957b42446..d1a28c16e 100644 --- a/ts/components/registration/stages/RestoreAccount.tsx +++ b/ts/components/registration/stages/RestoreAccount.tsx @@ -64,7 +64,7 @@ async function signInWithNewDisplayName(signInDetails: RecoverDetails) { } /** - * This will try to sign in with the user recovery phrase. + * This will try to sign in with the user recovery password. * If no ConfigurationMessage is received within ONBOARDING_RECOVERY_TIMEOUT, the user will be asked to enter a display name. */ async function signInAndFetchDisplayName( @@ -232,13 +232,13 @@ export const RestoreAccount = () => { autoFocus={true} disabledOnBlur={true} type="password" - placeholder={window.i18n('enterRecoveryPhrase')} + placeholder={window.i18n('recoveryPasswordEnter')} value={recoveryPassword} onValueChanged={(seed: string) => { dispatch(setRecoveryPassword(seed)); dispatch( setRecoveryPasswordError( - !seed ? window.i18n('recoveryPhraseEmpty') : undefined + !seed ? window.i18n('recoveryPasswordEnter') : undefined ) ); }} @@ -253,7 +253,7 @@ export const RestoreAccount = () => { onClick={recoverAndFetchDisplayName} text={window.i18n('continue')} disabled={!(!!recoveryPassword && !recoveryPasswordError)} - dataTestId="continue-session-button" + dataTestId="continue-button" /> ) : ( @@ -285,7 +285,7 @@ export const RestoreAccount = () => { !(!!recoveryPassword && !recoveryPasswordError) || !(!!displayName && !displayNameError) } - dataTestId="continue-session-button" + dataTestId="continue-button" /> )} diff --git a/ts/components/registration/stages/Start.tsx b/ts/components/registration/stages/Start.tsx index c3ddb846d..7d46731f8 100644 --- a/ts/components/registration/stages/Start.tsx +++ b/ts/components/registration/stages/Start.tsx @@ -25,6 +25,7 @@ export const Start = () => { dispatch(setOnboardingStep(Onboarding.CreateAccount)); }} text={window.i18n('onboardingAccountCreate')} + dataTestId="create-account-button" /> { dispatch(setAccountRestorationStep(AccountRestoration.RecoveryPassword)); }} text={window.i18n('onboardingAccountExists')} - dataTestId="restore-using-recovery" + dataTestId="existing-account-button" /> diff --git a/ts/components/settings/SessionSettings.tsx b/ts/components/settings/SessionSettings.tsx index e71235639..f8c19db52 100644 --- a/ts/components/settings/SessionSettings.tsx +++ b/ts/components/settings/SessionSettings.tsx @@ -50,7 +50,7 @@ export enum SessionSettingCategory { Appearance = 'appearance', Permissions = 'permissions', Help = 'help', - RecoveryPhrase = 'recoveryPhrase', + RecoveryPassword = 'recoveryPassword', ClearData = 'ClearData', } @@ -139,7 +139,7 @@ const SettingInCategory = (props: { // these three down there have no options, they are just a button case SessionSettingCategory.ClearData: case SessionSettingCategory.MessageRequests: - case SessionSettingCategory.RecoveryPhrase: + case SessionSettingCategory.RecoveryPassword: default: return null; } diff --git a/ts/components/settings/SessionSettingsHeader.tsx b/ts/components/settings/SessionSettingsHeader.tsx index 0b36b3603..b1ad6a829 100644 --- a/ts/components/settings/SessionSettingsHeader.tsx +++ b/ts/components/settings/SessionSettingsHeader.tsx @@ -45,7 +45,7 @@ export const SettingsHeader = (props: Props) => { break; case SessionSettingCategory.ClearData: case SessionSettingCategory.MessageRequests: - case SessionSettingCategory.RecoveryPhrase: + case SessionSettingCategory.RecoveryPassword: throw new Error(`no header for should be tried to be rendered for "${category}"`); default: diff --git a/ts/session/apis/open_group_api/sogsv3/knownBlindedkeys.ts b/ts/session/apis/open_group_api/sogsv3/knownBlindedkeys.ts index e569eb40b..491adb440 100644 --- a/ts/session/apis/open_group_api/sogsv3/knownBlindedkeys.ts +++ b/ts/session/apis/open_group_api/sogsv3/knownBlindedkeys.ts @@ -1,20 +1,20 @@ -import { from_hex, to_hex } from 'libsodium-wrappers-sumo'; import { crypto_sign_curve25519_pk_to_ed25519 } from 'curve25519-js'; +import { from_hex, to_hex } from 'libsodium-wrappers-sumo'; import { cloneDeep, flatten, isEmpty, isEqual, isString, uniqBy } from 'lodash'; -import { getConversationController } from '../../../conversations'; -import { LibSodiumWrappers } from '../../../crypto'; -import { KeyPrefixType, PubKey } from '../../../types'; import { Data } from '../../../../data/data'; -import { combineKeys, generateBlindingFactor } from '../../../utils/SodiumUtils'; import { OpenGroupData } from '../../../../data/opengroups'; -import { ConversationModel } from '../../../../models/conversation'; -import { UserUtils } from '../../../utils'; -import { SogsBlinding } from './sogsBlinding'; -import { fromHexToArray } from '../../../utils/String'; import { KNOWN_BLINDED_KEYS_ITEM } from '../../../../data/settings-key'; +import { ConversationModel } from '../../../../models/conversation'; import { roomHasBlindEnabled } from '../../../../types/sqlSharedTypes'; import { Storage } from '../../../../util/storage'; +import { getConversationController } from '../../../conversations'; +import { LibSodiumWrappers } from '../../../crypto'; +import { KeyPrefixType, PubKey } from '../../../types'; +import { UserUtils } from '../../../utils'; +import { combineKeys, generateBlindingFactor } from '../../../utils/SodiumUtils'; +import { fromHexToArray } from '../../../utils/String'; +import { SogsBlinding } from './sogsBlinding'; export type BlindedIdMapping = { blindedId: string; @@ -157,7 +157,7 @@ export function tryMatchBlindWithStandardKey( const blindedIdNoPrefix = PubKey.removePrefixIfNeeded(PubKey.cast(blindedSessionId).key); const kBytes = generateBlindingFactor(serverPubKey, sodium); - // From the session id (ignoring 05 prefix) we have two possible ed25519 pubkeys; the first is + // From the account id (ignoring 05 prefix) we have two possible ed25519 pubkeys; the first is // the positive(which is what Signal's XEd25519 conversion always uses) const inbin = from_hex(sessionIdNoPrefix); diff --git a/ts/session/apis/open_group_api/sogsv3/sogsApiV3.ts b/ts/session/apis/open_group_api/sogsv3/sogsApiV3.ts index 9a2edf381..ff7eeebf8 100644 --- a/ts/session/apis/open_group_api/sogsv3/sogsApiV3.ts +++ b/ts/session/apis/open_group_api/sogsv3/sogsApiV3.ts @@ -267,7 +267,7 @@ const handleMessagesResponseV4 = async ( ); const roomDetails: OpenGroupRequestCommonType = pick(roomInfos, 'serverUrl', 'roomId'); - // then we try to find matching real session ids with the blinded ids we have. + // then we try to find matching real account ids with the blinded ids we have. // this is where we override the blindedId with the real one in case we already know that user real sessionId const messagesWithResolvedBlindedIdsIfFound = []; diff --git a/ts/session/apis/snode_api/onsResolve.ts b/ts/session/apis/snode_api/onsResolve.ts index a0a27d0a1..c7555266e 100644 --- a/ts/session/apis/snode_api/onsResolve.ts +++ b/ts/session/apis/snode_api/onsResolve.ts @@ -103,7 +103,7 @@ async function getSessionIDForOnsName(onsNameCase: string) { throw new Error('ONSresolve: Validation failed'); } - // assert all the returned session ids are the same + // assert all the returned account ids are the same if (_.uniq(allResolvedSessionIds).length !== 1) { throw new Error('ONSresolve: Validation failed'); } diff --git a/ts/session/types/PubKey.ts b/ts/session/types/PubKey.ts index 2320bf646..a1f49d10c 100644 --- a/ts/session/types/PubKey.ts +++ b/ts/session/types/PubKey.ts @@ -134,7 +134,7 @@ export class PubKey { // Check if it's hex const isHex = pubkey.replace(/[\s]*/g, '').match(/^[0-9a-fA-F]+$/); if (!isHex) { - return window.i18n('invalidSessionId'); + return window.i18n('invalidAccountId'); } // Check if the pubkey length is 33 and leading with 05 or of length 32 diff --git a/ts/types/LocalizerKeys.ts b/ts/types/LocalizerKeys.ts index 3f4a56650..4daeec9ac 100644 --- a/ts/types/LocalizerKeys.ts +++ b/ts/types/LocalizerKeys.ts @@ -1,6 +1,10 @@ export type LocalizerKeys = | 'about' | 'accept' + | 'accountIDCopy' + | 'accountIdEnter' + | 'accountIdEnterYourFriends' + | 'accountIdYours' | 'activeMembers' | 'add' | 'addACaption' @@ -8,7 +12,6 @@ export type LocalizerKeys = | 'addModerator' | 'addModerators' | 'addingContacts' - | 'allUsersAreRandomly...' | 'anonymous' | 'answeredACall' | 'appMenuHide' @@ -99,7 +102,6 @@ export type LocalizerKeys = | 'contactsHeader' | 'contextMenuNoSuggestions' | 'continue' - | 'continueYourSession' | 'conversationsHeader' | 'conversationsNone' | 'conversationsSettingsTitle' @@ -107,7 +109,6 @@ export type LocalizerKeys = | 'copyErrorAndQuit' | 'copyMessage' | 'copyOpenGroupURL' - | 'copySessionID' | 'couldntFindServerMatching' | 'create' | 'createClosedGroupNamePrompt' @@ -116,7 +117,6 @@ export type LocalizerKeys = | 'createConversationNewGroup' | 'createGroup' | 'createPassword' - | 'createSessionID' | 'databaseError' | 'debugLog' | 'debugLogExplanation' @@ -193,11 +193,7 @@ export type LocalizerKeys = | 'enterNewLineDescription' | 'enterNewPassword' | 'enterPassword' - | 'enterRecoveryPhrase' | 'enterSendNewMessageDescription' - | 'enterSessionID' - | 'enterSessionIDOfRecipient' - | 'enterSessionIDOrONSName' | 'entireAccount' | 'error' | 'establishingConnection' @@ -239,14 +235,13 @@ export type LocalizerKeys = | 'imageCaptionIconAlt' | 'incomingCallFrom' | 'incomingError' + | 'invalidAccountId' | 'invalidGroupNameTooLong' | 'invalidGroupNameTooShort' - | 'invalidNumberError' | 'invalidOldPassword' | 'invalidOpenGroupUrl' | 'invalidPassword' | 'invalidPubkeyFormat' - | 'invalidSessionId' | 'inviteContacts' | 'join' | 'joinACommunity' @@ -273,7 +268,6 @@ export type LocalizerKeys = | 'leaving' | 'leftTheGroup' | 'lightboxImageAlt' - | 'linkDevice' | 'linkPreviewDescription' | 'linkPreviewsConfirmMessage' | 'linkPreviewsTitle' @@ -281,6 +275,7 @@ export type LocalizerKeys = | 'linkVisitWarningTitle' | 'loadAccountProgressMessage' | 'loading' + | 'lockApp' | 'mainMenuEdit' | 'mainMenuFile' | 'mainMenuHelp' @@ -305,11 +300,13 @@ export type LocalizerKeys = | 'messageDeletionForbidden' | 'messageHash' | 'messageInfo' + | 'messageNewDescription' | 'messageRequestAccepted' | 'messageRequestAcceptedOurs' | 'messageRequestAcceptedOursNoName' | 'messageRequestPending' | 'messageRequests' + | 'messageRequestsAcceptDescription' | 'messageWillDisappear' | 'messagesHeader' | 'moreInformation' @@ -371,6 +368,7 @@ export type LocalizerKeys = | 'onlyAdminCanRemoveMembers' | 'onlyAdminCanRemoveMembersDesc' | 'onlyGroupAdminsCanChange' + | 'onsErrorNotRecognised' | 'open' | 'openGroupInvitation' | 'openGroupURL' @@ -381,8 +379,8 @@ export type LocalizerKeys = | 'originalMessageNotFound' | 'otherPlural' | 'otherSingular' - | 'password' | 'passwordCharacterError' + | 'passwordCreate' | 'passwordLengthError' | 'passwordTypeError' | 'passwordViewTitle' @@ -420,11 +418,11 @@ export type LocalizerKeys = | 'readReceiptSettingDescription' | 'readReceiptSettingTitle' | 'received' + | 'recoveryPasswordEnter' | 'recoveryPasswordErrorMessageGeneric' | 'recoveryPasswordErrorMessageIncorrect' | 'recoveryPasswordErrorMessageShort' - | 'recoveryPhrase' - | 'recoveryPhraseEmpty' + | 'recoveryPasswordWarningSendDescription' | 'recoveryPhraseSavePromptMain' | 'remove' | 'removeAccountPasswordDescription' @@ -443,8 +441,6 @@ export type LocalizerKeys = | 'requestsSubtitle' | 'resend' | 'resolution' - | 'respondingToRequestWarning' - | 'restoreUsingRecoveryPhrase' | 'ringing' | 'save' | 'saveLogToDesktop' @@ -459,8 +455,6 @@ export type LocalizerKeys = | 'selectMessage' | 'sendFailed' | 'sendMessage' - | 'sendRecoveryPhraseMessage' - | 'sendRecoveryPhraseTitle' | 'sending' | 'sent' | 'serverId' @@ -481,8 +475,6 @@ export type LocalizerKeys = | 'shareBugDetails' | 'show' | 'showDebugLog' - | 'showRecoveryPhrase' - | 'showRecoveryPhrasePasswordRequest' | 'showUserDetails' | 'someOfYourDeviceUseOutdatedVersion' | 'spellCheckDescription' @@ -493,7 +485,6 @@ export type LocalizerKeys = | 'startConversation' | 'startInTrayDescription' | 'startInTrayTitle' - | 'startNewConversationBy...' | 'startedACall' | 'support' | 'surveyTitle' @@ -581,6 +572,7 @@ export type LocalizerKeys = | 'viewMenuZoomOut' | 'voiceMessage' | 'waitOneMoment' + | 'warning' | 'welcomeToYourSession' | 'windowMenuClose' | 'windowMenuMinimize' @@ -595,6 +587,4 @@ export type LocalizerKeys = | 'youHaveANewFriendRequest' | 'youLeftTheGroup' | 'youSetYourDisappearingMessages' - | 'yourSessionID' - | 'yourUniqueSessionID' | 'zoomFactorSettingTitle'; diff --git a/ts/util/accountManager.ts b/ts/util/accountManager.ts index eb3af83c9..a4b1b7b54 100644 --- a/ts/util/accountManager.ts +++ b/ts/util/accountManager.ts @@ -63,7 +63,7 @@ const generateKeypair = async ( }; /** - * Sign in with a recovery phrase. We won't try to recover an existing profile name + * Sign in with a recovery password. We won't try to recover an existing profile name * @param mnemonic the mnemonic the user duly saved in a safe place. We will restore his sessionID based on this. * @param mnemonicLanguage 'english' only is supported * @param profileName the displayName to use for this user @@ -77,7 +77,7 @@ export async function signInWithRecovery( } /** - * Sign in with a recovery phrase and try to recover display name and avatar from the first encountered configuration message. + * Sign in with a recovery password and try to recover display name and avatar from the first encountered configuration message. * @param mnemonic the mnemonic the user duly saved in a safe place. We will restore his sessionID based on this. * @param mnemonicLanguage 'english' only is supported * @param loadingAnimationCallback a callback to trigger a loading animation