diff --git a/.babelrc.js b/.babelrc.js
index a302d6d5e6..dbb5246d94 100644
--- a/.babelrc.js
+++ b/.babelrc.js
@@ -1,4 +1,4 @@
-// Copyright 2019-2020 Signal Messenger, LLC
+// Copyright 2019-2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
module.exports = {
@@ -9,6 +9,7 @@ module.exports = {
'react-hot-loader/babel',
'lodash',
'@babel/plugin-proposal-class-properties',
+ '@babel/plugin-proposal-optional-chaining',
// This plugin converts commonjs to esmodules which is required for
// importing commonjs modules from esmodules in storybook. As a part of
// converting to TypeScript we should use esmodules and can eventually
diff --git a/.eslintrc.js b/.eslintrc.js
index d2691c3fbe..e5bdae8c36 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -125,6 +125,7 @@ const rules = {
'`with` is disallowed in strict mode because it makes code impossible to predict and optimize.',
},
],
+ curly: 'error',
};
module.exports = {
diff --git a/.gitignore b/.gitignore
index ae9ef166bf..96e153e8eb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,6 +14,8 @@ release/
*.sublime*
/sql/
/start.sh
+.eslintcache
+tsconfig.tsbuildinfo
# generated files
js/components.js
@@ -36,3 +38,4 @@ sticker-creator/**/*.js
sticker-creator/dist/*
/.idea
+/storybook-static/
diff --git a/.storybook/config.js b/.storybook/config.js
index d2bf3b8822..83ad39d5be 100644
--- a/.storybook/config.js
+++ b/.storybook/config.js
@@ -2,7 +2,7 @@
// SPDX-License-Identifier: AGPL-3.0-only
import * as React from 'react';
-import { addDecorator, configure } from '@storybook/react';
+import { addDecorator, addParameters, configure } from '@storybook/react';
import { withKnobs, boolean, optionsKnob } from '@storybook/addon-knobs';
import classnames from 'classnames';
import * as styles from './styles.scss';
@@ -126,6 +126,12 @@ addDecorator(Story => );
addDecorator(story => {story()});
+addParameters({
+ axe: {
+ disabledRules: ['html-has-lang'],
+ },
+});
+
configure(() => {
// Load main app stories
const tsComponentsContext = require.context(
diff --git a/ACKNOWLEDGMENTS.md b/ACKNOWLEDGMENTS.md
index cb1b68758f..703a50c2fc 100644
--- a/ACKNOWLEDGMENTS.md
+++ b/ACKNOWLEDGMENTS.md
@@ -45,6 +45,54 @@ Signal Desktop makes use of the following open source projects.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+## @types/pino
+
+ MIT License
+
+ Copyright (c) Microsoft Corporation.
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE
+
+## @types/pino-multi-stream
+
+ MIT License
+
+ Copyright (c) Microsoft Corporation.
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE
+
## abort-controller
MIT License
@@ -361,32 +409,6 @@ Signal Desktop makes use of the following open source projects.
License: MIT
-## bunyan
-
- # This is the MIT license
-
- Copyright 2016 Trent Mick
- Copyright 2016 Joyent Inc.
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the
- "Software"), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
-
- The above copyright notice and this permission notice shall be included
- in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
## classnames
The MIT License (MIT)
@@ -1301,6 +1323,24 @@ Signal Desktop makes use of the following open source projects.
licenses; we recommend you read them, as their terms may differ from the
terms above.
+## lru-cache
+
+ The ISC License
+
+ Copyright (c) Isaac Z. Schlueter and Contributors
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+ IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
## memoizee
ISC License
@@ -1719,33 +1759,6 @@ Signal Desktop makes use of the following open source projects.
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
-## node-gyp
-
- (The MIT License)
-
- Copyright (c) 2012 Nathan Rajlich
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation
- files (the "Software"), to deal in the Software without
- restriction, including without limitation the rights to use,
- copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following
- conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- OTHER DEALINGS IN THE SOFTWARE.
-
## normalize-path
The MIT License (MIT)
@@ -1862,6 +1875,37 @@ Signal Desktop makes use of the following open source projects.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+## pino
+
+ The MIT License (MIT)
+
+ Copyright (c) 2016-2019 Matteo Collina, David Mark Clements and the Pino contributors
+
+ Pino contributors listed at https://github.com/pinojs/pino#the-team and in
+ the README file.
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+
+## pino-multi-stream
+
+ License: MIT
+
## popper.js
License: MIT
@@ -2365,6 +2409,30 @@ Signal Desktop makes use of the following open source projects.
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+## rotating-file-stream
+
+ The MIT License (MIT)
+
+ Copyright (c) 2015-2020 Daniele Ricci
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+
## sanitize-filename
License: WTFPL OR ISC
@@ -2990,3 +3058,27 @@ Signal Desktop makes use of the following open source projects.
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
+
+## zod
+
+ MIT License
+
+ Copyright (c) 2020 Colin McDonnell
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 687f894d8c..4ef4f8a089 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -43,10 +43,11 @@ Install the [Xcode Command-Line Tools](http://osxdaily.com/2014/02/12/install-co
### Linux
1. Pick your favorite package manager.
-1. Install `python`
+1. Install `python` (Python 2.7+)
1. Install `gcc`
1. Install `g++`
1. Install `make`
+1. Install `git-lfs`
### All platforms
@@ -55,6 +56,7 @@ Now, run these commands in your preferred terminal in a good directory for devel
```
git clone https://github.com/signalapp/Signal-Desktop.git
cd Signal-Desktop
+git-lfs install # Setup Git LFS.
npm install --global yarn # (only if you don’t already have `yarn`)
yarn install --frozen-lockfile # Install and build dependencies (this will take a while)
yarn grunt # Generate final JS and CSS assets
@@ -79,6 +81,8 @@ while you make changes:
yarn grunt dev # runs until you stop it, re-generating built assets on file changes
```
+If you miss the `git-lfs` step, run `yarn cache clean` and remove `node_modules` before trying again.
+
### webpack
Some parts of the app (such as the Sticker Creator) have moved to webpack.
diff --git a/Gruntfile.js b/Gruntfile.js
index c42bf529df..3e7abf84c3 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -1,4 +1,4 @@
-// Copyright 2014-2020 Signal Messenger, LLC
+// Copyright 2014-2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
const { join } = require('path');
@@ -113,13 +113,9 @@ module.exports = grunt => {
tasks: ['exec:build-protobuf'],
},
sass: {
- files: ['./stylesheets/*.scss'],
+ files: ['./stylesheets/*.scss', './stylesheets/**/*.scss'],
tasks: ['sass'],
},
- transpile: {
- files: ['./ts/**/*.ts', './ts/**/*.tsx'],
- tasks: ['exec:transpile'],
- },
},
exec: {
'tx-pull-new': {
@@ -386,12 +382,18 @@ module.exports = grunt => {
console.log('window opened');
})
.then(() =>
- // Get the window's title
- app.client.getTitle()
- )
- .then(title => {
// Verify the window's title
- assert.equal(title, packageJson.productName);
+ app.client.waitUntil(
+ async () =>
+ (await app.client.getTitle()) === packageJson.productName,
+ {
+ timeoutMsg: `Expected window title to be ${JSON.stringify(
+ packageJson.productName
+ )}`,
+ }
+ )
+ )
+ .then(() => {
console.log('title ok');
})
.then(() => {
diff --git a/_locales/en/messages.json b/_locales/en/messages.json
index 3fe43aaffc..7d61d0aa8b 100644
--- a/_locales/en/messages.json
+++ b/_locales/en/messages.json
@@ -982,7 +982,7 @@
"description": "Label for when something is turned off"
},
"deleteWarning": {
- "message": "Clicking 'delete' will permanently remove this message from your devices only.",
+ "message": "This message will be deleted from this device.",
"description": "Text shown in the confirmation dialog for deleting a message locally"
},
"deleteForEveryoneWarning": {
@@ -1077,6 +1077,22 @@
"message": "Secure session reset",
"description": "This is a past tense, informational message. In other words, your secure session has been reset."
},
+ "ChatRefresh--notification": {
+ "message": "Chat session refreshed",
+ "description": "Shown in timeline when a error happened, and the session was automatically reset."
+ },
+ "ChatRefresh--learnMore": {
+ "message": "Learn More",
+ "description": "Shown in timeline when session is automatically reset, to provide access to a popup info dialog"
+ },
+ "ChatRefresh--summary": {
+ "message": "Signal uses end-to-end encryption and it may need to refresh your chat session sometimes. This doesn’t affect your chat’s security but you may have missed a message from this contact and you can ask them to resend it.",
+ "description": "Shown on explainer dialog available from chat session refreshed timeline events"
+ },
+ "ChatRefresh--contactSupport": {
+ "message": "Contact Support",
+ "description": "Shown on explainer dialog available from chat session refreshed timeline events"
+ },
"quoteThumbnailAlt": {
"message": "Thumbnail of image from quoted message",
"description": "Used in alt tag of thumbnail images inside of an embedded message quote"
@@ -1877,6 +1893,108 @@
"message": "Start new conversation…",
"description": "Label underneath number a user enters that is not an existing contact"
},
+ "newConversation": {
+ "message": "New conversation",
+ "description": "Label for header when starting a new conversation"
+ },
+ "contactSearchPlaceholder": {
+ "message": "Search by name or phone number",
+ "description": "Placeholder to use when searching for contacts in the composer"
+ },
+ "noContactsFound": {
+ "message": "No contacts found",
+ "description": "Label shown when there are no contacts to compose to"
+ },
+ "chooseGroupMembers__title": {
+ "message": "Choose members",
+ "description": "The title for the 'choose group members' left pane screen"
+ },
+ "chooseGroupMembers__back-button": {
+ "message": "Back",
+ "description": "Used as alt-text of the back button on the 'choose group members' left pane screen"
+ },
+ "chooseGroupMembers__skip": {
+ "message": "Skip",
+ "description": "The 'skip' button text in the 'choose group members' left pane screen"
+ },
+ "chooseGroupMembers__next": {
+ "message": "Next",
+ "description": "The 'next' button text in the 'choose group members' left pane screen"
+ },
+ "chooseGroupMembers__maximum-group-size__title": {
+ "message": "Maximum group size reached",
+ "description": "Shown in the alert when you add the maximum number of group members"
+ },
+ "chooseGroupMembers__maximum-group-size__body": {
+ "message": "Signal groups can have a maximum of $max$ members.",
+ "description": "Shown in the alert when you add the maximum number of group members",
+ "placeholders": {
+ "max": {
+ "content": "$1",
+ "example": "1000"
+ }
+ }
+ },
+ "chooseGroupMembers__maximum-recommended-group-size__title": {
+ "message": "Recommended member limit reached",
+ "description": "Shown in the alert when you add the maximum recommended number of group members"
+ },
+ "chooseGroupMembers__maximum-recommended-group-size__body": {
+ "message": "Signal groups perform best with $max$ members or less. Adding more members will cause delays sending and receiving messages.",
+ "description": "Shown in the alert when you add the maximum recommended number of group members",
+ "placeholders": {
+ "max": {
+ "content": "$1",
+ "example": "150"
+ }
+ }
+ },
+ "chooseGroupMembers__cant-add-member__title": {
+ "message": "Can’t add member",
+ "description": "Shown in the alert when you try to add someone who can't be added to a group"
+ },
+ "chooseGroupMembers__cant-add-member__body": {
+ "message": "\"$name$\" can’t be added to the group because they’re using an old version of Signal. You can add them to the group after they’ve updated Signal.",
+ "description": "Shown in the alert when you try to add someone who can't be added to a group",
+ "placeholders": {
+ "max": {
+ "content": "$1",
+ "example": "Jane Doe"
+ }
+ }
+ },
+ "setGroupMetadata__title": {
+ "message": "Name this group",
+ "description": "The title for the 'set group metadata' left pane screen"
+ },
+ "setGroupMetadata__back-button": {
+ "message": "Back to member selection",
+ "description": "Used as alt-text of the back button on the 'set group metadata' left pane screen"
+ },
+ "setGroupMetadata__group-name-placeholder": {
+ "message": "Group name (required)",
+ "description": "The placeholder for the group name placeholder"
+ },
+ "setGroupMetadata__create-group": {
+ "message": "Create",
+ "description": "The 'create group' button text in the 'set group metadata' left pane screen"
+ },
+ "setGroupMetadata__members-header": {
+ "message": "Members",
+ "description": "The header for the members list in the 'set group metadata' left pane screen"
+ },
+ "setGroupMetadata__error-message": {
+ "message": "This group couldn’t be created. Check your connection and try again.",
+ "description": "Shown in the modal when we can't create a group"
+ },
+ "updateGroupAttributes__title": {
+ "message": "Edit group name and photo",
+ "description": "Shown in the modal when we want to update a group"
+ },
+ "updateGroupAttributes__error-message": {
+ "message": "Failed to update the group. Check your connection and try again.",
+ "description": "Shown in the modal when we can't update a group"
+ },
"notSupportedSMS": {
"message": "SMS/MMS messages are not supported.",
"description": "Label underneath number informing user that SMS is not supported on desktop"
@@ -2310,6 +2428,10 @@
"message": "Open conversation menu",
"description": "Shown in the shortcuts guide"
},
+ "Keyboard--new-conversation": {
+ "message": "Start new conversation",
+ "description": "Shown in the shortcuts guide"
+ },
"Keyboard--archive-conversation": {
"message": "Archive conversation",
"description": "Shown in the shortcuts guide"
@@ -3000,6 +3122,10 @@
}
}
},
+ "no-groups-in-common": {
+ "message": "No groups in common.",
+ "description": "Shown to indicate this user is not a member of any groups"
+ },
"acceptCall": {
"message": "Answer",
"description": "Shown in tooltip for the button to accept a call (audio or video)"
@@ -3358,6 +3484,10 @@
"message": "Admin",
"description": "Label for a group administrator"
},
+ "GroupV2--only-admins": {
+ "message": "Only Admins",
+ "description": "Label for group administrators -- used in drop-downs to select permissions that apply to admins"
+ },
"GroupV2--all-members": {
"message": "All members",
"description": "Label for describing the general non-privileged members of a group"
@@ -4625,6 +4755,10 @@
"message": "Block group",
"description": "This is a button to block a group"
},
+ "ConversationDetailsActions--leave-group-must-choose-new-admin": {
+ "message": "Before you leave, you must choose at least one new admin for this group.",
+ "description": "Shown if, before leaving a group, you need to choose an admin"
+ },
"ConversationDetailsActions--leave-group-modal-title": {
"message": "Do you really want to leave?",
"description": "This is the modal title for confirming leaving a group"
@@ -4683,6 +4817,10 @@
}
}
},
+ "ConversationDetailsMembershipList--add-members": {
+ "message": "Add members",
+ "description": "The button that you can click to add new members"
+ },
"ConversationDetailsMembershipList--show-all": {
"message": "See all",
"description": "This is a button on the conversation details to show all members"
@@ -4840,5 +4978,149 @@
"PendingInvites--info": {
"message": "Details about people invited to this group aren’t shown until they join. Invitees will only see messages after they join the group.",
"description": "Information shown below the invite list"
+ },
+ "AvatarInput--no-photo-label--group": {
+ "message": "Add a group photo",
+ "description": "The label for the avatar uploader when no group photo is selected"
+ },
+ "AvatarInput--change-photo-label": {
+ "message": "Change photo",
+ "description": "The label for the avatar uploader when a photo is selected"
+ },
+ "AvatarInput--upload-photo-choice": {
+ "message": "Upload photo",
+ "description": "The button text when you click on an uploaded avatar and want to upload a new one"
+ },
+ "AvatarInput--remove-photo-choice": {
+ "message": "Remove photo",
+ "description": "The button text when you click on an uploaded avatar and want to remove it"
+ },
+ "ContactPill--remove": {
+ "message": "Remove contact",
+ "description": "The label for the 'remove' button on the contact pill"
+ },
+ "ComposeErrorDialog--close": {
+ "message": "Okay",
+ "description": "The text on the button when there's an error in the composer"
+ },
+ "NewlyCreatedGroupInvitedContactsDialog--title--one": {
+ "message": "Invitation sent",
+ "description": "When creating a new group and inviting users, this is shown in the dialog"
+ },
+ "NewlyCreatedGroupInvitedContactsDialog--title--many": {
+ "message": "$count$ invitations sent",
+ "description": "When creating a new group and inviting users, this is shown in the dialog",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "3"
+ }
+ }
+ },
+ "NewlyCreatedGroupInvitedContactsDialog--body--user-paragraph--one": {
+ "message": "$name$ can’t be automatically added to this group by you.",
+ "description": "When creating a new group and inviting users, this is shown in the dialog",
+ "placeholders": {
+ "name": {
+ "content": "$1",
+ "example": "Jane Doe"
+ }
+ }
+ },
+ "NewlyCreatedGroupInvitedContactsDialog--body--user-paragraph--many": {
+ "message": "These users can’t be automatically added to this group by you.",
+ "description": "When creating a new group and inviting users, this is shown in the dialog"
+ },
+ "NewlyCreatedGroupInvitedContactsDialog--body--info-paragraph": {
+ "message": "They’ve been invited to join, and won’t see any group messages until they accept.",
+ "description": "When creating a new group and inviting users, this is shown in the dialog"
+ },
+ "NewlyCreatedGroupInvitedContactsDialog--body--learn-more": {
+ "message": "Learn more",
+ "description": "When creating a new group and inviting users, this is shown in the dialog"
+ },
+ "AddGroupMembersModal--title": {
+ "message": "Add members",
+ "description": "When adding new members to an existing group, this is shown in the dialog"
+ },
+ "AddGroupMembersModal--continue-to-confirm": {
+ "message": "Update",
+ "description": "When adding new members to an existing group, this is shown in the dialog"
+ },
+ "AddGroupMembersModal--confirm-title--one": {
+ "message": "Add $person$ to \"$group$\"?",
+ "description": "When adding new members to an existing group, this is shown in the confirmation dialog",
+ "placeholders": {
+ "person": {
+ "content": "$1",
+ "example": "Jane Doe"
+ },
+ "group": {
+ "content": "$2",
+ "example": "Tahoe Trip"
+ }
+ }
+ },
+ "AddGroupMembersModal--confirm-title--many": {
+ "message": "Add $count$ members to \"$group$\"?",
+ "description": "When adding new members to an existing group, this is shown in the confirmation dialog",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "5"
+ },
+ "group": {
+ "content": "$2",
+ "example": "Tahoe Trip"
+ }
+ }
+ },
+ "AddGroupMembersModal--confirm-button--one": {
+ "message": "Add member",
+ "description": "When adding new members to an existing group, this is shown on the confirmation dialog button"
+ },
+ "AddGroupMembersModal--confirm-button--many": {
+ "message": "Add members",
+ "description": "When adding new members to an existing group, this is shown on the confirmation dialog button"
+ },
+ "createNewGroupButton": {
+ "message": "New group",
+ "description": "The text of the button to create new groups"
+ },
+ "selectContact": {
+ "message": "Select contact",
+ "description": "The label for contact checkboxes that are non-selected (clicking them should select the contact)"
+ },
+ "deselectContact": {
+ "message": "De-select contact",
+ "description": "The label for contact checkboxes that are selected (clicking them should de-select the contact)"
+ },
+ "cannotSelectContact": {
+ "message": "Cannot select contact",
+ "description": "The label for contact checkboxes that are disabled"
+ },
+ "alreadyAMember": {
+ "message": "Already a member",
+ "description": "The label for contact checkboxes that are disabled because they're already a member"
+ },
+ "MessageAudio--play": {
+ "message": "Play audio attachment",
+ "description": "Aria label for audio attachment's Play button"
+ },
+ "MessageAudio--pause": {
+ "message": "Pause audio attachment",
+ "description": "Aria label for audio attachment's Pause button"
+ },
+ "MessageAudio--download": {
+ "message": "Download audio attachment",
+ "description": "Aria label for audio attachment's Download button"
+ },
+ "MessageAudio--pending": {
+ "message": "Downloading audio attachment...",
+ "description": "Aria label for pending audio attachment spinner"
+ },
+ "MessageAudio--slider": {
+ "message": "Playback time of audio attachment",
+ "description": "Aria label for audio attachment's playback time slider"
}
}
diff --git a/_locales/es_419/messages.json b/_locales/es_419/messages.json
deleted file mode 100644
index 7c37a855cd..0000000000
--- a/_locales/es_419/messages.json
+++ /dev/null
@@ -1,1400 +0,0 @@
-{
- "mainMenuFile": {
- "message": "&File",
- "description": "The label that is used for the File menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination."
- },
- "mainMenuEdit": {
- "message": "&Edit",
- "description": "The label that is used for the Edit menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination."
- },
- "mainMenuView": {
- "message": "&View",
- "description": "The label that is used for the View menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination."
- },
- "mainMenuWindow": {
- "message": "&Window",
- "description": "The label that is used for the Window menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination."
- },
- "mainMenuHelp": {
- "message": "&Help",
- "description": "The label that is used for the Help menu in the program main menu. The '&' indicates that the following letter will be used as the keyboard 'shortcut letter' for accessing the menu with the Alt- combination."
- },
- "mainMenuSettings": {
- "message": "Preferences…",
- "description": "The label that is used for the Preferences menu in the program main menu. This should be consistent with the standard naming for ‘Preferences’ on the operating system."
- },
- "appMenuHide": {
- "message": "Hide",
- "description": "Application menu command to hide the window"
- },
- "appMenuHideOthers": {
- "message": "Hide Others",
- "description": "Application menu command to hide all other windows"
- },
- "appMenuUnhide": {
- "message": "Show All",
- "description": "Application menu command to show all application windows"
- },
- "appMenuQuit": {
- "message": "Quit Signal",
- "description": "Application menu command to close the application"
- },
- "editMenuUndo": {
- "message": "Undo",
- "description": "Edit menu command to remove recently-typed text"
- },
- "editMenuRedo": {
- "message": "Redo",
- "description": "Edit menu command to restore previously undone typed text"
- },
- "editMenuCut": {
- "message": "Cut",
- "description": "Edit menu command to remove selected text and add it to clipboard"
- },
- "editMenuCopy": {
- "message": "Copy",
- "description": "Edit menu command to add selected text to clipboard"
- },
- "editMenuPaste": {
- "message": "Paste",
- "description": "Edit menu command to insert text from clipboard at cursor location"
- },
- "editMenuPasteAndMatchStyle": {
- "message": "Paste and Match Style",
- "description": "Edit menu command to insert text from clipboard at cursor location, taking only text and not style information"
- },
- "editMenuDelete": {
- "message": "Borrar",
- "description": "Edit menu command to remove the selected text"
- },
- "editMenuSelectAll": {
- "message": "Select All",
- "description": "Edit menu comand to select all of the text in selected text box"
- },
- "editMenuStartSpeaking": {
- "message": "Start speaking",
- "description": "Edit menu item under 'speech' to start dictation"
- },
- "editMenuStopSpeaking": {
- "message": "Stop speaking",
- "description": "Edit menu item under 'speech' to stop dictation"
- },
- "windowMenuClose": {
- "message": "Close Window",
- "description": "Window menu command to close the current window"
- },
- "windowMenuMinimize": {
- "message": "Minimize",
- "description": "Window menu command to minimize the current window"
- },
- "windowMenuZoom": {
- "message": "Zoom",
- "description": "Window menu command to make the current window the size of the whole screen"
- },
- "windowMenuBringAllToFront": {
- "message": "Bring All to Front",
- "description": "Window menu command to bring all windows of current applicatinon to front"
- },
- "viewMenuResetZoom": {
- "message": "Actual Size",
- "description": "View menu command to go back to the default zoom"
- },
- "viewMenuZoomIn": {
- "message": "Zoom In",
- "description": "View menu command to make everything bigger"
- },
- "viewMenuZoomOut": {
- "message": "Zoom Out",
- "description": "View menu command to make everything smaller"
- },
- "viewMenuToggleFullScreen": {
- "message": "Toggle Full Screen",
- "description": "View menu command to enter or leave Full Screen mode"
- },
- "viewMenuToggleDevTools": {
- "message": "Toggle Developer Tools",
- "description": "View menu command to show or hide the developer tools"
- },
- "menuSetupWithImport": {
- "message": "Set Up with Import",
- "description": "When the application is not yet set up, menu option to start up the import sequence"
- },
- "menuSetupAsNewDevice": {
- "message": "Set Up as New Device",
- "description": "When the application is not yet set up, menu option to start up the set up as fresh device"
- },
- "menuSetupAsStandalone": {
- "message": "Set Up as Standalone Device",
- "description": "Only available on development modes, menu option to open up the standalone device setup sequence"
- },
- "loading": {
- "message": "Cargando...",
- "description": "Message shown on the loading screen before we've loaded any messages"
- },
- "optimizingApplication": {
- "message": "Optimizing application...",
- "description": "Message shown on the loading screen while we are doing application optimizations"
- },
- "migratingToSQLCipher": {
- "message": "Optimizing messages... $status$ complete.",
- "description": "Message shown on the loading screen while we are doing application optimizations",
- "placeholders": {
- "status": {
- "content": "$1",
- "example": "45/200"
- }
- }
- },
- "chooseDirectory": {
- "message": "Selecciona un directorio",
- "description": "Button to allow the user to find a folder on disk"
- },
- "loadDataHeader": {
- "message": "Load your data",
- "description": "Header shown on the first screen in the data import process"
- },
- "loadDataDescription": {
- "message": "You've just gone through the export process, and your contacts and messages are waiting patiently on your computer. Select the folder that contains your saved Signal data.",
- "description": "Introduction to the process of importing messages and contacts from disk"
- },
- "importChooserTitle": {
- "message": "Escoje el directorio con la información exportada",
- "description": "Title of the popup window used to select data previously exported"
- },
- "importErrorHeader": {
- "message": "Something went wrong!",
- "description": "Header of the error screen after a failed import"
- },
- "importingHeader": {
- "message": "Loading contacts and messages",
- "description": "Header of screen shown as data is import"
- },
- "importErrorFirst": {
- "message": "Make sure you have chosen the correct directory that contains your saved Signal data. Its name should begin with 'Signal Export.' You can also save a new copy of your data from the Chrome App.",
- "description": "Message shown if the import went wrong; first paragraph"
- },
- "importErrorSecond": {
- "message": "If these steps don't work for you, please submit a debug log (View -> Debug Log) so that we can help you get migrated!",
- "description": "Message shown if the import went wrong; second paragraph"
- },
- "importAgain": {
- "message": "Choose folder and try again",
- "description": "Button shown if the user runs into an error during import, allowing them to start over"
- },
- "importCompleteHeader": {
- "message": "Success!",
- "description": "Header shown on the screen at the end of a successful import process"
- },
- "importCompleteStartButton": {
- "message": "Start using Signal Desktop",
- "description": "Button shown at end of successful import process, nothing left but a restart"
- },
- "importCompleteLinkButton": {
- "message": "Link this device to your phone",
- "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen"
- },
- "selectedLocation": {
- "message": "tu ubicación seleccionada",
- "description": "Message shown as the export location if we didn't capture the target directory"
- },
- "upgradingDatabase": {
- "message": "Actualizando base de datos. Esto pudiera tardar un poco...",
- "description": "Message shown on the loading screen when we're changing database structure on first run of a new version"
- },
- "loadingMessages": {
- "message": "Cargando mensajes. Hasta ahora $count$...",
- "description": "Message shown on the loading screen when we're catching up on the backlog of messages",
- "placeholders": {
- "count": {
- "content": "$1",
- "example": "5"
- }
- }
- },
- "me": {
- "message": "Yo",
- "description": "The label for yourself when shown in a group member list"
- },
- "view": {
- "message": "Ver",
- "description": "Used as a label on a button allowing user to see more information"
- },
- "youLeftTheGroup": {
- "message": "Abandonaste el grupo",
- "description": "Displayed when a user can't send a message because they have left the group"
- },
- "scrollDown": {
- "message": "Desplazar al final de la conversación",
- "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up"
- },
- "messageBelow": {
- "message": "Nuevo mensaje abajo",
- "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen"
- },
- "messagesBelow": {
- "message": "Nuevos mensajes abajo",
- "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen"
- },
- "unreadMessage": {
- "message": "1 Mensaje sin Leer",
- "description": "Text for unread message separator, just one message"
- },
- "unreadMessages": {
- "message": "$count$ Mensajes No Leídos",
- "description": "Text for unread message separator, with count",
- "placeholders": {
- "count": {
- "content": "$1",
- "example": "5"
- }
- }
- },
- "youMarkedAsVerified": {
- "message": "You marked your Safety Number with $name$ as verified",
- "description": "Shown in the conversation history when the user marks a contact as verified.",
- "placeholders": {
- "name": {
- "content": "$1",
- "example": "Bob"
- }
- }
- },
- "youMarkedAsNotVerified": {
- "message": "You marked your Safety Number with $name$ as not verified",
- "description": "Shown in the conversation history when the user marks a contact as not verified, whether on the Safety Number screen or by dismissing a banner or dialog.",
- "placeholders": {
- "name": {
- "content": "$1",
- "example": "Bob"
- }
- }
- },
- "youMarkedAsVerifiedOtherDevice": {
- "message": "You marked your Safety Number with $name$ as verified from another device",
- "description": "Shown in the conversation history when we discover that the user marked a contact as verified on another device.",
- "placeholders": {
- "name": {
- "content": "$1",
- "example": "Bob"
- }
- }
- },
- "youMarkedAsNotVerifiedOtherDevice": {
- "message": "You marked your Safety Number with $name$ as not verified from another device",
- "description": "Shown in the conversation history when we discover that the user marked a contact as not verified on another device.",
- "placeholders": {
- "name": {
- "content": "$1",
- "example": "Bob"
- }
- }
- },
- "membersNeedingVerification": {
- "message": "Tus números de seguridad con estos miembros del grupo han cambiado desde la última vez que verificaste. Presiona en un miembro de grupo para ver tu número de seguridad con él.",
- "description": "When there are multiple previously-verified group members with safety number changes, a banner will be shown. The list of contacts with safety number changes is shown, and this text introduces that list."
- },
- "changedSinceVerifiedMultiple": {
- "message": "Tus números de seguridad con múltiples miembros del grupo han cambiado desde que verificaste por última vez. Esto podría significar que alguien esta tratando de interceptar tus comunicaciones o simplemente que ellos han reinstalado Signal.",
- "description": "Shown on confirmation dialog when user attempts to send a message"
- },
- "changedSinceVerified": {
- "message": "Tu número de seguridad con $name$ ha cambiado desde la última vez que verificaste. Esto puede deberse a que alguien está intentando interceptar tu comunicación o simplemente a que $name$ a reinstalado Signal.",
- "description": "Shown on confirmation dialog when user attempts to send a message",
- "placeholders": {
- "name": {
- "content": "$1",
- "example": "Bob"
- }
- }
- },
- "changedRightAfterVerify": {
- "message": "El número de seguridad que estas tratando de verificar ha cambiado. Por favor revisa tu nuevo número de seguridad con $name$. Recuerda, este cambio pudiera significar que alguien esta intentando interceptar tu comunicación o simplemente que $name$ ha reinstalado Signal.",
- "description": "Shown on the safety number screen when the user has selected to verify/unverify a contact's safety number, and we immediately discover a safety number change",
- "placeholders": {
- "name": {
- "content": "$1",
- "example": "Bob"
- }
- }
- },
- "changedRecentlyMultiple": {
- "message": "Tus números de seguridad con multiples miembros de este grupo han cambiando recientemente. Esto pudiera significar que alguien esta intentando interceptar tu comunicación o simplemente que ellos han reinstalado Signal.",
- "description": "Shown on confirmation dialog when user attempts to send a message"
- },
- "changedRecently": {
- "message": "Tu número de seguridad con $name$ ha cambiado recientemente. Esto puede deberse a que alguien está intentando interceptar tu comunicación o simplemente a que $name$ ha reinstalado Signal.",
- "description": "Shown on confirmation dialog when user attempts to send a message",
- "placeholders": {
- "name": {
- "content": "$1",
- "example": "Bob"
- }
- }
- },
- "identityKeyErrorOnSend": {
- "message": "Tu número de seguridad con $name$ ha cambiado. Esto podría deberse a una de dos razones, alguien está intentando interceptar tu comunicación o simplemente que $name$ ha reinstalado Signal. Quizá desees verificar tu número de seguridad con este contacto.",
- "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change",
- "placeholders": {
- "name": {
- "content": "$1",
- "example": "Bob"
- }
- }
- },
- "sendAnyway": {
- "message": "Enviar de Cualquier Forma",
- "description": "Used on a warning dialog to make it clear that it might be risky to send the message."
- },
- "noLongerVerified": {
- "message": "Tu número de seguridad con $name$ ha cambiado y ya no está verificado. Presiona para mostrar.",
- "description": "Shown in converation banner when user's safety number has changed, but they were previously verified.",
- "placeholders": {
- "name": {
- "content": "$1",
- "example": "Bob"
- }
- }
- },
- "multipleNoLongerVerified": {
- "message": "Tus números de seguridad con múltiples miembros de este grupo han cambiado y ya no están verificados. Presiona para mostrar.",
- "description": "Shown in conversation banner when more than one group member's safety number has changed, but they were previously verified."
- },
- "debugLogExplanation": {
- "message": "Esta bitácora será publicada en línea para ser observada por los contribuyentes. Debes examinarla y editarla antes de enviarla.",
- "description": ""
- },
- "debugLogError": {
- "message": "Something went wrong with the upload! Please consider manually adding your log to the bug you file.",
- "description": ""
- },
- "reportIssue": {
- "message": "Reportar un problema",
- "description": "Link to open the issue tracker"
- },
- "gotIt": {
- "message": "¡Entendido!",
- "description": "Label for a button that dismisses a dialog. The user clicks it to confirm that they understand the message in the dialog."
- },
- "submit": {
- "message": "Enviar",
- "description": ""
- },
- "acceptNewKey": {
- "message": "Aceptar",
- "description": "Label for a button to accept a new safety number"
- },
- "verify": {
- "message": "Marcar como verificado",
- "description": ""
- },
- "unverify": {
- "message": "Marcar como no verificado",
- "description": ""
- },
- "isVerified": {
- "message": "Has verificado tu número de seguridad con $name$.",
- "description": "Summary state shown at top of the safety number screen if user has verified contact.",
- "placeholders": {
- "name": {
- "content": "$1",
- "example": "Bob"
- }
- }
- },
- "isNotVerified": {
- "message": "No has verificado tu número de seguridad con $name$.",
- "description": "Summary state shown at top of the safety number screen if user has not verified contact.",
- "placeholders": {
- "name": {
- "content": "$1",
- "example": "Bob"
- }
- }
- },
- "verified": {
- "message": "Verificado",
- "description": ""
- },
- "newIdentity": {
- "message": "Nuevo número de seguridad",
- "description": "Header for a key change dialog"
- },
- "identityChanged": {
- "message": "Tu número de seguridad con este contacto cambió. Esto puede significar que alguien está tratando de interceptar tus mensajes y/o llamadas o tu contacto simplemente reinstaló Signal. Deberías verificar tu número de seguridad a continuación.",
- "description": ""
- },
- "incomingError": {
- "message": "Error handling incoming message",
- "description": ""
- },
- "media": {
- "message": "Media",
- "description": "Header of the default pane in the media gallery, showing images and videos"
- },
- "mediaEmptyState": {
- "message": "You don’t have any media in this conversation",
- "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)"
- },
- "documents": {
- "message": "Documents",
- "description": "Header of the secondary pane in the media gallery, showing every non-media attachment"
- },
- "documentsEmptyState": {
- "message": "You don’t have any documents in this conversation",
- "description": "Message shown to user in the media gallery when there are no messages with document attachments (anything other than images or video)"
- },
- "today": {
- "message": "Today",
- "description": "Section header in the media gallery"
- },
- "yesterday": {
- "message": "Yesterday",
- "description": "Section header in the media gallery"
- },
- "thisWeek": {
- "message": "This Week",
- "description": "Section header in the media gallery"
- },
- "thisMonth": {
- "message": "This Month",
- "description": "Section header in the media gallery"
- },
- "unsupportedAttachment": {
- "message": "Tipo de archivo adjunto no soportado. Haz click para guardar.",
- "description": "Displayed for incoming unsupported attachment"
- },
- "clickToSave": {
- "message": "Presiona para guardar",
- "description": "Hover text for attachment filenames"
- },
- "unnamedFile": {
- "message": "Archivo Sin Nombre",
- "description": "Hover text for attachment filenames"
- },
- "voiceMessage": {
- "message": "Mensaje de Voz",
- "description": "Name for a voice message attachment"
- },
- "unsupportedFileType": {
- "message": "Tipo de archivo no soportado",
- "description": "Displayed for outgoing unsupported attachment"
- },
- "fileSizeWarning": {
- "message": "Disculpe, el archivo seleccionado excede las restricciones de tamaño del mensaje.",
- "description": ""
- },
- "disconnected": {
- "message": "Desconectado",
- "description": "Displayed when the desktop client cannot connect to the server."
- },
- "connecting": {
- "message": "Conectando",
- "description": "Displayed when the desktop client is currently connecting to the server."
- },
- "offline": {
- "message": "Desconectado",
- "description": "Displayed when the desktop client has no network connection."
- },
- "checkNetworkConnection": {
- "message": "Revisa tu conexión de red",
- "description": "Obvious instructions for when a user's computer loses its network connection"
- },
- "attemptingReconnection": {
- "message": "Intentando reconectar en $reconnect_duration_in_seconds$ segundos",
- "description": "",
- "placeholders": {
- "reconnect_duration_in_seconds": {
- "content": "$1",
- "example": "10"
- }
- }
- },
- "submitDebugLog": {
- "message": "Debug log",
- "description": "Menu item and header text for debug log modal (sentence case)"
- },
- "debugLog": {
- "message": "Registro de depuración",
- "description": "View menu item to open the debug log (title case)"
- },
- "goToReleaseNotes": {
- "message": "Go to Release Notes",
- "description": ""
- },
- "goToForums": {
- "message": "Go to Forums",
- "description": "Item under the Help menu, takes you to the forums"
- },
- "goToSupportPage": {
- "message": "Go to Support Page",
- "description": "Item under the Help menu, takes you to the support page"
- },
- "menuReportIssue": {
- "message": "Report an Issue",
- "description": "Item under the Help menu, takes you to GitHub new issue form (title case)"
- },
- "signalDesktopPreferences": {
- "message": "Signal Desktop Preferences",
- "description": "Title of the window that pops up with Signal Desktop preferences in it"
- },
- "aboutSignalDesktop": {
- "message": "Acerca de Signal Desktop",
- "description": "Item under the Help menu, which opens a small about window"
- },
- "speech": {
- "message": "Voz",
- "description": "Item under the Edit menu, with 'start/stop speaking' items below it"
- },
- "show": {
- "message": "Mostrar",
- "description": "Command under Window menu, to show the window"
- },
- "hide": {
- "message": "Hide",
- "description": "Command in the tray icon menu, to hide the window"
- },
- "quit": {
- "message": "Quit",
- "description": "Command in the tray icon menu, to quit the application"
- },
- "trayTooltip": {
- "message": "Signal Desktop",
- "description": "Tooltip for the tray icon"
- },
- "searchForPeopleOrGroups": {
- "message": "Enter name or number",
- "description": "Placeholder text in the search input"
- },
- "welcomeToSignal": {
- "message": "Bienvenido a Signal",
- "description": ""
- },
- "selectAContact": {
- "message": "Escoge un contacto o grupo para comenzar una conversación",
- "description": ""
- },
- "contactAvatarAlt": {
- "message": "Avatar for contact $name$",
- "description": "Used in the alt tag for the image avatar of a contact",
- "placeholders": {
- "name": {
- "content": "$1",
- "example": "John"
- }
- }
- },
- "sendMessageToContact": {
- "message": "Send Message",
- "description": "Shown when you are sent a contact and that contact has a signal account"
- },
- "home": {
- "message": "home",
- "description": "Shown on contact detail screen as a label for an address/phone/email"
- },
- "work": {
- "message": "work",
- "description": "Shown on contact detail screen as a label for an address/phone/email"
- },
- "mobile": {
- "message": "mobile",
- "description": "Shown on contact detail screen as a label for aa phone or email"
- },
- "email": {
- "message": "email",
- "description": "Generic label shown if contact email has custom type but no label"
- },
- "phone": {
- "message": "phone",
- "description": "Generic label shown if contact phone has custom type but no label"
- },
- "address": {
- "message": "address",
- "description": "Generic label shown if contact address has custom type but no label"
- },
- "poBox": {
- "message": "PO Box",
- "description": "When rendering an address, used to provide context to a post office box"
- },
- "downloadAttachment": {
- "message": "Download Attachment",
- "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button"
- },
- "replyToMessage": {
- "message": "Reply to Message",
- "description": "Shown in triple-dot menu next to message to allow user to start crafting a message with a quotation"
- },
- "originalMessageNotFound": {
- "message": "Original message not found",
- "description": "Shown in quote if reference message was not found as message was initially downloaded and processed"
- },
- "originalMessageNotAvailable": {
- "message": "Original message no longer available",
- "description": "Shown in toast if user clicks on quote that references message no longer in database"
- },
- "messageFoundButNotLoaded": {
- "message": "Original message found, but not loaded. Scroll up to load it.",
- "description": "Shown in toast if user clicks on quote references messages not loaded in view, but in database"
- },
- "you": {
- "message": "You",
- "description": "In Android theme, shown in quote if you or someone else replies to you"
- },
- "replyingTo": {
- "message": "Replying to $name$",
- "description": "Shown in iOS theme when you or someone quotes to a message which is not from you",
- "placeholders": {
- "name": {
- "content": "$1",
- "example": "John"
- }
- }
- },
- "audioPermissionNeeded": {
- "message": "To send audio messages, allow Signal Desktop to access your microphone.",
- "description": "Shown if the user attempts to send an audio message without audio permssions turned on"
- },
- "allowAccess": {
- "message": "Allow Access",
- "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages"
- },
- "showSettings": {
- "message": "Show Settings",
- "description": "A button shown in dialog requesting the user to turn on audio permissions"
- },
- "audio": {
- "message": "Audio",
- "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment"
- },
- "video": {
- "message": "Video",
- "description": "Shown in a quotation of a message containing a video if no text was originally provided with that video"
- },
- "photo": {
- "message": "Photo",
- "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image"
- },
- "ok": {
- "message": "OK",
- "description": ""
- },
- "cancel": {
- "message": "Cancelar",
- "description": ""
- },
- "failedToSend": {
- "message": "Fallo en el envío a algunos destinatarios. Revisa tu conexión a la red.",
- "description": ""
- },
- "error": {
- "message": "Error",
- "description": ""
- },
- "messageDetail": {
- "message": "Detalles del mensaje",
- "description": ""
- },
- "delete": {
- "message": "Borrar",
- "description": ""
- },
- "deleteWarning": {
- "message": "Are you sure? Clicking 'delete' will permanently remove this message from this device only.",
- "description": ""
- },
- "deleteThisMessage": {
- "message": "Borrar este mensaje",
- "description": ""
- },
- "from": {
- "message": "De",
- "description": "Label for the sender of a message"
- },
- "to": {
- "message": "Para",
- "description": "Label for the receiver of a message"
- },
- "sent": {
- "message": "Enviados",
- "description": "Label for the time a message was sent"
- },
- "received": {
- "message": "Recibidos",
- "description": "Label for the time a message was received"
- },
- "sendMessage": {
- "message": "Enviar un mensaje",
- "description": "Placeholder text in the message entry field"
- },
- "groupMembers": {
- "message": "Miembros del grupo",
- "description": ""
- },
- "showMembers": {
- "message": "Mostrar miembros",
- "description": ""
- },
- "resetSession": {
- "message": "Reiniciar sesión",
- "description": "This is a menu item for resetting the session, using the imperative case, as in a command."
- },
- "showSafetyNumber": {
- "message": "View safety number",
- "description": ""
- },
- "viewAllMedia": {
- "message": "View all media",
- "description": "This is a menu item for viewing all media (images + video) in a conversation, using the imperative case, as in a command."
- },
- "verifyHelp": {
- "message": "Si deseas verificar la seguridad de la criptografía de extremo-a-extremo con $name$, compara los números de arriba con los números en su dispositivo.",
- "description": "",
- "placeholders": {
- "name": {
- "content": "$1",
- "example": "John"
- }
- }
- },
- "theirIdentityUnknown": {
- "message": "Tú no has intercambiado ningún mensaje con este contacto todavía. Tu número de seguridad estará disponible después del primer mensaje.",
- "description": ""
- },
- "moreInfo": {
- "message": "More Info...",
- "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen"
- },
- "retrySend": {
- "message": "Retry Send",
- "description": "Shown on the drop-down menu for an indinvidaul message, but only if it is an outgoing message that failed to send"
- },
- "deleteMessage": {
- "message": "Delete Message",
- "description": "Shown on the drop-down menu for an individual message, deletes single message"
- },
- "deleteMessages": {
- "message": "Borrar mensajes",
- "description": "Menu item for deleting messages, title case."
- },
- "deleteConversationConfirmation": {
- "message": "Borrar esta conversación permanentemente?",
- "description": "Confirmation dialog text that asks the user if they really wish to delete the conversation. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone."
- },
- "sessionEnded": {
- "message": "Reiniciar sesión segura",
- "description": "This is a past tense, informational message. In other words, your secure session has been reset."
- },
- "quoteThumbnailAlt": {
- "message": "Thumbnail of image from quoted message",
- "description": "Used in alt tag of thumbnail images inside of an embedded message quote"
- },
- "imageFailedToLoad": {
- "message": "Image failed to load",
- "description": "When an image attachment is missing, this message is shown"
- },
- "videoScreenshotFailedToLoad": {
- "message": "Video screenshot failed to load",
- "description": "When a attachment video screenshot is missing, this message is shown"
- },
- "imageAttachmentAlt": {
- "message": "Image attached to message",
- "description": "Used in alt tag of image attachment"
- },
- "videoAttachmentAlt": {
- "message": "Screenshot of video attached to message",
- "description": "Used in alt tag of video attachment preview"
- },
- "lightboxImageAlt": {
- "message": "Image sent in conversation",
- "description": "Used in the alt tag for the image shown in a full-screen lightbox view"
- },
- "fileIconAlt": {
- "message": "File icon",
- "description": "Used in the media gallery documents tab to visually represent a file"
- },
- "installWelcome": {
- "message": "Bienvenido a Signal Desktop",
- "description": "Welcome title on the install page"
- },
- "installTagline": {
- "message": "La privacidad es posible. Signal lo hace fácil.",
- "description": "Tagline displayed under 'installWelcome' string on the install page"
- },
- "linkYourPhone": {
- "message": "Link your phone to Signal Desktop",
- "description": "Shown on the front page when the application first starst, above the QR code"
- },
- "signalSettings": {
- "message": "Signal Settings",
- "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app"
- },
- "linkedDevices": {
- "message": "Linked Devices",
- "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app"
- },
- "plusButton": {
- "message": "'+' Button",
- "description": "The button used in Signal Android to add a new linked device"
- },
- "linkNewDevice": {
- "message": "Link New Device",
- "description": "The menu option shown in Signal iOS to add a new linked device"
- },
- "deviceName": {
- "message": "Device name",
- "description": "The label in settings panel shown for the user-provided name for this desktop instance"
- },
- "chooseDeviceName": {
- "message": "Choose this device's name",
- "description": "The header shown on the 'choose device name' screen in the device linking process"
- },
- "finishLinkingPhone": {
- "message": "Finish linking phone",
- "description": "The text on the button to finish the linking process, after choosing the device name"
- },
- "initialSync": {
- "message": "Syncing contacts and groups",
- "description": "Shown during initial link while contacts and groups are being pulled from mobile device"
- },
- "installConnectionFailed": {
- "message": "Fallo al conectarse al servidor",
- "description": "Displayed when we can't connect to the server."
- },
- "installTooManyDevices": {
- "message": "Disculpe, tienes muchos dispositivos conectados. Intenta remover algunos.",
- "description": ""
- },
- "settings": {
- "message": "Configuraciones",
- "description": "Menu item and header for global settings"
- },
- "theme": {
- "message": "Estilo",
- "description": "Header for theme settings"
- },
- "permissions": {
- "message": "Permissions",
- "description": "Header for permissions section of settings"
- },
- "mediaPermissionsDescription": {
- "message": "Allow access to camera and microphone",
- "description": "Description of the media permission description"
- },
- "spellCheck": {
- "message": "Spell Check",
- "description": "Description of the media permission description"
- },
- "spellCheckDescription": {
- "message": "Enable spell check of text entered in message composition box",
- "description": "Description of the media permission description"
- },
- "clearDataHeader": {
- "message": "Clear Data",
- "description": "Header in the settings dialog for the section dealing with data deletion"
- },
- "clearDataExplanation": {
- "message": "This will clear all data in the application, removing all messages and saved account information.",
- "description": "Text describing what the clear data button will do."
- },
- "clearDataButton": {
- "message": "Clear data",
- "description": "Button in the settings dialog starting process to delete all data"
- },
- "deleteAllDataHeader": {
- "message": "Delete all data?",
- "description": "Header of the full-screen delete data confirmation screen"
- },
- "deleteAllDataBody": {
- "message": "You are about to delete all of this application's saved account information, including all contacts and all messages. You can always link with your mobile device again, but that will not restore deleted messages.",
- "description": "Text describing what exactly will happen if the user clicks the button to delete all data"
- },
- "deleteAllDataButton": {
- "message": "Delete all data",
- "description": "Text of the button that deletes all data"
- },
- "deleteAllDataProgress": {
- "message": "Disconnecting and deleting all data",
- "description": "Message shown to user when app is disconnected and data deleted"
- },
- "notifications": {
- "message": "Notificaciones",
- "description": "Header for notification settings"
- },
- "notificationSettingsDialog": {
- "message": "Cuando los mensajes llegan, muestran notificaciones que revelan:",
- "description": "Explain the purpose of the notification settings"
- },
- "disableNotifications": {
- "message": "Deshabilitar notificaciones",
- "description": "Label for disabling notifications"
- },
- "nameAndMessage": {
- "message": "Nombre y mensaje",
- "description": "Label for setting notifications to display name and message text"
- },
- "noNameOrMessage": {
- "message": "Sin nombre ni mensaje",
- "description": "Label for setting notifications to display no name and no message text"
- },
- "nameOnly": {
- "message": "Solo el nombre",
- "description": "Label for setting notifications to display sender name only"
- },
- "newMessage": {
- "message": "Nuevo mensaje",
- "description": "Displayed in notifications for only 1 message"
- },
- "newMessages": {
- "message": "Nuevos mensajes",
- "description": "Displayed in notifications for multiple messages"
- },
- "notificationMostRecentFrom": {
- "message": "Most recent from:",
- "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting"
- },
- "notificationFrom": {
- "message": "From:",
- "description": "Displayed in notifications when setting is 'name only' and one message is waiting"
- },
- "notificationMostRecent": {
- "message": "Most recent:",
- "description": "Displayed in notifications when setting is 'name and message' and more than one message is waiting"
- },
- "sendFailed": {
- "message": "Send failed",
- "description": "Shown on outgoing message if it fails to send"
- },
- "showMore": {
- "message": "Detalles",
- "description": "Displays the details of a key change"
- },
- "showLess": {
- "message": "Esconder detalles",
- "description": "Hides the details of a key change"
- },
- "learnMore": {
- "message": "Aprende más acerca de la verificación de números de seguridad",
- "description": "Text that links to a support article on verifying safety numbers"
- },
- "expiredWarning": {
- "message": "Esta versión de Signal Desktop está obsoleta. Por favor, actualiza a la versión más reciente para continuar mensajeando.",
- "description": "Warning notification that this version of the app has expired"
- },
- "androidMessageLengthWarning": {
- "message": "Clientes de Android solo recibirán los primeros 2000 caracteres de este mensaje",
- "description": "Warning that long messages could not get received completely by Android clients."
- },
- "upgrade": {
- "message": "Actualizar",
- "description": "Label text for button to upgrade the app to the latest version"
- },
- "mediaMessage": {
- "message": "Mensaje multimedia",
- "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview."
- },
- "unregisteredUser": {
- "message": "Número no está registrado",
- "description": "Error message displayed when sending to an unregistered user."
- },
- "sync": {
- "message": "Contactos",
- "description": "Label for contact and group sync settings"
- },
- "syncExplanation": {
- "message": "Importar todos los contactos y grupos de Signal desde tu dispositivo móvil",
- "description": "Explanatory text for sync settings"
- },
- "lastSynced": {
- "message": "Última importación a las",
- "description": "Label for date and time of last sync operation"
- },
- "syncNow": {
- "message": "Importar ya",
- "description": "Label for a button that syncs contacts and groups from your phone"
- },
- "syncing": {
- "message": "Importando...",
- "description": "Label for a disabled sync button while sync is in progress."
- },
- "syncFailed": {
- "message": "La importación ha fallado. Asegúrate de que tu computadora y tu dispositivo móvil están conectados al internet.",
- "description": "Informational text displayed if a sync operation times out."
- },
- "timestamp_s": {
- "message": "ahora",
- "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble."
- },
- "timestamp_m": {
- "message": "1 minuto",
- "description": "Brief timestamp for messages sent about one minute ago. Displayed in the conversation list and message bubble."
- },
- "timestamp_h": {
- "message": "1 hora",
- "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble."
- },
- "hoursAgoShort": {
- "message": "$hours$ hr",
- "description": "Even further contracted form of 'X hours ago' which works both for singular and plural, used in the left pane",
- "placeholders": {
- "hours": {
- "content": "$1",
- "example": "2"
- }
- }
- },
- "hoursAgo": {
- "message": "$hours$ hr ago",
- "description": "Contracted form of 'X hours ago' which works both for singular and plural",
- "placeholders": {
- "hours": {
- "content": "$1",
- "example": "2"
- }
- }
- },
- "minutesAgoShort": {
- "message": "$minutes$ min",
- "description": "Even further contracted form of 'X minutes ago' which works both for singular and plural, used in the left pane",
- "placeholders": {
- "minutes": {
- "content": "$1",
- "example": "10"
- }
- }
- },
- "minutesAgo": {
- "message": "$minutes$ min ago",
- "description": "Contracted form of 'X minutes ago' which works both for singular and plural",
- "placeholders": {
- "minutes": {
- "content": "$1",
- "example": "10"
- }
- }
- },
- "justNow": {
- "message": "ahora",
- "description": "Shown if a message is very recent, less than 60 seconds old"
- },
- "timestampFormat_M": {
- "message": "D MMM",
- "description": "Timestamp format string for displaying month and day (but not the year) of a date within the current year, ex: use 'MMM D' for 'Aug 8', or 'D MMM' for '8 Aug'."
- },
- "unblockToSend": {
- "message": "Desbloquea este contacto para enviarle un mensaje.",
- "description": "Brief message shown when trying to message a blocked number"
- },
- "youChangedTheTimer": {
- "message": "You set the disappearing message timer to $time$",
- "description": "Message displayed when you change the message expiration timer in a conversation.",
- "placeholders": {
- "time": {
- "content": "$1",
- "example": "10m"
- }
- }
- },
- "timerSetOnSync": {
- "message": "Updated disappearing message timer to $time$",
- "description": "Message displayed when timer is set on initial link of desktop device.",
- "placeholders": {
- "time": {
- "content": "$1",
- "example": "10m"
- }
- }
- },
- "theyChangedTheTimer": {
- "message": "$name$ set the disappearing message timer to $time$",
- "description": "Message displayed when someone else changes the message expiration timer in a conversation.",
- "placeholders": {
- "name": {
- "content": "$1",
- "example": "Bob"
- },
- "time": {
- "content": "$2",
- "example": "10m"
- }
- }
- },
- "timerOption_0_seconds": {
- "message": "apagado",
- "description": "Label for option to turn off message expiration in the timer menu"
- },
- "timerOption_5_seconds": {
- "message": "5 segundos",
- "description": "Label for a selectable option in the message expiration timer menu"
- },
- "timerOption_10_seconds": {
- "message": "10 segundos",
- "description": "Label for a selectable option in the message expiration timer menu"
- },
- "timerOption_30_seconds": {
- "message": "30 segundos",
- "description": "Label for a selectable option in the message expiration timer menu"
- },
- "timerOption_1_minute": {
- "message": "1 minuto",
- "description": "Label for a selectable option in the message expiration timer menu"
- },
- "timerOption_5_minutes": {
- "message": "5 minutes",
- "description": "Label for a selectable option in the message expiration timer menu"
- },
- "timerOption_30_minutes": {
- "message": "30 minutes",
- "description": "Label for a selectable option in the message expiration timer menu"
- },
- "timerOption_1_hour": {
- "message": "1 hora",
- "description": "Label for a selectable option in the message expiration timer menu"
- },
- "timerOption_6_hours": {
- "message": "6 hours",
- "description": "Label for a selectable option in the message expiration timer menu"
- },
- "timerOption_12_hours": {
- "message": "12 hours",
- "description": "Label for a selectable option in the message expiration timer menu"
- },
- "timerOption_1_day": {
- "message": "1 día",
- "description": "Label for a selectable option in the message expiration timer menu"
- },
- "timerOption_1_week": {
- "message": "1 semana",
- "description": "Label for a selectable option in the message expiration timer menu"
- },
- "disappearingMessages": {
- "message": "Mensajes auto destructivos",
- "description": "Conversation menu option to enable disappearing messages"
- },
- "timerOption_0_seconds_abbreviated": {
- "message": "apagado",
- "description": "Short format indicating current timer setting in the conversation list snippet"
- },
- "timerOption_5_seconds_abbreviated": {
- "message": "5s",
- "description": "Very short format indicating current timer setting in the conversation header"
- },
- "timerOption_10_seconds_abbreviated": {
- "message": "10s",
- "description": "Very short format indicating current timer setting in the conversation header"
- },
- "timerOption_30_seconds_abbreviated": {
- "message": "30s",
- "description": "Very short format indicating current timer setting in the conversation header"
- },
- "timerOption_1_minute_abbreviated": {
- "message": "1m",
- "description": "Very short format indicating current timer setting in the conversation header"
- },
- "timerOption_5_minutes_abbreviated": {
- "message": "5m",
- "description": "Very short format indicating current timer setting in the conversation header"
- },
- "timerOption_30_minutes_abbreviated": {
- "message": "30m",
- "description": "Very short format indicating current timer setting in the conversation header"
- },
- "timerOption_1_hour_abbreviated": {
- "message": "1h",
- "description": "Very short format indicating current timer setting in the conversation header"
- },
- "timerOption_6_hours_abbreviated": {
- "message": "6h",
- "description": "Very short format indicating current timer setting in the conversation header"
- },
- "timerOption_12_hours_abbreviated": {
- "message": "12h",
- "description": "Very short format indicating current timer setting in the conversation header"
- },
- "timerOption_1_day_abbreviated": {
- "message": "1d",
- "description": "Very short format indicating current timer setting in the conversation header"
- },
- "timerOption_1_week_abbreviated": {
- "message": "1 sem",
- "description": "Very short format indicating current timer setting in the conversation header"
- },
- "disappearingMessagesDisabled": {
- "message": "Disappearing messages disabled",
- "description": "Displayed in the left pane when the timer is turned off"
- },
- "disabledDisappearingMessages": {
- "message": "$name$ disabled disappearing messages",
- "description": "Displayed in the conversation list when the timer is turned off",
- "placeholders": {
- "name": {
- "content": "$1",
- "example": "John"
- }
- }
- },
- "youDisabledDisappearingMessages": {
- "message": "You disabled disappearing messages",
- "description": "Displayed in the conversation list when the timer is turned off"
- },
- "timerSetTo": {
- "message": "Contador puesto en $time$",
- "description": "Displayed in the conversation list when the timer is updated by some automatic action, or in the left pane",
- "placeholders": {
- "time": {
- "content": "$1",
- "example": "1w"
- }
- }
- },
- "audioNotificationDescription": {
- "message": "Reproducir notificación de audio",
- "description": "Description for audio notification setting"
- },
- "safetyNumberChanged": {
- "message": "Safety Number has changed",
- "description": "A notification shown in the conversation when a contact reinstalls"
- },
- "safetyNumberChangedGroup": {
- "message": "Safety Number with $name$ has changed",
- "description": "A notification shown in a group conversation when a contact reinstalls, showing the contact name",
- "placeholders": {
- "name": {
- "content": "$1",
- "example": "John"
- }
- }
- },
- "verifyNewNumber": {
- "message": "Verify Safety Number",
- "description": "Label on button included with safety number change notification in the conversation"
- },
- "yourSafetyNumberWith": {
- "message": "Tu número de seguridad con $name$:",
- "description": "Heading for safety number view",
- "placeholders": {
- "name": {
- "content": "$1",
- "example": "John"
- }
- }
- },
- "themeLight": {
- "message": "Light",
- "description": "Label text for light theme (normal)"
- },
- "themeDark": {
- "message": "Dark",
- "description": "Label text for dark theme"
- },
- "hideMenuBar": {
- "message": "Esconder barra de menú",
- "description": "Label text for menu bar visibility setting"
- },
- "startConversation": {
- "message": "Start conversation…",
- "description": "Label underneath number a user enters that is not an existing contact"
- },
- "newPhoneNumber": {
- "message": "Introduce un número telefónico para agregar contacto",
- "description": "Placeholder for adding a new number to a contact"
- },
- "invalidNumberError": {
- "message": "Número inválido",
- "description": "When a person inputs a number that is invalid"
- },
- "unlinkedWarning": {
- "message": "Re-enlaza Signal Desktop a tu dispositivo móvil para continuar mensajeando.",
- "description": ""
- },
- "unlinked": {
- "message": "No enlazado",
- "description": ""
- },
- "relink": {
- "message": "Re-enlazar",
- "description": ""
- },
- "autoUpdateNewVersionTitle": {
- "message": "Actualización de Signal disponible",
- "description": ""
- },
- "autoUpdateNewVersionMessage": {
- "message": "Hay una nueva versión de Signal disponible.",
- "description": ""
- },
- "autoUpdateNewVersionInstructions": {
- "message": "Press Restart Signal to apply the updates.",
- "description": ""
- },
- "autoUpdateRestartButtonLabel": {
- "message": "Restart Signal",
- "description": ""
- },
- "autoUpdateLaterButtonLabel": {
- "message": "Más tarde",
- "description": ""
- },
- "leftTheGroup": {
- "message": "$name$ left the group",
- "description": "Shown in the conversation history when a single person leaves the group",
- "placeholders": {
- "name": {
- "content": "$1",
- "example": "Bob"
- }
- }
- },
- "multipleLeftTheGroup": {
- "message": "$name$ left the group",
- "description": "Shown in the conversation history when multiple people leave the group",
- "placeholders": {
- "name": {
- "content": "$1",
- "example": "Alice, Bob"
- }
- }
- },
- "updatedTheGroup": {
- "message": "Group updated",
- "description": "Shown in the conversation history when someone updates the group",
- "placeholders": {
- "name": {
- "content": "$1",
- "example": "Alice"
- }
- }
- },
- "titleIsNow": {
- "message": "Title is now '$name$'",
- "description": "Shown in the conversation history when someone changes the title of the group",
- "placeholders": {
- "name": {
- "content": "$1",
- "example": "Book Club"
- }
- }
- },
- "joinedTheGroup": {
- "message": "$name$ joined the group",
- "description": "Shown in the conversation history when a single person joins the group",
- "placeholders": {
- "name": {
- "content": "$1",
- "example": "Alice"
- }
- }
- },
- "multipleJoinedTheGroup": {
- "message": "$names$ joined the group",
- "description": "Shown in the conversation history when more than one person joins the group",
- "placeholders": {
- "names": {
- "content": "$1",
- "example": "Alice, Bob"
- }
- }
- },
- "privacyPolicy": {
- "message": "Terms & Privacy Policy",
- "description": "Shown in the about box for the link to https://signal.org/legal"
- }
-}
diff --git a/about_preload.js b/about_preload.js
index 1d7d969b3a..2f9fa80f7d 100644
--- a/about_preload.js
+++ b/about_preload.js
@@ -25,4 +25,4 @@ window.closeAbout = () => ipcRenderer.send('close-about');
window.i18n = i18n.setup(locale, localeMessages);
-require('./ts/logging/set_up_renderer_logging');
+require('./ts/logging/set_up_renderer_logging').initialize();
diff --git a/app/menu.js b/app/menu.js
index 23979d5e39..10e2a71372 100644
--- a/app/menu.js
+++ b/app/menu.js
@@ -10,6 +10,7 @@ exports.createTemplate = (options, messages) => {
const {
isBeta,
+ devTools,
includeSetup,
openContactUs,
openForums,
@@ -118,13 +119,17 @@ exports.createTemplate = (options, messages) => {
label: messages.debugLog.message,
click: showDebugLog,
},
- {
- type: 'separator',
- },
- {
- role: 'toggledevtools',
- label: messages.viewMenuToggleDevTools.message,
- },
+ ...(devTools
+ ? [
+ {
+ type: 'separator',
+ },
+ {
+ role: 'toggledevtools',
+ label: messages.viewMenuToggleDevTools.message,
+ },
+ ]
+ : []),
],
},
{
diff --git a/app/tray_icon.js b/app/tray_icon.js
index 8a88b4319b..fde1eab4c3 100644
--- a/app/tray_icon.js
+++ b/app/tray_icon.js
@@ -11,8 +11,19 @@ let trayContextMenu = null;
let tray = null;
function createTrayIcon(getMainWindow, messages) {
- // A smaller icon is needed on macOS
- const iconSize = process.platform === 'darwin' ? '16' : '256';
+ let iconSize;
+ switch (process.platform) {
+ case 'darwin':
+ iconSize = '16';
+ break;
+ case 'win32':
+ iconSize = '32';
+ break;
+ default:
+ iconSize = '256';
+ break;
+ }
+
const iconNoNewMessages = path.join(
__dirname,
'..',
diff --git a/background.html b/background.html
index f29d0177e1..8e602dee0a 100644
--- a/background.html
+++ b/background.html
@@ -19,7 +19,7 @@
img-src 'self' blob: data:;
media-src 'self' blob:;
object-src 'none';
- script-src 'self';
+ script-src 'self' 'sha256-5J9nLKMi84ERvoy7r/3XVwiW1iZ5YaPic9BNaF/0rtI=';
style-src 'self' 'unsafe-inline';"
>
Signal
@@ -329,7 +329,6 @@
-
@@ -348,14 +347,11 @@
-
-
-
@@ -386,6 +382,12 @@
-
+
+