From 2503b089d654de390d322aa24aef6de08bbc9da3 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 27 Jul 2020 09:49:17 +1000 Subject: [PATCH 001/274] hide logs on session-file-server by default --- session-file-server | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/session-file-server b/session-file-server index 52b77bf30..5173163fe 160000 --- a/session-file-server +++ b/session-file-server @@ -1 +1 @@ -Subproject commit 52b77bf3039aec88b3900e8a7ed6e62d30a4d0d4 +Subproject commit 5173163fe18ac575676020e2f8621cf7a2956df3 From 52cb50f063e5ff631aeebdddceb02a6556373e58 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 27 Jul 2020 10:59:29 +1000 Subject: [PATCH 002/274] make lokiPlainFetch return a SnodeResponse object --- ts/session/snode_api/lokiRpc.ts | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/ts/session/snode_api/lokiRpc.ts b/ts/session/snode_api/lokiRpc.ts index 8b9559d3e..2bf5ebf66 100644 --- a/ts/session/snode_api/lokiRpc.ts +++ b/ts/session/snode_api/lokiRpc.ts @@ -30,15 +30,12 @@ async function lokiPlainFetch( if (!response.ok) { throw new window.textsecure.HTTPError('Loki_rpc error', response); } + const result = await response.text(); - let result; - if (response.headers.get('Content-Type') === 'application/json') { - result = await response.json(); - } else { - result = await response.text(); - } - - return result; + return { + body: result, + status: response.status, + }; } interface FetchOptions { From 8558764768a94dd1cd292bb648698008c5daff42 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 27 Jul 2020 11:27:37 +1000 Subject: [PATCH 003/274] fix open group integration tests --- integration_test/common.js | 17 ++++++++++------- integration_test/open_group_test.js | 2 +- .../page-objects/conversation.page.js | 7 +++++-- .../session/LeftPaneMessageSection.tsx | 7 ++++++- ts/session/snode_api/lokiRpc.ts | 2 +- 5 files changed, 23 insertions(+), 12 deletions(-) diff --git a/integration_test/common.js b/integration_test/common.js index 43bf55897..d0fbcf381 100644 --- a/integration_test/common.js +++ b/integration_test/common.js @@ -638,13 +638,15 @@ module.exports = { .should.eventually.equal(openGroupUrl); await app.client.element(ConversationPage.joinOpenGroupButton).click(); - // validate session loader is shown - await app.client.isExisting(ConversationPage.sessionLoader).should - .eventually.be.true; + await app.client.waitForExist( + ConversationPage.sessionToastJoinOpenGroup, + 2 * 1000 + ); + // account for slow home internet connection delays... await app.client.waitForExist( ConversationPage.sessionToastJoinOpenGroupSuccess, - 60 * 1000 + 20 * 1000 ); // validate overlay is closed @@ -652,9 +654,10 @@ module.exports = { .eventually.be.false; // validate open chat has been added - await app.client.isExisting( - ConversationPage.rowOpenGroupConversationName(name) - ).should.eventually.be.true; + await app.client.waitForExist( + ConversationPage.rowOpenGroupConversationName(name), + 20 * 1000 + ); }, async stopStubSnodeServer() { diff --git a/integration_test/open_group_test.js b/integration_test/open_group_test.js index 08a22d785..6e13adb56 100644 --- a/integration_test/open_group_test.js +++ b/integration_test/open_group_test.js @@ -59,7 +59,7 @@ describe('Open groups', function() { 1 * 1000 ); - // validate overlay is still opened + // validate overlay is still opened as connection failed await app.client.isExisting(ConversationPage.leftPaneOverlay).should .eventually.be.true; }); diff --git a/integration_test/page-objects/conversation.page.js b/integration_test/page-objects/conversation.page.js index 4110edd05..ff64fe285 100644 --- a/integration_test/page-objects/conversation.page.js +++ b/integration_test/page-objects/conversation.page.js @@ -44,11 +44,14 @@ module.exports = { // channels joinOpenGroupButton: commonPage.divRoleButtonWithText('Join Open Group'), openGroupInputUrl: commonPage.textAreaWithPlaceholder('chat.getsession.org'), + sessionToastJoinOpenGroup: commonPage.toastWithText( + 'Connecting to server...' + ), sessionToastJoinOpenGroupSuccess: commonPage.toastWithText( - 'Successfully connected to new open group server' + 'Successfully connected to open group' ), sessionToastJoinOpenGroupAlreadyExist: commonPage.toastWithText( - 'You are already connected to this public channel' + 'You are already connected to this open group' ), rowOpenGroupConversationName: groupName => commonPage.spanWithClassAndText( diff --git a/ts/components/session/LeftPaneMessageSection.tsx b/ts/components/session/LeftPaneMessageSection.tsx index 9b33e50cf..ffe4c34a3 100644 --- a/ts/components/session/LeftPaneMessageSection.tsx +++ b/ts/components/session/LeftPaneMessageSection.tsx @@ -476,10 +476,15 @@ export class LeftPaneMessageSection extends React.Component { // Connect to server try { + window.pushToast({ + title: window.i18n('connectingToServer'), + id: 'connectToServer', + type: 'success', + }); await OpenGroup.join(serverUrl, async () => { if (await OpenGroup.serverExists(serverUrl)) { window.pushToast({ - title: window.i18n('connectingToServer'), + title: window.i18n('connectToServerSuccess'), id: 'connectToServer', type: 'success', }); diff --git a/ts/session/snode_api/lokiRpc.ts b/ts/session/snode_api/lokiRpc.ts index 2bf5ebf66..0151643bd 100644 --- a/ts/session/snode_api/lokiRpc.ts +++ b/ts/session/snode_api/lokiRpc.ts @@ -85,7 +85,7 @@ export async function snodeRpc( params: any, targetNode: Snode ): Promise { - const url = `https://${targetNode.ip}${targetNode.port}/storage_rpc/v1`; + const url = `https://${targetNode.ip}:${targetNode.port}/storage_rpc/v1`; // TODO: The jsonrpc and body field will be ignored on storage server if (params.pubKey) { From 81d7189f0d73357dc03803dbc969ce0b90507996 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 27 Jul 2020 11:32:41 +1000 Subject: [PATCH 004/274] fix add_contacts test --- .../{add_friends_test.js => add_contacts_test.js} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename integration_test/{add_friends_test.js => add_contacts_test.js} (91%) diff --git a/integration_test/add_friends_test.js b/integration_test/add_contacts_test.js similarity index 91% rename from integration_test/add_friends_test.js rename to integration_test/add_contacts_test.js index 400da84ee..58bc930b6 100644 --- a/integration_test/add_friends_test.js +++ b/integration_test/add_contacts_test.js @@ -5,7 +5,7 @@ const { afterEach, beforeEach, describe, it } = require('mocha'); const common = require('./common'); const ConversationPage = require('./page-objects/conversation.page'); -describe('Add friends', function() { +describe('Add contact', function() { let app; let app2; this.timeout(60000); @@ -37,7 +37,7 @@ describe('Add friends', function() { await common.stopStubSnodeServer(); }); - it('addFriends: can add a friend by sessionID', async () => { + it('addContacts: can add a contact by sessionID', async () => { const textMessage = common.generateSendMessageText(); await app.client.element(ConversationPage.contactsButtonSection).click(); @@ -58,7 +58,7 @@ describe('Add friends', function() { await app.client.element(ConversationPage.nextButton).click(); await app.client.waitForExist(ConversationPage.sendMessageTextarea, 1000); - // send a text message to that user (will be a friend request) + // send a text message to that user await app.client .element(ConversationPage.sendMessageTextarea) .setValue(textMessage); @@ -68,7 +68,7 @@ describe('Add friends', function() { 1000 ); - // assure friend request message has been sent + // assure session request message has been sent await common.timeout(3000); await app.client.isExisting(ConversationPage.retrySendButton).should .eventually.be.false; From a983085cbdceea4ecf0911197332190f1355c4b3 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 28 Jul 2020 10:56:32 +1000 Subject: [PATCH 005/274] move page-objects to .ts files --- ts/test/session/integration/common.ts | 720 ++++++++++++++++++ .../session/integration/integration_test.ts | 35 + .../session/integration/link_device_test.ts | 70 ++ .../integration/page-objects/common.page.ts | 28 +- .../page-objects/conversation.page.ts | 26 +- .../page-objects/registration.page.ts | 11 +- .../integration/page-objects/settings.page.ts | 14 +- 7 files changed, 865 insertions(+), 39 deletions(-) create mode 100644 ts/test/session/integration/common.ts create mode 100644 ts/test/session/integration/integration_test.ts create mode 100644 ts/test/session/integration/link_device_test.ts rename integration_test/page-objects/common.page.js => ts/test/session/integration/page-objects/common.page.ts (53%) rename integration_test/page-objects/conversation.page.js => ts/test/session/integration/page-objects/conversation.page.ts (90%) rename integration_test/page-objects/registration.page.js => ts/test/session/integration/page-objects/registration.page.ts (80%) rename integration_test/page-objects/settings.page.js => ts/test/session/integration/page-objects/settings.page.ts (70%) diff --git a/ts/test/session/integration/common.ts b/ts/test/session/integration/common.ts new file mode 100644 index 000000000..69cc4f9f7 --- /dev/null +++ b/ts/test/session/integration/common.ts @@ -0,0 +1,720 @@ +// tslint:disable: no-implicit-dependencies + +import { Application, SpectronClient } from 'spectron'; +import path from 'path'; +import url from 'url'; +import http from 'http'; +import fse from 'fs-extra'; +import { exec } from 'child_process'; + +import chai from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import CommonPage from './page-objects/common.page'; +import RegistrationPage from './page-objects/registration.page'; +import ConversationPage from './page-objects/conversation.page'; +import SettingsPage from './page-objects/settings.page'; + +chai.should(); +chai.use(chaiAsPromised as any); +chai.config.includeStack = true; + +// FIXME audric +// // From https://github.com/chaijs/chai/issues/200 +// chai.use((_chai, _) => { +// _chai.Assertion.addMethod('withMessage', (msg:any) => { +// _.flag(Common, 'message', msg); +// }); +// }); + +const STUB_SNODE_SERVER_PORT = 3000; +const ENABLE_LOG = false; + + +// tslint:disable-next-line: no-unnecessary-class +export class Common { + /* ************** USERS ****************** */ + public static readonly TEST_MNEMONIC1 = + 'faxed mechanic mocked agony unrest loincloth pencil eccentric boyfriend oasis speedy ribbon faxed'; + public static readonly TEST_PUBKEY1 = + '0552b85a43fb992f6bdb122a5a379505a0b99a16f0628ab8840249e2a60e12a413'; + public static readonly TEST_DISPLAY_NAME1 = 'tester_Alice'; + + public static readonly TEST_MNEMONIC2 = + 'guide inbound jerseys bays nouns basin sulking awkward stockpile ostrich ascend pylons ascend'; + public static readonly TEST_PUBKEY2 = + '054e1ca8681082dbd9aad1cf6fc89a32254e15cba50c75b5a73ac10a0b96bcbd2a'; + public static readonly TEST_DISPLAY_NAME2 = 'tester_Bob'; + + public static readonly TEST_MNEMONIC3 = + 'alpine lukewarm oncoming blender kiwi fuel lobster upkeep vogue simplest gasp fully simplest'; + public static readonly TEST_PUBKEY3 = + '05f8662b6e83da5a31007cc3ded44c601f191e07999acb6db2314a896048d9036c'; + public static readonly TEST_DISPLAY_NAME3 = 'tester_Charlie'; + + /* ************** OPEN GROUPS ****************** */ + public static readonly VALID_GROUP_URL = 'https://chat.getsession.org'; + public static readonly VALID_GROUP_URL2 = 'https://chat-dev.lokinet.org'; + public static readonly VALID_GROUP_NAME = 'Session Public Chat'; + public static readonly VALID_GROUP_NAME2 = 'Loki Dev Chat'; + + /* ************** CLOSED GROUPS ****************** */ + public static readonly VALID_CLOSED_GROUP_NAME1 = 'Closed Group 1'; + + public static USER_DATA_ROOT_FOLDER = ''; + private static stubSnode: any; + private static messages: any; + private static fileServer: any; + + // tslint:disable: await-promise + // tslint:disable: no-console + + public static async timeout(ms: number) { + // tslint:disable-next-line: no-string-based-set-timeout + return new Promise(resolve => setTimeout(resolve, ms)); + } + + public static async closeToast(app: Application) { + app.client.element(CommonPage.toastCloseButton).click(); + } + + // a wrapper to work around electron/spectron bug + public static async setValueWrapper(app: Application, selector: any, value: string) { + // keys, setValue and addValue hang on certain platforms + + if (process.platform === 'darwin') { + await app.client.execute( + (slctr, val) => { + // eslint-disable-next-line no-undef + const iter = document.evaluate( + slctr, + document, + null, + XPathResult.UNORDERED_NODE_ITERATOR_TYPE, + null + ); + const elem = iter.iterateNext() as any; + if (elem) { + elem.value = val; + } else { + console.error('Cant find', slctr, elem, iter); + } + }, + selector, + value + ); + // let session js detect the text change + await app.client.element(selector).click(); + } else { + // Linux & Windows don't require wrapper + await app.client.element(selector).setValue(value); + } + } + + public static async startApp(environment = 'test-integration-session') { + const env = environment.startsWith('test-integration') + ? 'test-integration' + : environment; + const instance = environment.replace('test-integration-', ''); + + const app1 = new Application({ + path: path.join(__dirname, '..', '..', '..', '..', 'node_modules', '.bin', 'electron'), + args: ['.'], + env: { + NODE_ENV: env, + NODE_APP_INSTANCE: instance, + USE_STUBBED_NETWORK: true, + ELECTRON_ENABLE_LOGGING: true, + ELECTRON_ENABLE_STACK_DUMPING: true, + ELECTRON_DISABLE_SANDBOX: 1, + }, + requireName: 'electronRequire', + // chromeDriverLogPath: '../chromedriverlog.txt', + chromeDriverArgs: [ + `remote-debugging-port=${Math.floor( + // tslint:disable-next-line: insecure-random + Math.random() * (9999 - 9000) + 9000 + )}`, + ], + }); + // FIXME audric + // chaiAsPromised.transferPromiseness = app1.transferPromiseness; + + await app1.start(); + await app1.client.waitUntilWindowLoaded(); + + return app1; + } + + public static async startApp2() { + const app2 = await Common.startApp('test-integration-session-2'); + return app2; + } + + public static async stopApp(app1: Application) { + if (app1 && app1.isRunning()) { + await app1.stop(); + } + } + + public static async killallElectron() { + // rtharp - my 2nd client on MacOs needs: pkill -f "node_modules/.bin/electron" + // node_modules/electron/dist/electron is node_modules/electron/dist/Electron.app on MacOS + const killStr = + process.platform === 'win32' + ? 'taskkill /im electron.exe /t /f' + : 'pkill -f "node_modules/electron/dist/electron" | pkill -f "node_modules/.bin/electron"'; + return new Promise(resolve => { + exec(killStr, (_err, stdout, stderr) => { + resolve({ stdout, stderr }); + }); + }); + } + + public static async rmFolder(folder: string) { + await fse.remove(folder); + } + + public static async startAndAssureCleanedApp2() { + const app2 = await Common.startAndAssureCleanedApp( + 'test-integration-session-2' + ); + return app2; + } + + public static async startAndAssureCleanedApp(env = 'test-integration-session') { + const userData = path.join(Common.USER_DATA_ROOT_FOLDER, `Session-${env}`); + + await Common.rmFolder(userData); + + const app1 = await Common.startApp(env); + await app1.client.waitForExist( + RegistrationPage.registrationTabSignIn, + 4000 + ); + + return app1; + } + + public static async startAndStub({ + mnemonic, + displayName, + env = 'test-integration-session', + }: { + mnemonic: string; + displayName: string; + env?: string; + }) { + const app = await Common.startAndAssureCleanedApp(env); + await Common.startStubSnodeServer(); + + if (mnemonic && displayName) { + await Common.restoreFromMnemonic(app, mnemonic, displayName); + // not sure we need Common - rtharp. + await Common.timeout(2000); + } + + return app; + } + + public static async startAndStubN(props: any, n: number) { + // Make app with stub as number n + const appN = await Common.startAndStub({ + env: `test-integration-session-${n}`, + ...props, + }); + + return appN; + } + + public static async restoreFromMnemonic(app: Application, mnemonic: string, displayName: string) { + await app.client.element(RegistrationPage.registrationTabSignIn).click(); + await app.client.element(RegistrationPage.restoreFromSeedMode).click(); + await Common.setValueWrapper( + app, + RegistrationPage.recoveryPhraseInput, + mnemonic + ); + + await Common.setValueWrapper( + app, + RegistrationPage.displayNameInput, + displayName + ); + + // await app.client.element(RegistrationPage.continueSessionButton).click(); + await app.client.keys('Enter'); + + await app.client.waitForExist( + RegistrationPage.conversationListContainer, + 4000 + ); + } + + public static async makeFriends(app1: Application, client2: [Application, string]) { + const [app2, pubkey2] = client2; + + /** add each other as friends */ + const textMessage = Common.generateSendMessageText(); + + await app1.client.element(ConversationPage.contactsButtonSection).click(); + await app1.client.element(ConversationPage.addContactButton).click(); + + await Common.setValueWrapper(app1, ConversationPage.sessionIDInput, pubkey2); + await app1.client.element(ConversationPage.nextButton).click(); + await app1.client.waitForExist( + ConversationPage.sendFriendRequestTextarea, + 1000 + ); + + // send a text message to that user (will be a friend request) + await Common.setValueWrapper( + app1, + ConversationPage.sendFriendRequestTextarea, + textMessage + ); + await app1.client.keys('Enter'); + await app1.client.waitForExist( + ConversationPage.existingFriendRequestText(textMessage), + 1000 + ); + + // wait for left notification Friend Request count to go to 1 and click it + await app2.client.waitForExist( + ConversationPage.oneNotificationFriendRequestLeft, + 5000 + ); + await app2.client + .element(ConversationPage.oneNotificationFriendRequestLeft) + .click(); + // open the dropdown from the top friend request count + await app2.client.isExisting( + ConversationPage.oneNotificationFriendRequestTop + ).should.eventually.be.true; + await app2.client + .element(ConversationPage.oneNotificationFriendRequestTop) + .click(); + + // accept the friend request and validate that on both side the "accepted FR" message is shown + await app2.client + .element(ConversationPage.acceptFriendRequestButton) + .click(); + await app2.client.waitForExist( + ConversationPage.acceptedFriendRequestMessage, + 1000 + ); + await app1.client.waitForExist( + ConversationPage.acceptedFriendRequestMessage, + 5000 + ); + } + + public static async startAppsAsFriends() { + const app1Props = { + mnemonic: Common.TEST_MNEMONIC1, + displayName: Common.TEST_DISPLAY_NAME1, + stubSnode: true, + }; + + const app2Props = { + mnemonic: Common.TEST_MNEMONIC2, + displayName: Common.TEST_DISPLAY_NAME2, + stubSnode: true, + }; + + const [app1, app2] = await Promise.all([ + Common.startAndStub(app1Props), + Common.startAndStubN(app2Props, 2), + ]); + + await Common.makeFriends(app1, [app2, Common.TEST_PUBKEY2]); + + return [app1, app2]; + } + + public static async addFriendToNewClosedGroup(members: Array, useSenderKeys?: boolean) { + const [app, ...others] = members; + + await app.client + .element(ConversationPage.conversationButtonSection) + .click(); + await app.client.element(ConversationPage.createClosedGroupButton).click(); + + await Common.setValueWrapper( + app, + ConversationPage.closedGroupNameTextarea, + Common.VALID_CLOSED_GROUP_NAME1 + ); + + await app.client + .element(ConversationPage.closedGroupNameTextarea) + .getValue() + .should.eventually.equal(Common.VALID_CLOSED_GROUP_NAME1); + + // Common assumes that app does not have any other friends + + for (let i = 0; i < others.length; i += 1) { + // eslint-disable-next-line no-await-in-loop + await app.client + .element(ConversationPage.createClosedGroupMemberItem(i)) + .isVisible().should.eventually.be.true; + + // eslint-disable-next-line no-await-in-loop + await app.client + .element(ConversationPage.createClosedGroupMemberItem(i)) + .click(); + } + + await app.client + .element(ConversationPage.createClosedGroupMemberItemSelected) + .isVisible().should.eventually.be.true; + + if (useSenderKeys) { + // Select Sender Keys + await app.client + .element(ConversationPage.createClosedGroupSealedSenderToggle) + .click(); + } + + // trigger the creation of the group + await app.client + .element(ConversationPage.validateCreationClosedGroupButton) + .click(); + + await app.client.waitForExist( + ConversationPage.sessionToastGroupCreatedSuccess, + 1000 + ); + await app.client.isExisting( + ConversationPage.headerTitleGroupName(Common.VALID_CLOSED_GROUP_NAME1) + ).should.eventually.be.true; + await app.client + .element(ConversationPage.headerTitleMembers(members.length)) + .isVisible().should.eventually.be.true; + + // validate overlay is closed + await app.client + .isExisting(ConversationPage.leftPaneOverlay) + .should.eventually.be.equal(false); + + // move back to the conversation section + await app.client + .element(ConversationPage.conversationButtonSection) + .click(); + + // validate open chat has been added + await app.client.isExisting( + ConversationPage.rowOpenGroupConversationName( + Common.VALID_CLOSED_GROUP_NAME1 + ) + ).should.eventually.be.true; + + await Promise.all( + others.map(async otherApp => { + // next check that other members have been invited and have the group in their conversations + await otherApp.client.waitForExist( + ConversationPage.rowOpenGroupConversationName( + Common.VALID_CLOSED_GROUP_NAME1 + ), + 6000 + ); + // open the closed group conversation on otherApp + await otherApp.client + .element(ConversationPage.conversationButtonSection) + .click(); + await Common.timeout(500); + await otherApp.client + .element( + ConversationPage.rowOpenGroupConversationName( + Common.VALID_CLOSED_GROUP_NAME1 + ) + ) + .click(); + }) + ); + } + + public static async linkApp2ToApp(app1: Application, app2: Application, app1Pubkey: string) { + // app needs to be logged in as user1 and app2 needs to be logged out + // start the pairing dialog for the first app + await app1.client.element(SettingsPage.settingsButtonSection).click(); + await app1.client + .element(SettingsPage.settingsRowWithText('Devices')) + .click(); + + await app1.client.isVisible(ConversationPage.noPairedDeviceMessage); + // we should not find the linkDeviceButtonDisabled button (as DISABLED) + await app1.client.isExisting(ConversationPage.linkDeviceButtonDisabled) + .should.eventually.be.false; + await app1.client.element(ConversationPage.linkDeviceButton).click(); + + // validate device pairing dialog is shown and has a qrcode + await app1.client.isVisible(ConversationPage.devicePairingDialog); + await app1.client.isVisible(ConversationPage.qrImageDiv); + + // next trigger the link request from the app2 with the app1 pubkey + await app2.client.element(RegistrationPage.registrationTabSignIn).click(); + await app2.client.element(RegistrationPage.linkDeviceMode).click(); + + await Common.setValueWrapper( + app2, + RegistrationPage.textareaLinkDevicePubkey, + app1Pubkey + ); + await app2.client.element(RegistrationPage.linkDeviceTriggerButton).click(); + await app1.client.waitForExist(SettingsPage.secretWordsTextInDialog, 7000); + const secretWordsapp1 = await app1.client + .element(SettingsPage.secretWordsTextInDialog) + .getText(); + await app1.client.waitForExist(RegistrationPage.linkWithThisDevice, 10000); + + await app2.client + .element(RegistrationPage.secretWordsText) + .getText() + .should.eventually.be.equal(secretWordsapp1); + + await app1.client.element(ConversationPage.allowPairingButton).click(); + await app1.client.element(ConversationPage.okButton).click(); + // validate device paired in settings list with correct secrets + await app1.client.waitForExist( + ConversationPage.devicePairedDescription(secretWordsapp1), + 2000 + ); + + await app1.client.isExisting(ConversationPage.unpairDeviceButton).should + .eventually.be.true; + await app1.client.isExisting(ConversationPage.linkDeviceButtonDisabled) + .should.eventually.be.true; + + // validate app2 (secondary device) is linked successfully + await app2.client.waitForExist( + RegistrationPage.conversationListContainer, + 4000 + ); + + // validate primary pubkey of app2 is the same that in app1 + await app2.webContents + .executeJavaScript("window.storage.get('primaryDevicePubKey')") + .should.eventually.be.equal(app1Pubkey); + } + + public static async triggerUnlinkApp2FromApp(app1: Application, app2: Application) { + // check app2 is loggedin + await app2.client.isExisting(RegistrationPage.conversationListContainer) + .should.eventually.be.true; + + await app1.client.element(SettingsPage.settingsButtonSection).click(); + await app1.client + .element(SettingsPage.settingsRowWithText('Devices')) + .click(); + await app1.client.isExisting(ConversationPage.linkDeviceButtonDisabled) + .should.eventually.be.true; + // click the unlink button + await app1.client.element(ConversationPage.unpairDeviceButton).click(); + await app1.client.element(ConversationPage.validateUnpairDevice).click(); + + await app1.client.waitForExist( + ConversationPage.noPairedDeviceMessage, + 5000 + ); + await app1.client.element(ConversationPage.linkDeviceButton).isEnabled() + .should.eventually.be.true; + + // let time to app2 to catch the event and restart dropping its data + await Common.timeout(5000); + + // check that the app restarted + // (did not find a better way than checking the app no longer being accessible) + let isApp2Joinable = true; + try { + await app2.client.isExisting(RegistrationPage.registrationTabSignIn) + .should.eventually.be.true; + } catch (err) { + // if we get an error here, it means Spectron is lost. + // Common is a good thing because it means app2 restarted + isApp2Joinable = false; + } + + if (isApp2Joinable) { + throw new Error( + 'app2 is still joinable so it did not restart, so it did not unlink correctly' + ); + } + } + + public static async sendMessage(app: Application, messageText: string, fileLocation?: string) { + await Common.setValueWrapper( + app, + ConversationPage.sendMessageTextarea, + messageText + ); + await app.client + .element(ConversationPage.sendMessageTextarea) + .getValue() + .should.eventually.equal(messageText); + + // attach a file + if (fileLocation) { + await Common.setValueWrapper( + app, + ConversationPage.attachmentInput, + fileLocation + ); + } + + // send message + await app.client.element(ConversationPage.sendMessageTextarea).click(); + await app.client.keys('Enter'); + } + + public static generateSendMessageText(): string { + return `Test message from integration tests ${Date.now()}`; + } + + public static async startStubSnodeServer() { + if (!Common.stubSnode) { + Common.messages = {}; + Common.stubSnode = http.createServer((request: any, response: any) => { + const { query } = url.parse(request.url, true); + const { pubkey, data, timestamp } = query; + + if (!pubkey) { + console.warn('NO PUBKEY'); + response.writeHead(400, { 'Content-Type': 'text/html' }); + response.end(); + return; + } + if (Array.isArray(pubkey)) { + console.error('pubkey cannot be an array'); + response.writeHead(400, { 'Content-Type': 'text/html' }); + response.end(); + return; + } + + if (Array.isArray(data)) { + console.error('data cannot be an array'); + response.writeHead(400, { 'Content-Type': 'text/html' }); + response.end(); + return; + } + + if (request.method === 'POST') { + if (ENABLE_LOG) { + console.warn( + 'POST', + pubkey.substr(2, 3), + data.substr(4, 10), + timestamp + ); + } + + let ori = Common.messages[pubkey]; + + if (!Common.messages[pubkey]) { + ori = []; + } + + Common.messages[pubkey] = [...ori, { data, timestamp }]; + + response.writeHead(200, { 'Content-Type': 'text/html' }); + response.end(); + } else { + const retrievedMessages = { messages: Common.messages[pubkey] || [] }; + + if (ENABLE_LOG) { + const messages = retrievedMessages.messages.map((m: any) => + m.data.substr(4, 10) + ); + console.warn('GET', pubkey.substr(2, 3), messages); + } + response.writeHead(200, { 'Content-Type': 'application/json' }); + response.write(JSON.stringify(retrievedMessages)); + response.end(); + } + }); + Common.startLocalFileServer(); + Common.stubSnode.listen(STUB_SNODE_SERVER_PORT); + } else { + Common.messages = {}; + } + } + + public static startLocalFileServer() { + if (!Common.fileServer) { + // be sure to run `git submodule update --init && cd session-file-server && yarn install; cd -` + // eslint-disable-next-line global-require + // tslint:disable-next-line: no-require-imports + Common.fileServer = require('../../../../session-file-server/app'); + } + } + + public static async joinOpenGroup(app: Application, openGroupUrl: string, name: string) { + await app.client + .element(ConversationPage.conversationButtonSection) + .click(); + await app.client.element(ConversationPage.joinOpenGroupButton).click(); + + await Common.setValueWrapper( + app, + ConversationPage.openGroupInputUrl, + openGroupUrl + ); + await app.client + .element(ConversationPage.openGroupInputUrl) + .getValue() + .should.eventually.equal(openGroupUrl); + await app.client.element(ConversationPage.joinOpenGroupButton).click(); + + await app.client.waitForExist( + ConversationPage.sessionToastJoinOpenGroup, + 2 * 1000 + ); + + // account for slow home internet connection delays... + await app.client.waitForExist( + ConversationPage.sessionToastJoinOpenGroupSuccess, + 20 * 1000 + ); + + // validate overlay is closed + await app.client.isExisting(ConversationPage.leftPaneOverlay).should + .eventually.be.false; + + // validate open chat has been added + await app.client.waitForExist( + ConversationPage.rowOpenGroupConversationName(name), + 20 * 1000 + ); + } + + public static async stopStubSnodeServer() { + if (Common.stubSnode) { + Common.stubSnode.close(); + Common.stubSnode = null; + } + } + + /** + * Search for a string in logs + * @param app the render logs to search in + * @param str the string to search (not regex) + * Note: getRenderProcessLogs() clears the app logs each calls. + */ + public static async logsContains(renderLogs: Array<{message: string}>, str: string, count?: number) { + const foundLines = renderLogs.filter(log => log.message.includes(str)); + + // tslint:disable-next-line: no-unused-expression + chai.expect( + foundLines.length > 0, + `'${str}' not found in logs but was expected` + ).to.be.true; + + if (count) { + chai + .expect( + foundLines.length, + `'${str}' found but not the correct number of times` + ) + .to.be.equal(count); + } + } +} diff --git a/ts/test/session/integration/integration_test.ts b/ts/test/session/integration/integration_test.ts new file mode 100644 index 000000000..14961af6a --- /dev/null +++ b/ts/test/session/integration/integration_test.ts @@ -0,0 +1,35 @@ + +// import { expect } from 'chai'; +// import * as sinon from 'sinon'; +// import { TestUtils } from '../../test-utils'; +// import { PairingAuthorisation } from '../../../../js/modules/data'; +// import { MultiDeviceProtocol } from '../../../session/protocols'; +// import { PubKey } from '../../../session/types'; +// import { UserUtil } from '../../../util'; +// import { StringUtils } from '../../../session/utils'; + +import { Common } from './common'; + +// tslint:disable: no-import-side-effect + +// import './registration_test'; +// import './open_group_test'; +// import './add_contacts_test'; +import './link_device_test'; +// import './closed_group_test'; +// import './message_functions_test'; +// import './settings_test'; +// import'./message_sync_test'; +// import './sender_keys_test'; + +before(async () => { + // start the app once before all tests to get the platform-dependent + // path of user data and store it to common.USER_DATA_ROOT_FOLDER + const app1 = await Common.startApp(); + const ret = await app1.electron.remote.app.getPath( + 'appData' + ) as any; + Common.USER_DATA_ROOT_FOLDER = ret; + + await Common.stopApp(app1); +}); diff --git a/ts/test/session/integration/link_device_test.ts b/ts/test/session/integration/link_device_test.ts new file mode 100644 index 000000000..aaef467f0 --- /dev/null +++ b/ts/test/session/integration/link_device_test.ts @@ -0,0 +1,70 @@ +/* eslint-disable prefer-destructuring */ +/* eslint-disable more/no-then */ +/* eslint-disable func-names */ +/* eslint-disable import/no-extraneous-dependencies */ +// tslint:disable: no-implicit-dependencies +import { afterEach, beforeEach, describe, it } from 'mocha'; +import { Common } from './common'; +import { Application } from 'spectron'; + +describe('Link Device', function() { + let app: Application; + let app2: Application; + this.timeout(60000); + this.slow(15000); + + beforeEach(async () => { + await Common.killallElectron(); + + const app1Props = { + mnemonic: Common.TEST_MNEMONIC1, + displayName: Common.TEST_DISPLAY_NAME1, + }; + + const app2Props = {}; + + [app, app2] = await Promise.all([ + Common.startAndStub(app1Props), + Common.startAndStubN(app2Props, 2), + ]); + }); + + afterEach(async () => { + await Common.killallElectron(); + }); + + it('linkDevice: link two desktop devices', async () => { + await Common.linkApp2ToApp(app, app2, Common.TEST_PUBKEY1); + }); + + it('linkDevice: unlink two devices', async () => { + await Common.linkApp2ToApp(app, app2, Common.TEST_PUBKEY1); + await Common.timeout(1000); + await Common.triggerUnlinkApp2FromApp(app, app2); + }); + + it('linkDevice:sync no groups, closed group, nor open groups', async () => { + await Common.linkApp2ToApp(app, app2, Common.TEST_PUBKEY1); + await Common.timeout(10000); + + // get logs at this stage (getRenderProcessLogs() clears the app logs) + const secondaryRenderLogs = await app2.client.getRenderProcessLogs(); + // pairing request message sent from secondary to primary pubkey + await Common.logsContains( + secondaryRenderLogs, + `Sending pairing-request:pairing-request message to ${Common.TEST_PUBKEY1}` + ); + + const primaryRenderLogs = await app.client.getRenderProcessLogs(); + // primary grant pairing request + await Common.logsContains( + primaryRenderLogs, + 'Sending pairing-request:pairing-request message to OUR SECONDARY PUBKEY' + ); + + // no friends, no closed groups, no open groups. we should see those message sync in the log + await Common.logsContains(primaryRenderLogs, 'No closed group to sync.', 1); + await Common.logsContains(primaryRenderLogs, 'No open groups to sync', 1); + await Common.logsContains(primaryRenderLogs, 'No contacts to sync.', 1); + }); +}); diff --git a/integration_test/page-objects/common.page.js b/ts/test/session/integration/page-objects/common.page.ts similarity index 53% rename from integration_test/page-objects/common.page.js rename to ts/test/session/integration/page-objects/common.page.ts index 0ef3205e6..c9c01d9fe 100644 --- a/integration_test/page-objects/common.page.js +++ b/ts/test/session/integration/page-objects/common.page.ts @@ -1,28 +1,28 @@ -module.exports = { +export = { // generics - objWithClassAndText: (obj, classname, text) => + objWithClassAndText: (obj: string, classname: string, text: string) => `//${obj}[contains(string(), "${text}")][contains(@class, "${classname}")]`, - divRoleButtonWithText: text => + divRoleButtonWithText: (text: string) => `//div[contains(string(), "${text}")][contains(@role, "button")]`, - divRoleButtonWithTextDisabled: text => + divRoleButtonWithTextDisabled: (text: string) => `//div[contains(string(), "${text}")][contains(@role, "button")][contains(@class, "disabled")]`, - divRoleButtonDangerWithText: text => + divRoleButtonDangerWithText: (text: string) => `${module.exports.divRoleButtonWithText(text)}[contains(@class, "danger")]`, - inputWithPlaceholder: placeholder => + inputWithPlaceholder: (placeholder: string) => `//input[contains(@placeholder, "${placeholder}")]`, - inputWithId: id => `//input[contains(@id, '${id}')]`, - textAreaWithPlaceholder: placeholder => + inputWithId: (id: string) => `//input[contains(@id, '${id}')]`, + textAreaWithPlaceholder: (placeholder: string) => `//textarea[contains(@placeholder, "${placeholder}")]`, - textAreaWithClass: classname => + textAreaWithClass: (classname: string) => `//textarea[contains(@class, "${classname}")]`, - byId: id => `//*[@id="${id}"]`, - divWithClass: classname => `//div[contains(@class, "${classname}")]`, - divWithClassAndText: (classname, text) => + byId: (id: string) => `//*[@id="${id}"]`, + divWithClass: (classname: string) => `//div[contains(@class, "${classname}")]`, + divWithClassAndText: (classname: string, text: string) => module.exports.objWithClassAndText('div', classname, text), - spanWithClassAndText: (classname, text) => + spanWithClassAndText: (classname: string, text: string) => module.exports.objWithClassAndText('span', classname, text), - toastWithText: text => + toastWithText: (text: string) => module.exports.divWithClassAndText('session-toast-wrapper', text), toastCloseButton: '//div[contains(@class, "session-toast-wrapper")]//div[contains(@class, "toast-close")]/div', diff --git a/integration_test/page-objects/conversation.page.js b/ts/test/session/integration/page-objects/conversation.page.ts similarity index 90% rename from integration_test/page-objects/conversation.page.js rename to ts/test/session/integration/page-objects/conversation.page.ts index ff64fe285..07c891e71 100644 --- a/integration_test/page-objects/conversation.page.js +++ b/ts/test/session/integration/page-objects/conversation.page.ts @@ -1,6 +1,6 @@ -const commonPage = require('./common.page'); +import commonPage from './common.page'; -module.exports = { +export = { // conversation view sessionLoader: commonPage.divWithClass('session-loader'), leftPaneOverlay: commonPage.divWithClass('module-left-pane-overlay'), @@ -8,11 +8,11 @@ module.exports = { sendFriendRequestTextarea: commonPage.textAreaWithPlaceholder( 'Send your first message' ), - existingSendMessageText: textMessage => + existingSendMessageText: (textMessage: string) => `//*[contains(@class, "module-message__text--outgoing") and .//span[contains(@class, "text-selectable")][contains(string(), '${textMessage}')]]`, - existingFriendRequestText: textMessage => + existingFriendRequestText: (textMessage: string) => `//*[contains(@class, "module-message-friend-request__container") and .//span[contains(@class, "text-selectable")][contains(string(), '${textMessage}')]]`, - existingReceivedMessageText: textMessage => + existingReceivedMessageText: (textMessage: string) => `//*[contains(@class, "module-message__text--incoming") and .//span[contains(@class, "text-selectable")][contains(string(), '${textMessage}')]]`, // conversations @@ -22,10 +22,10 @@ module.exports = { 'module-friend-request__buttonContainer--outgoing', 'Retry Send' ), - headerTitleMembers: number => + headerTitleMembers: (num: number) => commonPage.spanWithClassAndText( 'module-conversation-header__title-text', - `${number} members` + `${num} members` ), conversationItem: commonPage.divWithClass('module-conversation-list-item'), @@ -33,7 +33,7 @@ module.exports = { attachmentInput: '//*[contains(@class, "choose-file")]/input[@type="file"]', attachmentButton: '//*[contains(@class, "choose-file")]/button', - messageCtxMenu: message => + messageCtxMenu: (message: string) => `//div[contains(@class, 'message-wrapper')]//span[contains(string(), '${message}')]/parent::div/parent::div/parent::div/parent::div//div[contains(@class, 'module-message__buttons__menu')]`, deleteMessageCtxButton: @@ -53,7 +53,7 @@ module.exports = { sessionToastJoinOpenGroupAlreadyExist: commonPage.toastWithText( 'You are already connected to this open group' ), - rowOpenGroupConversationName: groupName => + rowOpenGroupConversationName: (groupName: string) => commonPage.spanWithClassAndText( 'module-conversation__user__profile-number', groupName @@ -66,7 +66,7 @@ module.exports = { closedGroupNameTextarea: commonPage.textAreaWithPlaceholder( 'Enter a group name' ), - createClosedGroupMemberItem: idx => + createClosedGroupMemberItem: (idx: number) => commonPage.divWithClass(`session-member-item-${idx}`), createClosedGroupSealedSenderToggle: commonPage.divWithClass( 'session-toggle' @@ -80,7 +80,7 @@ module.exports = { sessionToastGroupCreatedSuccess: commonPage.toastWithText( 'Group created successfully' ), - headerTitleGroupName: groupname => + headerTitleGroupName: (groupname: string) => commonPage.spanWithClassAndText( 'module-contact-name__profile-name', groupname @@ -96,7 +96,7 @@ module.exports = { '//*[contains(@class,"session-icon-button") and .//*[contains(@class, "users")] and .//*[contains(@class, "notification-count") and contains(string(), "1")] ]', oneNotificationFriendRequestTop: '//*[contains(@class,"notification-count hover") and contains(string(), "1")]', - friendRequestFromUser: (displayName, pubkey) => + friendRequestFromUser: (displayName: string, pubkey: string) => `//*[contains(@class,"module-left-pane__list-popup") and .//*[contains(@class, "module-conversation__user") and .//*[contains(string(), "${displayName}")] and .//*[contains(string(), "(...${pubkey.substring( 60 )})")]]]`, @@ -122,7 +122,7 @@ module.exports = { qrImageDiv: commonPage.divWithClass('qr-image'), allowPairingButton: commonPage.divRoleButtonWithText('Allow Linking'), okButton: commonPage.divRoleButtonWithText('OK'), - devicePairedDescription: secretWords => + devicePairedDescription: (secretWords: string) => commonPage.divWithClassAndText( 'session-settings-item__description', secretWords diff --git a/integration_test/page-objects/registration.page.js b/ts/test/session/integration/page-objects/registration.page.ts similarity index 80% rename from integration_test/page-objects/registration.page.js rename to ts/test/session/integration/page-objects/registration.page.ts index 0ab617d84..3e02fafee 100644 --- a/integration_test/page-objects/registration.page.js +++ b/ts/test/session/integration/page-objects/registration.page.ts @@ -1,6 +1,7 @@ -const commonPage = require('./common.page'); +import commonPage from './common.page'; -module.exports = { + +export = { registrationTabSignIn: '//div[contains(string(), "Sign In")][contains(@class, "session-registration__tab")][contains(@role, "tab")]', @@ -31,10 +32,10 @@ module.exports = { 'Link Device to Existing Session ID' ), textareaLinkDevicePubkey: commonPage.textAreaWithPlaceholder( - 'Enter other device’s Session ID here' + 'Enter your Session ID' ), linkDeviceTriggerButton: commonPage.divRoleButtonWithText('Link Device'), toastWrapper: '//*[contains(@class,"session-toast-wrapper")]', - - secretToastDescription: '//p[contains(@class, "description")]', + secretWordsText: '//div[contains(@class,"session-registration__content__secret-words")]/div[contains(@class,"subtle")]', + linkWithThisDevice: commonPage.objWithClassAndText('h4', 'device-pairing-dialog__desc', 'Allow linking with this device?'), }; diff --git a/integration_test/page-objects/settings.page.js b/ts/test/session/integration/page-objects/settings.page.ts similarity index 70% rename from integration_test/page-objects/settings.page.js rename to ts/test/session/integration/page-objects/settings.page.ts index b7d532d4d..a34075516 100644 --- a/integration_test/page-objects/settings.page.js +++ b/ts/test/session/integration/page-objects/settings.page.ts @@ -1,21 +1,21 @@ -module.exports = { +export = { // settings view settingsButtonSection: '//*[contains(@class,"session-icon-button") and .//*[contains(@class, "gear")]]', - settingsRowWithText: text => + settingsRowWithText: (text: string) => `//*[contains(@class, "left-pane-setting-category-list-item")][contains(string(), '${text}')]`, - leftPaneSettingsButton: `//*[contains(@class,"session-icon-button") and .//*[contains(@class, "gear")]]`, + leftPaneSettingsButton: '//*[contains(@class,"session-icon-button") and .//*[contains(@class, "gear")]]', - settingToggleWithText: text => + settingToggleWithText: (text: string) => `//div[contains(@class, 'session-settings-item') and contains(string(), '${text}')]//*[contains(@class, 'session-toggle')]`, - settingButtonWithText: text => + settingButtonWithText: (text: string) => `//div[contains(@class, 'session-settings-item')]//*[contains(@class, 'session-button') and contains(string(), '${text}')]`, - settingCategoryWithText: text => + settingCategoryWithText: (text: string) => `//div[contains(@class, 'left-pane-setting-category-list-item') and contains(string(), '${text}')]`, // Confirm is a boolean. Selects confirmation input - passwordSetModalInput: _confirm => + passwordSetModalInput: (_confirm: boolean|undefined) => `//input[@id = 'password-modal-input${_confirm ? '-confirm' : ''}']`, secretWordsTextInDialog: From 2496ce76814dcd2feef84463507ab86107d37590 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 28 Jul 2020 10:57:10 +1000 Subject: [PATCH 006/274] move common.js and some integration test files to ts --- integration_test/common.js | 710 --------------------------- integration_test/integration_test.js | 27 - integration_test/link_device_test.js | 70 --- 3 files changed, 807 deletions(-) delete mode 100644 integration_test/common.js delete mode 100644 integration_test/integration_test.js delete mode 100644 integration_test/link_device_test.js diff --git a/integration_test/common.js b/integration_test/common.js deleted file mode 100644 index d0fbcf381..000000000 --- a/integration_test/common.js +++ /dev/null @@ -1,710 +0,0 @@ -/* eslint-disable no-console */ -/* eslint-disable import/no-extraneous-dependencies */ -/* eslint-disable prefer-destructuring */ - -const { Application } = require('spectron'); -const path = require('path'); -const url = require('url'); -const http = require('http'); -const fse = require('fs-extra'); -const { exec } = require('child_process'); - -const chai = require('chai'); -const chaiAsPromised = require('chai-as-promised'); -const CommonPage = require('./page-objects/common.page'); -const RegistrationPage = require('./page-objects/registration.page'); -const ConversationPage = require('./page-objects/conversation.page'); -const SettingsPage = require('./page-objects/settings.page'); - -chai.should(); -chai.use(chaiAsPromised); -chai.config.includeStack = true; - -// From https://github.com/chaijs/chai/issues/200 -chai.use((_chai, _) => { - _chai.Assertion.addMethod('withMessage', msg => { - _.flag(this, 'message', msg); - }); -}); - -const STUB_SNODE_SERVER_PORT = 3000; -const ENABLE_LOG = false; - -module.exports = { - /* ************** USERS ****************** */ - TEST_MNEMONIC1: - 'faxed mechanic mocked agony unrest loincloth pencil eccentric boyfriend oasis speedy ribbon faxed', - TEST_PUBKEY1: - '0552b85a43fb992f6bdb122a5a379505a0b99a16f0628ab8840249e2a60e12a413', - TEST_DISPLAY_NAME1: 'tester_Alice', - - TEST_MNEMONIC2: - 'guide inbound jerseys bays nouns basin sulking awkward stockpile ostrich ascend pylons ascend', - TEST_PUBKEY2: - '054e1ca8681082dbd9aad1cf6fc89a32254e15cba50c75b5a73ac10a0b96bcbd2a', - TEST_DISPLAY_NAME2: 'tester_Bob', - - TEST_MNEMONIC3: - 'alpine lukewarm oncoming blender kiwi fuel lobster upkeep vogue simplest gasp fully simplest', - TEST_PUBKEY3: - '05f8662b6e83da5a31007cc3ded44c601f191e07999acb6db2314a896048d9036c', - TEST_DISPLAY_NAME3: 'tester_Charlie', - - /* ************** OPEN GROUPS ****************** */ - VALID_GROUP_URL: 'https://chat.getsession.org', - VALID_GROUP_URL2: 'https://chat-dev.lokinet.org', - VALID_GROUP_NAME: 'Session Public Chat', - VALID_GROUP_NAME2: 'Loki Dev Chat', - - /* ************** CLOSED GROUPS ****************** */ - VALID_CLOSED_GROUP_NAME1: 'Closed Group 1', - - USER_DATA_ROOT_FOLDER: '', - - async timeout(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); - }, - - async closeToast(app) { - app.client.element(CommonPage.toastCloseButton).click(); - }, - - // a wrapper to work around electron/spectron bug - async setValueWrapper(app, selector, value) { - // keys, setValue and addValue hang on certain platforms - - if (process.platform === 'darwin') { - await app.client.execute( - (slctr, val) => { - // eslint-disable-next-line no-undef - const iter = document.evaluate( - slctr, - // eslint-disable-next-line no-undef - document, - null, - // eslint-disable-next-line no-undef - XPathResult.UNORDERED_NODE_ITERATOR_TYPE, - null - ); - const elem = iter.iterateNext(); - if (elem) { - elem.value = val; - } else { - console.error('Cant find', slctr, elem, iter); - } - }, - selector, - value - ); - // let session js detect the text change - await app.client.element(selector).click(); - } else { - // Linux & Windows don't require wrapper - await app.client.element(selector).setValue(value); - } - }, - - async startApp(environment = 'test-integration-session') { - const env = environment.startsWith('test-integration') - ? 'test-integration' - : environment; - const instance = environment.replace('test-integration-', ''); - - const app1 = new Application({ - path: path.join(__dirname, '..', 'node_modules', '.bin', 'electron'), - args: ['.'], - env: { - NODE_ENV: env, - NODE_APP_INSTANCE: instance, - USE_STUBBED_NETWORK: true, - ELECTRON_ENABLE_LOGGING: true, - ELECTRON_ENABLE_STACK_DUMPING: true, - ELECTRON_DISABLE_SANDBOX: 1, - }, - requireName: 'electronRequire', - // chromeDriverLogPath: '../chromedriverlog.txt', - chromeDriverArgs: [ - `remote-debugging-port=${Math.floor( - Math.random() * (9999 - 9000) + 9000 - )}`, - ], - }); - - chaiAsPromised.transferPromiseness = app1.transferPromiseness; - - await app1.start(); - await app1.client.waitUntilWindowLoaded(); - - return app1; - }, - - async startApp2() { - const app2 = await this.startApp('test-integration-session-2'); - return app2; - }, - - async stopApp(app1) { - if (app1 && app1.isRunning()) { - await app1.stop(); - } - }, - - async killallElectron() { - // rtharp - my 2nd client on MacOs needs: pkill -f "node_modules/.bin/electron" - // node_modules/electron/dist/electron is node_modules/electron/dist/Electron.app on MacOS - const killStr = - process.platform === 'win32' - ? 'taskkill /im electron.exe /t /f' - : 'pkill -f "node_modules/electron/dist/electron" | pkill -f "node_modules/.bin/electron"'; - return new Promise(resolve => { - exec(killStr, (_err, stdout, stderr) => { - resolve({ stdout, stderr }); - }); - }); - }, - - async rmFolder(folder) { - await fse.remove(folder); - }, - - async startAndAssureCleanedApp2() { - const app2 = await this.startAndAssureCleanedApp( - 'test-integration-session-2' - ); - return app2; - }, - - async startAndAssureCleanedApp(env = 'test-integration-session') { - const userData = path.join(this.USER_DATA_ROOT_FOLDER, `Session-${env}`); - - await this.rmFolder(userData); - - const app1 = await this.startApp(env); - await app1.client.waitForExist( - RegistrationPage.registrationTabSignIn, - 4000 - ); - - return app1; - }, - - async startAndStub({ - mnemonic, - displayName, - env = 'test-integration-session', - }) { - const app = await this.startAndAssureCleanedApp(env); - - await this.startStubSnodeServer(); - - if (mnemonic && displayName) { - await this.restoreFromMnemonic(app, mnemonic, displayName); - // not sure we need this - rtharp. - await this.timeout(2000); - } - - return app; - }, - - async startAndStubN(props, n) { - // Make app with stub as number n - const appN = await this.startAndStub({ - env: `test-integration-session-${n}`, - ...props, - }); - - return appN; - }, - - async restoreFromMnemonic(app, mnemonic, displayName) { - await app.client.element(RegistrationPage.registrationTabSignIn).click(); - await app.client.element(RegistrationPage.restoreFromSeedMode).click(); - await this.setValueWrapper( - app, - RegistrationPage.recoveryPhraseInput, - mnemonic - ); - - await this.setValueWrapper( - app, - RegistrationPage.displayNameInput, - displayName - ); - - // await app.client.element(RegistrationPage.continueSessionButton).click(); - await app.client.keys('Enter'); - - await app.client.waitForExist( - RegistrationPage.conversationListContainer, - 4000 - ); - }, - - async makeFriends(app1, client2) { - const [app2, pubkey2] = client2; - - /** add each other as friends */ - const textMessage = this.generateSendMessageText(); - - await app1.client.element(ConversationPage.contactsButtonSection).click(); - await app1.client.element(ConversationPage.addContactButton).click(); - - await this.setValueWrapper(app1, ConversationPage.sessionIDInput, pubkey2); - await app1.client.element(ConversationPage.nextButton).click(); - await app1.client.waitForExist( - ConversationPage.sendFriendRequestTextarea, - 1000 - ); - - // send a text message to that user (will be a friend request) - await this.setValueWrapper( - app1, - ConversationPage.sendFriendRequestTextarea, - textMessage - ); - await app1.client.keys('Enter'); - await app1.client.waitForExist( - ConversationPage.existingFriendRequestText(textMessage), - 1000 - ); - - // wait for left notification Friend Request count to go to 1 and click it - await app2.client.waitForExist( - ConversationPage.oneNotificationFriendRequestLeft, - 5000 - ); - await app2.client - .element(ConversationPage.oneNotificationFriendRequestLeft) - .click(); - // open the dropdown from the top friend request count - await app2.client.isExisting( - ConversationPage.oneNotificationFriendRequestTop - ).should.eventually.be.true; - await app2.client - .element(ConversationPage.oneNotificationFriendRequestTop) - .click(); - - // accept the friend request and validate that on both side the "accepted FR" message is shown - await app2.client - .element(ConversationPage.acceptFriendRequestButton) - .click(); - await app2.client.waitForExist( - ConversationPage.acceptedFriendRequestMessage, - 1000 - ); - await app1.client.waitForExist( - ConversationPage.acceptedFriendRequestMessage, - 5000 - ); - }, - - async startAppsAsFriends() { - const app1Props = { - mnemonic: this.TEST_MNEMONIC1, - displayName: this.TEST_DISPLAY_NAME1, - stubSnode: true, - }; - - const app2Props = { - mnemonic: this.TEST_MNEMONIC2, - displayName: this.TEST_DISPLAY_NAME2, - stubSnode: true, - }; - - const [app1, app2] = await Promise.all([ - this.startAndStub(app1Props), - this.startAndStubN(app2Props, 2), - ]); - - await this.makeFriends(app1, [app2, this.TEST_PUBKEY2]); - - return [app1, app2]; - }, - - async addFriendToNewClosedGroup(members, useSenderKeys) { - const [app, ...others] = members; - - await app.client - .element(ConversationPage.conversationButtonSection) - .click(); - await app.client.element(ConversationPage.createClosedGroupButton).click(); - - await this.setValueWrapper( - app, - ConversationPage.closedGroupNameTextarea, - this.VALID_CLOSED_GROUP_NAME1 - ); - - await app.client - .element(ConversationPage.closedGroupNameTextarea) - .getValue() - .should.eventually.equal(this.VALID_CLOSED_GROUP_NAME1); - - // This assumes that app does not have any other friends - - for (let i = 0; i < others.length; i += 1) { - // eslint-disable-next-line no-await-in-loop - await app.client - .element(ConversationPage.createClosedGroupMemberItem(i)) - .isVisible().should.eventually.be.true; - - // eslint-disable-next-line no-await-in-loop - await app.client - .element(ConversationPage.createClosedGroupMemberItem(i)) - .click(); - } - - await app.client - .element(ConversationPage.createClosedGroupMemberItemSelected) - .isVisible().should.eventually.be.true; - - if (useSenderKeys) { - // Select Sender Keys - await app.client - .element(ConversationPage.createClosedGroupSealedSenderToggle) - .click(); - } - - // trigger the creation of the group - await app.client - .element(ConversationPage.validateCreationClosedGroupButton) - .click(); - - await app.client.waitForExist( - ConversationPage.sessionToastGroupCreatedSuccess, - 1000 - ); - await app.client.isExisting( - ConversationPage.headerTitleGroupName(this.VALID_CLOSED_GROUP_NAME1) - ).should.eventually.be.true; - await app.client - .element(ConversationPage.headerTitleMembers(members.length)) - .isVisible().should.eventually.be.true; - - // validate overlay is closed - await app.client - .isExisting(ConversationPage.leftPaneOverlay) - .should.eventually.be.equal(false); - - // move back to the conversation section - await app.client - .element(ConversationPage.conversationButtonSection) - .click(); - - // validate open chat has been added - await app.client.isExisting( - ConversationPage.rowOpenGroupConversationName( - this.VALID_CLOSED_GROUP_NAME1 - ) - ).should.eventually.be.true; - - await Promise.all( - others.map(async otherApp => { - // next check that other members have been invited and have the group in their conversations - await otherApp.client.waitForExist( - ConversationPage.rowOpenGroupConversationName( - this.VALID_CLOSED_GROUP_NAME1 - ), - 6000 - ); - // open the closed group conversation on otherApp - await otherApp.client - .element(ConversationPage.conversationButtonSection) - .click(); - await this.timeout(500); - await otherApp.client - .element( - ConversationPage.rowOpenGroupConversationName( - this.VALID_CLOSED_GROUP_NAME1 - ) - ) - .click(); - }) - ); - }, - - async linkApp2ToApp(app1, app2, app1Pubkey) { - // app needs to be logged in as user1 and app2 needs to be logged out - // start the pairing dialog for the first app - await app1.client.element(SettingsPage.settingsButtonSection).click(); - await app1.client - .element(SettingsPage.settingsRowWithText('Devices')) - .click(); - - await app1.client.isVisible(ConversationPage.noPairedDeviceMessage); - // we should not find the linkDeviceButtonDisabled button (as DISABLED) - await app1.client.isExisting(ConversationPage.linkDeviceButtonDisabled) - .should.eventually.be.false; - await app1.client.element(ConversationPage.linkDeviceButton).click(); - - // validate device pairing dialog is shown and has a qrcode - await app1.client.isVisible(ConversationPage.devicePairingDialog); - await app1.client.isVisible(ConversationPage.qrImageDiv); - - // next trigger the link request from the app2 with the app1 pubkey - await app2.client.element(RegistrationPage.registrationTabSignIn).click(); - await app2.client.element(RegistrationPage.linkDeviceMode).click(); - - await this.setValueWrapper( - app2, - RegistrationPage.textareaLinkDevicePubkey, - app1Pubkey - ); - await app2.client.element(RegistrationPage.linkDeviceTriggerButton).click(); - await app1.client.waitForExist(SettingsPage.secretWordsTextInDialog, 7000); - const secretWordsapp1 = await app1.client - .element(SettingsPage.secretWordsTextInDialog) - .getText(); - await app2.client.waitForExist(RegistrationPage.toastWrapper, 6000); - await app2.client - .element(RegistrationPage.secretToastDescription) - .getText() - .should.eventually.be.equal(secretWordsapp1); - - await app1.client.element(ConversationPage.allowPairingButton).click(); - await app1.client.element(ConversationPage.okButton).click(); - // validate device paired in settings list with correct secrets - await app1.client.waitForExist( - ConversationPage.devicePairedDescription(secretWordsapp1), - 2000 - ); - - await app1.client.isExisting(ConversationPage.unpairDeviceButton).should - .eventually.be.true; - await app1.client.isExisting(ConversationPage.linkDeviceButtonDisabled) - .should.eventually.be.true; - - // validate app2 (secondary device) is linked successfully - await app2.client.waitForExist( - RegistrationPage.conversationListContainer, - 4000 - ); - - // validate primary pubkey of app2 is the same that in app1 - await app2.webContents - .executeJavaScript("window.storage.get('primaryDevicePubKey')") - .should.eventually.be.equal(app1Pubkey); - }, - - async triggerUnlinkApp2FromApp(app1, app2) { - // check app2 is loggedin - await app2.client.isExisting(RegistrationPage.conversationListContainer) - .should.eventually.be.true; - - await app1.client.element(SettingsPage.settingsButtonSection).click(); - await app1.client - .element(SettingsPage.settingsRowWithText('Devices')) - .click(); - await app1.client.isExisting(ConversationPage.linkDeviceButtonDisabled) - .should.eventually.be.true; - // click the unlink button - await app1.client.element(ConversationPage.unpairDeviceButton).click(); - await app1.client.element(ConversationPage.validateUnpairDevice).click(); - - await app1.client.waitForExist( - ConversationPage.noPairedDeviceMessage, - 5000 - ); - await app1.client.element(ConversationPage.linkDeviceButton).isEnabled() - .should.eventually.be.true; - - // let time to app2 to catch the event and restart dropping its data - await this.timeout(5000); - - // check that the app restarted - // (did not find a better way than checking the app no longer being accessible) - let isApp2Joinable = true; - try { - await app2.client.isExisting(RegistrationPage.registrationTabSignIn) - .should.eventually.be.true; - } catch (err) { - // if we get an error here, it means Spectron is lost. - // this is a good thing because it means app2 restarted - isApp2Joinable = false; - } - - if (isApp2Joinable) { - throw new Error( - 'app2 is still joinable so it did not restart, so it did not unlink correctly' - ); - } - }, - - async sendMessage(app, messageText, fileLocation = undefined) { - await this.setValueWrapper( - app, - ConversationPage.sendMessageTextarea, - messageText - ); - await app.client - .element(ConversationPage.sendMessageTextarea) - .getValue() - .should.eventually.equal(messageText); - - // attach a file - if (fileLocation) { - await this.setValueWrapper( - app, - ConversationPage.attachmentInput, - fileLocation - ); - } - - // send message - await app.client.element(ConversationPage.sendMessageTextarea).click(); - await app.client.keys('Enter'); - }, - - generateSendMessageText: () => - `Test message from integration tests ${Date.now()}`, - - async startStubSnodeServer() { - if (!this.stubSnode) { - this.messages = {}; - this.stubSnode = http.createServer((request, response) => { - const { query } = url.parse(request.url, true); - const { pubkey, data, timestamp } = query; - - if (!pubkey) { - console.warn('NO PUBKEY'); - response.writeHead(400, { 'Content-Type': 'text/html' }); - response.end(); - return; - } - - if (request.method === 'POST') { - if (ENABLE_LOG) { - console.warn( - 'POST', - pubkey.substr(2, 3), - data.substr(4, 10), - timestamp - ); - } - - let ori = this.messages[pubkey]; - - if (!this.messages[pubkey]) { - ori = []; - } - - this.messages[pubkey] = [...ori, { data, timestamp }]; - - response.writeHead(200, { 'Content-Type': 'text/html' }); - response.end(); - } else { - const retrievedMessages = { messages: this.messages[pubkey] || [] }; - - if (ENABLE_LOG) { - const messages = retrievedMessages.messages.map(m => - m.data.substr(4, 10) - ); - console.warn('GET', pubkey.substr(2, 3), messages); - } - response.writeHead(200, { 'Content-Type': 'application/json' }); - response.write(JSON.stringify(retrievedMessages)); - response.end(); - } - }); - this.startLocalFileServer(); - this.stubSnode.listen(STUB_SNODE_SERVER_PORT); - } else { - this.messages = {}; - } - }, - - async startLocalFileServer() { - if (!this.fileServer) { - // be sure to run `git submodule update --init && cd session-file-server && yarn install; cd -` - // eslint-disable-next-line global-require - this.fileServer = require('../session-file-server/app'); - } - }, - - async joinOpenGroup(app, openGroupUrl, name) { - await app.client - .element(ConversationPage.conversationButtonSection) - .click(); - await app.client.element(ConversationPage.joinOpenGroupButton).click(); - - await this.setValueWrapper( - app, - ConversationPage.openGroupInputUrl, - openGroupUrl - ); - await app.client - .element(ConversationPage.openGroupInputUrl) - .getValue() - .should.eventually.equal(openGroupUrl); - await app.client.element(ConversationPage.joinOpenGroupButton).click(); - - await app.client.waitForExist( - ConversationPage.sessionToastJoinOpenGroup, - 2 * 1000 - ); - - // account for slow home internet connection delays... - await app.client.waitForExist( - ConversationPage.sessionToastJoinOpenGroupSuccess, - 20 * 1000 - ); - - // validate overlay is closed - await app.client.isExisting(ConversationPage.leftPaneOverlay).should - .eventually.be.false; - - // validate open chat has been added - await app.client.waitForExist( - ConversationPage.rowOpenGroupConversationName(name), - 20 * 1000 - ); - }, - - async stopStubSnodeServer() { - if (this.stubSnode) { - this.stubSnode.close(); - this.stubSnode = null; - } - }, - - /** - * Search for a string in logs - * @param {*} app the render logs to search in - * @param {*} str the string to search (not regex) - * Note: getRenderProcessLogs() clears the app logs each calls. - */ - async logsContains(renderLogs, str, count = undefined) { - const foundLines = renderLogs.filter(log => log.message.includes(str)); - - // eslint-disable-next-line no-unused-expressions - chai.expect( - foundLines.length > 0, - `'${str}' not found in logs but was expected` - ).to.be.true; - - if (count) { - // eslint-disable-next-line no-unused-expressions - chai - .expect( - foundLines.length, - `'${str}' found but not the correct number of times` - ) - .to.be.equal(count); - } - }, - - // async killStubSnodeServer() { - // return new Promise(resolve => { - // exec( - // `lsof -ti:${STUB_SNODE_SERVER_PORT} |xargs kill -9`, - // (err, stdout, stderr) => { - // if (err) { - // resolve({ stdout, stderr }); - // } else { - // resolve({ stdout, stderr }); - // } - // } - // ); - // }); - // }, -}; diff --git a/integration_test/integration_test.js b/integration_test/integration_test.js deleted file mode 100644 index e37cac9ae..000000000 --- a/integration_test/integration_test.js +++ /dev/null @@ -1,27 +0,0 @@ -/* eslint-disable no-console */ -/* eslint-disable more/no-then */ -/* eslint-disable global-require */ -/* eslint-disable import/no-extraneous-dependencies */ - -const { before } = require('mocha'); -const common = require('./common'); - -require('./registration_test'); -require('./open_group_test'); -require('./add_friends_test'); -require('./link_device_test'); -require('./closed_group_test'); -require('./message_functions_test'); -require('./settings_test'); -require('./message_sync_test'); -require('./sender_keys_test'); - -before(async () => { - // start the app once before all tests to get the platform-dependent - // path of user data and store it to common.USER_DATA_ROOT_FOLDER - const app1 = await common.startApp(); - common.USER_DATA_ROOT_FOLDER = await app1.electron.remote.app.getPath( - 'appData' - ); - await common.stopApp(app1); -}); diff --git a/integration_test/link_device_test.js b/integration_test/link_device_test.js deleted file mode 100644 index 6ccbd14f1..000000000 --- a/integration_test/link_device_test.js +++ /dev/null @@ -1,70 +0,0 @@ -/* eslint-disable prefer-destructuring */ -/* eslint-disable more/no-then */ -/* eslint-disable func-names */ -/* eslint-disable import/no-extraneous-dependencies */ -const { afterEach, beforeEach, describe, it } = require('mocha'); -const common = require('./common'); - -describe('Link Device', function() { - let app; - let app2; - this.timeout(60000); - this.slow(15000); - - beforeEach(async () => { - await common.killallElectron(); - await common.stopStubSnodeServer(); - - const app1Props = { - mnemonic: common.TEST_MNEMONIC1, - displayName: common.TEST_DISPLAY_NAME1, - }; - - const app2Props = {}; - - [app, app2] = await Promise.all([ - common.startAndStub(app1Props), - common.startAndStubN(app2Props, 2), - ]); - }); - - afterEach(async () => { - await common.killallElectron(); - await common.stopStubSnodeServer(); - }); - - it('linkDevice: link two desktop devices', async () => { - await common.linkApp2ToApp(app, app2, common.TEST_PUBKEY1); - }); - - it('linkDevice: unlink two devices', async () => { - await common.linkApp2ToApp(app, app2, common.TEST_PUBKEY1); - await common.timeout(1000); - await common.triggerUnlinkApp2FromApp(app, app2); - }); - - it('linkDevice:sync no groups, closed group, nor open groups', async () => { - await common.linkApp2ToApp(app, app2, common.TEST_PUBKEY1); - await common.timeout(10000); - - // get logs at this stage (getRenderProcessLogs() clears the app logs) - const secondaryRenderLogs = await app2.client.getRenderProcessLogs(); - // pairing request message sent from secondary to primary pubkey - await common.logsContains( - secondaryRenderLogs, - `Sending pairing-request:pairing-request message to ${common.TEST_PUBKEY1}` - ); - - const primaryRenderLogs = await app.client.getRenderProcessLogs(); - // primary grant pairing request - await common.logsContains( - primaryRenderLogs, - 'Sending pairing-request:pairing-request message to OUR SECONDARY PUBKEY' - ); - - // no friends, no closed groups, no open groups. we should see those message sync in the log - await common.logsContains(primaryRenderLogs, 'No closed group to sync.', 1); - await common.logsContains(primaryRenderLogs, 'No open groups to sync', 1); - await common.logsContains(primaryRenderLogs, 'No contacts to sync.', 1); - }); -}); From e2612147b6d286a9cd20b2ab11e431582c6db000 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 28 Jul 2020 10:57:35 +1000 Subject: [PATCH 007/274] make test-integration call tests from ts/session/integration --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 40e0fd910..b3202f766 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "test-lib-view": "NODE_ENV=test-lib yarn run start", "test-loki-view": "NODE_ENV=test-loki yarn run start", "test-electron": "yarn grunt test", - "test-integration": "ELECTRON_DISABLE_SANDBOX=1 mocha --exit --timeout 10000 integration_test/integration_test.js", + "test-integration": "ELECTRON_DISABLE_SANDBOX=1 mocha --exit --timeout 10000 ts/test/session/integration/integration_test.js", "test-node": "mocha --recursive --exit test/app test/modules ts/test libloki/test/node --timeout 10000", "test-session": "mocha --recursive --exit ts/test/session --timeout 10000", "test-medium-groups": "ELECTRON_DISABLE_SANDBOX=1 mocha --exit --timeout 10000 integration_test/integration_test.js --grep 'senderkeys'", From 592c31dfc0181452934eb7486912fc1cbd1a1fe0 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 28 Jul 2020 10:57:59 +1000 Subject: [PATCH 008/274] fix tslint issues with spectron includes --- ts/components/conversation/ConversationHeader.tsx | 2 +- ts/components/session/SessionSeedModal.tsx | 4 ++-- ts/components/session/settings/SessionSettings.tsx | 8 ++++---- ts/components/session/settings/SessionSettingsHeader.tsx | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ts/components/conversation/ConversationHeader.tsx b/ts/components/conversation/ConversationHeader.tsx index 8b1cb57ed..dad02a7bf 100644 --- a/ts/components/conversation/ConversationHeader.tsx +++ b/ts/components/conversation/ConversationHeader.tsx @@ -423,7 +423,7 @@ export class ConversationHeader extends React.Component { public highlightMessageSearch() { // This is a temporary fix. In future we want to search // messages in the current conversation - $('.session-search-input input').focus(); + ($('.session-search-input input') as any).focus(); } // tslint:disable-next-line: cyclomatic-complexity diff --git a/ts/components/session/SessionSeedModal.tsx b/ts/components/session/SessionSeedModal.tsx index ed5fdb242..e89653741 100644 --- a/ts/components/session/SessionSeedModal.tsx +++ b/ts/components/session/SessionSeedModal.tsx @@ -39,7 +39,7 @@ export class SessionSeedModal extends React.Component { } public componentDidMount() { - setTimeout(() => $('#seed-input-password').focus(), 100); + setTimeout(() => ($('#seed-input-password') as any).focus(), 100); } public render() { @@ -145,7 +145,7 @@ export class SessionSeedModal extends React.Component { private confirmPassword() { const passwordHash = this.state.passwordHash; - const passwordValue = $('#seed-input-password').val(); + const passwordValue = ($('#seed-input-password') as any).val(); const isPasswordValid = window.passwordUtil.matchesHash( passwordValue, passwordHash diff --git a/ts/components/session/settings/SessionSettings.tsx b/ts/components/session/settings/SessionSettings.tsx index 3b4076da0..811897cfb 100644 --- a/ts/components/session/settings/SessionSettings.tsx +++ b/ts/components/session/settings/SessionSettings.tsx @@ -80,7 +80,7 @@ export class SettingsView extends React.Component { } public componentDidMount() { - setTimeout(() => $('#password-lock-input').focus(), 100); + setTimeout(() => ($('#password-lock-input') as any).focus(), 100); window.Whisper.events.on('refreshLinkedDeviceList', async () => { setTimeout(() => { @@ -198,7 +198,7 @@ export class SettingsView extends React.Component { } public async validatePasswordLock() { - const enteredPassword = String($('#password-lock-input').val()); + const enteredPassword = String(($('#password-lock-input') as any).val()); if (!enteredPassword) { this.setState({ @@ -264,7 +264,7 @@ export class SettingsView extends React.Component { } public setOptionsSetting(settingID: string) { - const selectedValue = $(`#${settingID} .session-radio input:checked`).val(); + const selectedValue = ($(`#${settingID} .session-radio input:checked`) as any).val(); window.setSettingValue(settingID, selectedValue); } @@ -668,7 +668,7 @@ export class SettingsView extends React.Component { } private async onKeyUp(event: any) { - const lockPasswordFocussed = $('#password-lock-input').is(':focus'); + const lockPasswordFocussed = ($('#password-lock-input') as any).is(':focus'); if (event.key === 'Enter' && lockPasswordFocussed) { await this.validatePasswordLock(); diff --git a/ts/components/session/settings/SessionSettingsHeader.tsx b/ts/components/session/settings/SessionSettingsHeader.tsx index 21e663e96..f1b01bf3a 100644 --- a/ts/components/session/settings/SessionSettingsHeader.tsx +++ b/ts/components/session/settings/SessionSettingsHeader.tsx @@ -30,7 +30,7 @@ export class SettingsHeader extends React.Component { } public focusSearch() { - $('.left-pane-setting-section .session-search-input input').focus(); + ($('.left-pane-setting-section .session-search-input input') as any).focus(); } public showAddLinkedDeviceModal() { From 720bb54bc19f7b9ca8fc0c3b037db59e201266c9 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 28 Jul 2020 11:08:34 +1000 Subject: [PATCH 009/274] move add_contacts_test open_group_test and registration_test to ts --- .../session/integration/add_contacts_test.ts | 46 +++++++------- .../session/integration/integration_test.ts | 6 +- .../session/integration/open_group_test.ts | 58 +++++++++--------- .../session/integration/registration_test.ts | 60 ++++++++++--------- 4 files changed, 91 insertions(+), 79 deletions(-) rename integration_test/add_contacts_test.js => ts/test/session/integration/add_contacts_test.ts (63%) rename integration_test/open_group_test.js => ts/test/session/integration/open_group_test.ts (69%) rename integration_test/registration_test.js => ts/test/session/integration/registration_test.ts (74%) diff --git a/integration_test/add_contacts_test.js b/ts/test/session/integration/add_contacts_test.ts similarity index 63% rename from integration_test/add_contacts_test.js rename to ts/test/session/integration/add_contacts_test.ts index 58bc930b6..7d617f984 100644 --- a/integration_test/add_contacts_test.js +++ b/ts/test/session/integration/add_contacts_test.ts @@ -1,59 +1,63 @@ /* eslint-disable func-names */ /* eslint-disable import/no-extraneous-dependencies */ -const { afterEach, beforeEach, describe, it } = require('mocha'); +// tslint:disable: await-promise +// tslint:disable: no-implicit-dependencies -const common = require('./common'); -const ConversationPage = require('./page-objects/conversation.page'); +import { afterEach, beforeEach, describe, it } from 'mocha'; +import { Common } from './common'; +import { Application } from 'spectron'; + +import ConversationPage from './page-objects/conversation.page'; describe('Add contact', function() { - let app; - let app2; + let app: Application; + let app2: Application; this.timeout(60000); this.slow(15000); beforeEach(async () => { - await common.killallElectron(); - await common.stopStubSnodeServer(); + await Common.killallElectron(); + await Common.stopStubSnodeServer(); const app1Props = { - mnemonic: common.TEST_MNEMONIC1, - displayName: common.TEST_DISPLAY_NAME1, + mnemonic: Common.TEST_MNEMONIC1, + displayName: Common.TEST_DISPLAY_NAME1, }; const app2Props = { - mnemonic: common.TEST_MNEMONIC2, - displayName: common.TEST_DISPLAY_NAME2, + mnemonic: Common.TEST_MNEMONIC2, + displayName: Common.TEST_DISPLAY_NAME2, }; [app, app2] = await Promise.all([ - common.startAndStub(app1Props), - common.startAndStubN(app2Props, 2), + Common.startAndStub(app1Props), + Common.startAndStubN(app2Props, 2), ]); }); afterEach(async () => { - await common.stopApp(app); - await common.killallElectron(); - await common.stopStubSnodeServer(); + await Common.stopApp(app); + await Common.killallElectron(); + await Common.stopStubSnodeServer(); }); it('addContacts: can add a contact by sessionID', async () => { - const textMessage = common.generateSendMessageText(); + const textMessage = Common.generateSendMessageText(); await app.client.element(ConversationPage.contactsButtonSection).click(); await app.client.element(ConversationPage.addContactButton).click(); await app.client.isExisting(ConversationPage.leftPaneOverlay).should .eventually.be.true; - await common.setValueWrapper( + await Common.setValueWrapper( app, ConversationPage.sessionIDInput, - common.TEST_PUBKEY2 + Common.TEST_PUBKEY2 ); await app.client .element(ConversationPage.sessionIDInput) .getValue() - .should.eventually.equal(common.TEST_PUBKEY2); + .should.eventually.equal(Common.TEST_PUBKEY2); await app.client.element(ConversationPage.nextButton).click(); await app.client.waitForExist(ConversationPage.sendMessageTextarea, 1000); @@ -69,7 +73,7 @@ describe('Add contact', function() { ); // assure session request message has been sent - await common.timeout(3000); + await Common.timeout(3000); await app.client.isExisting(ConversationPage.retrySendButton).should .eventually.be.false; diff --git a/ts/test/session/integration/integration_test.ts b/ts/test/session/integration/integration_test.ts index 14961af6a..9e3b6eb28 100644 --- a/ts/test/session/integration/integration_test.ts +++ b/ts/test/session/integration/integration_test.ts @@ -12,9 +12,9 @@ import { Common } from './common'; // tslint:disable: no-import-side-effect -// import './registration_test'; -// import './open_group_test'; -// import './add_contacts_test'; +import './registration_test'; +import './open_group_test'; +import './add_contacts_test'; import './link_device_test'; // import './closed_group_test'; // import './message_functions_test'; diff --git a/integration_test/open_group_test.js b/ts/test/session/integration/open_group_test.ts similarity index 69% rename from integration_test/open_group_test.js rename to ts/test/session/integration/open_group_test.ts index 6e13adb56..a38d5f570 100644 --- a/integration_test/open_group_test.js +++ b/ts/test/session/integration/open_group_test.ts @@ -1,41 +1,45 @@ /* eslint-disable func-names */ /* eslint-disable import/no-extraneous-dependencies */ -const { afterEach, beforeEach, describe, it } = require('mocha'); +// tslint:disable: await-promise +// tslint:disable: no-implicit-dependencies -const common = require('./common'); -const ConversationPage = require('./page-objects/conversation.page'); +import { afterEach, beforeEach, describe, it } from 'mocha'; +import { Common } from './common'; +import { Application } from 'spectron'; + +import ConversationPage from './page-objects/conversation.page'; describe('Open groups', function() { - let app; + let app: Application; this.timeout(40000); this.slow(15000); beforeEach(async () => { - await common.killallElectron(); + await Common.killallElectron(); const login = { - mnemonic: common.TEST_MNEMONIC1, - displayName: common.TEST_DISPLAY_NAME1, + mnemonic: Common.TEST_MNEMONIC1, + displayName: Common.TEST_DISPLAY_NAME1, }; - app = await common.startAndStub(login); + app = await Common.startAndStub(login); }); afterEach(async () => { - await common.killallElectron(); + await Common.killallElectron(); }); it('openGroup: works with valid open group url', async () => { - await common.joinOpenGroup( + await Common.joinOpenGroup( app, - common.VALID_GROUP_URL, - common.VALID_GROUP_NAME + Common.VALID_GROUP_URL, + Common.VALID_GROUP_NAME ); }); it('openGroup: cannot join two times the same open group', async () => { - await common.joinOpenGroup( + await Common.joinOpenGroup( app, - common.VALID_GROUP_URL2, - common.VALID_GROUP_NAME2 + Common.VALID_GROUP_URL2, + Common.VALID_GROUP_NAME2 ); // adding a second time the same open group @@ -44,10 +48,10 @@ describe('Open groups', function() { .click(); await app.client.element(ConversationPage.joinOpenGroupButton).click(); - await common.setValueWrapper( + await Common.setValueWrapper( app, ConversationPage.openGroupInputUrl, - common.VALID_GROUP_URL2 + Common.VALID_GROUP_URL2 ); await app.client.element(ConversationPage.joinOpenGroupButton).click(); // validate session loader is not shown @@ -71,10 +75,10 @@ describe('Open groups', function() { .click(); await app.client.element(ConversationPage.joinOpenGroupButton).click(); - await common.setValueWrapper( + await Common.setValueWrapper( app, ConversationPage.openGroupInputUrl, - common.VALID_GROUP_URL2 + Common.VALID_GROUP_URL2 ); await app.client.element(ConversationPage.joinOpenGroupButton).click(); @@ -83,29 +87,29 @@ describe('Open groups', function() { ConversationPage.sessionToastJoinOpenGroupSuccess, 30 * 1000 ); - await common.timeout(5 * 1000); // wait for toast to clear + await Common.timeout(5 * 1000); // wait for toast to clear await app.client.waitForExist( - ConversationPage.rowOpenGroupConversationName(common.VALID_GROUP_NAME2), + ConversationPage.rowOpenGroupConversationName(Common.VALID_GROUP_NAME2), 10 * 1000 ); // generate a message containing the current timestamp so we can find it in the list of messages - const textMessage = common.generateSendMessageText(); + const textMessage = Common.generateSendMessageText(); await app.client .element(ConversationPage.conversationButtonSection) .click(); await app.client.isExisting( - ConversationPage.rowOpenGroupConversationName(common.VALID_GROUP_NAME2) + ConversationPage.rowOpenGroupConversationName(Common.VALID_GROUP_NAME2) ); await app.client .element( - ConversationPage.rowOpenGroupConversationName(common.VALID_GROUP_NAME2) + ConversationPage.rowOpenGroupConversationName(Common.VALID_GROUP_NAME2) ) .click(); - await common.setValueWrapper( + await Common.setValueWrapper( app, ConversationPage.sendMessageTextarea, textMessage @@ -115,11 +119,11 @@ describe('Open groups', function() { .getValue() .should.eventually.equal(textMessage); // allow some time to fetch some messages - await common.timeout(3000); + await Common.timeout(3000); // send the message await app.client.keys('Enter'); - await common.timeout(5000); + await Common.timeout(5000); // validate that the message has been added to the message list view await app.client.waitForExist( ConversationPage.existingSendMessageText(textMessage), diff --git a/integration_test/registration_test.js b/ts/test/session/integration/registration_test.ts similarity index 74% rename from integration_test/registration_test.js rename to ts/test/session/integration/registration_test.ts index f9ba07704..dba321788 100644 --- a/integration_test/registration_test.js +++ b/ts/test/session/integration/registration_test.ts @@ -1,35 +1,39 @@ /* eslint-disable prefer-arrow-callback */ /* eslint-disable func-names */ /* eslint-disable import/no-extraneous-dependencies */ +// tslint:disable: no-implicit-dependencies +// tslint:disable: await-promise -const { afterEach, beforeEach, describe, it } = require('mocha'); +import { afterEach, beforeEach, describe, it } from 'mocha'; +import { Common } from './common'; +import { Application } from 'spectron'; + +import SettingsPage from './page-objects/settings.page'; +import RegistrationPage from './page-objects/registration.page'; +import ConversationPage from './page-objects/conversation.page'; -const common = require('./common'); -const SettingsPage = require('./page-objects/settings.page'); -const RegistrationPage = require('./page-objects/registration.page'); -const ConversationPage = require('./page-objects/conversation.page'); describe('Window Test and Login', function() { - let app; + let app: Application; this.timeout(20000); this.slow(15000); beforeEach(async () => { - await common.killallElectron(); + await Common.killallElectron(); }); afterEach(async () => { - await common.stopApp(app); - await common.killallElectron(); + await Common.stopApp(app); + await Common.killallElectron(); }); it('registration: opens one window', async () => { - app = await common.startAndAssureCleanedApp(); + app = await Common.startAndAssureCleanedApp(); app.client.getWindowCount().should.eventually.be.equal(1); }); it('registration: window title is correct', async () => { - app = await common.startAndAssureCleanedApp(); + app = await Common.startAndAssureCleanedApp(); app.client .getTitle() @@ -37,26 +41,26 @@ describe('Window Test and Login', function() { }); it('registration: can restore from seed', async () => { - app = await common.startAndAssureCleanedApp(); + app = await Common.startAndAssureCleanedApp(); await app.client.element(RegistrationPage.registrationTabSignIn).click(); await app.client.element(RegistrationPage.restoreFromSeedMode).click(); await app.client .element(RegistrationPage.recoveryPhraseInput) - .setValue(common.TEST_MNEMONIC1); + .setValue(Common.TEST_MNEMONIC1); await app.client .element(RegistrationPage.displayNameInput) - .setValue(common.TEST_DISPLAY_NAME1); + .setValue(Common.TEST_DISPLAY_NAME1); // validate fields are filled await app.client .element(RegistrationPage.recoveryPhraseInput) .getValue() - .should.eventually.equal(common.TEST_MNEMONIC1); + .should.eventually.equal(Common.TEST_MNEMONIC1); await app.client .element(RegistrationPage.displayNameInput) .getValue() - .should.eventually.equal(common.TEST_DISPLAY_NAME1); + .should.eventually.equal(Common.TEST_DISPLAY_NAME1); // trigger login await app.client.element(RegistrationPage.continueSessionButton).click(); @@ -65,18 +69,18 @@ describe('Window Test and Login', function() { 4000 ); - await common.timeout(2000); + await Common.timeout(2000); await app.webContents .executeJavaScript("window.storage.get('primaryDevicePubKey')") - .should.eventually.be.equal(common.TEST_PUBKEY1); + .should.eventually.be.equal(Common.TEST_PUBKEY1); }); it('registration: can create new account', async () => { - app = await common.startAndAssureCleanedApp(); + app = await Common.startAndAssureCleanedApp(); await app.client.element(RegistrationPage.createSessionIDButton).click(); // wait for the animation of generated pubkey to finish - await common.timeout(2000); + await Common.timeout(2000); const pubkeyGenerated = await app.client .element(RegistrationPage.textareaGeneratedPubkey) .getValue(); @@ -88,7 +92,7 @@ describe('Window Test and Login', function() { .eventually.be.true; await app.client .element(RegistrationPage.displayNameInput) - .setValue(common.TEST_DISPLAY_NAME1); + .setValue(Common.TEST_DISPLAY_NAME1); await app.client.element(RegistrationPage.getStartedButton).click(); await app.client.waitForExist( ConversationPage.conversationButtonSection, @@ -103,10 +107,10 @@ describe('Window Test and Login', function() { it('registration: can delete account when logged in', async () => { // login as user1 const login = { - mnemonic: common.TEST_MNEMONIC1, - displayName: common.TEST_DISPLAY_NAME1, + mnemonic: Common.TEST_MNEMONIC1, + displayName: Common.TEST_DISPLAY_NAME1, }; - app = await common.startAndStub(login); + app = await Common.startAndStub(login); await app.client.waitForExist( RegistrationPage.conversationListContainer, @@ -115,7 +119,7 @@ describe('Window Test and Login', function() { await app.webContents .executeJavaScript("window.storage.get('primaryDevicePubKey')") - .should.eventually.be.equal(common.TEST_PUBKEY1); + .should.eventually.be.equal(Common.TEST_PUBKEY1); // delete account await app.client.element(SettingsPage.settingsButtonSection).click(); await app.client.element(ConversationPage.deleteAccountButton).click(); @@ -124,12 +128,12 @@ describe('Window Test and Login', function() { // click on the modal OK button to delete the account await app.client.element(ConversationPage.validateDeleteAccount).click(); // wait for the app restart - await common.timeout(2000); + await Common.timeout(2000); // Spectron will loose the connection with the app during the app restart. // We have to restart the app without altering the logged in user or anything here, just to get a valid new ref to the app. - await common.stopApp(app); - app = await common.startApp(); + await Common.stopApp(app); + app = await Common.startApp(); // validate that on app start, the registration sign in is shown await app.client.waitForExist(RegistrationPage.registrationTabSignIn, 3000); From e2a42d1b61d58141f26a5801a78f1e73d6ae2ad5 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 29 Jul 2020 11:25:36 +1000 Subject: [PATCH 010/274] add stubbing of messageQueue in window from ts tests --- preload.js | 3 +++ ts/test/test-utils/utils/stubbing.ts | 23 ++++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/preload.js b/preload.js index acfec5268..38ed1056b 100644 --- a/preload.js +++ b/preload.js @@ -492,6 +492,9 @@ if (config.environment.includes('test-integration')) { debugMessageLogs: true, enableSenderKeys: true, }; + /* eslint-disable global-require, import/no-extraneous-dependencies */ + window.sinon = require('sinon'); + /* eslint-enable global-require, import/no-extraneous-dependencies */ } // Blocking diff --git a/ts/test/test-utils/utils/stubbing.ts b/ts/test/test-utils/utils/stubbing.ts index 9391204d9..ce004f8a2 100644 --- a/ts/test/test-utils/utils/stubbing.ts +++ b/ts/test/test-utils/utils/stubbing.ts @@ -1,6 +1,6 @@ import * as sinon from 'sinon'; -import * as crypto from 'crypto'; import * as DataShape from '../../../../js/modules/data'; +import { Application } from 'spectron'; const globalAny: any = global; const sandbox = sinon.createSandbox(); @@ -54,6 +54,27 @@ export function stubWindow( }; } +export async function spyMessageQueueSend(app: Application) { + await app.webContents.executeJavaScript( + "var messageQueueSpy = sinon.spy(window.libsession.getMessageQueue(), 'send'); " + ); +} + +export async function getAllMessagesSent(app: Application) { + const messageQueueSpy = await app.webContents.executeJavaScript( + 'messageQueueSpy.args;' + ); + if (!messageQueueSpy) { + throw new Error( + 'Be sure to call spyMessageQueueSend() on the correct app first.' + ); + } + const messages = await app.webContents.executeJavaScript( + 'messageQueueSpy.args' + ); + return messages; +} + export function restoreStubs() { globalAny.window = undefined; sandbox.restore(); From fec0ead1de23d5eb785e047f6233c1caed7888a5 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 29 Jul 2020 11:27:20 +1000 Subject: [PATCH 011/274] fix link device test and lint --- libtextsecure/sendmessage.js | 171 +------ .../session/settings/SessionSettings.tsx | 8 +- .../settings/SessionSettingsHeader.tsx | 4 +- ts/test/session/integration/common.ts | 459 ++++++++++-------- .../session/integration/integration_test.ts | 15 +- .../session/integration/link_device_test.ts | 41 +- .../integration/page-objects/common.page.ts | 3 +- .../page-objects/registration.page.ts | 10 +- .../integration/page-objects/settings.page.ts | 5 +- .../session/integration/registration_test.ts | 1 - ts/test/session/sending/MessageQueue_test.ts | 6 +- 11 files changed, 304 insertions(+), 419 deletions(-) diff --git a/libtextsecure/sendmessage.js b/libtextsecure/sendmessage.js index f31114f99..770254c15 100644 --- a/libtextsecure/sendmessage.js +++ b/libtextsecure/sendmessage.js @@ -1,4 +1,4 @@ -/* global textsecure, WebAPI, libsignal, window, libloki, _, libsession */ +/* global textsecure, WebAPI, window, libloki, _, libsession */ /* eslint-disable more/no-then, no-bitwise */ @@ -192,174 +192,6 @@ function MessageSender() { MessageSender.prototype = { constructor: MessageSender, - // makeAttachmentPointer :: Attachment -> Promise AttachmentPointerProto - async makeAttachmentPointer(attachment, publicServer = null, options = {}) { - const { isRaw = false, isAvatar = false } = options; - if (typeof attachment !== 'object' || attachment == null) { - return Promise.resolve(undefined); - } - - if ( - !(attachment.data instanceof ArrayBuffer) && - !ArrayBuffer.isView(attachment.data) - ) { - return Promise.reject( - new TypeError( - `\`attachment.data\` must be an \`ArrayBuffer\` or \`ArrayBufferView\`; got: ${typeof attachment.data}` - ) - ); - } - - const proto = new textsecure.protobuf.AttachmentPointer(); - let attachmentData; - const server = publicServer || this.server; - - if (publicServer || isRaw) { - attachmentData = attachment.data; - } else { - proto.key = libsignal.crypto.getRandomBytes(64); - const iv = libsignal.crypto.getRandomBytes(16); - const result = await textsecure.crypto.encryptAttachment( - attachment.data, - proto.key, - iv - ); - proto.digest = result.digest; - attachmentData = result.ciphertext; - } - - const result = isAvatar - ? await server.putAvatar(attachmentData) - : await server.putAttachment(attachmentData); - - if (!result) { - return Promise.reject( - new Error('Failed to upload data to attachment fileserver') - ); - } - const { url, id } = result; - proto.id = id; - proto.url = url; - proto.contentType = attachment.contentType; - - if (attachment.size) { - proto.size = attachment.size; - } - if (attachment.fileName) { - proto.fileName = attachment.fileName; - } - if (attachment.flags) { - proto.flags = attachment.flags; - } - if (attachment.width) { - proto.width = attachment.width; - } - if (attachment.height) { - proto.height = attachment.height; - } - if (attachment.caption) { - proto.caption = attachment.caption; - } - - return proto; - }, - - queueJobForNumber(number, runJob) { - const taskWithTimeout = textsecure.createTaskWithTimeout( - runJob, - `queueJobForNumber ${number}` - ); - - const runPrevious = this.pendingMessages[number] || Promise.resolve(); - this.pendingMessages[number] = runPrevious.then( - taskWithTimeout, - taskWithTimeout - ); - - const runCurrent = this.pendingMessages[number]; - runCurrent.then(() => { - if (this.pendingMessages[number] === runCurrent) { - delete this.pendingMessages[number]; - } - }); - }, - - uploadAttachments(message, publicServer) { - return Promise.all( - message.attachments.map(attachment => - this.makeAttachmentPointer(attachment, publicServer) - ) - ) - .then(attachmentPointers => { - // eslint-disable-next-line no-param-reassign - message.attachmentPointers = attachmentPointers; - }) - .catch(error => { - if (error instanceof Error && error.name === 'HTTPError') { - throw new textsecure.MessageError(message, error); - } else { - throw error; - } - }); - }, - - async uploadLinkPreviews(message, publicServer) { - try { - const preview = await Promise.all( - (message.preview || []).map(async item => ({ - ...item, - image: await this.makeAttachmentPointer(item.image, publicServer), - })) - ); - // eslint-disable-next-line no-param-reassign - message.preview = preview; - } catch (error) { - if (error instanceof Error && error.name === 'HTTPError') { - throw new textsecure.MessageError(message, error); - } else { - throw error; - } - } - }, - - uploadThumbnails(message, publicServer) { - const makePointer = this.makeAttachmentPointer.bind(this); - const { quote } = message; - - if (!quote || !quote.attachments || quote.attachments.length === 0) { - return Promise.resolve(); - } - - return Promise.all( - quote.attachments.map(attachment => { - const { thumbnail } = attachment; - if (!thumbnail) { - return null; - } - - return makePointer(thumbnail, publicServer).then(pointer => { - // eslint-disable-next-line no-param-reassign - attachment.attachmentPointer = pointer; - }); - }) - ).catch(error => { - if (error instanceof Error && error.name === 'HTTPError') { - throw new textsecure.MessageError(message, error); - } else { - throw error; - } - }); - }, - - uploadAvatar(attachment) { - // isRaw is true since the data is already encrypted - // and doesn't need to be encrypted again - return this.makeAttachmentPointer(attachment, null, { - isRaw: true, - isAvatar: true, - }); - }, - async sendContactSyncMessage(convos) { let convosToSync; if (!convos) { @@ -516,7 +348,6 @@ textsecure.MessageSender = function MessageSenderWrapper(username, password) { this.sendOpenGroupsSyncMessage = sender.sendOpenGroupsSyncMessage.bind( sender ); - this.uploadAvatar = sender.uploadAvatar.bind(sender); this.syncReadMessages = sender.syncReadMessages.bind(sender); this.syncVerification = sender.syncVerification.bind(sender); this.makeProxiedRequest = sender.makeProxiedRequest.bind(sender); diff --git a/ts/components/session/settings/SessionSettings.tsx b/ts/components/session/settings/SessionSettings.tsx index 811897cfb..de499bd15 100644 --- a/ts/components/session/settings/SessionSettings.tsx +++ b/ts/components/session/settings/SessionSettings.tsx @@ -264,7 +264,9 @@ export class SettingsView extends React.Component { } public setOptionsSetting(settingID: string) { - const selectedValue = ($(`#${settingID} .session-radio input:checked`) as any).val(); + const selectedValue = ($( + `#${settingID} .session-radio input:checked` + ) as any).val(); window.setSettingValue(settingID, selectedValue); } @@ -668,7 +670,9 @@ export class SettingsView extends React.Component { } private async onKeyUp(event: any) { - const lockPasswordFocussed = ($('#password-lock-input') as any).is(':focus'); + const lockPasswordFocussed = ($('#password-lock-input') as any).is( + ':focus' + ); if (event.key === 'Enter' && lockPasswordFocussed) { await this.validatePasswordLock(); diff --git a/ts/components/session/settings/SessionSettingsHeader.tsx b/ts/components/session/settings/SessionSettingsHeader.tsx index f1b01bf3a..c078341d6 100644 --- a/ts/components/session/settings/SessionSettingsHeader.tsx +++ b/ts/components/session/settings/SessionSettingsHeader.tsx @@ -30,7 +30,9 @@ export class SettingsHeader extends React.Component { } public focusSearch() { - ($('.left-pane-setting-section .session-search-input input') as any).focus(); + ($( + '.left-pane-setting-section .session-search-input input' + ) as any).focus(); } public showAddLinkedDeviceModal() { diff --git a/ts/test/session/integration/common.ts b/ts/test/session/integration/common.ts index 69cc4f9f7..e7a71b9ad 100644 --- a/ts/test/session/integration/common.ts +++ b/ts/test/session/integration/common.ts @@ -29,228 +29,249 @@ chai.config.includeStack = true; const STUB_SNODE_SERVER_PORT = 3000; const ENABLE_LOG = false; - // tslint:disable-next-line: no-unnecessary-class export class Common { - /* ************** USERS ****************** */ - public static readonly TEST_MNEMONIC1 = - 'faxed mechanic mocked agony unrest loincloth pencil eccentric boyfriend oasis speedy ribbon faxed'; - public static readonly TEST_PUBKEY1 = - '0552b85a43fb992f6bdb122a5a379505a0b99a16f0628ab8840249e2a60e12a413'; - public static readonly TEST_DISPLAY_NAME1 = 'tester_Alice'; + /* ************** USERS ****************** */ + public static readonly TEST_MNEMONIC1 = + 'faxed mechanic mocked agony unrest loincloth pencil eccentric boyfriend oasis speedy ribbon faxed'; + public static readonly TEST_PUBKEY1 = + '0552b85a43fb992f6bdb122a5a379505a0b99a16f0628ab8840249e2a60e12a413'; + public static readonly TEST_DISPLAY_NAME1 = 'tester_Alice'; - public static readonly TEST_MNEMONIC2 = - 'guide inbound jerseys bays nouns basin sulking awkward stockpile ostrich ascend pylons ascend'; - public static readonly TEST_PUBKEY2 = - '054e1ca8681082dbd9aad1cf6fc89a32254e15cba50c75b5a73ac10a0b96bcbd2a'; - public static readonly TEST_DISPLAY_NAME2 = 'tester_Bob'; + public static readonly TEST_MNEMONIC2 = + 'guide inbound jerseys bays nouns basin sulking awkward stockpile ostrich ascend pylons ascend'; + public static readonly TEST_PUBKEY2 = + '054e1ca8681082dbd9aad1cf6fc89a32254e15cba50c75b5a73ac10a0b96bcbd2a'; + public static readonly TEST_DISPLAY_NAME2 = 'tester_Bob'; - public static readonly TEST_MNEMONIC3 = - 'alpine lukewarm oncoming blender kiwi fuel lobster upkeep vogue simplest gasp fully simplest'; - public static readonly TEST_PUBKEY3 = - '05f8662b6e83da5a31007cc3ded44c601f191e07999acb6db2314a896048d9036c'; - public static readonly TEST_DISPLAY_NAME3 = 'tester_Charlie'; + public static readonly TEST_MNEMONIC3 = + 'alpine lukewarm oncoming blender kiwi fuel lobster upkeep vogue simplest gasp fully simplest'; + public static readonly TEST_PUBKEY3 = + '05f8662b6e83da5a31007cc3ded44c601f191e07999acb6db2314a896048d9036c'; + public static readonly TEST_DISPLAY_NAME3 = 'tester_Charlie'; - /* ************** OPEN GROUPS ****************** */ - public static readonly VALID_GROUP_URL = 'https://chat.getsession.org'; - public static readonly VALID_GROUP_URL2 = 'https://chat-dev.lokinet.org'; - public static readonly VALID_GROUP_NAME = 'Session Public Chat'; - public static readonly VALID_GROUP_NAME2 = 'Loki Dev Chat'; + /* ************** OPEN GROUPS ****************** */ + public static readonly VALID_GROUP_URL = 'https://chat.getsession.org'; + public static readonly VALID_GROUP_URL2 = 'https://chat-dev.lokinet.org'; + public static readonly VALID_GROUP_NAME = 'Session Public Chat'; + public static readonly VALID_GROUP_NAME2 = 'Loki Dev Chat'; - /* ************** CLOSED GROUPS ****************** */ - public static readonly VALID_CLOSED_GROUP_NAME1 = 'Closed Group 1'; + /* ************** CLOSED GROUPS ****************** */ + public static readonly VALID_CLOSED_GROUP_NAME1 = 'Closed Group 1'; - public static USER_DATA_ROOT_FOLDER = ''; - private static stubSnode: any; - private static messages: any; - private static fileServer: any; + public static USER_DATA_ROOT_FOLDER = ''; + private static stubSnode: any; + private static messages: any; + private static fileServer: any; - // tslint:disable: await-promise - // tslint:disable: no-console + // tslint:disable: await-promise + // tslint:disable: no-console - public static async timeout(ms: number) { - // tslint:disable-next-line: no-string-based-set-timeout - return new Promise(resolve => setTimeout(resolve, ms)); - } + public static async timeout(ms: number) { + // tslint:disable-next-line: no-string-based-set-timeout + return new Promise(resolve => setTimeout(resolve, ms)); + } - public static async closeToast(app: Application) { - app.client.element(CommonPage.toastCloseButton).click(); - } + public static async closeToast(app: Application) { + app.client.element(CommonPage.toastCloseButton).click(); + } - // a wrapper to work around electron/spectron bug - public static async setValueWrapper(app: Application, selector: any, value: string) { + // a wrapper to work around electron/spectron bug + public static async setValueWrapper( + app: Application, + selector: any, + value: string + ) { // keys, setValue and addValue hang on certain platforms if (process.platform === 'darwin') { await app.client.execute( (slctr, val) => { - // eslint-disable-next-line no-undef - const iter = document.evaluate( - slctr, - document, - null, - XPathResult.UNORDERED_NODE_ITERATOR_TYPE, - null - ); - const elem = iter.iterateNext() as any; - if (elem) { - elem.value = val; - } else { - console.error('Cant find', slctr, elem, iter); - } + // eslint-disable-next-line no-undef + const iter = document.evaluate( + slctr, + document, + null, + XPathResult.UNORDERED_NODE_ITERATOR_TYPE, + null + ); + const elem = iter.iterateNext() as any; + if (elem) { + elem.value = val; + } else { + console.error('Cant find', slctr, elem, iter); + } }, selector, value - ); - // let session js detect the text change + ); + // let session js detect the text change await app.client.element(selector).click(); } else { - // Linux & Windows don't require wrapper + // Linux & Windows don't require wrapper await app.client.element(selector).setValue(value); } + } + + public static async startApp(environment = 'test-integration-session') { + const env = environment.startsWith('test-integration') + ? 'test-integration' + : environment; + const instance = environment.replace('test-integration-', ''); + + const app1 = new Application({ + path: path.join( + __dirname, + '..', + '..', + '..', + '..', + 'node_modules', + '.bin', + 'electron' + ), + args: ['.'], + env: { + NODE_ENV: env, + NODE_APP_INSTANCE: instance, + USE_STUBBED_NETWORK: true, + ELECTRON_ENABLE_LOGGING: true, + ELECTRON_ENABLE_STACK_DUMPING: true, + ELECTRON_DISABLE_SANDBOX: 1, + }, + requireName: 'electronRequire', + // chromeDriverLogPath: '../chromedriverlog.txt', + chromeDriverArgs: [ + `remote-debugging-port=${Math.floor( + // tslint:disable-next-line: insecure-random + Math.random() * (9999 - 9000) + 9000 + )}`, + ], + }); + // FIXME audric + // chaiAsPromised.transferPromiseness = app1.transferPromiseness; + + await app1.start(); + await app1.client.waitUntilWindowLoaded(); + + return app1; + } + + public static async startApp2() { + const app2 = await Common.startApp('test-integration-session-2'); + return app2; + } + + public static async stopApp(app1: Application) { + if (app1 && app1.isRunning()) { + await app1.stop(); + } + } + + public static async killallElectron() { + // rtharp - my 2nd client on MacOs needs: pkill -f "node_modules/.bin/electron" + // node_modules/electron/dist/electron is node_modules/electron/dist/Electron.app on MacOS + const killStr = + process.platform === 'win32' + ? 'taskkill /im electron.exe /t /f' + : 'pkill -f "node_modules/electron/dist/electron" | pkill -f "node_modules/.bin/electron"'; + return new Promise(resolve => { + exec(killStr, (_err, stdout, stderr) => { + resolve({ stdout, stderr }); + }); + }); + } + + public static async rmFolder(folder: string) { + await fse.remove(folder); + } + + public static async startAndAssureCleanedApp2() { + const app2 = await Common.startAndAssureCleanedApp( + 'test-integration-session-2' + ); + return app2; + } + + public static async startAndAssureCleanedApp( + env = 'test-integration-session' + ) { + const userData = path.join(Common.USER_DATA_ROOT_FOLDER, `Session-${env}`); + + await Common.rmFolder(userData); + + const app1 = await Common.startApp(env); + await app1.client.waitForExist( + RegistrationPage.registrationTabSignIn, + 4000 + ); + + return app1; + } + + public static async startAndStub({ + mnemonic, + displayName, + env = 'test-integration-session', + }: { + mnemonic: string; + displayName: string; + env?: string; + }) { + const app = await Common.startAndAssureCleanedApp(env); + await Common.startStubSnodeServer(); + + if (mnemonic && displayName) { + await Common.restoreFromMnemonic(app, mnemonic, displayName); + // not sure we need Common - rtharp. + await Common.timeout(2000); } - public static async startApp(environment = 'test-integration-session') { - const env = environment.startsWith('test-integration') - ? 'test-integration' - : environment; - const instance = environment.replace('test-integration-', ''); + return app; + } - const app1 = new Application({ - path: path.join(__dirname, '..', '..', '..', '..', 'node_modules', '.bin', 'electron'), - args: ['.'], - env: { - NODE_ENV: env, - NODE_APP_INSTANCE: instance, - USE_STUBBED_NETWORK: true, - ELECTRON_ENABLE_LOGGING: true, - ELECTRON_ENABLE_STACK_DUMPING: true, - ELECTRON_DISABLE_SANDBOX: 1, - }, - requireName: 'electronRequire', - // chromeDriverLogPath: '../chromedriverlog.txt', - chromeDriverArgs: [ - `remote-debugging-port=${Math.floor( - // tslint:disable-next-line: insecure-random - Math.random() * (9999 - 9000) + 9000 - )}`, - ], - }); - // FIXME audric - // chaiAsPromised.transferPromiseness = app1.transferPromiseness; + public static async startAndStubN(props: any, n: number) { + // Make app with stub as number n + const appN = await Common.startAndStub({ + env: `test-integration-session-${n}`, + ...props, + }); - await app1.start(); - await app1.client.waitUntilWindowLoaded(); + return appN; + } - return app1; - } + public static async restoreFromMnemonic( + app: Application, + mnemonic: string, + displayName: string + ) { + await app.client.element(RegistrationPage.registrationTabSignIn).click(); + await app.client.element(RegistrationPage.restoreFromSeedMode).click(); + await Common.setValueWrapper( + app, + RegistrationPage.recoveryPhraseInput, + mnemonic + ); - public static async startApp2() { - const app2 = await Common.startApp('test-integration-session-2'); - return app2; - } + await Common.setValueWrapper( + app, + RegistrationPage.displayNameInput, + displayName + ); - public static async stopApp(app1: Application) { - if (app1 && app1.isRunning()) { - await app1.stop(); - } - } + // await app.client.element(RegistrationPage.continueSessionButton).click(); + await app.client.keys('Enter'); - public static async killallElectron() { - // rtharp - my 2nd client on MacOs needs: pkill -f "node_modules/.bin/electron" - // node_modules/electron/dist/electron is node_modules/electron/dist/Electron.app on MacOS - const killStr = - process.platform === 'win32' - ? 'taskkill /im electron.exe /t /f' - : 'pkill -f "node_modules/electron/dist/electron" | pkill -f "node_modules/.bin/electron"'; - return new Promise(resolve => { - exec(killStr, (_err, stdout, stderr) => { - resolve({ stdout, stderr }); - }); - }); - } + await app.client.waitForExist( + RegistrationPage.conversationListContainer, + 4000 + ); + } - public static async rmFolder(folder: string) { - await fse.remove(folder); - } - - public static async startAndAssureCleanedApp2() { - const app2 = await Common.startAndAssureCleanedApp( - 'test-integration-session-2' - ); - return app2; - } - - public static async startAndAssureCleanedApp(env = 'test-integration-session') { - const userData = path.join(Common.USER_DATA_ROOT_FOLDER, `Session-${env}`); - - await Common.rmFolder(userData); - - const app1 = await Common.startApp(env); - await app1.client.waitForExist( - RegistrationPage.registrationTabSignIn, - 4000 - ); - - return app1; - } - - public static async startAndStub({ - mnemonic, - displayName, - env = 'test-integration-session', - }: { - mnemonic: string; - displayName: string; - env?: string; - }) { - const app = await Common.startAndAssureCleanedApp(env); - await Common.startStubSnodeServer(); - - if (mnemonic && displayName) { - await Common.restoreFromMnemonic(app, mnemonic, displayName); - // not sure we need Common - rtharp. - await Common.timeout(2000); - } - - return app; - } - - public static async startAndStubN(props: any, n: number) { - // Make app with stub as number n - const appN = await Common.startAndStub({ - env: `test-integration-session-${n}`, - ...props, - }); - - return appN; - } - - public static async restoreFromMnemonic(app: Application, mnemonic: string, displayName: string) { - await app.client.element(RegistrationPage.registrationTabSignIn).click(); - await app.client.element(RegistrationPage.restoreFromSeedMode).click(); - await Common.setValueWrapper( - app, - RegistrationPage.recoveryPhraseInput, - mnemonic - ); - - await Common.setValueWrapper( - app, - RegistrationPage.displayNameInput, - displayName - ); - - // await app.client.element(RegistrationPage.continueSessionButton).click(); - await app.client.keys('Enter'); - - await app.client.waitForExist( - RegistrationPage.conversationListContainer, - 4000 - ); - } - - public static async makeFriends(app1: Application, client2: [Application, string]) { + public static async makeFriends( + app1: Application, + client2: [Application, string] + ) { const [app2, pubkey2] = client2; /** add each other as friends */ @@ -259,7 +280,11 @@ export class Common { await app1.client.element(ConversationPage.contactsButtonSection).click(); await app1.client.element(ConversationPage.addContactButton).click(); - await Common.setValueWrapper(app1, ConversationPage.sessionIDInput, pubkey2); + await Common.setValueWrapper( + app1, + ConversationPage.sessionIDInput, + pubkey2 + ); await app1.client.element(ConversationPage.nextButton).click(); await app1.client.waitForExist( ConversationPage.sendFriendRequestTextarea, @@ -331,7 +356,10 @@ export class Common { return [app1, app2]; } - public static async addFriendToNewClosedGroup(members: Array, useSenderKeys?: boolean) { + public static async addFriendToNewClosedGroup( + members: Array, + useSenderKeys?: boolean + ) { const [app, ...others] = members; await app.client @@ -433,7 +461,11 @@ export class Common { ); } - public static async linkApp2ToApp(app1: Application, app2: Application, app1Pubkey: string) { + public static async linkApp2ToApp( + app1: Application, + app2: Application, + app1Pubkey: string + ) { // app needs to be logged in as user1 and app2 needs to be logged out // start the pairing dialog for the first app await app1.client.element(SettingsPage.settingsButtonSection).click(); @@ -497,7 +529,10 @@ export class Common { .should.eventually.be.equal(app1Pubkey); } - public static async triggerUnlinkApp2FromApp(app1: Application, app2: Application) { + public static async triggerUnlinkApp2FromApp( + app1: Application, + app2: Application + ) { // check app2 is loggedin await app2.client.isExisting(RegistrationPage.conversationListContainer) .should.eventually.be.true; @@ -541,7 +576,11 @@ export class Common { } } - public static async sendMessage(app: Application, messageText: string, fileLocation?: string) { + public static async sendMessage( + app: Application, + messageText: string, + fileLocation?: string + ) { await Common.setValueWrapper( app, ConversationPage.sendMessageTextarea, @@ -567,7 +606,7 @@ export class Common { } public static generateSendMessageText(): string { - return `Test message from integration tests ${Date.now()}`; + return `Test message from integration tests ${Date.now()}`; } public static async startStubSnodeServer() { @@ -584,17 +623,17 @@ export class Common { return; } if (Array.isArray(pubkey)) { - console.error('pubkey cannot be an array'); - response.writeHead(400, { 'Content-Type': 'text/html' }); - response.end(); - return; + console.error('pubkey cannot be an array'); + response.writeHead(400, { 'Content-Type': 'text/html' }); + response.end(); + return; } if (Array.isArray(data)) { - console.error('data cannot be an array'); - response.writeHead(400, { 'Content-Type': 'text/html' }); - response.end(); - return; + console.error('data cannot be an array'); + response.writeHead(400, { 'Content-Type': 'text/html' }); + response.end(); + return; } if (request.method === 'POST') { @@ -647,7 +686,11 @@ export class Common { } } - public static async joinOpenGroup(app: Application, openGroupUrl: string, name: string) { + public static async joinOpenGroup( + app: Application, + openGroupUrl: string, + name: string + ) { await app.client .element(ConversationPage.conversationButtonSection) .click(); @@ -699,7 +742,11 @@ export class Common { * @param str the string to search (not regex) * Note: getRenderProcessLogs() clears the app logs each calls. */ - public static async logsContains(renderLogs: Array<{message: string}>, str: string, count?: number) { + public static async logsContains( + renderLogs: Array<{ message: string }>, + str: string, + count?: number + ) { const foundLines = renderLogs.filter(log => log.message.includes(str)); // tslint:disable-next-line: no-unused-expression diff --git a/ts/test/session/integration/integration_test.ts b/ts/test/session/integration/integration_test.ts index 9e3b6eb28..a1bd00acf 100644 --- a/ts/test/session/integration/integration_test.ts +++ b/ts/test/session/integration/integration_test.ts @@ -1,16 +1,7 @@ - -// import { expect } from 'chai'; -// import * as sinon from 'sinon'; -// import { TestUtils } from '../../test-utils'; -// import { PairingAuthorisation } from '../../../../js/modules/data'; -// import { MultiDeviceProtocol } from '../../../session/protocols'; -// import { PubKey } from '../../../session/types'; -// import { UserUtil } from '../../../util'; -// import { StringUtils } from '../../../session/utils'; - import { Common } from './common'; // tslint:disable: no-import-side-effect +// tslint:disable: await-promise import './registration_test'; import './open_group_test'; @@ -26,9 +17,7 @@ before(async () => { // start the app once before all tests to get the platform-dependent // path of user data and store it to common.USER_DATA_ROOT_FOLDER const app1 = await Common.startApp(); - const ret = await app1.electron.remote.app.getPath( - 'appData' - ) as any; + const ret = (await app1.electron.remote.app.getPath('appData')) as any; Common.USER_DATA_ROOT_FOLDER = ret; await Common.stopApp(app1); diff --git a/ts/test/session/integration/link_device_test.ts b/ts/test/session/integration/link_device_test.ts index aaef467f0..51900c536 100644 --- a/ts/test/session/integration/link_device_test.ts +++ b/ts/test/session/integration/link_device_test.ts @@ -3,9 +3,13 @@ /* eslint-disable func-names */ /* eslint-disable import/no-extraneous-dependencies */ // tslint:disable: no-implicit-dependencies +// tslint:disable: await-promise + import { afterEach, beforeEach, describe, it } from 'mocha'; import { Common } from './common'; import { Application } from 'spectron'; +import * as TestUtils from '../../test-utils/utils/stubbing'; +import { expect } from 'chai'; describe('Link Device', function() { let app: Application; @@ -44,27 +48,34 @@ describe('Link Device', function() { }); it('linkDevice:sync no groups, closed group, nor open groups', async () => { + await TestUtils.spyMessageQueueSend(app); + await TestUtils.spyMessageQueueSend(app2); + await Common.linkApp2ToApp(app, app2, Common.TEST_PUBKEY1); await Common.timeout(10000); + const allMessagesSentApp = await TestUtils.getAllMessagesSent(app); + const allMessagesSentApp2 = await TestUtils.getAllMessagesSent(app2); - // get logs at this stage (getRenderProcessLogs() clears the app logs) - const secondaryRenderLogs = await app2.client.getRenderProcessLogs(); - // pairing request message sent from secondary to primary pubkey - await Common.logsContains( - secondaryRenderLogs, - `Sending pairing-request:pairing-request message to ${Common.TEST_PUBKEY1}` + expect(allMessagesSentApp2[0][1]).to.have.property('requestSignature'); + expect(allMessagesSentApp2[0][1]).to.have.property( + 'primaryDevicePubKey', + Common.TEST_PUBKEY1 ); + expect(allMessagesSentApp2[0][1]).to.have.property('secondaryDevicePubKey'); - const primaryRenderLogs = await app.client.getRenderProcessLogs(); - // primary grant pairing request - await Common.logsContains( - primaryRenderLogs, - 'Sending pairing-request:pairing-request message to OUR SECONDARY PUBKEY' + expect(allMessagesSentApp[1][1]).to.have.property('requestSignature'); + expect(allMessagesSentApp[1][1]).to.have.property('grantSignature'); + expect(allMessagesSentApp[1][1]).to.have.property( + 'displayName', + Common.TEST_DISPLAY_NAME1 ); + expect(allMessagesSentApp[1][1]).to.have.property( + 'primaryDevicePubKey', + Common.TEST_PUBKEY1 + ); + expect(allMessagesSentApp[1][1]).to.have.property('secondaryDevicePubKey'); - // no friends, no closed groups, no open groups. we should see those message sync in the log - await Common.logsContains(primaryRenderLogs, 'No closed group to sync.', 1); - await Common.logsContains(primaryRenderLogs, 'No open groups to sync', 1); - await Common.logsContains(primaryRenderLogs, 'No contacts to sync.', 1); + // one message for session establishment, one for grant authorization. No group or anything to sync + expect(allMessagesSentApp.length).to.be.equal(2); }); }); diff --git a/ts/test/session/integration/page-objects/common.page.ts b/ts/test/session/integration/page-objects/common.page.ts index c9c01d9fe..5295598f7 100644 --- a/ts/test/session/integration/page-objects/common.page.ts +++ b/ts/test/session/integration/page-objects/common.page.ts @@ -17,7 +17,8 @@ export = { textAreaWithClass: (classname: string) => `//textarea[contains(@class, "${classname}")]`, byId: (id: string) => `//*[@id="${id}"]`, - divWithClass: (classname: string) => `//div[contains(@class, "${classname}")]`, + divWithClass: (classname: string) => + `//div[contains(@class, "${classname}")]`, divWithClassAndText: (classname: string, text: string) => module.exports.objWithClassAndText('div', classname, text), spanWithClassAndText: (classname: string, text: string) => diff --git a/ts/test/session/integration/page-objects/registration.page.ts b/ts/test/session/integration/page-objects/registration.page.ts index 3e02fafee..2d7e7ae7b 100644 --- a/ts/test/session/integration/page-objects/registration.page.ts +++ b/ts/test/session/integration/page-objects/registration.page.ts @@ -1,6 +1,5 @@ import commonPage from './common.page'; - export = { registrationTabSignIn: '//div[contains(string(), "Sign In")][contains(@class, "session-registration__tab")][contains(@role, "tab")]', @@ -36,6 +35,11 @@ export = { ), linkDeviceTriggerButton: commonPage.divRoleButtonWithText('Link Device'), toastWrapper: '//*[contains(@class,"session-toast-wrapper")]', - secretWordsText: '//div[contains(@class,"session-registration__content__secret-words")]/div[contains(@class,"subtle")]', - linkWithThisDevice: commonPage.objWithClassAndText('h4', 'device-pairing-dialog__desc', 'Allow linking with this device?'), + secretWordsText: + '//div[contains(@class,"session-registration__content__secret-words")]/div[contains(@class,"subtle")]', + linkWithThisDevice: commonPage.objWithClassAndText( + 'h4', + 'device-pairing-dialog__desc', + 'Allow linking with this device?' + ), }; diff --git a/ts/test/session/integration/page-objects/settings.page.ts b/ts/test/session/integration/page-objects/settings.page.ts index a34075516..b5f98d4e8 100644 --- a/ts/test/session/integration/page-objects/settings.page.ts +++ b/ts/test/session/integration/page-objects/settings.page.ts @@ -5,7 +5,8 @@ export = { settingsRowWithText: (text: string) => `//*[contains(@class, "left-pane-setting-category-list-item")][contains(string(), '${text}')]`, - leftPaneSettingsButton: '//*[contains(@class,"session-icon-button") and .//*[contains(@class, "gear")]]', + leftPaneSettingsButton: + '//*[contains(@class,"session-icon-button") and .//*[contains(@class, "gear")]]', settingToggleWithText: (text: string) => `//div[contains(@class, 'session-settings-item') and contains(string(), '${text}')]//*[contains(@class, 'session-toggle')]`, @@ -15,7 +16,7 @@ export = { `//div[contains(@class, 'left-pane-setting-category-list-item') and contains(string(), '${text}')]`, // Confirm is a boolean. Selects confirmation input - passwordSetModalInput: (_confirm: boolean|undefined) => + passwordSetModalInput: (_confirm: boolean | undefined) => `//input[@id = 'password-modal-input${_confirm ? '-confirm' : ''}']`, secretWordsTextInDialog: diff --git a/ts/test/session/integration/registration_test.ts b/ts/test/session/integration/registration_test.ts index dba321788..5e62052b5 100644 --- a/ts/test/session/integration/registration_test.ts +++ b/ts/test/session/integration/registration_test.ts @@ -12,7 +12,6 @@ import SettingsPage from './page-objects/settings.page'; import RegistrationPage from './page-objects/registration.page'; import ConversationPage from './page-objects/conversation.page'; - describe('Window Test and Login', function() { let app: Application; this.timeout(20000); diff --git a/ts/test/session/sending/MessageQueue_test.ts b/ts/test/session/sending/MessageQueue_test.ts index 4e1644d27..6b4315c03 100644 --- a/ts/test/session/sending/MessageQueue_test.ts +++ b/ts/test/session/sending/MessageQueue_test.ts @@ -1,11 +1,7 @@ import chai from 'chai'; import * as sinon from 'sinon'; import _ from 'lodash'; -import { - GroupUtils, - PromiseUtils, - SyncMessageUtils, -} from '../../../session/utils'; +import { GroupUtils, PromiseUtils } from '../../../session/utils'; import { Stubs, TestUtils } from '../../../test/test-utils'; import { MessageQueue } from '../../../session/sending/MessageQueue'; import { From 7de0a0ae65b1384553b51a1e0d744823b9adf026 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Thu, 30 Jul 2020 16:49:11 +0200 Subject: [PATCH 012/274] Add Subscreen for blocked Users --- .../session/LeftPaneSettingSection.tsx | 5 +++ .../session/settings/SessionSettings.tsx | 41 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/ts/components/session/LeftPaneSettingSection.tsx b/ts/components/session/LeftPaneSettingSection.tsx index 7d729e498..1cfde2986 100644 --- a/ts/components/session/LeftPaneSettingSection.tsx +++ b/ts/components/session/LeftPaneSettingSection.tsx @@ -212,6 +212,11 @@ export class LeftPaneSettingSection extends React.Component { title: window.i18n('privacySettingsTitle'), hidden: false, }, + { + id: SessionSettingCategory.Blocked, + title: window.i18n('settingsUnblockHeader'), + hidden: isSecondaryDevice, + }, { id: SessionSettingCategory.Permissions, title: window.i18n('permissionSettingsTitle'), diff --git a/ts/components/session/settings/SessionSettings.tsx b/ts/components/session/settings/SessionSettings.tsx index 3b4076da0..ed2ece37b 100644 --- a/ts/components/session/settings/SessionSettings.tsx +++ b/ts/components/session/settings/SessionSettings.tsx @@ -103,6 +103,9 @@ export class SettingsView extends React.Component { if (category === SessionSettingCategory.Devices) { // special case for linked devices settings = this.getLinkedDeviceSettings(); + } else if(category === SessionSettingCategory.Blocked) { + // special case for blocked user + settings = this.getBlockedUserSettings(); } else { // Grab initial values from database on startup // ID corresponds to installGetter parameters in preload.js @@ -589,6 +592,44 @@ export class SettingsView extends React.Component { ]; } + private getBlockedUserSettings(): Array { + const results: Array = []; + const model = window.getConversations(); + + for (const currentModel of model.models) { + let displayName = currentModel.id; + + if (currentModel.attributes.profile && currentModel.attributes.profile.displayName) { + displayName = currentModel.attributes.profile.displayName + } + + if(currentModel.isBlocked()) { + results.push({ + id: currentModel.id, + title: displayName, + description: currentModel.id, + type: SessionSettingType.Button, + category: SessionSettingCategory.Blocked, + content: { + buttonColor: SessionButtonColor.Danger, + buttonText: window.i18n('unblockUser'), + }, + comparisonValue: undefined, + setFn: () => { + currentModel.unblock() + }, + hidden: false, + onClick: undefined, + confirmationDialogParams: undefined, + }); + } + } + + console.log(results); + + return results; + } + private getLinkedDeviceSettings(): Array { const { linkedPubKeys } = this.state; const { isSecondaryDevice } = this.props; From e800e5509b4c9c73858944a0f3673cc9a124a580 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Fri, 31 Jul 2020 09:23:56 +0200 Subject: [PATCH 013/274] Placeholder for no DisplayName-Contacts in blocked --- ts/components/session/settings/SessionSettings.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ts/components/session/settings/SessionSettings.tsx b/ts/components/session/settings/SessionSettings.tsx index ed2ece37b..625e122e2 100644 --- a/ts/components/session/settings/SessionSettings.tsx +++ b/ts/components/session/settings/SessionSettings.tsx @@ -597,7 +597,7 @@ export class SettingsView extends React.Component { const model = window.getConversations(); for (const currentModel of model.models) { - let displayName = currentModel.id; + let displayName = 'User (...' + currentModel.id.substr(-6) + ')'; if (currentModel.attributes.profile && currentModel.attributes.profile.displayName) { displayName = currentModel.attributes.profile.displayName @@ -625,8 +625,6 @@ export class SettingsView extends React.Component { } } - console.log(results); - return results; } From c12c3b5f64b4f3c033c317ff1851523ad45d3789 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 3 Aug 2020 11:25:06 +1000 Subject: [PATCH 014/274] move stub of integration tests to typescript --- js/modules/loki_app_dot_net_api.d.ts | 1 + js/modules/loki_public_chat_api.js | 2 +- preload.js | 4 +- .../session/integration/add_contacts_test.ts | 5 +- .../session/integration/closed_group_test.ts | 33 ++++---- .../session/integration/integration_test.ts | 9 ++- .../session/integration/link_device_test.ts | 6 +- .../integration/message_functions_test.ts | 41 +++++----- .../session/integration/message_sync_test.ts | 72 +++++++++--------- .../session/integration/open_group_test.ts | 5 +- .../session/integration/registration_test.ts | 5 +- .../session/integration/sender_keys_test.ts | 65 ++++++++-------- .../test/session/integration/settings_test.ts | 46 +++++------ .../integration/stubs/stub_app_dot_net_api.ts | 9 ++- .../integration/stubs/stub_message_api.ts | 22 ++++-- .../test/session/integration}/test_attachment | Bin 16 files changed, 179 insertions(+), 146 deletions(-) rename integration_test/closed_group_test.js => ts/test/session/integration/closed_group_test.ts (61%) rename integration_test/message_functions_test.js => ts/test/session/integration/message_functions_test.ts (66%) rename integration_test/message_sync_test.js => ts/test/session/integration/message_sync_test.ts (67%) rename integration_test/sender_keys_test.js => ts/test/session/integration/sender_keys_test.ts (66%) rename integration_test/settings_test.js => ts/test/session/integration/settings_test.ts (70%) rename integration_test/stubs/stub_app_dot_net_api.js => ts/test/session/integration/stubs/stub_app_dot_net_api.ts (93%) rename integration_test/stubs/stub_message_api.js => ts/test/session/integration/stubs/stub_message_api.ts (54%) rename {integration_test => ts/test/session/integration}/test_attachment (100%) diff --git a/js/modules/loki_app_dot_net_api.d.ts b/js/modules/loki_app_dot_net_api.d.ts index f578c40ab..df50f3424 100644 --- a/js/modules/loki_app_dot_net_api.d.ts +++ b/js/modules/loki_app_dot_net_api.d.ts @@ -34,6 +34,7 @@ export interface LokiPublicChannelAPI { } declare class LokiAppDotNetServerAPI implements LokiAppDotNetServerInterface { + public baseServerUrl: string; constructor(ourKey: string, url: string); } diff --git a/js/modules/loki_public_chat_api.js b/js/modules/loki_public_chat_api.js index e37c01f3c..4578baade 100644 --- a/js/modules/loki_public_chat_api.js +++ b/js/modules/loki_public_chat_api.js @@ -117,7 +117,7 @@ class LokiPublicChatFactoryAPI extends EventEmitter { // after verification then we can start up all the pollers if (process.env.USE_STUBBED_NETWORK) { // eslint-disable-next-line global-require - const StubAppDotNetAPI = require('../../integration_test/stubs/stub_app_dot_net_api.js'); + const StubAppDotNetAPI = require('../.././ts/test/session/integration/stubs/stub_app_dot_net_api'); thisServer = new StubAppDotNetAPI(this.ourKey, serverUrl); } else { thisServer = new LokiAppDotNetAPI(this.ourKey, serverUrl); diff --git a/preload.js b/preload.js index 38ed1056b..c5a57bf92 100644 --- a/preload.js +++ b/preload.js @@ -341,10 +341,10 @@ const { OnionAPI } = require('./ts/session/onions'); window.OnionAPI = OnionAPI; if (process.env.USE_STUBBED_NETWORK) { - const StubMessageAPI = require('./integration_test/stubs/stub_message_api'); + const StubMessageAPI = require('./ts/test/session/integration/stubs/stub_message_api'); window.LokiMessageAPI = StubMessageAPI; - const StubAppDotNetAPI = require('./integration_test/stubs/stub_app_dot_net_api'); + const StubAppDotNetAPI = require('./ts/test/session/integration/stubs/stub_app_dot_net_api'); window.LokiAppDotNetServerAPI = StubAppDotNetAPI; } else { window.LokiMessageAPI = require('./js/modules/loki_message_api'); diff --git a/ts/test/session/integration/add_contacts_test.ts b/ts/test/session/integration/add_contacts_test.ts index 7d617f984..d644284b2 100644 --- a/ts/test/session/integration/add_contacts_test.ts +++ b/ts/test/session/integration/add_contacts_test.ts @@ -2,6 +2,7 @@ /* eslint-disable import/no-extraneous-dependencies */ // tslint:disable: await-promise // tslint:disable: no-implicit-dependencies +// tslint:disable: no-invalid-this import { afterEach, beforeEach, describe, it } from 'mocha'; import { Common } from './common'; @@ -10,10 +11,10 @@ import { Application } from 'spectron'; import ConversationPage from './page-objects/conversation.page'; describe('Add contact', function() { + this.timeout(60000); + this.slow(20000); let app: Application; let app2: Application; - this.timeout(60000); - this.slow(15000); beforeEach(async () => { await Common.killallElectron(); diff --git a/integration_test/closed_group_test.js b/ts/test/session/integration/closed_group_test.ts similarity index 61% rename from integration_test/closed_group_test.js rename to ts/test/session/integration/closed_group_test.ts index 49aabf0f1..c6023c713 100644 --- a/integration_test/closed_group_test.js +++ b/ts/test/session/integration/closed_group_test.ts @@ -1,37 +1,42 @@ /* eslint-disable func-names */ /* eslint-disable import/no-extraneous-dependencies */ -const { afterEach, beforeEach, describe, it } = require('mocha'); -const common = require('./common'); +// tslint:disable: await-promise +// tslint:disable: no-implicit-dependencies +// tslint:disable: no-invalid-this -const ConversationPage = require('./page-objects/conversation.page'); +import { afterEach, beforeEach, describe, it } from 'mocha'; +import { Common } from './common'; +import { Application } from 'spectron'; + +import ConversationPage from './page-objects/conversation.page'; describe('Closed groups', function() { - let app; - let app2; this.timeout(60000); - this.slow(15000); + this.slow(20000); + let app: Application; + let app2: Application; beforeEach(async () => { - await common.killallElectron(); - await common.stopStubSnodeServer(); + await Common.killallElectron(); + await Common.stopStubSnodeServer(); - [app, app2] = await common.startAppsAsFriends(); + [app, app2] = await Common.startAppsAsFriends(); }); afterEach(async () => { - await common.stopApp(app); - await common.killallElectron(); - await common.stopStubSnodeServer(); + await Common.stopApp(app); + await Common.killallElectron(); + await Common.stopStubSnodeServer(); }); it('closedGroup: can create a closed group with a friend and send/receive a message', async () => { const useSenderKeys = false; // create group and add new friend - await common.addFriendToNewClosedGroup([app, app2], useSenderKeys); + await Common.addFriendToNewClosedGroup([app, app2], useSenderKeys); // send a message from app and validate it is received on app2 - const textMessage = common.generateSendMessageText(); + const textMessage = Common.generateSendMessageText(); await app.client .element(ConversationPage.sendMessageTextarea) .setValue(textMessage); diff --git a/ts/test/session/integration/integration_test.ts b/ts/test/session/integration/integration_test.ts index a1bd00acf..cde34e6f3 100644 --- a/ts/test/session/integration/integration_test.ts +++ b/ts/test/session/integration/integration_test.ts @@ -1,7 +1,6 @@ import { Common } from './common'; -// tslint:disable: no-import-side-effect -// tslint:disable: await-promise +// tslint:disable: no-import-side-effect no-invalid-this await-promise import './registration_test'; import './open_group_test'; @@ -13,11 +12,13 @@ import './link_device_test'; // import'./message_sync_test'; // import './sender_keys_test'; -before(async () => { +before(async function() { // start the app once before all tests to get the platform-dependent // path of user data and store it to common.USER_DATA_ROOT_FOLDER + this.timeout(60000); + this.slow(20000); const app1 = await Common.startApp(); - const ret = (await app1.electron.remote.app.getPath('appData')) as any; + const ret = await app1.electron.remote.app.getPath('appData'); Common.USER_DATA_ROOT_FOLDER = ret; await Common.stopApp(app1); diff --git a/ts/test/session/integration/link_device_test.ts b/ts/test/session/integration/link_device_test.ts index 51900c536..b1d1d04ac 100644 --- a/ts/test/session/integration/link_device_test.ts +++ b/ts/test/session/integration/link_device_test.ts @@ -4,6 +4,7 @@ /* eslint-disable import/no-extraneous-dependencies */ // tslint:disable: no-implicit-dependencies // tslint:disable: await-promise +// tslint:disable: no-invalid-this import { afterEach, beforeEach, describe, it } from 'mocha'; import { Common } from './common'; @@ -12,11 +13,10 @@ import * as TestUtils from '../../test-utils/utils/stubbing'; import { expect } from 'chai'; describe('Link Device', function() { + this.timeout(60000); + this.slow(20000); let app: Application; let app2: Application; - this.timeout(60000); - this.slow(15000); - beforeEach(async () => { await Common.killallElectron(); diff --git a/integration_test/message_functions_test.js b/ts/test/session/integration/message_functions_test.ts similarity index 66% rename from integration_test/message_functions_test.js rename to ts/test/session/integration/message_functions_test.ts index 245664ff1..ac25701ff 100644 --- a/integration_test/message_functions_test.js +++ b/ts/test/session/integration/message_functions_test.ts @@ -1,41 +1,44 @@ -/* eslint-disable prefer-destructuring */ -/* eslint-disable more/no-then */ /* eslint-disable func-names */ /* eslint-disable import/no-extraneous-dependencies */ -const path = require('path'); +// tslint:disable: await-promise +// tslint:disable: no-implicit-dependencies +// tslint:disable: no-invalid-this -const { afterEach, beforeEach, describe, it } = require('mocha'); -const common = require('./common'); -const ConversationPage = require('./page-objects/conversation.page'); +import path from 'path'; +import { afterEach, beforeEach, describe, it } from 'mocha'; +import { Common } from './common'; +import { Application } from 'spectron'; + +import ConversationPage from './page-objects/conversation.page'; describe('Message Functions', function() { - let app; - let app2; this.timeout(60000); - this.slow(15000); + this.slow(20000); + let app: Application; + let app2: Application; beforeEach(async () => { - await common.killallElectron(); - await common.stopStubSnodeServer(); + await Common.killallElectron(); + await Common.stopStubSnodeServer(); - [app, app2] = await common.startAppsAsFriends(); + [app, app2] = await Common.startAppsAsFriends(); }); afterEach(async () => { - await common.stopApp(app); - await common.killallElectron(); - await common.stopStubSnodeServer(); + await Common.stopApp(app); + await Common.killallElectron(); + await Common.stopStubSnodeServer(); }); it('can send attachment', async () => { // create group and add new friend - await common.addFriendToNewClosedGroup([app, app2], false); + await Common.addFriendToNewClosedGroup([app, app2], false); // send attachment from app1 to closed group const fileLocation = path.join(__dirname, 'test_attachment'); const messageText = 'test_attachment'; - await common.sendMessage(app, messageText, fileLocation); + await Common.sendMessage(app, messageText, fileLocation); // validate attachment sent await app.client.waitForExist( @@ -51,9 +54,9 @@ describe('Message Functions', function() { it('can delete message', async () => { // create group and add new friend - await common.addFriendToNewClosedGroup([app, app2], false); + await Common.addFriendToNewClosedGroup([app, app2], false); const messageText = 'delete_me'; - await common.sendMessage(app, messageText); + await Common.sendMessage(app, messageText); await app.client.waitForExist( ConversationPage.existingSendMessageText(messageText), diff --git a/integration_test/message_sync_test.js b/ts/test/session/integration/message_sync_test.ts similarity index 67% rename from integration_test/message_sync_test.js rename to ts/test/session/integration/message_sync_test.ts index 3aa078e23..d05ad04b3 100644 --- a/integration_test/message_sync_test.js +++ b/ts/test/session/integration/message_sync_test.ts @@ -1,39 +1,43 @@ /* eslint-disable func-names */ /* eslint-disable import/no-extraneous-dependencies */ -const { after, before, describe, it } = require('mocha'); +// tslint:disable: await-promise +// tslint:disable: no-implicit-dependencies +// tslint:disable: no-invalid-this -const common = require('./common'); +import { after, before, describe, it } from 'mocha'; +import { Common } from './common'; +import { Application } from 'spectron'; describe('Message Syncing', function() { - let Alice1; - let Bob1; - let Alice2; this.timeout(60000); - this.slow(15000); + this.slow(20000); + let Alice1: Application; + let Bob1: Application; + let Alice2: Application; // this test suite builds a complex usecase over several tests, // so you need to run all of those tests together (running only one might fail) before(async () => { - await common.killallElectron(); - await common.stopStubSnodeServer(); + await Common.killallElectron(); + await Common.stopStubSnodeServer(); const alice2Props = {}; - [Alice1, Bob1] = await common.startAppsAsFriends(); // Alice and Bob are friends + [Alice1, Bob1] = await Common.startAppsAsFriends(); // Alice and Bob are friends - await common.addFriendToNewClosedGroup([Alice1, Bob1], false); - await common.joinOpenGroup( + await Common.addFriendToNewClosedGroup([Alice1, Bob1], false); + await Common.joinOpenGroup( Alice1, - common.VALID_GROUP_URL, - common.VALID_GROUP_NAME + Common.VALID_GROUP_URL, + Common.VALID_GROUP_NAME ); - Alice2 = await common.startAndStubN(alice2Props, 4); // Alice secondary, just start the app for now. no linking + Alice2 = await Common.startAndStubN(alice2Props, 4); // Alice secondary, just start the app for now. no linking }); after(async () => { - await common.killallElectron(); - await common.stopStubSnodeServer(); + await Common.killallElectron(); + await Common.stopStubSnodeServer(); }); it('message syncing with 1 friend, 1 closed group, 1 open group', async () => { @@ -51,8 +55,8 @@ describe('Message Syncing', function() { // Linking Alice2 to Alice1 // alice2 should trigger auto FR with bob1 as it's one of her friend // and alice2 should trigger a FALLBACK_MESSAGE with bob1 as he is in a closed group with her - await common.linkApp2ToApp(Alice1, Alice2, common.TEST_PUBKEY1); - await common.timeout(25000); + await Common.linkApp2ToApp(Alice1, Alice2, Common.TEST_PUBKEY1); + await Common.timeout(25000); // validate pubkey of app2 is the set const alice2Pubkey = await Alice2.webContents.executeJavaScript( @@ -65,17 +69,17 @@ describe('Message Syncing', function() { const alice2Logs = await Alice2.client.getRenderProcessLogs(); // validate primary alice - await common.logsContains( + await Common.logsContains( alice1Logs, 'Sending closed-group-sync-send:outgoing message to OUR SECONDARY PUBKEY', 1 ); - await common.logsContains( + await Common.logsContains( alice1Logs, 'Sending open-group-sync-send:outgoing message to OUR SECONDARY PUBKEY', 1 ); - await common.logsContains( + await Common.logsContains( alice1Logs, 'Sending contact-sync-send:outgoing message to OUR SECONDARY PUBKEY', 1 @@ -86,29 +90,29 @@ describe('Message Syncing', function() { // alice2 receives group sync, contact sync and open group sync // alice2 triggers session request with closed group members and autoFR with contact sync received // once autoFR is auto-accepted, alice2 trigger contact sync - await common.logsContains( + await Common.logsContains( alice2Logs, 'Got sync group message with group id', 1 ); - await common.logsContains( + await Common.logsContains( alice2Logs, 'Received GROUP_SYNC with open groups: [chat.getsession.org]', 1 ); - await common.logsContains( + await Common.logsContains( alice2Logs, - `Sending auto-friend-request:friend-request message to ${common.TEST_PUBKEY2}`, + `Sending auto-friend-request:friend-request message to ${Common.TEST_PUBKEY2}`, 1 ); - await common.logsContains( + await Common.logsContains( alice2Logs, - `Sending session-request:friend-request message to ${common.TEST_PUBKEY2}`, + `Sending session-request:friend-request message to ${Common.TEST_PUBKEY2}`, 1 ); - await common.logsContains( + await Common.logsContains( alice2Logs, - `Sending contact-sync-send:outgoing message to OUR_PRIMARY_PUBKEY`, + 'Sending contact-sync-send:outgoing message to OUR_PRIMARY_PUBKEY', 1 ); @@ -117,25 +121,25 @@ describe('Message Syncing', function() { // bob1 receives session request from alice2 // bob1 accept auto fr by sending a bg message // once autoFR is auto-accepted, alice2 trigger contact sync - await common.logsContains( + await Common.logsContains( bob1Logs, `Received FALLBACK_MESSAGE from source: ${alice2Pubkey}`, 1 ); - await common.logsContains( + await Common.logsContains( bob1Logs, `Received AUTO_FRIEND_REQUEST from source: ${alice2Pubkey}`, 1 ); - await common.logsContains( + await Common.logsContains( bob1Logs, `Sending auto-friend-accept:onlineBroadcast message to ${alice2Pubkey}`, 1 ); // be sure only one autoFR accept was sent (even if multi device, we need to reply to that specific device only) - await common.logsContains( + await Common.logsContains( bob1Logs, - `Sending auto-friend-accept:onlineBroadcast message to`, + 'Sending auto-friend-accept:onlineBroadcast message to', 1 ); }); diff --git a/ts/test/session/integration/open_group_test.ts b/ts/test/session/integration/open_group_test.ts index a38d5f570..ecf8acf07 100644 --- a/ts/test/session/integration/open_group_test.ts +++ b/ts/test/session/integration/open_group_test.ts @@ -2,6 +2,7 @@ /* eslint-disable import/no-extraneous-dependencies */ // tslint:disable: await-promise // tslint:disable: no-implicit-dependencies +// tslint:disable: no-invalid-this import { afterEach, beforeEach, describe, it } from 'mocha'; import { Common } from './common'; @@ -10,9 +11,9 @@ import { Application } from 'spectron'; import ConversationPage from './page-objects/conversation.page'; describe('Open groups', function() { + this.timeout(60000); + this.slow(20000); let app: Application; - this.timeout(40000); - this.slow(15000); beforeEach(async () => { await Common.killallElectron(); diff --git a/ts/test/session/integration/registration_test.ts b/ts/test/session/integration/registration_test.ts index 5e62052b5..cbbcd28bb 100644 --- a/ts/test/session/integration/registration_test.ts +++ b/ts/test/session/integration/registration_test.ts @@ -3,6 +3,7 @@ /* eslint-disable import/no-extraneous-dependencies */ // tslint:disable: no-implicit-dependencies // tslint:disable: await-promise +// tslint:disable: no-invalid-this import { afterEach, beforeEach, describe, it } from 'mocha'; import { Common } from './common'; @@ -13,9 +14,9 @@ import RegistrationPage from './page-objects/registration.page'; import ConversationPage from './page-objects/conversation.page'; describe('Window Test and Login', function() { + this.timeout(60000); + this.slow(20000); let app: Application; - this.timeout(20000); - this.slow(15000); beforeEach(async () => { await Common.killallElectron(); diff --git a/integration_test/sender_keys_test.js b/ts/test/session/integration/sender_keys_test.ts similarity index 66% rename from integration_test/sender_keys_test.js rename to ts/test/session/integration/sender_keys_test.ts index 836af43c2..e194b545f 100644 --- a/integration_test/sender_keys_test.js +++ b/ts/test/session/integration/sender_keys_test.ts @@ -1,13 +1,17 @@ /* eslint-disable func-names */ /* eslint-disable import/no-extraneous-dependencies */ -const { afterEach, beforeEach, describe, it } = require('mocha'); -const common = require('./common'); +// tslint:disable: await-promise +// tslint:disable: no-implicit-dependencies +// tslint:disable: no-invalid-this -const ConversationPage = require('./page-objects/conversation.page'); +import { afterEach, beforeEach, describe, it } from 'mocha'; +import { Common } from './common'; +import { Application } from 'spectron'; +import ConversationPage from './page-objects/conversation.page'; -async function generateAndSendMessage(app) { +async function generateAndSendMessage(app: Application) { // send a message from app and validate it is received on app2 - const textMessage = common.generateSendMessageText(); + const textMessage = Common.generateSendMessageText(); await app.client .element(ConversationPage.sendMessageTextarea) .setValue(textMessage); @@ -28,8 +32,11 @@ async function generateAndSendMessage(app) { return textMessage; } -async function makeFriendsPlusMessage(app, [app2, pubkey]) { - await common.makeFriends(app, [app2, pubkey]); +async function makeFriendsPlusMessage( + app: Application, + [app2, pubkey]: [Application, string] +) { + await Common.makeFriends(app, [app2, pubkey]); // Send something back so that `app` can see our name const text = await generateAndSendMessage(app2); @@ -43,12 +50,12 @@ async function makeFriendsPlusMessage(app, [app2, pubkey]) { } async function testTwoMembers() { - const [app, app2] = await common.startAppsAsFriends(); + const [app, app2] = await Common.startAppsAsFriends(); const useSenderKeys = true; // create group and add new friend - await common.addFriendToNewClosedGroup([app, app2], useSenderKeys); + await Common.addFriendToNewClosedGroup([app, app2], useSenderKeys); const text1 = await generateAndSendMessage(app); @@ -73,39 +80,39 @@ async function testThreeMembers() { // 1. Make three clients A, B, C const app1Props = { - mnemonic: common.TEST_MNEMONIC1, - displayName: common.TEST_DISPLAY_NAME1, + mnemonic: Common.TEST_MNEMONIC1, + displayName: Common.TEST_DISPLAY_NAME1, stubSnode: true, }; const app2Props = { - mnemonic: common.TEST_MNEMONIC2, - displayName: common.TEST_DISPLAY_NAME2, + mnemonic: Common.TEST_MNEMONIC2, + displayName: Common.TEST_DISPLAY_NAME2, stubSnode: true, }; const app3Props = { - mnemonic: common.TEST_MNEMONIC3, - displayName: common.TEST_DISPLAY_NAME3, + mnemonic: Common.TEST_MNEMONIC3, + displayName: Common.TEST_DISPLAY_NAME3, stubSnode: true, }; const [app1, app2, app3] = await Promise.all([ - common.startAndStub(app1Props), - common.startAndStubN(app2Props, 2), - common.startAndStubN(app3Props, 3), + Common.startAndStub(app1Props), + Common.startAndStubN(app2Props, 2), + Common.startAndStubN(app3Props, 3), ]); // 2. Make A friends with B and C (B and C are not friends) - await makeFriendsPlusMessage(app1, [app2, common.TEST_PUBKEY2]); - await makeFriendsPlusMessage(app1, [app3, common.TEST_PUBKEY3]); + await makeFriendsPlusMessage(app1, [app2, Common.TEST_PUBKEY2]); + await makeFriendsPlusMessage(app1, [app3, Common.TEST_PUBKEY3]); const useSenderKeys = true; // 3. Add all three to the group - await common.addFriendToNewClosedGroup([app1, app2, app3], useSenderKeys); + await Common.addFriendToNewClosedGroup([app1, app2, app3], useSenderKeys); // 4. Test that all members can see the message from app1 const text1 = await generateAndSendMessage(app1); @@ -131,20 +138,16 @@ async function testThreeMembers() { } describe('senderkeys', function() { - let app; - - this.timeout(600000); - this.slow(40000); - + this.timeout(60000); + this.slow(20000); beforeEach(async () => { - await common.killallElectron(); - await common.stopStubSnodeServer(); + await Common.killallElectron(); + await Common.stopStubSnodeServer(); }); afterEach(async () => { - await common.stopApp(app); - await common.killallElectron(); - await common.stopStubSnodeServer(); + await Common.killallElectron(); + await Common.stopStubSnodeServer(); }); it('Two member group', testTwoMembers); diff --git a/integration_test/settings_test.js b/ts/test/session/integration/settings_test.ts similarity index 70% rename from integration_test/settings_test.js rename to ts/test/session/integration/settings_test.ts index cf463a411..a41221221 100644 --- a/integration_test/settings_test.js +++ b/ts/test/session/integration/settings_test.ts @@ -1,41 +1,43 @@ -/* eslint-disable prefer-destructuring */ -/* eslint-disable more/no-then */ -/* eslint-disable func-names */ /* eslint-disable import/no-extraneous-dependencies */ +// tslint:disable: await-promise +// tslint:disable: no-implicit-dependencies +// tslint:disable: no-invalid-this -const { after, before, describe, it } = require('mocha'); -const common = require('./common'); +import { after, before, describe, it } from 'mocha'; +import { Common } from './common'; +import { Application } from 'spectron'; -const SettingsPage = require('./page-objects/settings.page'); -const CommonPage = require('./page-objects/common.page'); +import SettingsPage from './page-objects/settings.page'; +import CommonPage from './page-objects/common.page'; // Generate random password +// tslint:disable-next-line: insecure-random const password = Math.random() .toString(36) .substr(2, 8); const passwordInputID = 'password-modal-input'; describe('Settings', function() { - let app; this.timeout(60000); - this.slow(15000); + this.slow(20000); + let app: Application; before(async () => { - await common.killallElectron(); - await common.stopStubSnodeServer(); + await Common.killallElectron(); + await Common.stopStubSnodeServer(); const appProps = { - mnemonic: common.TEST_MNEMONIC1, - displayName: common.TEST_DISPLAY_NAME1, + mnemonic: Common.TEST_MNEMONIC1, + displayName: Common.TEST_DISPLAY_NAME1, }; - app = await common.startAndStub(appProps); + app = await Common.startAndStub(appProps); }); after(async () => { - await common.stopApp(app); - await common.killallElectron(); - await common.stopStubSnodeServer(); + await Common.stopApp(app); + await Common.killallElectron(); + await Common.stopStubSnodeServer(); }); it('can toggle menubar', async () => { @@ -60,12 +62,12 @@ describe('Settings', function() { .element(SettingsPage.settingButtonWithText('Set Password')) .click(); - await common.setValueWrapper( + await Common.setValueWrapper( app, CommonPage.inputWithId(passwordInputID), password ); - await common.setValueWrapper( + await Common.setValueWrapper( app, CommonPage.inputWithId(`${passwordInputID}-confirm`), password @@ -79,12 +81,12 @@ describe('Settings', function() { 2000 ); - await common.closeToast(app); + await Common.closeToast(app); }); it('can remove password', async () => { // Enter password to unlock settings - await common.setValueWrapper( + await Common.setValueWrapper( app, CommonPage.inputWithId('password-lock-input'), password @@ -97,7 +99,7 @@ describe('Settings', function() { .element(SettingsPage.settingButtonWithText('Remove Password')) .click(); - await common.setValueWrapper( + await Common.setValueWrapper( app, CommonPage.inputWithId(passwordInputID), password diff --git a/integration_test/stubs/stub_app_dot_net_api.js b/ts/test/session/integration/stubs/stub_app_dot_net_api.ts similarity index 93% rename from integration_test/stubs/stub_app_dot_net_api.js rename to ts/test/session/integration/stubs/stub_app_dot_net_api.ts index 48414c6de..ca6d796cd 100644 --- a/integration_test/stubs/stub_app_dot_net_api.js +++ b/ts/test/session/integration/stubs/stub_app_dot_net_api.ts @@ -1,6 +1,6 @@ /* global clearTimeout, Buffer, TextDecoder, process */ -const OriginalAppDotNetApi = require('../../js/modules/loki_app_dot_net_api.js'); +import LokiAppDotNetServerAPI from '../../../../../js/modules/loki_app_dot_net_api'; const sampleFeed = ' FeedForAll Sample Feed'; @@ -69,9 +69,12 @@ const samplesGetMessages = { ], }; -class StubAppDotNetAPI extends OriginalAppDotNetApi { +class StubAppDotNetAPI extends LokiAppDotNetServerAPI { // make a request to the server - async serverRequest(endpoint, options = {}) { + public async serverRequest( + endpoint: string, + options: { method?: string } = {} + ) { const { method } = options; // console.warn('STUBBED ', method, ':', endpoint); diff --git a/integration_test/stubs/stub_message_api.js b/ts/test/session/integration/stubs/stub_message_api.ts similarity index 54% rename from integration_test/stubs/stub_message_api.js rename to ts/test/session/integration/stubs/stub_message_api.ts index 869fd00fc..3265709a6 100644 --- a/integration_test/stubs/stub_message_api.js +++ b/ts/test/session/integration/stubs/stub_message_api.ts @@ -1,22 +1,30 @@ -/* global clearTimeout, dcodeIO, Buffer, TextDecoder, process */ -const nodeFetch = require('node-fetch'); +import { StringUtils } from '../../../../session/utils'; + +import fetch from 'node-fetch'; class StubMessageAPI { - constructor(ourKey) { + public ourKey: string; + public baseUrl: string; + constructor(ourKey: string) { this.ourKey = ourKey; this.baseUrl = 'http://localhost:3000'; } // eslint-disable-next-line no-unused-vars - async sendMessage(pubKey, data, messageTimeStamp, ttl, options = {}) { + public async sendMessage( + pubKey: string, + data: any, + messageTimeStamp: number, + ttl: number, + options = {} + ) { // console.warn('STUBBED message api ', pubKey, ttl); const post = { method: 'POST', }; - const data64 = dcodeIO.ByteBuffer.wrap(data).toString('base64'); - - await nodeFetch( + const data64 = StringUtils.decode(data, 'base64'); + await fetch( `${ this.baseUrl }/messages?pubkey=${pubKey}×tamp=${messageTimeStamp}&data=${encodeURIComponent( diff --git a/integration_test/test_attachment b/ts/test/session/integration/test_attachment similarity index 100% rename from integration_test/test_attachment rename to ts/test/session/integration/test_attachment From 80b082178129bcfdecef9ad438d238bcea7872f3 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 3 Aug 2020 11:45:02 +1000 Subject: [PATCH 015/274] move unit tests to sub folder --- package.json | 4 ++-- .../crypto/MessageEncrypter_test.ts | 12 +++++----- .../{ => unit}/messages/ChatMessage_test.ts | 6 ++--- .../messages/ClosedGroupChatMessage_test.ts | 12 +++++----- .../messages/DeviceLinkMessage_test.ts | 8 +++---- .../messages/DeviceUnlinkMessage_test.ts | 6 ++--- .../messages/EndSessionMessage_test.ts | 6 ++--- .../messages/GroupInvitationMessage_test.ts | 6 ++--- .../messages/OpenGroupMessage_test.ts | 6 ++--- .../messages/ReceiptMessage_test.ts | 6 ++--- .../SessionEstablishedMessage_test.ts | 6 ++--- .../messages/SessionResetMessage_test.ts | 6 ++--- .../{ => unit}/messages/TypingMessage_test.ts | 11 ++++----- .../protocols/MultiDeviceProtocol_test.ts | 12 +++++----- .../protocols/SessionProtocol_test.ts | 12 +++++----- .../{ => unit}/sending/MessageQueue_test.ts | 23 ++++++++++--------- .../{ => unit}/sending/MessageSender_test.ts | 18 +++++++-------- .../sending/PendingMessageCache_test.ts | 8 +++---- .../session/{ => unit}/utils/JobQueue_test.ts | 4 ++-- .../session/{ => unit}/utils/Messages_test.ts | 10 ++++---- .../session/{ => unit}/utils/Promise_test.ts | 2 +- .../session/{ => unit}/utils/String_test.ts | 4 ++-- .../{ => unit}/utils/SyncMessage_test.ts | 10 ++++---- 23 files changed, 99 insertions(+), 99 deletions(-) rename ts/test/session/{ => unit}/crypto/MessageEncrypter_test.ts (93%) rename ts/test/session/{ => unit}/messages/ChatMessage_test.ts (96%) rename ts/test/session/{ => unit}/messages/ClosedGroupChatMessage_test.ts (89%) rename ts/test/session/{ => unit}/messages/DeviceLinkMessage_test.ts (95%) rename ts/test/session/{ => unit}/messages/DeviceUnlinkMessage_test.ts (83%) rename ts/test/session/{ => unit}/messages/EndSessionMessage_test.ts (92%) rename ts/test/session/{ => unit}/messages/GroupInvitationMessage_test.ts (87%) rename ts/test/session/{ => unit}/messages/OpenGroupMessage_test.ts (93%) rename ts/test/session/{ => unit}/messages/ReceiptMessage_test.ts (92%) rename ts/test/session/{ => unit}/messages/SessionEstablishedMessage_test.ts (83%) rename ts/test/session/{ => unit}/messages/SessionResetMessage_test.ts (92%) rename ts/test/session/{ => unit}/messages/TypingMessage_test.ts (90%) rename ts/test/session/{ => unit}/protocols/MultiDeviceProtocol_test.ts (97%) rename ts/test/session/{ => unit}/protocols/SessionProtocol_test.ts (97%) rename ts/test/session/{ => unit}/sending/MessageQueue_test.ts (94%) rename ts/test/session/{ => unit}/sending/MessageSender_test.ts (93%) rename ts/test/session/{ => unit}/sending/PendingMessageCache_test.ts (97%) rename ts/test/session/{ => unit}/utils/JobQueue_test.ts (96%) rename ts/test/session/{ => unit}/utils/Messages_test.ts (94%) rename ts/test/session/{ => unit}/utils/Promise_test.ts (98%) rename ts/test/session/{ => unit}/utils/String_test.ts (98%) rename ts/test/session/{ => unit}/utils/SyncMessage_test.ts (92%) diff --git a/package.json b/package.json index b3202f766..78a64be3e 100644 --- a/package.json +++ b/package.json @@ -31,9 +31,9 @@ "test-lib-view": "NODE_ENV=test-lib yarn run start", "test-loki-view": "NODE_ENV=test-loki yarn run start", "test-electron": "yarn grunt test", - "test-integration": "ELECTRON_DISABLE_SANDBOX=1 mocha --exit --timeout 10000 ts/test/session/integration/integration_test.js", + "test-integration": "ELECTRON_DISABLE_SANDBOX=1 mocha --exit --full-trace --timeout 10000 ts/test/session/integration/integration_test.js", "test-node": "mocha --recursive --exit test/app test/modules ts/test libloki/test/node --timeout 10000", - "test-session": "mocha --recursive --exit ts/test/session --timeout 10000", + "test-session": "mocha --recursive --exit ts/test/session/unit --full-trace --timeout 10000", "test-medium-groups": "ELECTRON_DISABLE_SANDBOX=1 mocha --exit --timeout 10000 integration_test/integration_test.js --grep 'senderkeys'", "test-groups": "ELECTRON_DISABLE_SANDBOX=1 mocha --exit --timeout 10000 integration_test/integration_test.js --grep 'Closed groups'", "eslint": "eslint --cache .", diff --git a/ts/test/session/crypto/MessageEncrypter_test.ts b/ts/test/session/unit/crypto/MessageEncrypter_test.ts similarity index 93% rename from ts/test/session/crypto/MessageEncrypter_test.ts rename to ts/test/session/unit/crypto/MessageEncrypter_test.ts index 6fcb3119e..eb85516e2 100644 --- a/ts/test/session/crypto/MessageEncrypter_test.ts +++ b/ts/test/session/unit/crypto/MessageEncrypter_test.ts @@ -1,13 +1,13 @@ import { expect } from 'chai'; import * as crypto from 'crypto'; import * as sinon from 'sinon'; -import { MessageEncrypter } from '../../../session/crypto'; -import { EncryptionType } from '../../../session/types/EncryptionType'; -import { Stubs, TestUtils } from '../../test-utils'; -import { UserUtil } from '../../../util'; -import { SignalService } from '../../../protobuf'; +import { MessageEncrypter } from '../../../../session/crypto'; +import { EncryptionType } from '../../../../session/types/EncryptionType'; +import { Stubs, TestUtils } from '../../../test-utils'; +import { UserUtil } from '../../../../util'; +import { SignalService } from '../../../../protobuf'; -import * as Ratchet from '../../../session/medium_group/ratchet'; +import * as Ratchet from '../../../../session/medium_group/ratchet'; // tslint:disable-next-line: max-func-body-length describe('MessageEncrypter', () => { diff --git a/ts/test/session/messages/ChatMessage_test.ts b/ts/test/session/unit/messages/ChatMessage_test.ts similarity index 96% rename from ts/test/session/messages/ChatMessage_test.ts rename to ts/test/session/unit/messages/ChatMessage_test.ts index 8e807f7b8..a4a365ac9 100644 --- a/ts/test/session/messages/ChatMessage_test.ts +++ b/ts/test/session/unit/messages/ChatMessage_test.ts @@ -5,11 +5,11 @@ import { ChatMessage, Preview, Quote, -} from '../../../session/messages/outgoing'; -import { SignalService } from '../../../protobuf'; +} from '../../../../session/messages/outgoing'; +import { SignalService } from '../../../../protobuf'; import { TextEncoder } from 'util'; import { toNumber } from 'lodash'; -import { Constants } from '../../../session'; +import { Constants } from '../../../../session'; describe('ChatMessage', () => { it('can create empty message with just a timestamp', () => { diff --git a/ts/test/session/messages/ClosedGroupChatMessage_test.ts b/ts/test/session/unit/messages/ClosedGroupChatMessage_test.ts similarity index 89% rename from ts/test/session/messages/ClosedGroupChatMessage_test.ts rename to ts/test/session/unit/messages/ClosedGroupChatMessage_test.ts index 4b6408aae..74692fd58 100644 --- a/ts/test/session/messages/ClosedGroupChatMessage_test.ts +++ b/ts/test/session/unit/messages/ClosedGroupChatMessage_test.ts @@ -3,13 +3,13 @@ import { expect } from 'chai'; import { ChatMessage, ClosedGroupChatMessage, -} from '../../../session/messages/outgoing'; -import { SignalService } from '../../../protobuf'; +} from '../../../../session/messages/outgoing'; +import { SignalService } from '../../../../protobuf'; import { TextEncoder } from 'util'; -import { TestUtils } from '../../test-utils'; -import { StringUtils } from '../../../session/utils'; -import { PubKey } from '../../../session/types'; -import { Constants } from '../../../session'; +import { TestUtils } from '../../../test-utils'; +import { StringUtils } from '../../../../session/utils'; +import { PubKey } from '../../../../session/types'; +import { Constants } from '../../../../session'; describe('ClosedGroupChatMessage', () => { let groupId: PubKey; diff --git a/ts/test/session/messages/DeviceLinkMessage_test.ts b/ts/test/session/unit/messages/DeviceLinkMessage_test.ts similarity index 95% rename from ts/test/session/messages/DeviceLinkMessage_test.ts rename to ts/test/session/unit/messages/DeviceLinkMessage_test.ts index 785bfa018..420d7f82f 100644 --- a/ts/test/session/messages/DeviceLinkMessage_test.ts +++ b/ts/test/session/unit/messages/DeviceLinkMessage_test.ts @@ -4,10 +4,10 @@ import { beforeEach } from 'mocha'; import { DeviceLinkGrantMessage, DeviceLinkRequestMessage, -} from '../../../session/messages/outgoing'; -import { SignalService } from '../../../protobuf'; -import { LokiProfile } from '../../../types/Message'; -import { Constants } from '../../../session'; +} from '../../../../session/messages/outgoing'; +import { SignalService } from '../../../../protobuf'; +import { LokiProfile } from '../../../../types/Message'; +import { Constants } from '../../../../session'; describe('DeviceLinkMessage', () => { let linkRequestMessage: DeviceLinkRequestMessage; diff --git a/ts/test/session/messages/DeviceUnlinkMessage_test.ts b/ts/test/session/unit/messages/DeviceUnlinkMessage_test.ts similarity index 83% rename from ts/test/session/messages/DeviceUnlinkMessage_test.ts rename to ts/test/session/unit/messages/DeviceUnlinkMessage_test.ts index a26e1ba53..af8c66f34 100644 --- a/ts/test/session/messages/DeviceUnlinkMessage_test.ts +++ b/ts/test/session/unit/messages/DeviceUnlinkMessage_test.ts @@ -1,9 +1,9 @@ import { expect } from 'chai'; import { beforeEach } from 'mocha'; -import { DeviceUnlinkMessage } from '../../../session/messages/outgoing'; -import { SignalService } from '../../../protobuf'; -import { Constants } from '../../../session'; +import { DeviceUnlinkMessage } from '../../../../session/messages/outgoing'; +import { SignalService } from '../../../../protobuf'; +import { Constants } from '../../../../session'; describe('DeviceUnlinkMessage', () => { let message: DeviceUnlinkMessage; diff --git a/ts/test/session/messages/EndSessionMessage_test.ts b/ts/test/session/unit/messages/EndSessionMessage_test.ts similarity index 92% rename from ts/test/session/messages/EndSessionMessage_test.ts rename to ts/test/session/unit/messages/EndSessionMessage_test.ts index 53e49f8df..fed88af24 100644 --- a/ts/test/session/messages/EndSessionMessage_test.ts +++ b/ts/test/session/unit/messages/EndSessionMessage_test.ts @@ -1,10 +1,10 @@ import { expect } from 'chai'; import { beforeEach } from 'mocha'; -import { EndSessionMessage } from '../../../session/messages/outgoing'; -import { SignalService } from '../../../protobuf'; +import { EndSessionMessage } from '../../../../session/messages/outgoing'; +import { SignalService } from '../../../../protobuf'; import { TextEncoder } from 'util'; -import { Constants } from '../../../session'; +import { Constants } from '../../../../session'; describe('EndSessionMessage', () => { let message: EndSessionMessage; diff --git a/ts/test/session/messages/GroupInvitationMessage_test.ts b/ts/test/session/unit/messages/GroupInvitationMessage_test.ts similarity index 87% rename from ts/test/session/messages/GroupInvitationMessage_test.ts rename to ts/test/session/unit/messages/GroupInvitationMessage_test.ts index 5dddd2ecb..72bda5fb7 100644 --- a/ts/test/session/messages/GroupInvitationMessage_test.ts +++ b/ts/test/session/unit/messages/GroupInvitationMessage_test.ts @@ -1,9 +1,9 @@ import { expect } from 'chai'; import { beforeEach } from 'mocha'; -import { GroupInvitationMessage } from '../../../session/messages/outgoing'; -import { SignalService } from '../../../protobuf'; -import { Constants } from '../../../session'; +import { GroupInvitationMessage } from '../../../../session/messages/outgoing'; +import { SignalService } from '../../../../protobuf'; +import { Constants } from '../../../../session'; describe('GroupInvitationMessage', () => { let message: GroupInvitationMessage; diff --git a/ts/test/session/messages/OpenGroupMessage_test.ts b/ts/test/session/unit/messages/OpenGroupMessage_test.ts similarity index 93% rename from ts/test/session/messages/OpenGroupMessage_test.ts rename to ts/test/session/unit/messages/OpenGroupMessage_test.ts index c3244ca75..48b6a4197 100644 --- a/ts/test/session/messages/OpenGroupMessage_test.ts +++ b/ts/test/session/unit/messages/OpenGroupMessage_test.ts @@ -3,9 +3,9 @@ import { expect } from 'chai'; import { AttachmentPointer, OpenGroupMessage, -} from '../../../session/messages/outgoing'; -import * as MIME from '../../../../ts/types/MIME'; -import { OpenGroup } from '../../../session/types'; +} from '../../../../session/messages/outgoing'; +import * as MIME from '../../../../../ts/types/MIME'; +import { OpenGroup } from '../../../../session/types'; describe('OpenGroupMessage', () => { const group = new OpenGroup({ diff --git a/ts/test/session/messages/ReceiptMessage_test.ts b/ts/test/session/unit/messages/ReceiptMessage_test.ts similarity index 92% rename from ts/test/session/messages/ReceiptMessage_test.ts rename to ts/test/session/unit/messages/ReceiptMessage_test.ts index 9643f92a9..bcc0f25ac 100644 --- a/ts/test/session/messages/ReceiptMessage_test.ts +++ b/ts/test/session/unit/messages/ReceiptMessage_test.ts @@ -4,10 +4,10 @@ import { beforeEach } from 'mocha'; import { DeliveryReceiptMessage, ReadReceiptMessage, -} from '../../../session/messages/outgoing'; -import { SignalService } from '../../../protobuf'; +} from '../../../../session/messages/outgoing'; +import { SignalService } from '../../../../protobuf'; import { toNumber } from 'lodash'; -import { Constants } from '../../../session'; +import { Constants } from '../../../../session'; describe('ReceiptMessage', () => { let readMessage: ReadReceiptMessage; diff --git a/ts/test/session/messages/SessionEstablishedMessage_test.ts b/ts/test/session/unit/messages/SessionEstablishedMessage_test.ts similarity index 83% rename from ts/test/session/messages/SessionEstablishedMessage_test.ts rename to ts/test/session/unit/messages/SessionEstablishedMessage_test.ts index 270c4364d..e84693204 100644 --- a/ts/test/session/messages/SessionEstablishedMessage_test.ts +++ b/ts/test/session/unit/messages/SessionEstablishedMessage_test.ts @@ -1,9 +1,9 @@ import { expect } from 'chai'; import { beforeEach } from 'mocha'; -import { SessionEstablishedMessage } from '../../../session/messages/outgoing'; -import { SignalService } from '../../../protobuf'; -import { Constants } from '../../../session'; +import { SessionEstablishedMessage } from '../../../../session/messages/outgoing'; +import { SignalService } from '../../../../protobuf'; +import { Constants } from '../../../../session'; describe('SessionEstablishedMessage', () => { let message: SessionEstablishedMessage; diff --git a/ts/test/session/messages/SessionResetMessage_test.ts b/ts/test/session/unit/messages/SessionResetMessage_test.ts similarity index 92% rename from ts/test/session/messages/SessionResetMessage_test.ts rename to ts/test/session/unit/messages/SessionResetMessage_test.ts index 2013e380b..9857be5db 100644 --- a/ts/test/session/messages/SessionResetMessage_test.ts +++ b/ts/test/session/unit/messages/SessionResetMessage_test.ts @@ -1,10 +1,10 @@ import { expect } from 'chai'; import { beforeEach } from 'mocha'; -import { SessionRequestMessage } from '../../../session/messages/outgoing'; -import { SignalService } from '../../../protobuf'; +import { SessionRequestMessage } from '../../../../session/messages/outgoing'; +import { SignalService } from '../../../../protobuf'; import { TextDecoder, TextEncoder } from 'util'; -import { Constants } from '../../../session'; +import { Constants } from '../../../../session'; describe('SessionRequestMessage', () => { let message: SessionRequestMessage; diff --git a/ts/test/session/messages/TypingMessage_test.ts b/ts/test/session/unit/messages/TypingMessage_test.ts similarity index 90% rename from ts/test/session/messages/TypingMessage_test.ts rename to ts/test/session/unit/messages/TypingMessage_test.ts index f89a19abc..2d3c981a6 100644 --- a/ts/test/session/messages/TypingMessage_test.ts +++ b/ts/test/session/unit/messages/TypingMessage_test.ts @@ -1,13 +1,12 @@ import { expect } from 'chai'; -import { TypingMessage } from '../../../session/messages/outgoing'; -import { SignalService } from '../../../protobuf'; -import { TextEncoder } from 'util'; +import { TypingMessage } from '../../../../session/messages/outgoing'; +import { SignalService } from '../../../../protobuf'; import Long from 'long'; import { toNumber } from 'lodash'; -import { StringUtils } from '../../../session/utils'; -import { TestUtils } from '../../test-utils'; -import { Constants } from '../../../session'; +import { StringUtils } from '../../../../session/utils'; +import { TestUtils } from '../../../test-utils'; +import { Constants } from '../../../../session'; describe('TypingMessage', () => { it('has Action.STARTED if isTyping = true', () => { diff --git a/ts/test/session/protocols/MultiDeviceProtocol_test.ts b/ts/test/session/unit/protocols/MultiDeviceProtocol_test.ts similarity index 97% rename from ts/test/session/protocols/MultiDeviceProtocol_test.ts rename to ts/test/session/unit/protocols/MultiDeviceProtocol_test.ts index e1d248121..c44544b5a 100644 --- a/ts/test/session/protocols/MultiDeviceProtocol_test.ts +++ b/ts/test/session/unit/protocols/MultiDeviceProtocol_test.ts @@ -1,11 +1,11 @@ import { expect } from 'chai'; import * as sinon from 'sinon'; -import { TestUtils } from '../../test-utils'; -import { PairingAuthorisation } from '../../../../js/modules/data'; -import { MultiDeviceProtocol } from '../../../session/protocols'; -import { PubKey } from '../../../session/types'; -import { UserUtil } from '../../../util'; -import { StringUtils } from '../../../session/utils'; +import { TestUtils } from '../../../test-utils'; +import { PairingAuthorisation } from '../../../../../js/modules/data'; +import { MultiDeviceProtocol } from '../../../../session/protocols'; +import { PubKey } from '../../../../session/types'; +import { UserUtil } from '../../../../util'; +import { StringUtils } from '../../../../session/utils'; function generateFakeAuthorisations( primary: PubKey, diff --git a/ts/test/session/protocols/SessionProtocol_test.ts b/ts/test/session/unit/protocols/SessionProtocol_test.ts similarity index 97% rename from ts/test/session/protocols/SessionProtocol_test.ts rename to ts/test/session/unit/protocols/SessionProtocol_test.ts index e836c4488..8f827530c 100644 --- a/ts/test/session/protocols/SessionProtocol_test.ts +++ b/ts/test/session/unit/protocols/SessionProtocol_test.ts @@ -1,12 +1,12 @@ import { expect } from 'chai'; -import { SessionProtocol } from '../../../session/protocols'; import * as sinon from 'sinon'; -import { Stubs, TestUtils } from '../../test-utils'; -import { UserUtil } from '../../../util'; -import { SessionRequestMessage } from '../../../session/messages/outgoing'; +import { SessionProtocol } from '../../../../session/protocols'; +import { Stubs, TestUtils } from '../../../test-utils'; +import { UserUtil } from '../../../../util'; +import { SessionRequestMessage } from '../../../../session/messages/outgoing'; import { TextEncoder } from 'util'; -import { MessageSender } from '../../../session/sending'; -import { PubKey } from '../../../session/types'; +import { MessageSender } from '../../../../session/sending'; +import { PubKey } from '../../../../session/types'; // tslint:disable-next-line: max-func-body-length describe('SessionProtocol', () => { diff --git a/ts/test/session/sending/MessageQueue_test.ts b/ts/test/session/unit/sending/MessageQueue_test.ts similarity index 94% rename from ts/test/session/sending/MessageQueue_test.ts rename to ts/test/session/unit/sending/MessageQueue_test.ts index 6b4315c03..dc48fc8b9 100644 --- a/ts/test/session/sending/MessageQueue_test.ts +++ b/ts/test/session/unit/sending/MessageQueue_test.ts @@ -1,24 +1,25 @@ import chai from 'chai'; import * as sinon from 'sinon'; import _ from 'lodash'; -import { GroupUtils, PromiseUtils } from '../../../session/utils'; -import { Stubs, TestUtils } from '../../../test/test-utils'; -import { MessageQueue } from '../../../session/sending/MessageQueue'; +import { describe } from 'mocha'; + +import { GroupUtils, PromiseUtils } from '../../../../session/utils'; +import { Stubs, TestUtils } from '../../../../test/test-utils'; +import { MessageQueue } from '../../../../session/sending/MessageQueue'; import { ClosedGroupMessage, ContentMessage, OpenGroupMessage, -} from '../../../session/messages/outgoing'; -import { PrimaryPubKey, PubKey, RawMessage } from '../../../session/types'; -import { UserUtil } from '../../../util'; -import { MessageSender } from '../../../session/sending'; +} from '../../../../session/messages/outgoing'; +import { PrimaryPubKey, PubKey, RawMessage } from '../../../../session/types'; +import { UserUtil } from '../../../../util'; +import { MessageSender } from '../../../../session/sending'; import { MultiDeviceProtocol, SessionProtocol, -} from '../../../session/protocols'; -import { PendingMessageCacheStub } from '../../test-utils/stubs'; -import { describe } from 'mocha'; -import { TestSyncMessage } from '../../test-utils/stubs/messages/TestSyncMessage'; +} from '../../../../session/protocols'; +import { PendingMessageCacheStub } from '../../../test-utils/stubs'; +import { TestSyncMessage } from '../../../test-utils/stubs/messages/TestSyncMessage'; // tslint:disable-next-line: no-require-imports no-var-requires const chaiAsPromised = require('chai-as-promised'); diff --git a/ts/test/session/sending/MessageSender_test.ts b/ts/test/session/unit/sending/MessageSender_test.ts similarity index 93% rename from ts/test/session/sending/MessageSender_test.ts rename to ts/test/session/unit/sending/MessageSender_test.ts index 1a6e33ee0..1b1411572 100644 --- a/ts/test/session/sending/MessageSender_test.ts +++ b/ts/test/session/unit/sending/MessageSender_test.ts @@ -2,15 +2,15 @@ import { expect } from 'chai'; import * as crypto from 'crypto'; import * as sinon from 'sinon'; import { toNumber } from 'lodash'; -import { MessageSender } from '../../../session/sending'; -import LokiMessageAPI from '../../../../js/modules/loki_message_api'; -import { TestUtils } from '../../test-utils'; -import { UserUtil } from '../../../util'; -import { MessageEncrypter } from '../../../session/crypto'; -import { SignalService } from '../../../protobuf'; -import { OpenGroupMessage } from '../../../session/messages/outgoing'; -import { EncryptionType } from '../../../session/types/EncryptionType'; -import { PubKey } from '../../../session/types'; +import { MessageSender } from '../../../../session/sending'; +import LokiMessageAPI from '../../../../../js/modules/loki_message_api'; +import { TestUtils } from '../../../test-utils'; +import { UserUtil } from '../../../../util'; +import { MessageEncrypter } from '../../../../session/crypto'; +import { SignalService } from '../../../../protobuf'; +import { OpenGroupMessage } from '../../../../session/messages/outgoing'; +import { EncryptionType } from '../../../../session/types/EncryptionType'; +import { PubKey } from '../../../../session/types'; describe('MessageSender', () => { const sandbox = sinon.createSandbox(); diff --git a/ts/test/session/sending/PendingMessageCache_test.ts b/ts/test/session/unit/sending/PendingMessageCache_test.ts similarity index 97% rename from ts/test/session/sending/PendingMessageCache_test.ts rename to ts/test/session/unit/sending/PendingMessageCache_test.ts index 995d424e3..63177c380 100644 --- a/ts/test/session/sending/PendingMessageCache_test.ts +++ b/ts/test/session/unit/sending/PendingMessageCache_test.ts @@ -1,10 +1,10 @@ import { expect } from 'chai'; import * as sinon from 'sinon'; import * as _ from 'lodash'; -import { MessageUtils } from '../../../session/utils'; -import { TestUtils } from '../../../test/test-utils'; -import { PendingMessageCache } from '../../../session/sending/PendingMessageCache'; -import { SessionProtocol } from '../../../session/protocols'; +import { MessageUtils } from '../../../../session/utils'; +import { TestUtils } from '../../../../test/test-utils'; +import { PendingMessageCache } from '../../../../session/sending/PendingMessageCache'; +import { SessionProtocol } from '../../../../session/protocols'; // Equivalent to Data.StorageItem interface StorageItem { diff --git a/ts/test/session/utils/JobQueue_test.ts b/ts/test/session/unit/utils/JobQueue_test.ts similarity index 96% rename from ts/test/session/utils/JobQueue_test.ts rename to ts/test/session/unit/utils/JobQueue_test.ts index 379641ae4..1abb38b87 100644 --- a/ts/test/session/utils/JobQueue_test.ts +++ b/ts/test/session/unit/utils/JobQueue_test.ts @@ -1,7 +1,7 @@ import chai from 'chai'; import { v4 as uuid } from 'uuid'; -import { JobQueue } from '../../../session/utils/JobQueue'; -import { TestUtils } from '../../test-utils'; +import { JobQueue } from '../../../../session/utils/JobQueue'; +import { TestUtils } from '../../../test-utils'; // tslint:disable-next-line: no-require-imports no-var-requires const chaiAsPromised = require('chai-as-promised'); diff --git a/ts/test/session/utils/Messages_test.ts b/ts/test/session/unit/utils/Messages_test.ts similarity index 94% rename from ts/test/session/utils/Messages_test.ts rename to ts/test/session/unit/utils/Messages_test.ts index cd8b052b9..596bbfe88 100644 --- a/ts/test/session/utils/Messages_test.ts +++ b/ts/test/session/unit/utils/Messages_test.ts @@ -1,14 +1,14 @@ import chai from 'chai'; import * as sinon from 'sinon'; import crypto from 'crypto'; -import { TestUtils } from '../../test-utils/'; -import { MessageUtils } from '../../../session/utils/'; -import { EncryptionType, PubKey } from '../../../session/types/'; -import { SessionProtocol } from '../../../session/protocols'; +import { TestUtils } from '../../../test-utils'; +import { MessageUtils } from '../../../../session/utils'; +import { EncryptionType, PubKey } from '../../../../session/types'; +import { SessionProtocol } from '../../../../session/protocols'; import { MediumGroupChatMessage, SessionRequestMessage, -} from '../../../session/messages/outgoing'; +} from '../../../../session/messages/outgoing'; // tslint:disable-next-line: no-require-imports no-var-requires const chaiAsPromised = require('chai-as-promised'); diff --git a/ts/test/session/utils/Promise_test.ts b/ts/test/session/unit/utils/Promise_test.ts similarity index 98% rename from ts/test/session/utils/Promise_test.ts rename to ts/test/session/unit/utils/Promise_test.ts index 476a2ff6a..b83e1d071 100644 --- a/ts/test/session/utils/Promise_test.ts +++ b/ts/test/session/unit/utils/Promise_test.ts @@ -1,7 +1,7 @@ import chai from 'chai'; import * as sinon from 'sinon'; -import { PromiseUtils } from '../../../session/utils/'; +import { PromiseUtils } from '../../../../session/utils'; // tslint:disable-next-line: no-require-imports no-var-requires const chaiAsPromised = require('chai-as-promised'); diff --git a/ts/test/session/utils/String_test.ts b/ts/test/session/unit/utils/String_test.ts similarity index 98% rename from ts/test/session/utils/String_test.ts rename to ts/test/session/unit/utils/String_test.ts index f9b3be86d..5e42bf731 100644 --- a/ts/test/session/utils/String_test.ts +++ b/ts/test/session/unit/utils/String_test.ts @@ -2,8 +2,8 @@ import chai from 'chai'; import ByteBuffer from 'bytebuffer'; // Can't import type as StringUtils.Encoding -import { Encoding } from '../../../session/utils/String'; -import { StringUtils } from '../../../session/utils/'; +import { Encoding } from '../../../../session/utils/String'; +import { StringUtils } from '../../../../session/utils'; // tslint:disable-next-line: no-require-imports no-var-requires const chaiAsPromised = require('chai-as-promised'); diff --git a/ts/test/session/utils/SyncMessage_test.ts b/ts/test/session/unit/utils/SyncMessage_test.ts similarity index 92% rename from ts/test/session/utils/SyncMessage_test.ts rename to ts/test/session/unit/utils/SyncMessage_test.ts index ff6f168d9..39178028e 100644 --- a/ts/test/session/utils/SyncMessage_test.ts +++ b/ts/test/session/unit/utils/SyncMessage_test.ts @@ -1,11 +1,11 @@ import chai from 'chai'; import * as sinon from 'sinon'; -import { SyncMessageUtils } from '../../../session/utils/'; -import { TestUtils } from '../../test-utils'; -import { UserUtil } from '../../../util'; -import { MultiDeviceProtocol } from '../../../session/protocols'; -import { SyncMessage } from '../../../session/messages/outgoing'; +import { SyncMessageUtils } from '../../../../session/utils'; +import { TestUtils } from '../../../test-utils'; +import { UserUtil } from '../../../../util'; +import { MultiDeviceProtocol } from '../../../../session/protocols'; +import { SyncMessage } from '../../../../session/messages/outgoing'; // tslint:disable-next-line: no-require-imports no-var-requires const chaiAsPromised = require('chai-as-promised'); From 38b9736314275526b5314a49636efb17995f5752 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 3 Aug 2020 11:57:20 +1000 Subject: [PATCH 016/274] skip linking test integration test --- ts/test/session/integration/link_device_test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ts/test/session/integration/link_device_test.ts b/ts/test/session/integration/link_device_test.ts index b1d1d04ac..16a484c59 100644 --- a/ts/test/session/integration/link_device_test.ts +++ b/ts/test/session/integration/link_device_test.ts @@ -37,17 +37,17 @@ describe('Link Device', function() { await Common.killallElectron(); }); - it('linkDevice: link two desktop devices', async () => { + xit('linkDevice: link two desktop devices', async () => { await Common.linkApp2ToApp(app, app2, Common.TEST_PUBKEY1); }); - it('linkDevice: unlink two devices', async () => { + xit('linkDevice: unlink two devices', async () => { await Common.linkApp2ToApp(app, app2, Common.TEST_PUBKEY1); await Common.timeout(1000); await Common.triggerUnlinkApp2FromApp(app, app2); }); - it('linkDevice:sync no groups, closed group, nor open groups', async () => { + xit('linkDevice:sync no groups, closed group, nor open groups', async () => { await TestUtils.spyMessageQueueSend(app); await TestUtils.spyMessageQueueSend(app2); From 878619a0bcdb4b922865903293e7132e24c34dd3 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 3 Aug 2020 15:58:52 +1000 Subject: [PATCH 017/274] move integration tests to _itest.ts suffix --- package.json | 4 ++-- ..._contacts_test.ts => add_contacts_itest.ts} | 0 ...sed_group_test.ts => closed_group_itest.ts} | 0 ...ntegration_test.ts => integration_itest.ts} | 18 +++++++++--------- ...ink_device_test.ts => link_device_itest.ts} | 0 ...ions_test.ts => message_functions_itest.ts} | 0 ...sage_sync_test.ts => message_sync_itest.ts} | 0 ...{open_group_test.ts => open_group_itest.ts} | 0 ...istration_test.ts => registration_itest.ts} | 0 ...ender_keys_test.ts => sender_keys_itest.ts} | 0 .../{settings_test.ts => settings_itest.ts} | 0 11 files changed, 11 insertions(+), 11 deletions(-) rename ts/test/session/integration/{add_contacts_test.ts => add_contacts_itest.ts} (100%) rename ts/test/session/integration/{closed_group_test.ts => closed_group_itest.ts} (100%) rename ts/test/session/integration/{integration_test.ts => integration_itest.ts} (63%) rename ts/test/session/integration/{link_device_test.ts => link_device_itest.ts} (100%) rename ts/test/session/integration/{message_functions_test.ts => message_functions_itest.ts} (100%) rename ts/test/session/integration/{message_sync_test.ts => message_sync_itest.ts} (100%) rename ts/test/session/integration/{open_group_test.ts => open_group_itest.ts} (100%) rename ts/test/session/integration/{registration_test.ts => registration_itest.ts} (100%) rename ts/test/session/integration/{sender_keys_test.ts => sender_keys_itest.ts} (100%) rename ts/test/session/integration/{settings_test.ts => settings_itest.ts} (100%) diff --git a/package.json b/package.json index 16c9f6ad4..95aa400ff 100644 --- a/package.json +++ b/package.json @@ -31,8 +31,8 @@ "test-lib-view": "NODE_ENV=test-lib yarn run start", "test-loki-view": "NODE_ENV=test-loki yarn run start", "test-electron": "yarn grunt test", - "test-integration": "ELECTRON_DISABLE_SANDBOX=1 mocha --exit --full-trace --timeout 10000 ts/test/session/integration/integration_test.js", - "test-node": "mocha --recursive --exit test/app test/modules ts/test libloki/test/node --timeout 10000", + "test-integration": "ELECTRON_DISABLE_SANDBOX=1 mocha --exit --full-trace --timeout 10000 ts/test/session/integration/integration_itest.js", + "test-node": "mocha --recursive --exit --timeout 10000 test/app test/modules \"./ts/test/**/*_test.js\" libloki/test/node ", "test-session": "mocha --recursive --exit ts/test/session/unit --full-trace --timeout 10000", "test-medium-groups": "ELECTRON_DISABLE_SANDBOX=1 mocha --exit --timeout 10000 integration_test/integration_test.js --grep 'senderkeys'", "test-groups": "ELECTRON_DISABLE_SANDBOX=1 mocha --exit --timeout 10000 integration_test/integration_test.js --grep 'Closed groups'", diff --git a/ts/test/session/integration/add_contacts_test.ts b/ts/test/session/integration/add_contacts_itest.ts similarity index 100% rename from ts/test/session/integration/add_contacts_test.ts rename to ts/test/session/integration/add_contacts_itest.ts diff --git a/ts/test/session/integration/closed_group_test.ts b/ts/test/session/integration/closed_group_itest.ts similarity index 100% rename from ts/test/session/integration/closed_group_test.ts rename to ts/test/session/integration/closed_group_itest.ts diff --git a/ts/test/session/integration/integration_test.ts b/ts/test/session/integration/integration_itest.ts similarity index 63% rename from ts/test/session/integration/integration_test.ts rename to ts/test/session/integration/integration_itest.ts index cde34e6f3..aa37c6577 100644 --- a/ts/test/session/integration/integration_test.ts +++ b/ts/test/session/integration/integration_itest.ts @@ -2,15 +2,15 @@ import { Common } from './common'; // tslint:disable: no-import-side-effect no-invalid-this await-promise -import './registration_test'; -import './open_group_test'; -import './add_contacts_test'; -import './link_device_test'; -// import './closed_group_test'; -// import './message_functions_test'; -// import './settings_test'; -// import'./message_sync_test'; -// import './sender_keys_test'; +import './registration_itest'; +import './open_group_itest'; +import './add_contacts_itest'; +import './link_device_itest'; +// import './closed_group_itest'; +// import './message_functions_itest'; +// import './settings_itest'; +// import'./message_sync_itest'; +// import './sender_keys_itest'; before(async function() { // start the app once before all tests to get the platform-dependent diff --git a/ts/test/session/integration/link_device_test.ts b/ts/test/session/integration/link_device_itest.ts similarity index 100% rename from ts/test/session/integration/link_device_test.ts rename to ts/test/session/integration/link_device_itest.ts diff --git a/ts/test/session/integration/message_functions_test.ts b/ts/test/session/integration/message_functions_itest.ts similarity index 100% rename from ts/test/session/integration/message_functions_test.ts rename to ts/test/session/integration/message_functions_itest.ts diff --git a/ts/test/session/integration/message_sync_test.ts b/ts/test/session/integration/message_sync_itest.ts similarity index 100% rename from ts/test/session/integration/message_sync_test.ts rename to ts/test/session/integration/message_sync_itest.ts diff --git a/ts/test/session/integration/open_group_test.ts b/ts/test/session/integration/open_group_itest.ts similarity index 100% rename from ts/test/session/integration/open_group_test.ts rename to ts/test/session/integration/open_group_itest.ts diff --git a/ts/test/session/integration/registration_test.ts b/ts/test/session/integration/registration_itest.ts similarity index 100% rename from ts/test/session/integration/registration_test.ts rename to ts/test/session/integration/registration_itest.ts diff --git a/ts/test/session/integration/sender_keys_test.ts b/ts/test/session/integration/sender_keys_itest.ts similarity index 100% rename from ts/test/session/integration/sender_keys_test.ts rename to ts/test/session/integration/sender_keys_itest.ts diff --git a/ts/test/session/integration/settings_test.ts b/ts/test/session/integration/settings_itest.ts similarity index 100% rename from ts/test/session/integration/settings_test.ts rename to ts/test/session/integration/settings_itest.ts From 31f84aaa9971bc89ac7a7c984297ba585dd002ce Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 3 Aug 2020 13:41:30 +1000 Subject: [PATCH 018/274] use cache for gh pull actions to speed them up --- .github/workflows/pull-request.yml | 15 ++++++++++----- package.json | 1 + 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 4db844656..f49f3730a 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -47,11 +47,16 @@ jobs: npm config set python python2.7 npm config set msvs_version 2015 - - name: Install yarn - run: npm install yarn --no-save + - uses: actions/cache@v2 + id: yarn-cache + with: + path: '**/node_modules' + key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }} - - name: Install Dependencies - run: yarn install --frozen-lockfile + - name: Install Dependencies #skipped if step before set variable to true + if: | + steps.yarn-cache.outputs.cache-hit != 'true' + run: yarn install --frozen-lockfile --prefer-offline - name: Generate and concat files run: yarn generate @@ -59,7 +64,7 @@ jobs: - name: Lint Files if: runner.os != 'Windows' run: | - yarn format-full + yarn format-full-check yarn eslint yarn tslint diff --git a/package.json b/package.json index 95aa400ff..a2dfef599 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "tslint": "tslint --format stylish --project .", "format": "prettier --list-different --write `git ls-files --modified *.{css,js,json,scss,ts,tsx}` `git ls-files --modified ./**/*.{css,js,json,scss,ts,tsx}`", "format-full": "prettier --list-different --write \"*.{css,js,json,scss,ts,tsx}\" \"./**/*.{css,js,json,scss,ts,tsx}\"", + "format-full-check": "prettier --check \"*.{css,js,json,scss,ts,tsx}\" \"./**/*.{css,js,json,scss,ts,tsx}\"", "transpile": "tsc --incremental", "clean-transpile": "rimraf ts/**/*.js && rimraf ts/*.js", "pow-metrics": "node metrics_app.js localhost 9000", From 10ea59246fa248371753e31d8af8b3f07be789c8 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 4 Aug 2020 10:00:55 +1000 Subject: [PATCH 019/274] add back closed group tests --- ts/test/session/integration/common.ts | 36 ++----------------- .../session/integration/integration_itest.ts | 2 +- .../page-objects/conversation.page.ts | 18 ++-------- 3 files changed, 6 insertions(+), 50 deletions(-) diff --git a/ts/test/session/integration/common.ts b/ts/test/session/integration/common.ts index e7a71b9ad..3edd13594 100644 --- a/ts/test/session/integration/common.ts +++ b/ts/test/session/integration/common.ts @@ -276,7 +276,6 @@ export class Common { /** add each other as friends */ const textMessage = Common.generateSendMessageText(); - await app1.client.element(ConversationPage.contactsButtonSection).click(); await app1.client.element(ConversationPage.addContactButton).click(); @@ -287,50 +286,21 @@ export class Common { ); await app1.client.element(ConversationPage.nextButton).click(); await app1.client.waitForExist( - ConversationPage.sendFriendRequestTextarea, + ConversationPage.sendMessageTextareaAndMessage, 1000 ); // send a text message to that user (will be a friend request) await Common.setValueWrapper( app1, - ConversationPage.sendFriendRequestTextarea, + ConversationPage.sendMessageTextareaAndMessage, textMessage ); await app1.client.keys('Enter'); await app1.client.waitForExist( - ConversationPage.existingFriendRequestText(textMessage), + ConversationPage.existingSendMessageText(textMessage), 1000 ); - - // wait for left notification Friend Request count to go to 1 and click it - await app2.client.waitForExist( - ConversationPage.oneNotificationFriendRequestLeft, - 5000 - ); - await app2.client - .element(ConversationPage.oneNotificationFriendRequestLeft) - .click(); - // open the dropdown from the top friend request count - await app2.client.isExisting( - ConversationPage.oneNotificationFriendRequestTop - ).should.eventually.be.true; - await app2.client - .element(ConversationPage.oneNotificationFriendRequestTop) - .click(); - - // accept the friend request and validate that on both side the "accepted FR" message is shown - await app2.client - .element(ConversationPage.acceptFriendRequestButton) - .click(); - await app2.client.waitForExist( - ConversationPage.acceptedFriendRequestMessage, - 1000 - ); - await app1.client.waitForExist( - ConversationPage.acceptedFriendRequestMessage, - 5000 - ); } public static async startAppsAsFriends() { diff --git a/ts/test/session/integration/integration_itest.ts b/ts/test/session/integration/integration_itest.ts index aa37c6577..427988278 100644 --- a/ts/test/session/integration/integration_itest.ts +++ b/ts/test/session/integration/integration_itest.ts @@ -6,7 +6,7 @@ import './registration_itest'; import './open_group_itest'; import './add_contacts_itest'; import './link_device_itest'; -// import './closed_group_itest'; +import './closed_group_itest'; // import './message_functions_itest'; // import './settings_itest'; // import'./message_sync_itest'; diff --git a/ts/test/session/integration/page-objects/conversation.page.ts b/ts/test/session/integration/page-objects/conversation.page.ts index 07c891e71..91408f8fc 100644 --- a/ts/test/session/integration/page-objects/conversation.page.ts +++ b/ts/test/session/integration/page-objects/conversation.page.ts @@ -5,13 +5,11 @@ export = { sessionLoader: commonPage.divWithClass('session-loader'), leftPaneOverlay: commonPage.divWithClass('module-left-pane-overlay'), sendMessageTextarea: commonPage.textAreaWithClass('send-message'), - sendFriendRequestTextarea: commonPage.textAreaWithPlaceholder( - 'Send your first message' + sendMessageTextareaAndMessage: commonPage.textAreaWithPlaceholder( + 'Type your message' ), existingSendMessageText: (textMessage: string) => `//*[contains(@class, "module-message__text--outgoing") and .//span[contains(@class, "text-selectable")][contains(string(), '${textMessage}')]]`, - existingFriendRequestText: (textMessage: string) => - `//*[contains(@class, "module-message-friend-request__container") and .//span[contains(@class, "text-selectable")][contains(string(), '${textMessage}')]]`, existingReceivedMessageText: (textMessage: string) => `//*[contains(@class, "module-message__text--incoming") and .//span[contains(@class, "text-selectable")][contains(string(), '${textMessage}')]]`, @@ -92,18 +90,6 @@ export = { addContactButton: commonPage.divRoleButtonWithText('Add Contact'), sessionIDInput: commonPage.textAreaWithPlaceholder('Enter a Session ID'), nextButton: commonPage.divRoleButtonWithText('Next'), - oneNotificationFriendRequestLeft: - '//*[contains(@class,"session-icon-button") and .//*[contains(@class, "users")] and .//*[contains(@class, "notification-count") and contains(string(), "1")] ]', - oneNotificationFriendRequestTop: - '//*[contains(@class,"notification-count hover") and contains(string(), "1")]', - friendRequestFromUser: (displayName: string, pubkey: string) => - `//*[contains(@class,"module-left-pane__list-popup") and .//*[contains(@class, "module-conversation__user") and .//*[contains(string(), "${displayName}")] and .//*[contains(string(), "(...${pubkey.substring( - 60 - )})")]]]`, - acceptFriendRequestButton: - '//*[contains(@role, "button")][contains(@class, "session-button")][contains(string(), "Accept")]', - acceptedFriendRequestMessage: - '//*[contains(@class, "module-friend-request__title")][contains(string(), "Friend request accepted")]', descriptionDeleteAccount: commonPage.spanWithClassAndText( 'session-confirm-main-message', From c41a0648806f32828925995c58f6be105de51dc8 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 5 Aug 2020 10:41:50 +1000 Subject: [PATCH 020/274] add tool to find unused localized string and fix our current en locale --- _locales/en/messages.json | 441 +----------------- js/views/conversation_view.js | 14 +- tools/unusedLocalizedString.py | 55 +++ .../session/SessionPasswordModal.tsx | 38 +- 4 files changed, 98 insertions(+), 450 deletions(-) create mode 100755 tools/unusedLocalizedString.py diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 4aaad9806..3c62eec8a 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -39,10 +39,6 @@ "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" @@ -151,10 +147,6 @@ "message": "No Suggestions", "description": "Shown in the context menu for a misspelled word to indicate that there are no suggestions to replace the misspelled word" }, - "connectingLoad": { - "message": "Connecting To Server", - "description": "Message shown on the as a loading screen while we are connecting to something" - }, "loading": { "message": "Loading...", "description": "Message shown on the loading screen before we've loaded any messages" @@ -173,30 +165,10 @@ } } }, - "archivedConversations": { - "message": "Archived Conversations", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archive Conversation", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Move Conversation to Inbox", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Choose folder", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Choose file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Load your data", "description": "Header shown on the first screen in the data import process" @@ -241,27 +213,6 @@ "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": "your selected location", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Upgrading database. This may take some time...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Loading messages. $count$ so far...", - "description": "Message shown on the loading screen when we're catching up on the backlog of messages", - "placeholders": { - "count": { - "content": "$1", - "example": "5" - } - } - }, - "capsLockOn": { - "message": "Caps lock is on." - }, "me": { "message": "Me", "description": "The label for yourself when shown in a group member list" @@ -278,18 +229,6 @@ "message": "You were removed from the group", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Scroll to bottom of conversation", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "New message below", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "New messages below", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 Unread Message", "description": "Text for unread message separator, just one message" @@ -434,10 +373,6 @@ "submit": { "message": "Submit" }, - "acceptNewKey": { - "message": "Accept", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Mark as verified" }, @@ -471,9 +406,6 @@ "message": "New safety number", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Your safety number with this contact has changed. This could either mean that someone is trying to intercept your communication, or this contact simply reinstalled Session. You may wish to verify the new safety number below." - }, "incomingError": { "message": "Error handling incoming message" }, @@ -509,18 +441,6 @@ "message": "This Month", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Unsupported attachment type. Click to save.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Click to save", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Unnamed File", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Voice Message", "description": "Name for a voice message attachment" @@ -581,9 +501,6 @@ "unableToLoadAttachment": { "message": "Unable to load attachment." }, - "connect": { - "message": "Connect" - }, "disconnected": { "message": "Disconnected", "description": "Displayed when the desktop client cannot connect to the server." @@ -645,10 +562,6 @@ "message": "Show", "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" @@ -770,16 +683,6 @@ "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 Session to access your microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -788,10 +691,6 @@ "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" @@ -812,10 +711,6 @@ "message": "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.", "description": "Shown if a general error happened while trying to install update package" }, - "readOnlyVolume": { - "message": "Session Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Session.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "OK" }, @@ -831,33 +726,12 @@ "copy": { "message": "Copy" }, - "skip": { - "message": "Skip" - }, "close": { "message": "Close" }, "continue": { "message": "Continue" }, - "noThankyou": { - "message": "No, thank you" - }, - "noMessagesTitle": { - "message": "You don't have any messages, yet." - }, - "noMessagesSubtitle": { - "message": "Would you like to join Session's open group?" - }, - "pairNewDevice": { - "message": "Pair New Device" - }, - "devicePairingAccepted": { - "message": "Device Linking Accepted" - }, - "devicePairingReceived": { - "message": "Device Linking Received" - }, "devicePairingRequestReceivedLimitTitle": { "message": "Device linking limit reached." }, @@ -876,9 +750,6 @@ "pairNewDevicePrompt": { "message": "Scan the QR Code on your other device" }, - "pairedDevices": { - "message": "Linked Devices" - }, "noPairedDevices": { "message": "No linked devices" }, @@ -900,9 +771,6 @@ "showPairingWordsTitle": { "message": "Linking Secret Words" }, - "secretPrompt": { - "message": "Here is your secret" - }, "confirmUnpairingTitle": { "message": "Please confirm you want to unlink the following device:" }, @@ -929,25 +797,15 @@ "confirm": { "message": "Confirm" }, - "failedToSend": { - "message": "Failed to send to some recipients. Check your network connection." - }, "error": { "message": "Error" }, - "messageDetail": { - "message": "Message Detail" - }, "delete": { "message": "Delete" }, "unsend": { "message": "Unsend" }, - "forwardMessage": { - "message": "Forward", - "description": "Text of Forward Message button" - }, "deletePublicWarning": { "message": "Are you sure? Clicking 'unsend' will permanently remove this message for everyone in this channel." }, @@ -1006,10 +864,6 @@ "showSafetyNumber": { "message": "View Safety Number" }, - "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": "If you wish to verify the security of your end-to-end encryption with $name$, compare the numbers above with the numbers on their device.", "placeholders": { @@ -1139,10 +993,6 @@ "message": "Save", "descripton": "Used as a 'commit changes' button in the Caption Editor for outgoing image attachments" }, - "fileIconAlt": { - "message": "File icon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -1153,14 +1003,6 @@ } } }, - "installWelcome": { - "message": "Welcome to Session", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privacy is possible. Signal makes it easy.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, "linkYourPhone": { "message": "Link your phone to Session", "description": "Shown on the front page when the application first starst, above the QR code" @@ -1181,10 +1023,6 @@ "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" @@ -1204,14 +1042,6 @@ "installTooManyDevices": { "message": "Sorry, you have too many devices linked already. Try removing some." }, - "settings": { - "message": "Settings", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Theme", - "description": "Header for theme settings" - }, "permissions": { "message": "Permissions", "description": "Header for permissions section of settings" @@ -1262,26 +1092,10 @@ "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 register with your seed 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": "Notifications", "description": "Header for notification settings" @@ -1326,10 +1140,6 @@ "message": "Time to live (how long the recipient will have to collect their messages)", "description": "Description of the time to live setting" }, - "messageTTLSettingWarning": { - "message": "Warning! Lowering the TTL could result in messages being lost if the recipient doesn't collect them in time!", - "description": "Warning for the time to live setting" - }, "zoomFactorSettingTitle": { "message": "Zoom Factor", "description": "Title of the Zoom Factor setting" @@ -1378,14 +1188,6 @@ "message": "Send failed", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Details", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Hide details", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Learn more about verifying safety numbers", "description": "Text that links to a support article on verifying safety numbers" @@ -1406,34 +1208,10 @@ "message": "Media message", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Number is not registered", - "description": "Error message displayed when sending to an unregistered user." - }, "sync": { "message": "Contacts", "description": "Label for contact and group sync settings" }, - "syncExplanation": { - "message": "Import all Signal groups and contacts from your mobile device.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Last import at", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Import now", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importing...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Import failed. Make sure your computer and your phone are connected to the internet.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "now", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1446,50 +1224,6 @@ "message": "1 hour", "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": "now", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1676,10 +1410,6 @@ } } }, - "audioNotificationDescription": { - "message": "Play audio notification", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Safety Number has changed", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1708,14 +1438,6 @@ } } }, - "themeLight": { - "message": "Light", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Dark", - "description": "Label text for dark theme" - }, "themeToggleTitle": { "message": "Light Mode" }, @@ -1738,10 +1460,6 @@ "message": "Start New Conversation", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Enter a phone number to add a contact.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Invalid public key", "description": "When a person inputs a public key that is invalid" @@ -1866,18 +1584,6 @@ "unblockUser": { "message": "Unblock User" }, - "settingsUnblockHeader": { - "message": "Blocked Users", - "description": "Shown in the settings page as the heading for the blocked user settings" - }, - "editProfileTitle": { - "message": "Change your own display name", - "description": "The title shown when user edits their own profile" - }, - "editProfileDisplayNameWarning": { - "message": "Note: Your display name will be visible to your contacts", - "description": "Shown to the user as a warning about setting display name" - }, "copyPublicKey": { "message": "Copy Public Key", "description": "Button action that the user can click to copy their public keys" @@ -1901,10 +1607,6 @@ "copyChatId": { "message": "Copy Chat ID" }, - "updateGroup": { - "message": "Update Group", - "description": "Button action that the user can click to rename the group or add a new member" - }, "leaveGroup": { "message": "Leave Group", "description": "Button action that the user can click to leave the group" @@ -1921,10 +1623,6 @@ "message": "Leave this Closed Group?", "description": "Confirmation dialog text that tells the user what will happen if they leave the closed group." }, - "leaveGroupDialogTitle": { - "message": "Are you sure you want to leave this group?", - "description": "Title shown to the user to confirm they want to leave the group" - }, "noContactsForGroup": { "message": "You don't have any contacts to start a group with." }, @@ -1948,10 +1646,6 @@ "message": "Message text copied", "description": "A toast message telling the user that the message text was copied" }, - "editProfile": { - "message": "Edit Profile", - "description": "Button action that the user can click to edit their profile" - }, "editGroupNameOrPicture": { "message": "Edit group name or picture", "description": "Button action that the user can click to edit a group name (open)" @@ -1960,10 +1654,6 @@ "message": "Edit group name", "description": "Button action that the user can click to edit a group name (closed)" }, - "createGroupDialogTitle": { - "message": "Creating a Closed Group", - "description": "Title for the dialog box used to create a new private group" - }, "updateGroupDialogTitle": { "message": "Updating a Closed Group", "description": "Title for the dialog box used to update an existing private group" @@ -2036,34 +1726,10 @@ "message": "This is your unique public QR Code.
Other users may scan this in order to begin a conversation with you.", "description": "Description given to QRCode modal" }, - "showQRCode": { - "message": "Show QR Code", - "description": "Button action that the user can click to view their QR code" - }, - "showAddServer": { - "message": "Add Public Server", - "description": "Button action that the user can click to connect to a new public server" - }, - "serverUrl": { - "message": "Server URL", - "description": "Placeholder for server URL input" - }, "noServerURL": { "message": "Please enter a server URL", "description": "Error message when no server url entered" }, - "addServerDialogTitle": { - "message": "Connect To New Public Server", - "description": "Title for the dialog box used to connect to a new public server" - }, - "createPrivateGroup": { - "message": "Create Private Group", - "description": "Button action that the user can click to show a dialog for creating a new private group chat" - }, - "seedViewTitle": { - "message": "Please save the seed below in a safe location. They can be used to restore your account if you lose access or migrate to a new device.", - "description": "The title shown when the user views their seeds" - }, "copiedMnemonic": { "message": "Recovery phrase copied successfully", "description": "A toast message telling the user that the mnemonic seed was copied" @@ -2079,10 +1745,6 @@ "unlock": { "message": "Unlock" }, - "resetDatabase": { - "message": "Reset Database", - "description": "A button action that the user can click to reset the database" - }, "password": { "message": "Password", "description": "Placeholder for password input" @@ -2154,26 +1816,11 @@ "message": "Connecting to server..." }, "connectToServerSuccess": { - "message": "Successfully connected to open group" + "message": "Successfully connected to open group" }, "setPasswordFail": { "message": "Failed to set password" }, - "removePasswordFail": { - "message": "Failed to remove password" - }, - "changePasswordFail": { - "message": "Failed to change password" - }, - "setPasswordSuccess": { - "message": "Password set" - }, - "removePasswordSuccess": { - "message": "Password removed" - }, - "changePasswordSuccess": { - "message": "Password changed" - }, "passwordLengthError": { "message": "Password must be between 6 and 50 characters long", "description": "Error string shown to the user when password doesn't meet length criteria" @@ -2199,18 +1846,10 @@ "message": "Invalid Session ID", "description": "Error string shown when user types an invalid pubkey hex string" }, - "invalidLnsFormat": { - "message": "Invalid LNS Name", - "description": "Error string shown when user types an invalid LNS name" - }, "invalidPubkeyFormat": { "message": "Invalid Pubkey Format", "description": "Error string shown when user types an invalid pubkey format" }, - "attemptedConnectionTimeout": { - "message": "Connection to open group timed out", - "description": "Shown in toast when attempted connection to OpenGroup times out" - }, "lnsMappingNotFound": { "message": "There is no LNS mapping associated with this name", "description": "Shown in toast if user enters an unknown LNS name" @@ -2222,42 +1861,24 @@ "lnsTooFewNodes": { "message": "Not enough nodes currently active for LNS lookup" }, - "conversationsTab": { - "message": "Conversations", - "description": "conversation tab title" - }, "emptyGroupNameError": { "message": "Group Name cannot be empty", "description": "Error message displayed on empty group name" }, - "emptyProfileNameError": { - "message": "Profile name cannot be empty", - "description": "Error message displayed on empty profile name" - }, "nonAdminDeleteMember": { "message": "Only group admin can remove members!" }, - "editProfileDialogTitle": { - "message": "Editing Profile" - }, "editProfileModalTitle": { "message": "Profile", "description": "Title for the Edit Profile modal" }, - - "profileName": { - "message": "Profile Name" - }, "groupNamePlaceholder": { "message": "Group Name" }, "inviteContacts": { "message": "Invite Contacts" }, - "manageModerators": { - "message": "Manage Moderators" - }, "addModerators": { "message": "Add Moderators" }, @@ -2361,9 +1982,6 @@ "linkDevice": { "message": "Link Device" }, - "restoreSessionID": { - "message": "Restore Session ID" - }, "restoreUsingSeed": { "message": "Restore From Recovery Phrase" }, @@ -2382,24 +2000,12 @@ "welcomeToYourSession": { "message": "Welcome to your Session" }, - "completeSignUp": { - "message": "Complete Sign Up" - }, - "compose": { - "message": "Compose" - }, "newSession": { "message": "New Session" }, - "freindRequestsButton": { - "message": "Requests" - }, "searchForAKeyPhrase": { "message": "Search for a key phrase or contact" }, - "enterRecipient": { - "message": "Enter Recipient" - }, "enterSessionID": { "message": "Enter Session ID" }, @@ -2415,9 +2021,6 @@ "message": { "message": "Message" }, - "lists": { - "message": "Lists" - }, "edit": { "message": "Edit" }, @@ -2430,48 +2033,21 @@ "yourPublicKey": { "message": "Your Session ID" }, - "accept": { - "message": "Accept" - }, - "decline": { - "message": "Decline" - }, "appearanceSettingsTitle": { "message": "Appearance" }, - "appearanceSettingsDescription": { - "message": "Appearance and interface options" - }, - "accountSettingsTitle": { - "message": "Account" - }, - "accountSettingsDescription": { - "message": "Manage your account" - }, "permissionSettingsTitle": { "message": "Permissions" }, - "permissionSettingsDescription": { - "message": "Set Session's permissions" - }, "privacySettingsTitle": { "message": "Privacy" }, - "privacySettingsDescription": { - "message": "Manage your privacy settings" - }, "notificationSettingsTitle": { "message": "Notifications" }, - "notificationSettingsDescription": { - "message": "Configure notification options" - }, "devicesSettingsTitle": { "message": "Devices" }, - "devicesSettingsDescription": { - "message": "Manage your linked devices" - }, "mnemonicEmpty": { "message": "Seed is mandatory" }, @@ -2487,12 +2063,6 @@ } } }, - "channels": { - "message": "Channels" - }, - "groups": { - "message": "Groups" - }, "addChannel": { "message": "Join Open Group" }, @@ -2529,27 +2099,18 @@ "joinChannel": { "message": "Join Open Group" }, - "joinPublicChat": { - "message": "Join open group" - }, "next": { "message": "Next" }, "description": { "message": "Description" }, - "filterReceivedRequests": { - "message": "Filter received requests" - }, "secretWords": { "message": "Secret words" }, "pairingDevice": { "message": "Linking Device" }, - "gotPairingRequest": { - "message": "Linking request received" - }, "devicePairedSuccessfully": { "message": "Device linked successfully" }, diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index 8982e52cd..f75cc55a8 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -1372,14 +1372,14 @@ } // If removable from server, we "Unsend" - otherwise "Delete" - const pluralSuffix = multiple ? 's' : ''; - const title = i18n( - isPublic - ? `unsendMessage${pluralSuffix}` - : `deleteMessage${pluralSuffix}` - ); + let title; + if (isPublic) { + title = multiple ? i18n('unsendMessages') : i18n('unsendMessage'); + } else { + title = multiple ? i18n('deleteMessages') : i18n('deleteMessage'); + } - const okText = i18n(isServerDeletable ? 'unsend' : 'delete'); + const okText = isServerDeletable ? i18n('unsend') : i18n('delete'); window.confirmationDialog({ title, diff --git a/tools/unusedLocalizedString.py b/tools/unusedLocalizedString.py new file mode 100755 index 000000000..32d1dd2b3 --- /dev/null +++ b/tools/unusedLocalizedString.py @@ -0,0 +1,55 @@ +#!/bin/python + + +# usage : ./tools/unusedLocalizedString.py |grep False + +import re +import os +from glob import glob + +# get all files matching .js, .ts and .tsx in ./ +dir_path = './' +files = [y for x in os.walk(dir_path) for y in glob(os.path.join(x[0], '*.js'))] +files += [y for x in os.walk(dir_path) for y in glob(os.path.join(x[0], '*.ts'))] +files += [y for x in os.walk(dir_path) for y in glob(os.path.join(x[0], '*.tsx'))] + +# exclude node_modules and session-file-server directories +filtered_files = [f for f in files if "node_modules" not in f and "session-file-server" not in f] + +# search for this pattern in _locales/en/messages.json: it is a defined localized string +patternLocalizedString = re.compile("^ \".*\"\: {") + +localizedStringToSearch = 0 +localizedStringNotFound = 0 +for i, line in enumerate(open('_locales/en/messages.json')): + for match in re.finditer(patternLocalizedString, line): + localizedStringToSearch = localizedStringToSearch + 1 + found = match.group() + # extract the key only from the line + foundAline = found[3:-4] + # print 'Found on line %s: \'%s\'' % (i + 1, foundAline) + + # generate a new regex to be searched for to find its usage in the code + # currently, it matches + # * i18n('key') with or without line return + # * messages.key (used in some places) + # * and also 'key'. (some false positive might be present here) + searchedLine = "i18n\([\r\n]?\s*'{0}'|messages.{0}|'{0}'".format(foundAline) + + + found = False + # skip timerOptions string constructed dynamically + if 'timerOption_' in foundAline: + found = True + else: + for file_path in filtered_files: + fileContent = open(file_path, 'r').read() + if len(re.findall(searchedLine,fileContent,re.MULTILINE)) > 0: + found = True + break + if not found: + localizedStringNotFound = localizedStringNotFound + 1 + print "i18n for '{0}': found:{1}:".format(foundAline, found) + +print "number of localized string found in messages.json:{0}".format(localizedStringToSearch) +print "number of localized string NOT found:{0}".format(localizedStringNotFound) \ No newline at end of file diff --git a/ts/components/session/SessionPasswordModal.tsx b/ts/components/session/SessionPasswordModal.tsx index a00f56ab8..9e9d4b19f 100644 --- a/ts/components/session/SessionPasswordModal.tsx +++ b/ts/components/session/SessionPasswordModal.tsx @@ -191,18 +191,50 @@ export class SessionPasswordModal extends React.Component { } if (!valid) { + let str; + switch (action) { + case Set: + str = window.i18n('setPasswordInvalid'); + break; + case Change: + str = window.i18n('changePasswordInvalid'); + break; + case Remove: + str = window.i18n('removePasswordInvalid'); + break; + default: + throw new Error(`Invalid action ${action}`); + } this.setState({ - error: window.i18n(`${action}PasswordInvalid`), + error: str, }); return; } await window.setPassword(newPassword, oldPassword); + let title; + let description; + switch (action) { + case Set: + title = window.i18n('setPasswordTitle'); + description = window.i18n('setPasswordToastDescription'); + break; + case Change: + title = window.i18n('changePasswordTitle'); + description = window.i18n('changePasswordToastDescription'); + break; + case Remove: + title = window.i18n('removePasswordTitle'); + description = window.i18n('removePasswordToastDescription'); + break; + default: + throw new Error(`Invalid action ${action}`); + } const toastParams = { - title: window.i18n(`${action}PasswordTitle`), - description: window.i18n(`${action}PasswordToastDescription`), + title: title, + description: description, type: action !== Remove ? 'success' : 'warning', icon: action !== Remove ? 'lock' : undefined, }; From fde67235845fc60523eaf6c6a793caa685e406e5 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Wed, 5 Aug 2020 09:42:12 +0200 Subject: [PATCH 021/274] Fix Lint problem --- ts/components/session/settings/SessionSettings.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ts/components/session/settings/SessionSettings.tsx b/ts/components/session/settings/SessionSettings.tsx index 625e122e2..1330664d8 100644 --- a/ts/components/session/settings/SessionSettings.tsx +++ b/ts/components/session/settings/SessionSettings.tsx @@ -597,7 +597,7 @@ export class SettingsView extends React.Component { const model = window.getConversations(); for (const currentModel of model.models) { - let displayName = 'User (...' + currentModel.id.substr(-6) + ')'; + let displayName = `User (...${currentModel.id.toString().substr(-6)})`; if (currentModel.attributes.profile && currentModel.attributes.profile.displayName) { displayName = currentModel.attributes.profile.displayName From 7e0d4dfa28292b9089926fa34422cae95469fd26 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Thu, 6 Aug 2020 08:25:17 +0200 Subject: [PATCH 022/274] Update ts/components/session/LeftPaneSettingSection.tsx Co-authored-by: Audric Ackermann --- ts/components/session/LeftPaneSettingSection.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ts/components/session/LeftPaneSettingSection.tsx b/ts/components/session/LeftPaneSettingSection.tsx index 1cfde2986..e4b90ac3f 100644 --- a/ts/components/session/LeftPaneSettingSection.tsx +++ b/ts/components/session/LeftPaneSettingSection.tsx @@ -215,7 +215,7 @@ export class LeftPaneSettingSection extends React.Component { { id: SessionSettingCategory.Blocked, title: window.i18n('settingsUnblockHeader'), - hidden: isSecondaryDevice, + hidden: false, }, { id: SessionSettingCategory.Permissions, From 46f447ef7c8d9210b2e4ccc731117505e573a57a Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Thu, 6 Aug 2020 08:25:57 +0200 Subject: [PATCH 023/274] Update ts/components/session/settings/SessionSettings.tsx Co-authored-by: Audric Ackermann --- ts/components/session/settings/SessionSettings.tsx | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/ts/components/session/settings/SessionSettings.tsx b/ts/components/session/settings/SessionSettings.tsx index 1330664d8..0b7eeed8c 100644 --- a/ts/components/session/settings/SessionSettings.tsx +++ b/ts/components/session/settings/SessionSettings.tsx @@ -597,13 +597,12 @@ export class SettingsView extends React.Component { const model = window.getConversations(); for (const currentModel of model.models) { - let displayName = `User (...${currentModel.id.toString().substr(-6)})`; - - if (currentModel.attributes.profile && currentModel.attributes.profile.displayName) { - displayName = currentModel.attributes.profile.displayName - } - if(currentModel.isBlocked()) { + let displayName = `User (...${currentModel.id.toString().substr(-6)})`; + + if (currentModel.attributes.profile && currentModel.attributes.profile.displayName) { + displayName = currentModel.attributes.profile.displayName + } results.push({ id: currentModel.id, title: displayName, From b430848c5310ffb381283c5853a301246b494d4d Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Thu, 6 Aug 2020 09:08:18 +0200 Subject: [PATCH 024/274] Get only blocked SessionIDs even if conv is gone --- .../session/LeftPaneSettingSection.tsx | 2 +- .../session/settings/SessionSettings.tsx | 56 ++++++++++--------- 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/ts/components/session/LeftPaneSettingSection.tsx b/ts/components/session/LeftPaneSettingSection.tsx index 1cfde2986..e4b90ac3f 100644 --- a/ts/components/session/LeftPaneSettingSection.tsx +++ b/ts/components/session/LeftPaneSettingSection.tsx @@ -215,7 +215,7 @@ export class LeftPaneSettingSection extends React.Component { { id: SessionSettingCategory.Blocked, title: window.i18n('settingsUnblockHeader'), - hidden: isSecondaryDevice, + hidden: false, }, { id: SessionSettingCategory.Permissions, diff --git a/ts/components/session/settings/SessionSettings.tsx b/ts/components/session/settings/SessionSettings.tsx index 1330664d8..83d332d19 100644 --- a/ts/components/session/settings/SessionSettings.tsx +++ b/ts/components/session/settings/SessionSettings.tsx @@ -7,7 +7,7 @@ import { SessionButtonColor, SessionButtonType, } from '../SessionButton'; -import { UserUtil } from '../../../util'; +import { UserUtil, BlockedNumberController } from '../../../util'; import { MultiDeviceProtocol } from '../../../session/protocols'; import { PubKey } from '../../../session/types'; import { NumberUtils } from '../../../session/utils'; @@ -594,37 +594,41 @@ export class SettingsView extends React.Component { private getBlockedUserSettings(): Array { const results: Array = []; - const model = window.getConversations(); + const blockedNumbers = BlockedNumberController.getBlockedNumbers(); - for (const currentModel of model.models) { - let displayName = `User (...${currentModel.id.toString().substr(-6)})`; + for (const blockedNumber of blockedNumbers) { + + let displayName = `User (...${blockedNumber.substr(-6)})`; - if (currentModel.attributes.profile && currentModel.attributes.profile.displayName) { + let currentModel = window.ConversationController.get(blockedNumber); + if ( + currentModel && + currentModel.attributes.profile && + currentModel.attributes.profile.displayName + ) { displayName = currentModel.attributes.profile.displayName } - if(currentModel.isBlocked()) { - results.push({ - id: currentModel.id, - title: displayName, - description: currentModel.id, - type: SessionSettingType.Button, - category: SessionSettingCategory.Blocked, - content: { - buttonColor: SessionButtonColor.Danger, - buttonText: window.i18n('unblockUser'), - }, - comparisonValue: undefined, - setFn: () => { - currentModel.unblock() - }, - hidden: false, - onClick: undefined, - confirmationDialogParams: undefined, - }); - } - } + results.push({ + id: blockedNumber, + title: displayName, + description: blockedNumber, + type: SessionSettingType.Button, + category: SessionSettingCategory.Blocked, + content: { + buttonColor: SessionButtonColor.Danger, + buttonText: window.i18n('unblockUser'), + }, + comparisonValue: undefined, + setFn: () => { + BlockedNumberController.unblock(blockedNumber) + }, + hidden: false, + onClick: undefined, + confirmationDialogParams: undefined, + }); + } return results; } From 7ec263f27356ef9f9d117a395e4aa78e312828fd Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Thu, 6 Aug 2020 09:35:01 +0200 Subject: [PATCH 025/274] fixed transaltion key --- _locales/en/messages.json | 2 +- ts/components/session/LeftPaneSettingSection.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index e47117dd9..dd513a86d 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1910,7 +1910,7 @@ "unblockUser": { "message": "Unblock User" }, - "settingsUnblockHeader": { + "blockedSettingsTitle": { "message": "Blocked Users", "description": "Shown in the settings page as the heading for the blocked user settings" }, diff --git a/ts/components/session/LeftPaneSettingSection.tsx b/ts/components/session/LeftPaneSettingSection.tsx index e4b90ac3f..6bc707951 100644 --- a/ts/components/session/LeftPaneSettingSection.tsx +++ b/ts/components/session/LeftPaneSettingSection.tsx @@ -214,7 +214,7 @@ export class LeftPaneSettingSection extends React.Component { }, { id: SessionSettingCategory.Blocked, - title: window.i18n('settingsUnblockHeader'), + title: window.i18n('blockedSettingsTitle'), hidden: false, }, { From 380d533da8c087ab28fe56cd9a8c34b856776739 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Thu, 6 Aug 2020 10:30:22 +0200 Subject: [PATCH 026/274] fix lint --- ts/components/session/settings/SessionSettings.tsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/ts/components/session/settings/SessionSettings.tsx b/ts/components/session/settings/SessionSettings.tsx index 83d332d19..9a665a8c6 100644 --- a/ts/components/session/settings/SessionSettings.tsx +++ b/ts/components/session/settings/SessionSettings.tsx @@ -7,7 +7,7 @@ import { SessionButtonColor, SessionButtonType, } from '../SessionButton'; -import { UserUtil, BlockedNumberController } from '../../../util'; +import { BlockedNumberController, UserUtil } from '../../../util'; import { MultiDeviceProtocol } from '../../../session/protocols'; import { PubKey } from '../../../session/types'; import { NumberUtils } from '../../../session/utils'; @@ -600,7 +600,7 @@ export class SettingsView extends React.Component { let displayName = `User (...${blockedNumber.substr(-6)})`; - let currentModel = window.ConversationController.get(blockedNumber); + const currentModel = window.ConversationController.get(blockedNumber); if ( currentModel && currentModel.attributes.profile && @@ -609,7 +609,6 @@ export class SettingsView extends React.Component { displayName = currentModel.attributes.profile.displayName } - results.push({ id: blockedNumber, title: displayName, @@ -621,8 +620,8 @@ export class SettingsView extends React.Component { buttonText: window.i18n('unblockUser'), }, comparisonValue: undefined, - setFn: () => { - BlockedNumberController.unblock(blockedNumber) + setFn: async () => { + await BlockedNumberController.unblock(blockedNumber) }, hidden: false, onClick: undefined, From 1f7cfc357be8d0615741ac91769748000fcd9ad2 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 7 Aug 2020 08:44:46 +1000 Subject: [PATCH 027/274] add a tool to find missing i18n key in two files --- tools/compareLocalizedStrings.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100755 tools/compareLocalizedStrings.py diff --git a/tools/compareLocalizedStrings.py b/tools/compareLocalizedStrings.py new file mode 100755 index 000000000..3b72b6711 --- /dev/null +++ b/tools/compareLocalizedStrings.py @@ -0,0 +1,30 @@ +#!/bin/python3 + + +# usage : ./tools/compareLocalizedStrings.py en de + +import re +import os +from glob import glob +import json +import sys + +if len(sys.argv) != 3: + print(f'usage: {sys.argv[0]} ') + sys.exit(1) + +src = sys.argv[1] +dest = sys.argv[2] +print(f'src {src}, dest {dest}') +jsonInEn = json.loads(open(f'_locales/{src}/messages.json', 'r').read()) +jsonInDe = json.loads(open(f'_locales/{dest}/messages.json', 'r').read()) +keysInEn = jsonInEn.keys() +keysInDe = jsonInDe.keys() + +print(keysInEn) + +for key in keysInEn: + if key not in keysInDe: + print(f'not found in de:{key}') + +print(f'total keys in en {len(keysInEn)}') \ No newline at end of file From e24fc12b9378a16f9d25d81642e2f464b0be821b Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 7 Aug 2020 08:51:52 +1000 Subject: [PATCH 028/274] fix sender_keys itest --- ts/test/session/integration/common.ts | 14 +++++++------- ts/test/session/integration/integration_itest.ts | 8 ++++---- .../session/integration/message_functions_itest.ts | 5 +++-- ts/test/session/integration/message_sync_itest.ts | 4 ++-- .../integration/page-objects/conversation.page.ts | 2 +- ts/test/session/integration/sender_keys_itest.ts | 9 +++++---- ts/test/session/integration/settings_itest.ts | 6 +++--- 7 files changed, 25 insertions(+), 23 deletions(-) diff --git a/ts/test/session/integration/common.ts b/ts/test/session/integration/common.ts index 3edd13594..e10b93900 100644 --- a/ts/test/session/integration/common.ts +++ b/ts/test/session/integration/common.ts @@ -19,12 +19,12 @@ chai.use(chaiAsPromised as any); chai.config.includeStack = true; // FIXME audric -// // From https://github.com/chaijs/chai/issues/200 -// chai.use((_chai, _) => { -// _chai.Assertion.addMethod('withMessage', (msg:any) => { -// _.flag(Common, 'message', msg); -// }); -// }); +// From https://github.com/chaijs/chai/issues/200 +chai.use((_chai, _) => { + _chai.Assertion.addMethod('withMessage', (msg: string) => { + _.flag(Common, 'message', msg); + }); +}); const STUB_SNODE_SERVER_PORT = 3000; const ENABLE_LOG = false; @@ -272,7 +272,7 @@ export class Common { app1: Application, client2: [Application, string] ) { - const [app2, pubkey2] = client2; + const [_, pubkey2] = client2; /** add each other as friends */ const textMessage = Common.generateSendMessageText(); diff --git a/ts/test/session/integration/integration_itest.ts b/ts/test/session/integration/integration_itest.ts index 427988278..a12415ff8 100644 --- a/ts/test/session/integration/integration_itest.ts +++ b/ts/test/session/integration/integration_itest.ts @@ -7,10 +7,10 @@ import './open_group_itest'; import './add_contacts_itest'; import './link_device_itest'; import './closed_group_itest'; -// import './message_functions_itest'; -// import './settings_itest'; -// import'./message_sync_itest'; -// import './sender_keys_itest'; +import './message_functions_itest'; +import './settings_itest'; +import './message_sync_itest'; +import './sender_keys_itest'; before(async function() { // start the app once before all tests to get the platform-dependent diff --git a/ts/test/session/integration/message_functions_itest.ts b/ts/test/session/integration/message_functions_itest.ts index ac25701ff..59b354e64 100644 --- a/ts/test/session/integration/message_functions_itest.ts +++ b/ts/test/session/integration/message_functions_itest.ts @@ -30,13 +30,14 @@ describe('Message Functions', function() { await Common.stopStubSnodeServer(); }); - it('can send attachment', async () => { + it('messageFunction: can send attachment', async () => { // create group and add new friend await Common.addFriendToNewClosedGroup([app, app2], false); // send attachment from app1 to closed group const fileLocation = path.join(__dirname, 'test_attachment'); const messageText = 'test_attachment'; + await Common.closeToast(app); await Common.sendMessage(app, messageText, fileLocation); @@ -52,7 +53,7 @@ describe('Message Functions', function() { ); }); - it('can delete message', async () => { + it('messageFunction: can delete message', async () => { // create group and add new friend await Common.addFriendToNewClosedGroup([app, app2], false); const messageText = 'delete_me'; diff --git a/ts/test/session/integration/message_sync_itest.ts b/ts/test/session/integration/message_sync_itest.ts index d05ad04b3..8a25d6e9c 100644 --- a/ts/test/session/integration/message_sync_itest.ts +++ b/ts/test/session/integration/message_sync_itest.ts @@ -4,7 +4,7 @@ // tslint:disable: no-implicit-dependencies // tslint:disable: no-invalid-this -import { after, before, describe, it } from 'mocha'; +import { after, before, it, describe} from 'mocha'; import { Common } from './common'; import { Application } from 'spectron'; @@ -40,7 +40,7 @@ describe('Message Syncing', function() { await Common.stopStubSnodeServer(); }); - it('message syncing with 1 friend, 1 closed group, 1 open group', async () => { + xit('message syncing with 1 friend, 1 closed group, 1 open group', async () => { // Alice1 has: // * no linked device // * Bob is a friend diff --git a/ts/test/session/integration/page-objects/conversation.page.ts b/ts/test/session/integration/page-objects/conversation.page.ts index 91408f8fc..8c9fa40e3 100644 --- a/ts/test/session/integration/page-objects/conversation.page.ts +++ b/ts/test/session/integration/page-objects/conversation.page.ts @@ -26,7 +26,7 @@ export = { `${num} members` ), - conversationItem: commonPage.divWithClass('module-conversation-list-item'), + conversationItem: '//*[contains(@class, \'module-conversation-list-item\')]', attachmentInput: '//*[contains(@class, "choose-file")]/input[@type="file"]', attachmentButton: '//*[contains(@class, "choose-file")]/button', diff --git a/ts/test/session/integration/sender_keys_itest.ts b/ts/test/session/integration/sender_keys_itest.ts index e194b545f..87b68c120 100644 --- a/ts/test/session/integration/sender_keys_itest.ts +++ b/ts/test/session/integration/sender_keys_itest.ts @@ -36,10 +36,14 @@ async function makeFriendsPlusMessage( app: Application, [app2, pubkey]: [Application, string] ) { + await Common.makeFriends(app, [app2, pubkey]); // Send something back so that `app` can see our name + await app2.client.waitForExist(ConversationPage.conversationItem, 5000); + await app2.client.element(ConversationPage.conversationItem).click(); const text = await generateAndSendMessage(app2); + await app.client.waitForExist( ConversationPage.existingReceivedMessageText(text), 8000 @@ -104,8 +108,8 @@ async function testThreeMembers() { ]); // 2. Make A friends with B and C (B and C are not friends) - await makeFriendsPlusMessage(app1, [app2, Common.TEST_PUBKEY2]); + await makeFriendsPlusMessage(app1, [app3, Common.TEST_PUBKEY3]); const useSenderKeys = true; @@ -116,17 +120,14 @@ async function testThreeMembers() { // 4. Test that all members can see the message from app1 const text1 = await generateAndSendMessage(app1); - await app2.client.waitForExist( ConversationPage.existingReceivedMessageText(text1), 5000 ); - await app3.client.waitForExist( ConversationPage.existingReceivedMessageText(text1), 5000 ); - // TODO: test that B and C can send messages to the group // const text2 = await generateAndSendMessage(app3); diff --git a/ts/test/session/integration/settings_itest.ts b/ts/test/session/integration/settings_itest.ts index a41221221..d97a87ce5 100644 --- a/ts/test/session/integration/settings_itest.ts +++ b/ts/test/session/integration/settings_itest.ts @@ -40,7 +40,7 @@ describe('Settings', function() { await Common.stopStubSnodeServer(); }); - it('can toggle menubar', async () => { + it('settings: can toggle menubar', async () => { const menuBarVisible = await app.browserWindow.isMenuBarVisible(); await app.client.element(SettingsPage.settingsButtonSection).click(); @@ -53,7 +53,7 @@ describe('Settings', function() { menuBarToggled.should.equal(!menuBarVisible); }); - it('can set password', async () => { + it('settings: can set password', async () => { await app.client .element(SettingsPage.settingsRowWithText('Privacy')) .click(); @@ -84,7 +84,7 @@ describe('Settings', function() { await Common.closeToast(app); }); - it('can remove password', async () => { + it('settings: can remove password', async () => { // Enter password to unlock settings await Common.setValueWrapper( app, From 756f0d8ce50d1e48a6e0582b48cd6cc71a659507 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 7 Aug 2020 09:14:58 +1000 Subject: [PATCH 029/274] fix delete can send attachment test --- .../integration/stubs/stub_app_dot_net_api.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/ts/test/session/integration/stubs/stub_app_dot_net_api.ts b/ts/test/session/integration/stubs/stub_app_dot_net_api.ts index ca6d796cd..cce40b973 100644 --- a/ts/test/session/integration/stubs/stub_app_dot_net_api.ts +++ b/ts/test/session/integration/stubs/stub_app_dot_net_api.ts @@ -122,6 +122,19 @@ class StubAppDotNetAPI extends LokiAppDotNetServerAPI { }, }; } + if ( + endpoint === 'files' + ) { + return { + statusCode: 200, + response: { + data: { + url: 'fakeurl', + id: 12345, + }, + }, + }; + } if (endpoint === 'channels/1') { let name = 'Unknown group'; From a3dcc625b2d0001fd22852be7ad06072c99be302 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 7 Aug 2020 09:40:57 +1000 Subject: [PATCH 030/274] disable file server dependency install on ci --- .github/workflows/pull-request.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index f49f3730a..c03f7a22d 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -28,11 +28,12 @@ jobs: - name: Pull git submodules run: git submodule update --init - - name: Install file server dependency - run: | - cd session-file-server - yarn install; - cd - + # file server dependencies are not needed for now + # - name: Install file server dependency + # run: | + # cd session-file-server + # yarn install; + # cd - - name: Install node uses: actions/setup-node@v1 From 6cffb3c31fdbc21061bb7bd1d22203bc964e6cd8 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 7 Aug 2020 10:06:52 +1000 Subject: [PATCH 031/274] lint --- _locales/en/messages.json | 2 +- ts/test/session/integration/message_sync_itest.ts | 2 +- ts/test/session/integration/page-objects/conversation.page.ts | 2 +- ts/test/session/integration/sender_keys_itest.ts | 1 - ts/test/session/integration/stubs/stub_app_dot_net_api.ts | 4 +--- 5 files changed, 4 insertions(+), 7 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 4cf5c3bf4..83a122f85 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1791,7 +1791,7 @@ "message": "Connecting to server..." }, "connectToServerSuccess": { - "message": "Successfully connected to open group" + "message": "Successfully connected to open group" }, "setPasswordFail": { "message": "Failed to set password" diff --git a/ts/test/session/integration/message_sync_itest.ts b/ts/test/session/integration/message_sync_itest.ts index 8a25d6e9c..ba5fd29a1 100644 --- a/ts/test/session/integration/message_sync_itest.ts +++ b/ts/test/session/integration/message_sync_itest.ts @@ -4,7 +4,7 @@ // tslint:disable: no-implicit-dependencies // tslint:disable: no-invalid-this -import { after, before, it, describe} from 'mocha'; +import { after, before, describe, it } from 'mocha'; import { Common } from './common'; import { Application } from 'spectron'; diff --git a/ts/test/session/integration/page-objects/conversation.page.ts b/ts/test/session/integration/page-objects/conversation.page.ts index 8c9fa40e3..44be79fab 100644 --- a/ts/test/session/integration/page-objects/conversation.page.ts +++ b/ts/test/session/integration/page-objects/conversation.page.ts @@ -26,7 +26,7 @@ export = { `${num} members` ), - conversationItem: '//*[contains(@class, \'module-conversation-list-item\')]', + conversationItem: "//*[contains(@class, 'module-conversation-list-item')]", attachmentInput: '//*[contains(@class, "choose-file")]/input[@type="file"]', attachmentButton: '//*[contains(@class, "choose-file")]/button', diff --git a/ts/test/session/integration/sender_keys_itest.ts b/ts/test/session/integration/sender_keys_itest.ts index 87b68c120..ba1b17783 100644 --- a/ts/test/session/integration/sender_keys_itest.ts +++ b/ts/test/session/integration/sender_keys_itest.ts @@ -36,7 +36,6 @@ async function makeFriendsPlusMessage( app: Application, [app2, pubkey]: [Application, string] ) { - await Common.makeFriends(app, [app2, pubkey]); // Send something back so that `app` can see our name diff --git a/ts/test/session/integration/stubs/stub_app_dot_net_api.ts b/ts/test/session/integration/stubs/stub_app_dot_net_api.ts index cce40b973..8fef6005d 100644 --- a/ts/test/session/integration/stubs/stub_app_dot_net_api.ts +++ b/ts/test/session/integration/stubs/stub_app_dot_net_api.ts @@ -122,9 +122,7 @@ class StubAppDotNetAPI extends LokiAppDotNetServerAPI { }, }; } - if ( - endpoint === 'files' - ) { + if (endpoint === 'files') { return { statusCode: 200, response: { From c90e696da3b17fab209da6b651f204a57e9b7694 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 12 Aug 2020 10:05:18 +1000 Subject: [PATCH 032/274] fix types for $ conflicting between jQuery and webdriverIO --- ts/components/session/SessionSeedModal.tsx | 2 +- ts/components/session/settings/SessionSettings.tsx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ts/components/session/SessionSeedModal.tsx b/ts/components/session/SessionSeedModal.tsx index e89653741..adfcb63b6 100644 --- a/ts/components/session/SessionSeedModal.tsx +++ b/ts/components/session/SessionSeedModal.tsx @@ -145,7 +145,7 @@ export class SessionSeedModal extends React.Component { private confirmPassword() { const passwordHash = this.state.passwordHash; - const passwordValue = ($('#seed-input-password') as any).val(); + const passwordValue = jQuery('#seed-input-password').val(); const isPasswordValid = window.passwordUtil.matchesHash( passwordValue, passwordHash diff --git a/ts/components/session/settings/SessionSettings.tsx b/ts/components/session/settings/SessionSettings.tsx index e285e84ce..c73b0d8ad 100644 --- a/ts/components/session/settings/SessionSettings.tsx +++ b/ts/components/session/settings/SessionSettings.tsx @@ -198,7 +198,7 @@ export class SettingsView extends React.Component { } public async validatePasswordLock() { - const enteredPassword = String(($('#password-lock-input') as any).val()); + const enteredPassword = String(jQuery('#password-lock-input').val()); if (!enteredPassword) { this.setState({ @@ -265,9 +265,9 @@ export class SettingsView extends React.Component { } public setOptionsSetting(settingID: string) { - const selectedValue = ($( + const selectedValue = jQuery( `#${settingID} .session-radio input:checked` - ) as any).val(); + ).val(); window.setSettingValue(settingID, selectedValue); } From d793220772c44fc03ec3d116d75b496c8168e762 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 12 Aug 2020 10:19:26 +1000 Subject: [PATCH 033/274] fix integration-tests with translation change --- ts/test/session/integration/page-objects/conversation.page.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ts/test/session/integration/page-objects/conversation.page.ts b/ts/test/session/integration/page-objects/conversation.page.ts index 44be79fab..9e6b96347 100644 --- a/ts/test/session/integration/page-objects/conversation.page.ts +++ b/ts/test/session/integration/page-objects/conversation.page.ts @@ -88,7 +88,7 @@ export = { contactsButtonSection: '//*[contains(@class,"session-icon-button") and .//*[contains(@class, "users")]]', addContactButton: commonPage.divRoleButtonWithText('Add Contact'), - sessionIDInput: commonPage.textAreaWithPlaceholder('Enter a Session ID'), + sessionIDInput: commonPage.textAreaWithPlaceholder('Enter Session ID'), nextButton: commonPage.divRoleButtonWithText('Next'), descriptionDeleteAccount: commonPage.spanWithClassAndText( From eb3ee8f6b0d15e8be97b304520e587493a79bc68 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 13 Aug 2020 13:44:03 +1000 Subject: [PATCH 034/274] make leftpane overlay closer to android --- _locales/en/messages.json | 73 +++++++------------ ts/components/MainViewController.tsx | 42 ++++++----- .../session/LeftPaneMessageSection.tsx | 13 +--- .../session/SessionClosableOverlay.tsx | 18 +++-- .../session/settings/SessionSettings.tsx | 11 ++- 5 files changed, 69 insertions(+), 88 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 108077218..24b8bee6e 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -169,6 +169,10 @@ "message": "Choose folder", "description": "Button to allow the user to find a folder on disk" }, + "done": { + "message": "Done", + "description": "Button when a specific action is to be done." + }, "loadDataHeader": { "message": "Load your data", "description": "Header shown on the first screen in the data import process" @@ -1558,23 +1562,15 @@ } }, "blockUser": { - "message": "Block User" + "message": "Block contact" }, "unblockUser": { - "message": "Unblock User" + "message": "Unblock contact" }, "blockedSettingsTitle": { - "message": "Blocked Users", + "message": "Blocked contacts", "description": "Shown in the settings page as the heading for the blocked user settings" }, - "editProfileTitle": { - "message": "Change your own display name", - "description": "The title shown when user edits their own profile" - }, - "editProfileDisplayNameWarning": { - "message": "Note: Your display name will be visible to your contacts", - "description": "Shown to the user as a warning about setting display name" - }, "copyPublicKey": { "message": "Copy Public Key", "description": "Button action that the user can click to copy their public keys" @@ -1713,8 +1709,8 @@ "message": "This is your unique public QR Code.
Other users may scan this in order to begin a conversation with you.", "description": "Description given to QRCode modal" }, - "noServerURL": { - "message": "Please enter a server URL", + "invalidOpenGroupUrl": { + "message": "Please enter an open group URL", "description": "Error message when no server url entered" }, "copiedMnemonic": { @@ -1797,7 +1793,7 @@ "message": "You are already connected to this open group" }, "connectToServerFail": { - "message": "Failed to connect to server. Check URL" + "message": "Couldn't join group" }, "connectingToServer": { "message": "Connecting to server..." @@ -2047,11 +2043,8 @@ "newClosedGroup": { "message": "New Closed Group" }, - "createClosedGroup": { - "message": "Create Closed Group" - }, - "createClosedGroupDescription": { - "message": "Closed groups are end-to-end encrypted group chats for up to 10 members. They provide the same privacy protections as one-on-one sessions." + "newClosedGroupDescription": { + "message": "Closed groups support up to 10 members and provide the same privacy protections as one-on-one sessions." }, "createClosedGroupNamePrompt": { "message": "Group Name" @@ -2065,14 +2058,11 @@ "enterOpenGroupURL": { "message": "Enter Open Group URL" }, - "channelUrlPlaceholder": { - "message": "chat.getsession.org" + "openGroupURL": { + "message": "Open Group URL" }, - "addChannelDescription": { - "message": "Enter an open group URL." - }, - "joinChannel": { - "message": "Join Open Group" + "enterAnOpenGroupURL": { + "message": "Enter an open group URL" }, "next": { "message": "Next" @@ -2089,25 +2079,17 @@ "devicePairedSuccessfully": { "message": "Device linked successfully" }, - "invalidGroupName": { - "message": "Group Name length must be between 1 to $maxSize$", - "description": "Error message displayed on invalid group name", - "placeholders": { - "maxSize": { - "content": "$1", - "example": "125" - } - } + "invalidGroupNameTooShort": { + "message": "Please enter a group name" }, - "invalidGroupSize": { - "message": "Closed Group size must be between 1 to $maxSize$", - "description": "Error message displayed on invalid closed group size", - "placeholders": { - "maxSize": { - "content": "$1", - "example": "10" - } - } + "invalidGroupNameTooLong": { + "message": "Please enter a shorter group name" + }, + "pickClosedGroupMember": { + "message": "Please pick at least 2 group members" + }, + "closedGroupMaxSize": { + "message": "A closed group cannot have more than 10 members" }, "maxGroupMembersError": { "message": "Max number of members for small group chats is $maxSize$", @@ -2117,8 +2099,5 @@ "example": "10" } } - }, - "useSenderKeys": { - "message": "Use Sender Keys" } } diff --git a/ts/components/MainViewController.tsx b/ts/components/MainViewController.tsx index 7c5affc38..b8e120380 100644 --- a/ts/components/MainViewController.tsx +++ b/ts/components/MainViewController.tsx @@ -48,15 +48,17 @@ async function createClosedGroup( onSuccess: any ) { // Validate groupName and groupMembers length - if ( - groupName.length === 0 || - groupName.length > window.CONSTANTS.MAX_GROUP_NAME_LENGTH - ) { + if (groupName.length === 0) { window.pushToast({ - title: window.i18n( - 'invalidGroupName', - window.CONSTANTS.MAX_GROUP_NAME_LENGTH - ), + title: window.i18n('invalidGroupNameTooShort'), + type: 'error', + id: 'invalidGroupName', + }); + + return; + } else if (groupName.length > window.CONSTANTS.MAX_GROUP_NAME_LENGTH) { + window.pushToast({ + title: window.i18n('invalidGroupNameTooLong'), type: 'error', id: 'invalidGroupName', }); @@ -64,18 +66,22 @@ async function createClosedGroup( return; } - // >= because we add ourself as a member after this. so a 10 group is already invalid as it will be 11 with ourself - if ( - groupMembers.length === 0 || - groupMembers.length >= window.CONSTANTS.SMALL_GROUP_SIZE_LIMIT - ) { + // >= because we add ourself as a member AFTER this. so a 10 group is already invalid as it will be 11 with ourself + // the same is valid with groups count <= 1 + + if (groupMembers.length <= 1) { window.pushToast({ - title: window.i18n( - 'invalidGroupSize', - window.CONSTANTS.SMALL_GROUP_SIZE_LIMIT - ), + title: window.i18n('pickClosedGroupMember'), type: 'error', - id: 'invalidGroupSize', + id: 'pickClosedGroupMember', + }); + + return; + } else if (groupMembers.length >= window.CONSTANTS.SMALL_GROUP_SIZE_LIMIT) { + window.pushToast({ + title: window.i18n('closedGroupMaxSize'), + type: 'error', + id: 'closedGroupMaxSize', }); return; diff --git a/ts/components/session/LeftPaneMessageSection.tsx b/ts/components/session/LeftPaneMessageSection.tsx index ac790ff00..52371b0e6 100644 --- a/ts/components/session/LeftPaneMessageSection.tsx +++ b/ts/components/session/LeftPaneMessageSection.tsx @@ -364,7 +364,7 @@ export class LeftPaneMessageSection extends React.Component { private renderBottomButtons(): JSX.Element { const edit = window.i18n('edit'); const joinOpenGroup = window.i18n('joinOpenGroup'); - const createClosedGroup = window.i18n('createClosedGroup'); + const newClosedGroup = window.i18n('newClosedGroup'); const showEditButton = false; return ( @@ -386,7 +386,7 @@ export class LeftPaneMessageSection extends React.Component { }} /> { @@ -447,15 +447,10 @@ export class LeftPaneMessageSection extends React.Component { return; } - // Server URL entered? - if (serverUrl.length === 0) { - return; - } - // Server URL valid? - if (!OpenGroup.validate(serverUrl)) { + if (serverUrl.length === 0 || !OpenGroup.validate(serverUrl)) { window.pushToast({ - title: window.i18n('noServerURL'), + title: window.i18n('invalidOpenGroupUrl'), id: 'connectToServer', type: 'error', }); diff --git a/ts/components/session/SessionClosableOverlay.tsx b/ts/components/session/SessionClosableOverlay.tsx index 28aafe99c..35d6813a3 100644 --- a/ts/components/session/SessionClosableOverlay.tsx +++ b/ts/components/session/SessionClosableOverlay.tsx @@ -145,15 +145,15 @@ export class SessionClosableOverlay extends React.Component { break; case 'open-group': title = window.i18n('joinOpenGroup'); - buttonText = window.i18n('joinOpenGroup'); - descriptionLong = window.i18n('addChannelDescription'); - subtitle = window.i18n('enterOpenGroupURL'); - placeholder = window.i18n('channelUrlPlaceholder'); + buttonText = window.i18n('next'); + // descriptionLong = ''; + subtitle = window.i18n('openGroupURL'); + placeholder = window.i18n('enterAnOpenGroupURL'); break; case 'closed-group': title = window.i18n('newClosedGroup'); - buttonText = window.i18n('createClosedGroup'); - descriptionLong = window.i18n('createClosedGroupDescription'); + buttonText = window.i18n('done'); + descriptionLong = window.i18n('newClosedGroupDescription'); subtitle = window.i18n('createClosedGroupNamePrompt'); placeholder = window.i18n('createClosedGroupPlaceholder'); break; @@ -232,7 +232,9 @@ export class SessionClosableOverlay extends React.Component { )} -
{descriptionLong}
+ {descriptionLong && ( +
{descriptionLong}
+ )} {isMessageView &&

{window.i18n('or')}

} {isMessageView && ( @@ -272,7 +274,7 @@ export class SessionClosableOverlay extends React.Component { 'sender-keys-description' )} > - {window.i18n('useSenderKeys')} + Use Sender Keys )} diff --git a/ts/components/session/settings/SessionSettings.tsx b/ts/components/session/settings/SessionSettings.tsx index cd956000f..e9f859cf3 100644 --- a/ts/components/session/settings/SessionSettings.tsx +++ b/ts/components/session/settings/SessionSettings.tsx @@ -103,7 +103,7 @@ export class SettingsView extends React.Component { if (category === SessionSettingCategory.Devices) { // special case for linked devices settings = this.getLinkedDeviceSettings(); - } else if(category === SessionSettingCategory.Blocked) { + } else if (category === SessionSettingCategory.Blocked) { // special case for blocked user settings = this.getBlockedUserSettings(); } else { @@ -600,16 +600,15 @@ export class SettingsView extends React.Component { const blockedNumbers = BlockedNumberController.getBlockedNumbers(); for (const blockedNumber of blockedNumbers) { - let displayName = `User (...${blockedNumber.substr(-6)})`; const currentModel = window.ConversationController.get(blockedNumber); if ( - currentModel && - currentModel.attributes.profile && + currentModel && + currentModel.attributes.profile && currentModel.attributes.profile.displayName ) { - displayName = currentModel.attributes.profile.displayName + displayName = currentModel.attributes.profile.displayName; } results.push({ @@ -624,7 +623,7 @@ export class SettingsView extends React.Component { }, comparisonValue: undefined, setFn: async () => { - await BlockedNumberController.unblock(blockedNumber) + await BlockedNumberController.unblock(blockedNumber); }, hidden: false, onClick: undefined, From cf3352d0af4a8c93090523ac879ca3df989bc237 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 13 Aug 2020 15:30:44 +1000 Subject: [PATCH 035/274] add a timeout function to promiseUtils for attemptConnection --- .../session/SessionClosableOverlay.tsx | 2 +- ts/session/types/OpenGroup.ts | 11 +++++-- ts/session/utils/Promise.ts | 32 +++++++++++++------ ts/test/session/unit/utils/Promise_test.ts | 4 +-- 4 files changed, 35 insertions(+), 14 deletions(-) diff --git a/ts/components/session/SessionClosableOverlay.tsx b/ts/components/session/SessionClosableOverlay.tsx index 35d6813a3..2e6744b38 100644 --- a/ts/components/session/SessionClosableOverlay.tsx +++ b/ts/components/session/SessionClosableOverlay.tsx @@ -103,7 +103,7 @@ export class SessionClosableOverlay extends React.Component { }); } - // tslint:disable-next-line max-func-body-length */ + // tslint:disable-next-line max-func-body-length cyclomatic-complexity */ public render(): JSX.Element { const { overlayMode, diff --git a/ts/session/types/OpenGroup.ts b/ts/session/types/OpenGroup.ts index 290e1c7f9..4666bdefa 100644 --- a/ts/session/types/OpenGroup.ts +++ b/ts/session/types/OpenGroup.ts @@ -1,4 +1,5 @@ import { ConversationModel } from '../../../js/models/conversations'; +import { PromiseUtils } from '../utils'; interface OpenGroupParams { server: string; @@ -126,8 +127,14 @@ export class OpenGroup { onLoading(); } - conversation = await window.attemptConnection(prefixedServer, channel); - conversationId = conversation?.cid; + conversation = await PromiseUtils.timeout( + window.attemptConnection(prefixedServer, channel), + 5000 + ); + if (!conversation) { + throw new Error(window.i18n('connectToServerFail')); + } + conversationId = (conversation as any)?.cid; } catch (e) { throw new Error(e); } diff --git a/ts/session/utils/Promise.ts b/ts/session/utils/Promise.ts index 9019ff282..237938e77 100644 --- a/ts/session/utils/Promise.ts +++ b/ts/session/utils/Promise.ts @@ -14,13 +14,13 @@ async function toPromise(value: Return): Promise { */ export async function waitForTask( task: (done: SimpleFunction) => Return, - timeout: number = 2000 + timeoutMs: number = 2000 ): Promise { const timeoutPromise = new Promise((_, rej) => { const wait = setTimeout(() => { clearTimeout(wait); rej(new Error('Task timed out.')); - }, timeout); + }, timeoutMs); }); const taskPromise = new Promise(async (res, rej) => { @@ -35,7 +35,7 @@ export async function waitForTask( } export interface PollOptions { - timeout: number; + timeoutMs: number; interval: number; } @@ -51,16 +51,16 @@ export async function poll( options: Partial = {} ): Promise { const defaults: PollOptions = { - timeout: 2000, + timeoutMs: 2000, interval: 100, }; - const { timeout, interval } = { + const { timeoutMs, interval } = { ...defaults, ...options, }; - const endTime = Date.now() + timeout; + const endTime = Date.now() + timeoutMs; let stop = false; const finish = () => { stop = true; @@ -101,7 +101,7 @@ export async function poll( */ export async function waitUntil( check: () => Return, - timeout: number = 2000 + timeoutMs: number = 2000 ) { // This is causing unhandled promise rejection somewhere in MessageQueue tests return poll( @@ -112,8 +112,22 @@ export async function waitUntil( } }, { - timeout, - interval: timeout / 20, + timeoutMs, + interval: timeoutMs / 20, } ); } + +export async function timeout( + promise: Promise, + timeoutMs: number = 2000 +): Promise { + const timeoutPromise = new Promise((_, rej) => { + const wait = setTimeout(() => { + clearTimeout(wait); + rej(new Error('Task timed out.')); + }, timeoutMs); + }); + + return Promise.race([timeoutPromise, promise]); +} diff --git a/ts/test/session/unit/utils/Promise_test.ts b/ts/test/session/unit/utils/Promise_test.ts index b83e1d071..28ec57532 100644 --- a/ts/test/session/unit/utils/Promise_test.ts +++ b/ts/test/session/unit/utils/Promise_test.ts @@ -60,7 +60,7 @@ describe('Promise Utils', () => { const completionSpy = sandbox.spy(); const task = (_done: any) => undefined; - const promise = PromiseUtils.poll(task, { timeout: 1 }); + const promise = PromiseUtils.poll(task, { timeoutMs: 1 }); await expect(promise).to.be.rejectedWith('Periodic check timeout'); expect(pollSpy.callCount).to.equal(1); @@ -82,7 +82,7 @@ describe('Promise Utils', () => { } }; - const promise = PromiseUtils.poll(task, { timeout, interval }); + const promise = PromiseUtils.poll(task, { timeoutMs: timeout, interval }); await expect(promise).to.be.fulfilled; expect(pollSpy.callCount).to.equal(1); From 30937f4ae3d6d8ebada4610bac72a02f7e1395d7 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 13 Aug 2020 15:31:51 +1000 Subject: [PATCH 036/274] make start new session screen closer to the android one --- _locales/en/messages.json | 17 +++++++++++++---- js/views/last_seen_indicator_view.js | 2 +- stylesheets/_session.scss | 2 +- stylesheets/_session_left_pane.scss | 1 + .../session/SessionClosableOverlay.tsx | 10 +++++----- ts/types/PhoneNumber.ts | 2 +- 6 files changed, 22 insertions(+), 12 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 24b8bee6e..46115a95b 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -234,8 +234,14 @@ "description": "Displayed when a user can't send a message because they have left the group" }, "unreadMessage": { - "message": "1 Unread Message", - "description": "Text for unread message separator, just one message" + "message": "$count$ Unread Message", + "description": "Text for unread message separator, just one message", + "placeholders": { + "count": { + "content": "$1", + "example": "5" + } + } }, "unreadMessages": { "message": "$count$ Unread Messages", @@ -1825,7 +1831,7 @@ "remove": { "message": "Remove" }, - "invalidHexId": { + "invalidSessionId": { "message": "Invalid Session ID", "description": "Error string shown when user types an invalid pubkey hex string" }, @@ -1992,8 +1998,11 @@ "enterSessionID": { "message": "Enter Session ID" }, + "enterSessionIDOfRecipient": { + "message": "Enter Session ID of recipient" + }, "usersCanShareTheir...": { - "message": "Users can share their Session ID from their account settings, or by sharing their QR code." + "message": "Users can share their Session ID by going into their account settings and tapping \"Share Session ID\", or by sharing their QR code." }, "message": { "message": "Message" diff --git a/js/views/last_seen_indicator_view.js b/js/views/last_seen_indicator_view.js index 12049d59e..de475aff5 100644 --- a/js/views/last_seen_indicator_view.js +++ b/js/views/last_seen_indicator_view.js @@ -25,7 +25,7 @@ render_attributes() { const unreadMessages = this.count === 1 - ? i18n('unreadMessage') + ? i18n('unreadMessage', [this.count]) : i18n('unreadMessages', [this.count]); return { diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index 5838f929d..c611aa0da 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -1353,7 +1353,7 @@ label { padding: 0px 5px 20px 5px; &.session-id-editable-textarea:placeholder-shown { - padding: 20px 5px 0px 5px; + padding: 10px 5px 0px 5px; } &.group-id-editable-textarea { diff --git a/stylesheets/_session_left_pane.scss b/stylesheets/_session_left_pane.scss index 71fb51a5e..c17d3e1f9 100644 --- a/stylesheets/_session_left_pane.scss +++ b/stylesheets/_session_left_pane.scss @@ -352,6 +352,7 @@ $session-compose-margin: 20px; .user-search-dropdown { width: 100%; + min-height: 34px; flex-grow: 1; overflow-y: auto; } diff --git a/ts/components/session/SessionClosableOverlay.tsx b/ts/components/session/SessionClosableOverlay.tsx index 2e6744b38..d69b539d0 100644 --- a/ts/components/session/SessionClosableOverlay.tsx +++ b/ts/components/session/SessionClosableOverlay.tsx @@ -134,14 +134,14 @@ export class SessionClosableOverlay extends React.Component { buttonText = window.i18n('next'); descriptionLong = window.i18n('usersCanShareTheir...'); subtitle = window.i18n('enterSessionID'); - placeholder = window.i18n('enterSessionID'); + placeholder = window.i18n('enterSessionIDOfRecipient'); break; case 'contact': title = window.i18n('addContact'); buttonText = window.i18n('next'); descriptionLong = window.i18n('usersCanShareTheir...'); subtitle = window.i18n('enterSessionID'); - placeholder = window.i18n('enterSessionID'); + placeholder = window.i18n('enterSessionIDOfRecipient'); break; case 'open-group': title = window.i18n('joinOpenGroup'); @@ -235,9 +235,9 @@ export class SessionClosableOverlay extends React.Component { {descriptionLong && (
{descriptionLong}
)} - {isMessageView &&

{window.i18n('or')}

} - - {isMessageView && ( + {isMessageView && false &&

{window.i18n('or')}

} + {/* FIXME enable back those two items when they are working */} + {isMessageView && false && ( Date: Thu, 13 Aug 2020 16:06:30 +1000 Subject: [PATCH 037/274] fix input translation for searches with android translations --- _locales/en/messages.json | 4 ++-- ts/components/session/LeftPaneMessageSection.tsx | 2 +- ts/components/session/SessionClosableOverlay.tsx | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 46115a95b..b7de1969a 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1992,8 +1992,8 @@ "newSession": { "message": "New Session" }, - "searchForAKeyPhrase": { - "message": "Search for a key phrase or contact" + "searchFor...": { + "message": "Search for conversations, contacts, and messages" }, "enterSessionID": { "message": "Enter Session ID" diff --git a/ts/components/session/LeftPaneMessageSection.tsx b/ts/components/session/LeftPaneMessageSection.tsx index 52371b0e6..c73a3de29 100644 --- a/ts/components/session/LeftPaneMessageSection.tsx +++ b/ts/components/session/LeftPaneMessageSection.tsx @@ -241,7 +241,7 @@ export class LeftPaneMessageSection extends React.Component { {this.renderList()} {this.renderBottomButtons()} diff --git a/ts/components/session/SessionClosableOverlay.tsx b/ts/components/session/SessionClosableOverlay.tsx index d69b539d0..1eeb70d89 100644 --- a/ts/components/session/SessionClosableOverlay.tsx +++ b/ts/components/session/SessionClosableOverlay.tsx @@ -241,7 +241,7 @@ export class SessionClosableOverlay extends React.Component { )} From 71004f04a26ffdc895187609c13e90c87526908e Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 13 Aug 2020 16:45:11 +1000 Subject: [PATCH 038/274] add a getDeleteMenuItem and hide on open groups as leave and delete messages does the same in fact --- ts/components/ConversationListItem.tsx | 3 +- .../conversation/ConversationHeader.tsx | 2 +- ts/session/utils/Menu.tsx | 134 ++++++++++-------- 3 files changed, 76 insertions(+), 63 deletions(-) diff --git a/ts/components/ConversationListItem.tsx b/ts/components/ConversationListItem.tsx index 43f4b1c10..3eee60730 100644 --- a/ts/components/ConversationListItem.tsx +++ b/ts/components/ConversationListItem.tsx @@ -16,6 +16,7 @@ import { getClearNicknameMenuItem, getCopyIdMenuItem, getDeleteContactMenuItem, + getDeleteMessagesMenuItem, getInviteContactMenuItem, getLeaveGroupMenuItem, } from '../session/utils/Menu'; @@ -216,7 +217,7 @@ export class ConversationListItem extends React.PureComponent { onCopyPublicKey, i18n )} - {i18n('deleteMessages')} + {getDeleteMessagesMenuItem(isPublic, onDeleteMessages, i18n)} {getInviteContactMenuItem( type === 'group', isPublic, diff --git a/ts/components/conversation/ConversationHeader.tsx b/ts/components/conversation/ConversationHeader.tsx index 29208b3a0..e695cbb5b 100644 --- a/ts/components/conversation/ConversationHeader.tsx +++ b/ts/components/conversation/ConversationHeader.tsx @@ -311,7 +311,7 @@ export class ConversationHeader extends React.Component { onCopyPublicKey, i18n )} - {i18n('deleteMessages')} + {Menu.getDeleteMessagesMenuItem(isPublic, onDeleteMessages, i18n)} {Menu.getAddModeratorsMenuItem( amMod, isKickedFromGroup, diff --git a/ts/session/utils/Menu.tsx b/ts/session/utils/Menu.tsx index 165056090..7a1c244aa 100644 --- a/ts/session/utils/Menu.tsx +++ b/ts/session/utils/Menu.tsx @@ -9,9 +9,7 @@ function showTimerOptions( isKickedFromGroup: boolean, isBlocked: boolean ): boolean { - return ( - Boolean(!isPublic) && Boolean(!isRss) && !isKickedFromGroup && !isBlocked - ); + return !isPublic && !isRss && !isKickedFromGroup && !isBlocked; } function showMemberMenu( @@ -19,7 +17,7 @@ function showMemberMenu( isRss: boolean, isGroup: boolean ): boolean { - return Boolean(!isPublic) && Boolean(!isRss) && isGroup; + return !isPublic && !isRss && isGroup; } function showSafetyNumber( @@ -28,7 +26,7 @@ function showSafetyNumber( isGroup: boolean, isMe: boolean ): boolean { - return Boolean(!isPublic) && Boolean(!isRss) && !isGroup && !isMe; + return !isPublic && !isRss && !isGroup && !isMe; } function showResetSession( @@ -36,84 +34,72 @@ function showResetSession( isRss: boolean, isGroup: boolean ): boolean { - return Boolean(!isPublic) && Boolean(!isRss) && Boolean(!isGroup); + return !isPublic && !isRss && !isGroup; } -function showBlock( - isMe: boolean | undefined, - isPrivate: boolean | undefined -): boolean { - return Boolean(!isMe) && Boolean(isPrivate); +function showBlock(isMe: boolean, isPrivate: boolean): boolean { + return !isMe && isPrivate; } function showClearNickname( - isPublic: boolean | undefined, - isRss: boolean | undefined, - isMe: boolean | undefined, - hasNickname: boolean | undefined + isPublic: boolean, + isRss: boolean, + isMe: boolean, + hasNickname: boolean ): boolean { - return ( - Boolean(!isPublic) && - Boolean(!isRss) && - Boolean(!isMe) && - Boolean(hasNickname) - ); + return !isPublic && !isRss && !isMe && hasNickname; } -function showCopyId( - isPublic: boolean | undefined, - isRss: boolean | undefined -): boolean { - return Boolean(!isPublic) && Boolean(!isRss); +function showDeleteMessages(isPublic: boolean): boolean { + return !isPublic; +} + +function showCopyId(isPublic: boolean, isRss: boolean | undefined): boolean { + return !isPublic && !isRss; } function showDeleteContact( - isMe: boolean | undefined, - isClosable: boolean | undefined, - isGroup: boolean | undefined, - isPublic: boolean | undefined, - isRss: boolean | undefined + isMe: boolean, + isClosable: boolean, + isGroup: boolean, + isPublic: boolean, + isRss: boolean ): boolean { - return ( - Boolean(!isMe) && Boolean(isClosable) && !!(!isGroup || isPublic || isRss) - ); + return !isMe && isClosable && !!(!isGroup || isPublic || isRss); } function showAddModerators( - amMod: boolean | undefined, - isKickedFromGroup: boolean | undefined + amMod: boolean, + isKickedFromGroup: boolean ): boolean { - return Boolean(!isKickedFromGroup) && Boolean(amMod); + return !isKickedFromGroup && amMod; } function showRemoveModerators( - amMod: boolean | undefined, - isKickedFromGroup: boolean | undefined + amMod: boolean, + isKickedFromGroup: boolean ): boolean { - return Boolean(!isKickedFromGroup) && Boolean(amMod); + return !isKickedFromGroup && amMod; } function showUpdateGroupName( - amMod: boolean | undefined, - isKickedFromGroup: boolean | undefined + amMod: boolean, + isKickedFromGroup: boolean ): boolean { - return Boolean(!isKickedFromGroup) && Boolean(amMod); + return !isKickedFromGroup && amMod; } function showLeaveGroup( - isKickedFromGroup: boolean | undefined, - isGroup: boolean | undefined, - isPublic: boolean | undefined, - isRss: boolean | undefined + isKickedFromGroup: boolean, + isGroup: boolean, + isPublic: boolean, + isRss: boolean ): boolean { - return Boolean(!isKickedFromGroup) && Boolean(isGroup) && !isPublic && !isRss; + return !isKickedFromGroup && isGroup && !isPublic && !isRss; } -function showInviteContact( - isGroup: boolean | undefined, - isPublic: boolean | undefined -): boolean { - return Boolean(isGroup) && Boolean(isPublic); +function showInviteContact(isGroup: boolean, isPublic: boolean): boolean { + return isGroup && isPublic; } /** Menu items standardized */ @@ -124,7 +110,7 @@ export function getInviteContactMenuItem( action: any, i18n: LocalizerType ): JSX.Element | null { - if (showInviteContact(isGroup, isPublic)) { + if (showInviteContact(Boolean(isGroup), Boolean(isPublic))) { return {i18n('inviteContacts')}; } return null; @@ -139,7 +125,15 @@ export function getDeleteContactMenuItem( action: any, i18n: LocalizerType ): JSX.Element | null { - if (showDeleteContact(isMe, isClosable, isGroup, isPublic, isRss)) { + if ( + showDeleteContact( + Boolean(isMe), + Boolean(isClosable), + Boolean(isGroup), + Boolean(isPublic), + Boolean(isRss) + ) + ) { if (isPublic) { return {i18n('leaveOpenGroup')}; } @@ -156,7 +150,14 @@ export function getLeaveGroupMenuItem( action: any, i18n: LocalizerType ): JSX.Element | null { - if (showLeaveGroup(isKickedFromGroup, isGroup, isPublic, isRss)) { + if ( + showLeaveGroup( + Boolean(isKickedFromGroup), + Boolean(isGroup), + Boolean(isPublic), + Boolean(isRss) + ) + ) { return {i18n('leaveClosedGroup')}; } return null; @@ -168,7 +169,7 @@ export function getUpdateGroupNameMenuItem( action: any, i18n: LocalizerType ): JSX.Element | null { - if (showUpdateGroupName(amMod, isKickedFromGroup)) { + if (showUpdateGroupName(Boolean(amMod), Boolean(isKickedFromGroup))) { return ( {i18n('editGroupNameOrPicture')} ); @@ -182,7 +183,7 @@ export function getRemoveModeratorsMenuItem( action: any, i18n: LocalizerType ): JSX.Element | null { - if (showRemoveModerators(amMod, isKickedFromGroup)) { + if (showRemoveModerators(Boolean(amMod), Boolean(isKickedFromGroup))) { return {i18n('removeModerators')}; } return null; @@ -194,7 +195,7 @@ export function getAddModeratorsMenuItem( action: any, i18n: LocalizerType ): JSX.Element | null { - if (showAddModerators(amMod, isKickedFromGroup)) { + if (showAddModerators(Boolean(amMod), Boolean(isKickedFromGroup))) { return {i18n('addModerators')}; } return null; @@ -207,8 +208,8 @@ export function getCopyIdMenuItem( action: any, i18n: LocalizerType ): JSX.Element | null { - if (showCopyId(isPublic, isRss)) { - const copyIdLabel = isGroup ? i18n('copyChatId') : i18n('copyPublicKey'); + if (showCopyId(Boolean(isPublic), Boolean(isRss))) { + const copyIdLabel = i18n('editMenuCopy'); return {copyIdLabel}; } return null; @@ -332,3 +333,14 @@ export function getClearNicknameMenuItem( } return null; } + +export function getDeleteMessagesMenuItem( + isPublic: boolean | undefined, + action: any, + i18n: LocalizerType +): JSX.Element | null { + if (showDeleteMessages(Boolean(isPublic))) { + return {i18n('deleteMessages')}; + } + return null; +} From b05576075f3a566e16409c08b806c8bae13ff12f Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 13 Aug 2020 16:56:51 +1000 Subject: [PATCH 039/274] disable deleteMessages() for open groups. As only leaveGroup is supported --- js/models/conversations.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/js/models/conversations.js b/js/models/conversations.js index 0b9621c6e..645975088 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -2396,11 +2396,7 @@ let params; if (this.isPublic()) { - params = { - title: i18n('deleteMessages'), - message: i18n('deletePublicConversationConfirmation'), - resolve: () => ConversationController.deleteContact(this.id), - }; + throw new Error('Called deleteMessages() on an open group. Only leave group is supported.') } else { params = { title: i18n('deleteMessages'), From edf25e8cbc57311d62343033ebe39bfbd4f2e3a8 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 13 Aug 2020 17:01:08 +1000 Subject: [PATCH 040/274] clean up menu on message click --- _locales/en/messages.json | 3 --- ts/components/conversation/Message.tsx | 5 ----- 2 files changed, 8 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index b7de1969a..26021a8f5 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1597,9 +1597,6 @@ "message": "Ban failed!", "description": "Toast on unsuccesful user ban." }, - "copyChatId": { - "message": "Copy Chat ID" - }, "leaveOpenGroup": { "message": "Leave Open Group", "description": "Button action that the user can click to leave the group" diff --git a/ts/components/conversation/Message.tsx b/ts/components/conversation/Message.tsx index 59f57566f..1fc888f97 100644 --- a/ts/components/conversation/Message.tsx +++ b/ts/components/conversation/Message.tsx @@ -992,11 +992,6 @@ export class Message extends React.PureComponent { {deleteMessageCtxText} ) : null} - {isPublic ? ( - - {i18n('copyPublicKey')} - - ) : null} {isModerator && isPublic ? ( {i18n('banUser')} ) : null} From 66d3a2b86c8746faed43a9540c4d7645a1eddd7c Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 13 Aug 2020 17:22:02 +1000 Subject: [PATCH 041/274] replace unsend with deleteForEveryone --- _locales/en/messages.json | 20 +++++++++++++------ js/models/conversations.js | 4 +++- js/views/conversation_view.js | 8 ++++++-- .../conversation/ConversationHeader.tsx | 2 +- ts/components/conversation/Message.tsx | 4 +++- 5 files changed, 27 insertions(+), 11 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 26021a8f5..0726088f3 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -809,14 +809,11 @@ "delete": { "message": "Delete" }, - "unsend": { - "message": "Unsend" - }, "deletePublicWarning": { - "message": "Are you sure? Clicking 'unsend' will permanently remove this message for everyone in this channel." + "message": "Are you sure? This will permanently remove this message for everyone in this open group." }, "deleteMultiplePublicWarning": { - "message": "Are you sure? Clicking 'unsend' will permanently remove these messages for everyone in this channel." + "message": "Are you sure? This will permanently remove these messages for everyone in this open group." }, "deleteWarning": { "message": "Are you sure? Clicking 'delete' will permanently remove this message from this device only." @@ -910,7 +907,18 @@ "message": "Delete Messages", "description": "Menu item for deleting messages, title case." }, - + "deleteMessagesForEveryone": { + "message": "Delete messages for everyone", + "description": "Menu item for deleting messages, title case." + }, + "deleteMessageForEveryone": { + "message": "Delete message for everyone", + "description": "Menu item for deleting messages, title case." + }, + "deleteForEveryone": { + "message": "Delete for everyone", + "description": "Menu item for deleting messages, title case." + }, "deletePublicConversationConfirmation": { "message": "Permanently delete the messages locally from this public channel?", "description": "Confirmation dialog text that asks the user if they really wish to delete the public channel messages locally. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone." diff --git a/js/models/conversations.js b/js/models/conversations.js index 645975088..6c49105fa 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -2396,7 +2396,9 @@ let params; if (this.isPublic()) { - throw new Error('Called deleteMessages() on an open group. Only leave group is supported.') + throw new Error( + 'Called deleteMessages() on an open group. Only leave group is supported.' + ); } else { params = { title: i18n('deleteMessages'), diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index f75cc55a8..0f7316819 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -1374,12 +1374,16 @@ // If removable from server, we "Unsend" - otherwise "Delete" let title; if (isPublic) { - title = multiple ? i18n('unsendMessages') : i18n('unsendMessage'); + title = multiple + ? i18n('deleteMessagesForEveryone') + : i18n('deleteMessageForEveryone'); } else { title = multiple ? i18n('deleteMessages') : i18n('deleteMessage'); } - const okText = isServerDeletable ? i18n('unsend') : i18n('delete'); + const okText = isServerDeletable + ? i18n('deleteForEveryone') + : i18n('delete'); window.confirmationDialog({ title, diff --git a/ts/components/conversation/ConversationHeader.tsx b/ts/components/conversation/ConversationHeader.tsx index e695cbb5b..0a0cb578f 100644 --- a/ts/components/conversation/ConversationHeader.tsx +++ b/ts/components/conversation/ConversationHeader.tsx @@ -368,7 +368,7 @@ export class ConversationHeader extends React.Component { const isServerDeletable = isPublic; const deleteMessageButtonText = i18n( - isServerDeletable ? 'unsend' : 'delete' + isServerDeletable ? 'deleteForEveryone' : 'delete' ); return ( diff --git a/ts/components/conversation/Message.tsx b/ts/components/conversation/Message.tsx index 1fc888f97..1b9c464ab 100644 --- a/ts/components/conversation/Message.tsx +++ b/ts/components/conversation/Message.tsx @@ -926,7 +926,9 @@ export class Message extends React.PureComponent { }; const isServerDeletable = !!this.props.isPublic; - const deleteMessageCtxText = i18n(isServerDeletable ? 'unsend' : 'delete'); + const deleteMessageCtxText = i18n( + isServerDeletable ? 'deleteForEveryone' : 'delete' + ); // CONTEXT MENU "Select Message" does not work From e008dbd0d5a55b4c8e23bb1c5818edf8b415dc6a Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 14 Aug 2020 10:07:47 +1000 Subject: [PATCH 042/274] "leave {Closed|Open} Group" => "leave group" --- _locales/en/messages.json | 14 +++++--------- js/models/conversations.js | 16 ++++++++-------- js/views/app_view.js | 9 +++------ ts/components/session/SessionGroupSettings.tsx | 4 ++-- ts/session/utils/Menu.tsx | 4 ++-- 5 files changed, 20 insertions(+), 27 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 0726088f3..8e0d86808 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -927,10 +927,6 @@ "message": "Permanently delete the messages in this conversation?", "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." }, - "leaveOpenGroupConfirmation": { - "message": "Leave this Open Group?", - "description": "Confirmation dialog text that tells the user what will happen if they leave the public channel." - }, "deleteAccount": { "message": "Delete Account", "description": "Text for button in settings view to delete account" @@ -1605,17 +1601,17 @@ "message": "Ban failed!", "description": "Toast on unsuccesful user ban." }, - "leaveOpenGroup": { - "message": "Leave Open Group", + "leaveGroup": { + "message": "Leave Group", "description": "Button action that the user can click to leave the group" }, "leaveClosedGroup": { "message": "Leave Closed Group", "description": "Button action that the user can click to leave the group" }, - "leaveClosedGroupConfirmation": { - "message": "Leave this Closed Group?", - "description": "Confirmation dialog text that tells the user what will happen if they leave the closed group." + "leaveGroupConfirmation": { + "message": "Are you sure you want to leave this group?", + "description": "Confirmation dialog text that tells the user what will happen if they leave the group." }, "noContactsForGroup": { "message": "You don't have any contacts to start a group with." diff --git a/js/models/conversations.js b/js/models/conversations.js index 6c49105fa..2f38ae439 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -2302,12 +2302,15 @@ this.contactCollection.reset(contacts); }); }, + // returns true if this is a closed/medium or open group + isGroup() { + return this.get('type') === 'group'; + }, copyPublicKey() { clipboard.writeText(this.id); - const isGroup = this.getProps().type === 'group'; - const copiedMessage = isGroup + const copiedMessage = this.isGroup() ? i18n('copiedChatId') : i18n('copiedPublicKey'); @@ -2330,12 +2333,9 @@ let title = i18n('deleteContact'); let message = i18n('deleteContactConfirmation'); - if (this.isPublic()) { - title = i18n('leaveOpenGroup'); - message = i18n('leaveOpenGroupConfirmation'); - } else if (this.isClosedGroup()) { - title = i18n('leaveClosedGroup'); - message = i18n('leaveClosedGroupConfirmation'); + if (this.isGroup()) { + title = i18n('leaveGroup'); + message = i18n('leaveGroupConfirmation'); } window.confirmationDialog({ diff --git a/js/views/app_view.js b/js/views/app_view.js index 3bfbe282a..046a5c40e 100644 --- a/js/views/app_view.js +++ b/js/views/app_view.js @@ -237,12 +237,9 @@ let title = i18n('deleteContact'); let message = i18n('deleteContactConfirmation'); - if (groupConvo.isPublic()) { - title = i18n('leaveOpenGroup'); - message = i18n('leaveOpenGroupConfirmation'); - } else if (groupConvo.isClosedGroup()) { - title = i18n('leaveClosedGroup'); - message = i18n('leaveClosedGroupConfirmation'); + if (groupConvo.isGroup()) { + title = i18n('leaveGroup'); + message = i18n('leaveGroupConfirmation'); } window.confirmationDialog({ diff --git a/ts/components/session/SessionGroupSettings.tsx b/ts/components/session/SessionGroupSettings.tsx index c7e64f8eb..d028563de 100644 --- a/ts/components/session/SessionGroupSettings.tsx +++ b/ts/components/session/SessionGroupSettings.tsx @@ -223,10 +223,10 @@ export class SessionGroupSettings extends React.Component { const hasDisappearingMessages = !isPublic && !isKickedFromGroup && !isBlocked; const leaveGroupString = isPublic - ? window.i18n('leaveOpenGroup') + ? window.i18n('leaveGroup') : isKickedFromGroup ? window.i18n('youGotKickedFromGroup') - : window.i18n('leaveClosedGroup'); + : window.i18n('leaveGroup'); const disappearingMessagesOptions = timerOptions.map(option => { return { diff --git a/ts/session/utils/Menu.tsx b/ts/session/utils/Menu.tsx index 7a1c244aa..18faef424 100644 --- a/ts/session/utils/Menu.tsx +++ b/ts/session/utils/Menu.tsx @@ -135,7 +135,7 @@ export function getDeleteContactMenuItem( ) ) { if (isPublic) { - return {i18n('leaveOpenGroup')}; + return {i18n('leaveGroup')}; } return {i18n('deleteContact')}; } @@ -158,7 +158,7 @@ export function getLeaveGroupMenuItem( Boolean(isRss) ) ) { - return {i18n('leaveClosedGroup')}; + return {i18n('leaveGroup')}; } return null; } From d108630f223c329c0a845ca4371337899d4173a1 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 14 Aug 2020 10:56:22 +1000 Subject: [PATCH 043/274] add a toastUtils file and replace all pushToast calls in ts files --- ts/components/DevicePairingDialog.tsx | 5 +++-- ts/components/EditProfileDialog.tsx | 3 ++- ts/components/MainViewController.tsx | 5 +++-- .../session/LeftPaneContactSection.tsx | 3 ++- .../session/LeftPaneMessageSection.tsx | 17 +++++++++-------- ts/components/session/RegistrationTabs.tsx | 14 +++++++------- ts/components/session/SessionPasswordModal.tsx | 13 +++++-------- ts/components/session/SessionSeedModal.tsx | 3 ++- .../session/settings/SessionSettings.tsx | 4 ++-- ts/session/utils/Toast.ts | 10 ++++++++++ ts/session/utils/index.ts | 2 ++ 11 files changed, 47 insertions(+), 32 deletions(-) create mode 100644 ts/session/utils/Toast.ts diff --git a/ts/components/DevicePairingDialog.tsx b/ts/components/DevicePairingDialog.tsx index c15604d88..e8c25dd36 100644 --- a/ts/components/DevicePairingDialog.tsx +++ b/ts/components/DevicePairingDialog.tsx @@ -4,6 +4,7 @@ import { QRCode } from 'react-qr-svg'; import { SessionModal } from './session/SessionModal'; import { SessionButton, SessionButtonColor } from './session/SessionButton'; import { SessionSpinner } from './session/SessionSpinner'; +import { ToastUtils } from '../session/utils'; interface Props { onClose: any; @@ -280,7 +281,7 @@ export class DevicePairingDialog extends React.Component { errors: null, }); this.closeDialog(); - window.pushToast({ + ToastUtils.push({ title: window.i18n('devicePairedSuccessfully'), type: 'success', }); @@ -365,7 +366,7 @@ export class DevicePairingDialog extends React.Component { private triggerUnpairDevice() { const deviceUnpaired = () => { - window.pushToast({ + ToastUtils.push({ title: window.i18n('deviceUnpaired'), }); this.closeDialog(); diff --git a/ts/components/EditProfileDialog.tsx b/ts/components/EditProfileDialog.tsx index 293bf1349..349d0db57 100644 --- a/ts/components/EditProfileDialog.tsx +++ b/ts/components/EditProfileDialog.tsx @@ -17,6 +17,7 @@ import { } from './session/icon'; import { SessionModal } from './session/SessionModal'; import { PillDivider } from './session/PillDivider'; +import { ToastUtils } from '../session/utils'; declare global { interface Window { @@ -304,7 +305,7 @@ export class EditProfileDialog extends React.Component { private copySessionID(sessionID: string) { window.clipboard.writeText(sessionID); - window.pushToast({ + ToastUtils.push({ title: window.i18n('copiedSessionID'), type: 'success', id: 'copiedSessionID', diff --git a/ts/components/MainViewController.tsx b/ts/components/MainViewController.tsx index 7c5affc38..6b644637e 100644 --- a/ts/components/MainViewController.tsx +++ b/ts/components/MainViewController.tsx @@ -15,6 +15,7 @@ export const MainViewController = { }; import { ContactType } from './session/SessionMemberListItem'; +import { ToastUtils } from '../session/utils'; export class MessageView extends React.Component { public render() { @@ -52,7 +53,7 @@ async function createClosedGroup( groupName.length === 0 || groupName.length > window.CONSTANTS.MAX_GROUP_NAME_LENGTH ) { - window.pushToast({ + ToastUtils.push({ title: window.i18n( 'invalidGroupName', window.CONSTANTS.MAX_GROUP_NAME_LENGTH @@ -69,7 +70,7 @@ async function createClosedGroup( groupMembers.length === 0 || groupMembers.length >= window.CONSTANTS.SMALL_GROUP_SIZE_LIMIT ) { - window.pushToast({ + ToastUtils.push({ title: window.i18n( 'invalidGroupSize', window.CONSTANTS.SMALL_GROUP_SIZE_LIMIT diff --git a/ts/components/session/LeftPaneContactSection.tsx b/ts/components/session/LeftPaneContactSection.tsx index 68de97471..440c4e4a8 100644 --- a/ts/components/session/LeftPaneContactSection.tsx +++ b/ts/components/session/LeftPaneContactSection.tsx @@ -22,6 +22,7 @@ import { SessionClosableOverlayType, } from './SessionClosableOverlay'; import { MainViewController } from '../MainViewController'; +import { ToastUtils } from '../../session/utils'; export interface Props { searchTerm: string; @@ -192,7 +193,7 @@ export class LeftPaneContactSection extends React.Component { const error = validateNumber(sessionID, window.i18n); if (error) { - window.pushToast({ + ToastUtils.push({ title: error, type: 'error', id: 'addContact', diff --git a/ts/components/session/LeftPaneMessageSection.tsx b/ts/components/session/LeftPaneMessageSection.tsx index ac790ff00..c4dba3713 100644 --- a/ts/components/session/LeftPaneMessageSection.tsx +++ b/ts/components/session/LeftPaneMessageSection.tsx @@ -30,6 +30,7 @@ import { SessionButtonType, } from './SessionButton'; import { OpenGroup } from '../../session/types'; +import { ToastUtils } from '../../session/utils'; export interface Props { searchTerm: string; @@ -416,7 +417,7 @@ export class LeftPaneMessageSection extends React.Component { const { openConversationInternal } = this.props; if (!this.state.valuePasted && !this.props.searchTerm) { - window.pushToast({ + ToastUtils.push({ title: window.i18n('invalidNumberError'), type: 'error', id: 'invalidPubKey', @@ -432,7 +433,7 @@ export class LeftPaneMessageSection extends React.Component { if (!error) { openConversationInternal(pubkey); } else { - window.pushToast({ + ToastUtils.push({ title: error, type: 'error', id: 'invalidPubKey', @@ -454,7 +455,7 @@ export class LeftPaneMessageSection extends React.Component { // Server URL valid? if (!OpenGroup.validate(serverUrl)) { - window.pushToast({ + ToastUtils.push({ title: window.i18n('noServerURL'), id: 'connectToServer', type: 'error', @@ -465,7 +466,7 @@ export class LeftPaneMessageSection extends React.Component { // Already connected? if (Boolean(await OpenGroup.getConversation(serverUrl))) { - window.pushToast({ + ToastUtils.push({ title: window.i18n('publicChatExists'), id: 'publicChatExists', type: 'error', @@ -476,14 +477,14 @@ export class LeftPaneMessageSection extends React.Component { // Connect to server try { - window.pushToast({ + ToastUtils.push({ title: window.i18n('connectingToServer'), id: 'connectToServer', type: 'success', }); await OpenGroup.join(serverUrl, async () => { if (await OpenGroup.serverExists(serverUrl)) { - window.pushToast({ + ToastUtils.push({ title: window.i18n('connectToServerSuccess'), id: 'connectToServer', type: 'success', @@ -507,7 +508,7 @@ export class LeftPaneMessageSection extends React.Component { } } catch (e) { window.console.error('Failed to connect to server:', e); - window.pushToast({ + ToastUtils.push({ title: window.i18n('connectToServerFail'), id: 'connectToServer', type: 'error', @@ -532,7 +533,7 @@ export class LeftPaneMessageSection extends React.Component { () => { this.handleToggleOverlay(undefined); - window.pushToast({ + ToastUtils.push({ title: window.i18n('closedGroupCreatedToastTitle'), type: 'success', }); diff --git a/ts/components/session/RegistrationTabs.tsx b/ts/components/session/RegistrationTabs.tsx index 71fa3aac7..52c6f4b21 100644 --- a/ts/components/session/RegistrationTabs.tsx +++ b/ts/components/session/RegistrationTabs.tsx @@ -11,7 +11,7 @@ import { trigger } from '../../shims/events'; import { SessionHtmlRenderer } from './SessionHTMLRenderer'; import { SessionIdEditable } from './SessionIdEditable'; import { SessionSpinner } from './SessionSpinner'; -import { StringUtils } from '../../session/utils'; +import { StringUtils, ToastUtils } from '../../session/utils'; enum SignInMode { Default, @@ -803,7 +803,7 @@ export class RegistrationTabs extends React.Component<{}, State> { if (!trimName) { window.log.warn('invalid trimmed name for registration'); - window.pushToast({ + ToastUtils.push({ title: window.i18n('displayNameEmpty'), type: 'error', id: 'invalidDisplayName', @@ -814,7 +814,7 @@ export class RegistrationTabs extends React.Component<{}, State> { if (passwordErrorString) { window.log.warn('invalid password for registration'); - window.pushToast({ + ToastUtils.push({ title: window.i18n('invalidPassword'), type: 'error', id: 'invalidPassword', @@ -826,7 +826,7 @@ export class RegistrationTabs extends React.Component<{}, State> { if (!!password && !passwordFieldsMatch) { window.log.warn('passwords does not match for registration'); - window.pushToast({ + ToastUtils.push({ title: window.i18n('passwordsDoNotMatch'), type: 'error', id: 'invalidPassword', @@ -864,7 +864,7 @@ export class RegistrationTabs extends React.Component<{}, State> { ); trigger('openInbox'); } catch (e) { - window.pushToast({ + ToastUtils.push({ title: `Error: ${e.message || 'Something went wrong'}`, type: 'error', id: 'registrationError', @@ -895,7 +895,7 @@ export class RegistrationTabs extends React.Component<{}, State> { // tslint:disable-next-line: no-backbone-get-set-outside-model if (window.textsecure.storage.get('secondaryDeviceStatus') === 'ongoing') { window.log.warn('registering secondary device already ongoing'); - window.pushToast({ + ToastUtils.push({ title: window.i18n('pairingOngoing'), type: 'error', id: 'pairingOngoing', @@ -938,7 +938,7 @@ export class RegistrationTabs extends React.Component<{}, State> { const validationError = c.validateNumber(); if (validationError) { onError('Invalid public key').ignore(); - window.pushToast({ + ToastUtils.push({ title: window.i18n('invalidNumberError'), type: 'error', id: 'invalidNumberError', diff --git a/ts/components/session/SessionPasswordModal.tsx b/ts/components/session/SessionPasswordModal.tsx index 9e9d4b19f..99a5b485f 100644 --- a/ts/components/session/SessionPasswordModal.tsx +++ b/ts/components/session/SessionPasswordModal.tsx @@ -3,6 +3,7 @@ import React from 'react'; import { SessionModal } from './SessionModal'; import { SessionButton, SessionButtonColor } from './SessionButton'; import { PasswordUtil } from '../../util/'; +import { ToastUtils } from '../../session/utils'; export enum PasswordAction { Set = 'set', Change = 'change', @@ -232,16 +233,12 @@ export class SessionPasswordModal extends React.Component { throw new Error(`Invalid action ${action}`); } - const toastParams = { + ToastUtils.push({ + id: 'set-password-success-toast', + type: action !== Remove ? 'success' : 'warning', title: title, description: description, - type: action !== Remove ? 'success' : 'warning', icon: action !== Remove ? 'lock' : undefined, - }; - - window.pushToast({ - id: 'set-password-success-toast', - ...toastParams, }); onSuccess(this.props.action); @@ -265,7 +262,7 @@ export class SessionPasswordModal extends React.Component { ) ); - window.pushToast({ + ToastUtils.push({ title, type: 'warning', }); diff --git a/ts/components/session/SessionSeedModal.tsx b/ts/components/session/SessionSeedModal.tsx index adfcb63b6..b6590bbe2 100644 --- a/ts/components/session/SessionSeedModal.tsx +++ b/ts/components/session/SessionSeedModal.tsx @@ -2,6 +2,7 @@ import React from 'react'; import { SessionModal } from './SessionModal'; import { SessionButton } from './SessionButton'; +import { ToastUtils } from '../../session/utils'; interface Props { onClose: any; @@ -212,7 +213,7 @@ export class SessionSeedModal extends React.Component { private copySeed(seed: string) { window.clipboard.writeText(seed); - window.pushToast({ + ToastUtils.push({ title: window.i18n('copiedMnemonic'), type: 'success', id: 'copySeedToast', diff --git a/ts/components/session/settings/SessionSettings.tsx b/ts/components/session/settings/SessionSettings.tsx index cd956000f..5c81717be 100644 --- a/ts/components/session/settings/SessionSettings.tsx +++ b/ts/components/session/settings/SessionSettings.tsx @@ -10,7 +10,7 @@ import { import { BlockedNumberController, UserUtil } from '../../../util'; import { MultiDeviceProtocol } from '../../../session/protocols'; import { PubKey } from '../../../session/types'; -import { NumberUtils } from '../../../session/utils'; +import { NumberUtils, ToastUtils } from '../../../session/utils'; export enum SessionSettingCategory { Appearance = 'appearance', @@ -103,7 +103,7 @@ export class SettingsView extends React.Component { if (category === SessionSettingCategory.Devices) { // special case for linked devices settings = this.getLinkedDeviceSettings(); - } else if(category === SessionSettingCategory.Blocked) { + } else if (category === SessionSettingCategory.Blocked) { // special case for blocked user settings = this.getBlockedUserSettings(); } else { diff --git a/ts/session/utils/Toast.ts b/ts/session/utils/Toast.ts new file mode 100644 index 000000000..bf2edb945 --- /dev/null +++ b/ts/session/utils/Toast.ts @@ -0,0 +1,10 @@ +export function push(options: { + title: string; + id?: string; + description?: string; + type?: 'success' | 'info' | 'warning' | 'error'; + icon?: string; + shouldFade?: boolean; +}) { + window.pushToast(options); +} diff --git a/ts/session/utils/index.ts b/ts/session/utils/index.ts index b38705d0e..bf9e1f969 100644 --- a/ts/session/utils/index.ts +++ b/ts/session/utils/index.ts @@ -6,6 +6,7 @@ import * as NumberUtils from './Number'; import * as PromiseUtils from './Promise'; import * as ProtobufUtils from './Protobuf'; import * as MenuUtils from './Menu'; +import * as ToastUtils from './Toast'; export * from './Attachments'; export * from './TypedEmitter'; @@ -20,4 +21,5 @@ export { PromiseUtils, ProtobufUtils, MenuUtils, + ToastUtils, }; From 4fbbbc26a4dd32a97604bf4ea4da7bd2743e8e68 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 14 Aug 2020 10:56:44 +1000 Subject: [PATCH 044/274] make blockled list number updates on unblock --- _locales/en/messages.json | 3 +++ .../session/settings/SessionSettings.tsx | 26 ++++++++++--------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 108077218..428f97e0c 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1563,6 +1563,9 @@ "unblockUser": { "message": "Unblock User" }, + "unblocked": { + "message": "Unblocked" + }, "blockedSettingsTitle": { "message": "Blocked Users", "description": "Shown in the settings page as the heading for the blocked user settings" diff --git a/ts/components/session/settings/SessionSettings.tsx b/ts/components/session/settings/SessionSettings.tsx index 5c81717be..043dcd6dd 100644 --- a/ts/components/session/settings/SessionSettings.tsx +++ b/ts/components/session/settings/SessionSettings.tsx @@ -600,22 +600,20 @@ export class SettingsView extends React.Component { const blockedNumbers = BlockedNumberController.getBlockedNumbers(); for (const blockedNumber of blockedNumbers) { - - let displayName = `User (...${blockedNumber.substr(-6)})`; + let title: string; const currentModel = window.ConversationController.get(blockedNumber); - if ( - currentModel && - currentModel.attributes.profile && - currentModel.attributes.profile.displayName - ) { - displayName = currentModel.attributes.profile.displayName - } + title = + currentModel.getProfileName() || + currentModel.getName() || + window.i18n('anonymous'); + + title = `${title} ${window.shortenPubkey(blockedNumber)}`; results.push({ id: blockedNumber, - title: displayName, - description: blockedNumber, + title, + description: '', type: SessionSettingType.Button, category: SessionSettingCategory.Blocked, content: { @@ -624,7 +622,11 @@ export class SettingsView extends React.Component { }, comparisonValue: undefined, setFn: async () => { - await BlockedNumberController.unblock(blockedNumber) + await currentModel.unblock(); + ToastUtils.push({ + title: window.i18n('unblocked'), + id: 'unblocked', + }); }, hidden: false, onClick: undefined, From 9d4dff611fa960b7015bffdeff2f3e315a374dc9 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 14 Aug 2020 11:25:31 +1000 Subject: [PATCH 045/274] simplify Copied xxx => Copied to clipboard --- _locales/en/messages.json | 17 ++--------------- js/models/conversations.js | 6 ++---- js/models/messages.js | 4 ++-- ts/components/ConversationListItem.tsx | 4 ++-- ts/components/EditProfileDialog.tsx | 4 ++-- .../conversation/ConversationHeader.tsx | 2 +- ts/components/session/SessionSeedModal.tsx | 2 +- 7 files changed, 12 insertions(+), 27 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 8e0d86808..973f047eb 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1616,14 +1616,6 @@ "noContactsForGroup": { "message": "You don't have any contacts to start a group with." }, - "copiedPublicKey": { - "message": "Session ID copied", - "description": "A toast message telling the user that the key was copied" - }, - "copiedChatId": { - "message": "Copied chat ID", - "description": "A toast message telling the user that the key was copied" - }, "copyMessage": { "message": "Copy message text", "description": "Button action that the user can click to copy their public keys" @@ -1720,13 +1712,8 @@ "message": "Please enter an open group URL", "description": "Error message when no server url entered" }, - "copiedMnemonic": { - "message": "Recovery phrase copied successfully", - "description": "A toast message telling the user that the mnemonic seed was copied" - }, - "copiedSessionID": { - "message": "Copied Session ID to clipboard", - "description": "A toast message telling the user that their Session ID was copied" + "copiedToClipboard": { + "message": "Copied to clipboard" }, "passwordViewTitle": { "message": "Type In Your Password", diff --git a/js/models/conversations.js b/js/models/conversations.js index 2f38ae439..cf1e6e36a 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -2310,14 +2310,12 @@ copyPublicKey() { clipboard.writeText(this.id); - const copiedMessage = this.isGroup() - ? i18n('copiedChatId') - : i18n('copiedPublicKey'); + const copiedMessage = i18n('copiedToClipboard'); window.pushToast({ title: copiedMessage, type: 'success', - id: 'copiedPublicKey', + id: 'copiedToClipboard', }); }, diff --git a/js/models/messages.js b/js/models/messages.js index 777825217..6aca3a49c 100644 --- a/js/models/messages.js +++ b/js/models/messages.js @@ -935,9 +935,9 @@ } window.pushToast({ - title: i18n('copiedPublicKey'), + title: i18n('copiedToClipboard'), type: 'success', - id: 'copiedPublicKey', + id: 'copiedToClipboard', }); }, diff --git a/ts/components/ConversationListItem.tsx b/ts/components/ConversationListItem.tsx index 3eee60730..076e13976 100644 --- a/ts/components/ConversationListItem.tsx +++ b/ts/components/ConversationListItem.tsx @@ -14,7 +14,7 @@ import { Colors, LocalizerType } from '../types/Util'; import { getBlockMenuItem, getClearNicknameMenuItem, - getCopyIdMenuItem, + getCopyMenuItem, getDeleteContactMenuItem, getDeleteMessagesMenuItem, getInviteContactMenuItem, @@ -210,7 +210,7 @@ export class ConversationListItem extends React.PureComponent { onClearNickname, i18n )} - {getCopyIdMenuItem( + {getCopyMenuItem( isPublic, isRss, type === 'group', diff --git a/ts/components/EditProfileDialog.tsx b/ts/components/EditProfileDialog.tsx index 293bf1349..888794fbf 100644 --- a/ts/components/EditProfileDialog.tsx +++ b/ts/components/EditProfileDialog.tsx @@ -305,9 +305,9 @@ export class EditProfileDialog extends React.Component { window.clipboard.writeText(sessionID); window.pushToast({ - title: window.i18n('copiedSessionID'), + title: window.i18n('copiedToClipboard'), type: 'success', - id: 'copiedSessionID', + id: 'copiedToClipboard', }); } diff --git a/ts/components/conversation/ConversationHeader.tsx b/ts/components/conversation/ConversationHeader.tsx index 0a0cb578f..71aac74d0 100644 --- a/ts/components/conversation/ConversationHeader.tsx +++ b/ts/components/conversation/ConversationHeader.tsx @@ -304,7 +304,7 @@ export class ConversationHeader extends React.Component { return ( {this.renderPublicMenuItems()} - {Menu.getCopyIdMenuItem( + {Menu.getCopyMenuItem( isPublic, isRss, isGroup, diff --git a/ts/components/session/SessionSeedModal.tsx b/ts/components/session/SessionSeedModal.tsx index adfcb63b6..c2730fac3 100644 --- a/ts/components/session/SessionSeedModal.tsx +++ b/ts/components/session/SessionSeedModal.tsx @@ -213,7 +213,7 @@ export class SessionSeedModal extends React.Component { window.clipboard.writeText(seed); window.pushToast({ - title: window.i18n('copiedMnemonic'), + title: window.i18n('copiedToClipboard'), type: 'success', id: 'copySeedToast', }); From 13b28e565d751dceeb1caa8f1ff220322e5c18ee Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 14 Aug 2020 11:25:54 +1000 Subject: [PATCH 046/274] hide copy option for closed group --- ts/session/utils/Menu.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ts/session/utils/Menu.tsx b/ts/session/utils/Menu.tsx index 18faef424..eb8b54e44 100644 --- a/ts/session/utils/Menu.tsx +++ b/ts/session/utils/Menu.tsx @@ -54,8 +54,8 @@ function showDeleteMessages(isPublic: boolean): boolean { return !isPublic; } -function showCopyId(isPublic: boolean, isRss: boolean | undefined): boolean { - return !isPublic && !isRss; +function showCopyId(isPublic: boolean, isRss: boolean, isGroup: boolean): boolean { + return !isGroup && !isRss; } function showDeleteContact( @@ -201,14 +201,14 @@ export function getAddModeratorsMenuItem( return null; } -export function getCopyIdMenuItem( +export function getCopyMenuItem( isPublic: boolean | undefined, isRss: boolean | undefined, isGroup: boolean | undefined, action: any, i18n: LocalizerType ): JSX.Element | null { - if (showCopyId(Boolean(isPublic), Boolean(isRss))) { + if (showCopyId(Boolean(isPublic), Boolean(isRss), Boolean(isGroup))) { const copyIdLabel = i18n('editMenuCopy'); return {copyIdLabel}; } From dc77e6e44e9601460ecc94ab2113f7590d2ae602 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 14 Aug 2020 14:22:54 +1000 Subject: [PATCH 047/274] remove toggle use sender keys. Rely on lokiFeatureFlag directly --- stylesheets/_session.scss | 11 ------- .../session/SessionClosableOverlay.tsx | 33 +++++-------------- 2 files changed, 8 insertions(+), 36 deletions(-) diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index 5838f929d..b5a16d233 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -674,17 +674,6 @@ label { } } -.sealed-sender-toggle { - display: flex; - padding: 6px; -} - -.sender-keys-description { - display: flex; - align-items: center; - padding-left: 10px; -} - .session-modal__body { display: flex; flex-direction: column; diff --git a/ts/components/session/SessionClosableOverlay.tsx b/ts/components/session/SessionClosableOverlay.tsx index 28aafe99c..5debae1e4 100644 --- a/ts/components/session/SessionClosableOverlay.tsx +++ b/ts/components/session/SessionClosableOverlay.tsx @@ -37,7 +37,6 @@ interface Props { interface State { groupName: string; selectedMembers: Array; - senderKeys: boolean; } export class SessionClosableOverlay extends React.Component { @@ -49,7 +48,6 @@ export class SessionClosableOverlay extends React.Component { this.state = { groupName: '', selectedMembers: [], - senderKeys: false, }; this.inputRef = React.createRef(); @@ -160,7 +158,7 @@ export class SessionClosableOverlay extends React.Component { default: } - const { groupName, selectedMembers, senderKeys } = this.state; + const { groupName, selectedMembers } = this.state; const ourSessionID = window.textsecure.storage.user.getNumber(); const contacts = this.getContacts(); @@ -256,33 +254,18 @@ export class SessionClosableOverlay extends React.Component { /> )} - {isClosedGroupView && window.lokiFeatureFlags.enableSenderKeys && ( -
- { - const value = this.state.senderKeys; - this.setState({ senderKeys: !value }); - }} - /> - - - {window.i18n('useSenderKeys')} - -
- )} - onButtonClick(groupName, selectedMembers, senderKeys)} + onClick={() => + onButtonClick( + groupName, + selectedMembers, + window.lokiFeatureFlags.enableSenderKeys + ) + } /> ); From 86f8fe54ae7c7dea4cfb28b607efc2a662509d7f Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Sat, 15 Aug 2020 13:21:35 +0200 Subject: [PATCH 048/274] Check for model in blocked settings --- ts/components/session/settings/SessionSettings.tsx | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/ts/components/session/settings/SessionSettings.tsx b/ts/components/session/settings/SessionSettings.tsx index 043dcd6dd..f98269898 100644 --- a/ts/components/session/settings/SessionSettings.tsx +++ b/ts/components/session/settings/SessionSettings.tsx @@ -603,11 +603,15 @@ export class SettingsView extends React.Component { let title: string; const currentModel = window.ConversationController.get(blockedNumber); - title = + if (currentModel) { + title = currentModel.getProfileName() || currentModel.getName() || window.i18n('anonymous'); - + } else { + title = window.i18n('anonymous'); + } + title = `${title} ${window.shortenPubkey(blockedNumber)}`; results.push({ @@ -622,7 +626,11 @@ export class SettingsView extends React.Component { }, comparisonValue: undefined, setFn: async () => { - await currentModel.unblock(); + if (currentModel) { + await currentModel.unblock(); + } else { + await BlockedNumberController.unblock(blockedNumber) + } ToastUtils.push({ title: window.i18n('unblocked'), id: 'unblocked', From 2f35d9d2a64fc17ddb2694963add06a11b75a9c5 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Sat, 15 Aug 2020 13:58:24 +0200 Subject: [PATCH 049/274] lint fix --- ts/components/session/settings/SessionSettings.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ts/components/session/settings/SessionSettings.tsx b/ts/components/session/settings/SessionSettings.tsx index f98269898..41dc10d82 100644 --- a/ts/components/session/settings/SessionSettings.tsx +++ b/ts/components/session/settings/SessionSettings.tsx @@ -605,13 +605,13 @@ export class SettingsView extends React.Component { const currentModel = window.ConversationController.get(blockedNumber); if (currentModel) { title = - currentModel.getProfileName() || - currentModel.getName() || - window.i18n('anonymous'); + currentModel.getProfileName() || + currentModel.getName() || + window.i18n('anonymous'); } else { title = window.i18n('anonymous'); } - + title = `${title} ${window.shortenPubkey(blockedNumber)}`; results.push({ @@ -629,7 +629,7 @@ export class SettingsView extends React.Component { if (currentModel) { await currentModel.unblock(); } else { - await BlockedNumberController.unblock(blockedNumber) + await BlockedNumberController.unblock(blockedNumber); } ToastUtils.push({ title: window.i18n('unblocked'), From 38c099cdf0297b2ef0275c8ae01a88d04bb7f9a7 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 17 Aug 2020 11:21:57 +1000 Subject: [PATCH 050/274] rename seed to recovery phrase --- .../session/LeftPaneSettingSection.tsx | 6 ++-- ts/components/session/SessionSeedModal.tsx | 34 +++++++++---------- .../session/settings/SessionSettings.tsx | 2 +- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/ts/components/session/LeftPaneSettingSection.tsx b/ts/components/session/LeftPaneSettingSection.tsx index a1e4f7645..699dcb23b 100644 --- a/ts/components/session/LeftPaneSettingSection.tsx +++ b/ts/components/session/LeftPaneSettingSection.tsx @@ -151,8 +151,8 @@ export class LeftPaneSettingSection extends React.Component { const dangerButtonText = isSecondaryDevice ? window.i18n('unpairDevice') - : window.i18n('deleteAccount'); - const showSeed = window.i18n('showSeed'); + : window.i18n('clearAllData'); + const showRecoveryPhrase = window.i18n('showRecoveryPhrase'); return (
@@ -164,7 +164,7 @@ export class LeftPaneSettingSection extends React.Component { /> {!isSecondaryDevice && ( { error: '', loadingPassword: true, loadingSeed: true, - seed: '', + recoveryPhrase: '', hasPassword: null, passwordHash: '', passwordValid: false, }; - this.copySeed = this.copySeed.bind(this); - this.getSeed = this.getSeed.bind(this); + this.copyRecoveryPhrase = this.copyRecoveryPhrase.bind(this); + this.getRecoveryPhrase = this.getRecoveryPhrase.bind(this); this.confirmPassword = this.confirmPassword.bind(this); this.checkHasPassword = this.checkHasPassword.bind(this); this.onEnter = this.onEnter.bind(this); @@ -47,7 +47,7 @@ export class SessionSeedModal extends React.Component { const i18n = window.i18n; this.checkHasPassword(); - this.getSeed().ignore(); + this.getRecoveryPhrase().ignore(); const { onClose } = this.props; const { hasPassword, passwordValid } = this.state; @@ -57,7 +57,7 @@ export class SessionSeedModal extends React.Component { <> {!loading && ( null} onClose={onClose} > @@ -102,7 +102,7 @@ export class SessionSeedModal extends React.Component {
@@ -126,7 +126,7 @@ export class SessionSeedModal extends React.Component {

- {this.state.seed} + {this.state.recoveryPhrase}
@@ -134,9 +134,9 @@ export class SessionSeedModal extends React.Component { { - this.copySeed(this.state.seed); + this.copyRecoveryPhrase(this.state.recoveryPhrase); }} />
@@ -194,29 +194,29 @@ export class SessionSeedModal extends React.Component { }); } - private async getSeed() { - if (this.state.seed) { + private async getRecoveryPhrase() { + if (this.state.recoveryPhrase) { return false; } const manager = await window.getAccountManager(); - const seed = manager.getCurrentMnemonic(); + const recoveryPhrase = manager.getCurrentMnemonic(); this.setState({ - seed, + recoveryPhrase, loadingSeed: false, }); return true; } - private copySeed(seed: string) { - window.clipboard.writeText(seed); + private copyRecoveryPhrase(recoveryPhrase: string) { + window.clipboard.writeText(recoveryPhrase); ToastUtils.push({ title: window.i18n('copiedToClipboard'), type: 'success', - id: 'copySeedToast', + id: 'copyRecoveryPhraseToast', }); } diff --git a/ts/components/session/settings/SessionSettings.tsx b/ts/components/session/settings/SessionSettings.tsx index 043dcd6dd..0a727a4ed 100644 --- a/ts/components/session/settings/SessionSettings.tsx +++ b/ts/components/session/settings/SessionSettings.tsx @@ -192,7 +192,7 @@ export class SettingsView extends React.Component {
From 730c520b222784e8bcb171c2ccbcdff9a68406fc Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 17 Aug 2020 11:29:14 +1000 Subject: [PATCH 051/274] remove seed name from Registration tabs components --- ts/components/session/RegistrationTabs.tsx | 66 +++++++++++----------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/ts/components/session/RegistrationTabs.tsx b/ts/components/session/RegistrationTabs.tsx index 52c6f4b21..6faec374e 100644 --- a/ts/components/session/RegistrationTabs.tsx +++ b/ts/components/session/RegistrationTabs.tsx @@ -15,7 +15,7 @@ import { StringUtils, ToastUtils } from '../../session/utils'; enum SignInMode { Default, - UsingSeed, + UsingRecoveryPhrase, LinkingDevice, } @@ -40,8 +40,8 @@ interface State { validatePassword: string; passwordErrorString: string; passwordFieldsMatch: boolean; - mnemonicSeed: string; - generatedMnemonicSeed: string; + recoveryPhrase: string; + generatedRecoveryPhrase: string; hexGeneratedPubKey: string; primaryDevicePubKey: string; mnemonicError: string | undefined; @@ -116,8 +116,8 @@ export class RegistrationTabs extends React.Component<{}, State> { validatePassword: '', passwordErrorString: '', passwordFieldsMatch: false, - mnemonicSeed: '', - generatedMnemonicSeed: '', + recoveryPhrase: '', + generatedRecoveryPhrase: '', hexGeneratedPubKey: '', primaryDevicePubKey: '', mnemonicError: undefined, @@ -165,7 +165,7 @@ export class RegistrationTabs extends React.Component<{}, State> { } private async generateMnemonicAndKeyPair() { - if (this.state.generatedMnemonicSeed === '') { + if (this.state.generatedRecoveryPhrase === '') { const language = 'english'; const mnemonic = await this.accountManager.generateMnemonic(language); @@ -184,7 +184,7 @@ export class RegistrationTabs extends React.Component<{}, State> { const hexGeneratedPubKey = StringUtils.decode(keyPair.pubKey, 'hex'); this.setState({ - generatedMnemonicSeed: mnemonic, + generatedRecoveryPhrase: mnemonic, hexGeneratedPubKey, // our 'frontend' sessionID }); } @@ -203,7 +203,7 @@ export class RegistrationTabs extends React.Component<{}, State> { validatePassword: '', passwordErrorString: '', passwordFieldsMatch: false, - mnemonicSeed: '', + recoveryPhrase: '', primaryDevicePubKey: '', mnemonicError: undefined, displayNameError: undefined, @@ -212,8 +212,8 @@ export class RegistrationTabs extends React.Component<{}, State> { private onSeedChanged(val: string) { this.setState({ - mnemonicSeed: val, - mnemonicError: !val ? window.i18n('mnemonicEmpty') : undefined, + recoveryPhrase: val, + mnemonicError: !val ? window.i18n('recoveryPhraseEmpty') : undefined, }); } @@ -397,13 +397,13 @@ export class RegistrationTabs extends React.Component<{}, State> { private renderRegistrationContent() { const { signInMode, signUpMode } = this.state; - if (signInMode === SignInMode.UsingSeed) { + if (signInMode === SignInMode.UsingRecoveryPhrase) { return (
{ this.onSeedChanged(val); @@ -553,7 +553,7 @@ export class RegistrationTabs extends React.Component<{}, State> { if (signInMode === SignInMode.Default) { return (
- {this.renderRestoreUsingSeedButton( + {this.renderRestoreUsingRecoveryPhraseButton( SessionButtonType.BrandOutline, SessionButtonColor.Green )} @@ -574,7 +574,7 @@ export class RegistrationTabs extends React.Component<{}, State> { {!this.state.secretWords && ( <>

{or}

- {this.renderRestoreUsingSeedButton( + {this.renderRestoreUsingRecoveryPhraseButton( SessionButtonType.BrandOutline, SessionButtonColor.White )} @@ -606,7 +606,7 @@ export class RegistrationTabs extends React.Component<{}, State> { } private handleContinueYourSessionClick() { - if (this.state.signInMode === SignInMode.UsingSeed) { + if (this.state.signInMode === SignInMode.UsingRecoveryPhrase) { this.register('english').ignore(); } else { this.registerSecondaryDevice().ignore(); @@ -623,17 +623,17 @@ export class RegistrationTabs extends React.Component<{}, State> { mnemonicError, primaryDevicePubKey, displayName, - mnemonicSeed, + recoveryPhrase, password, } = this.state; let enableContinue = true; let text = window.i18n('continueYourSession'); const displayNameOK = !displayNameError && !!displayName; // Display name required - const mnemonicOK = !mnemonicError && !!mnemonicSeed; // Mnemonic required + const mnemonicOK = !mnemonicError && !!recoveryPhrase; // Mnemonic required const passwordsOK = !password || (!passwordErrorString && passwordFieldsMatch); // password is valid if empty, or if no error and fields are matching - if (signInMode === SignInMode.UsingSeed) { + if (signInMode === SignInMode.UsingRecoveryPhrase) { enableContinue = displayNameOK && mnemonicOK && passwordsOK; } else if (signInMode === SignInMode.LinkingDevice) { enableContinue = !!primaryDevicePubKey; @@ -670,7 +670,7 @@ export class RegistrationTabs extends React.Component<{}, State> { ); } - private renderRestoreUsingSeedButton( + private renderRestoreUsingRecoveryPhraseButton( buttonType: SessionButtonType, buttonColor: SessionButtonColor ) { @@ -679,16 +679,16 @@ export class RegistrationTabs extends React.Component<{}, State> { onClick={() => { this.cancelSecondaryDevice().ignore(); this.setState({ - signInMode: SignInMode.UsingSeed, + signInMode: SignInMode.UsingRecoveryPhrase, primaryDevicePubKey: '', - mnemonicSeed: '', + recoveryPhrase: '', displayName: '', signUpMode: SignUpMode.Default, }); }} buttonType={buttonType} buttonColor={buttonColor} - text={window.i18n('restoreUsingSeed')} + text={window.i18n('restoreUsingRecoveryPhrase')} /> ); } @@ -699,7 +699,7 @@ export class RegistrationTabs extends React.Component<{}, State> { onClick={() => { this.setState({ signInMode: SignInMode.LinkingDevice, - mnemonicSeed: '', + recoveryPhrase: '', displayName: '', signUpMode: SignUpMode.Default, }); @@ -719,7 +719,7 @@ export class RegistrationTabs extends React.Component<{}, State> { return; } - if (signInMode === SignInMode.UsingSeed) { + if (signInMode === SignInMode.UsingRecoveryPhrase) { this.handleContinueYourSessionClick(); return; @@ -789,8 +789,8 @@ export class RegistrationTabs extends React.Component<{}, State> { private async register(language: string) { const { password, - mnemonicSeed, - generatedMnemonicSeed, + recoveryPhrase, + generatedRecoveryPhrase, signInMode, displayName, passwordErrorString, @@ -835,11 +835,11 @@ export class RegistrationTabs extends React.Component<{}, State> { return; } - if (signInMode === SignInMode.UsingSeed && !mnemonicSeed) { + if (signInMode === SignInMode.UsingRecoveryPhrase && !recoveryPhrase) { window.log.warn('empty mnemonic seed passed in seed restoration mode'); return; - } else if (!generatedMnemonicSeed) { + } else if (!generatedRecoveryPhrase) { window.log.warn('empty generated seed'); return; @@ -849,9 +849,9 @@ export class RegistrationTabs extends React.Component<{}, State> { window.textsecure.storage.remove('secondaryDeviceStatus'); const seedToUse = - signInMode === SignInMode.UsingSeed - ? mnemonicSeed - : generatedMnemonicSeed; + signInMode === SignInMode.UsingRecoveryPhrase + ? recoveryPhrase + : generatedRecoveryPhrase; try { await this.resetRegistration(); @@ -947,7 +947,7 @@ export class RegistrationTabs extends React.Component<{}, State> { return; } try { - const fakeMnemonic = this.state.mnemonicSeed; + const fakeMnemonic = this.state.recoveryPhrase; await this.accountManager.registerSingleDevice( fakeMnemonic, From 70b739d24f54c554b3d6282032a3a4ed3df81918 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 17 Aug 2020 11:36:25 +1000 Subject: [PATCH 052/274] update translation to match android - part 1 --- _locales/en/messages.json | 439 ++++++++++-------- app/menu.js | 6 +- app/sql.js | 2 +- app/tray_icon.js | 2 +- js/models/conversations.js | 4 +- js/views/app_view.js | 13 +- js/views/conversation_view.js | 1 + js/views/inbox_view.js | 1 - js/views/network_status_view.js | 2 +- main.js | 6 +- ts/components/SearchResults.tsx | 2 +- ts/components/conversation/ContactDetail.tsx | 46 +- .../conversation/ConversationHeader.tsx | 8 +- ts/components/conversation/Message.tsx | 22 +- .../conversation/StagedLinkPreview.tsx | 2 +- .../session/LeftPaneSettingSection.tsx | 8 +- .../session/SessionPasswordPrompt.tsx | 2 +- ts/components/session/SessionSeedModal.tsx | 17 +- ts/session/utils/Menu.tsx | 8 +- ts/state/selectors/conversations.ts | 2 +- 20 files changed, 301 insertions(+), 292 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 90191839b..d731e557b 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1,27 +1,27 @@ { "privacyPolicy": { "message": "Terms & Privacy Policy", - "description": "Shown in the about box for the link to https://getsession.org/privacy-policy/" + "description": "Shown in the about box for the link to https://getsession.org/privacy-policy/", + "androidKey": "RegistrationActivity_terms_and_privacy" }, "copyErrorAndQuit": { "message": "Copy error and quit", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Unknown group", - "description": "Shown as the name of a group if we don't have any information about it" + "unknown": { + "message": "Unknown", + "description": "Shown as the name of a group if we don't have any information about it", + "androidKey": "NotificationChannel_missing_display_name" }, "databaseError": { "message": "Database Error", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Delete all data and restart", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "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." + "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.", + "androidKey": "attachment_type_selector__file_description", + "addStart": "&" }, "mainMenuEdit": { "message": "&Edit", @@ -29,7 +29,10 @@ }, "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." + "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.", + "androidKey": "message_recipients_list_item__view", + "addStart": "&", + "camelCase": true }, "mainMenuWindow": { "message": "&Window", @@ -37,7 +40,9 @@ }, "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." + "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.", + "androidKey": "text_secure_normal__help", + "addStart": "&" }, "appMenuHide": { "message": "Hide", @@ -57,7 +62,9 @@ }, "editMenuUndo": { "message": "Undo", - "description": "Edit menu command to remove recently-typed text" + "description": "Edit menu command to remove recently-typed text", + "androidKey": "ConversationListFragment_undo", + "camelCase": true }, "editMenuRedo": { "message": "Redo", @@ -69,7 +76,8 @@ }, "editMenuCopy": { "message": "Copy", - "description": "Edit menu command to add selected text to clipboard" + "description": "Edit menu command to add selected text to clipboard", + "androidKey": "copy" }, "editMenuPaste": { "message": "Paste", @@ -81,11 +89,13 @@ }, "editMenuDelete": { "message": "Delete", - "description": "Edit menu command to remove the selected text" + "description": "Edit menu command to remove the selected text", + "androidKey": "delete" }, "editMenuSelectAll": { "message": "Select All", - "description": "Edit menu comand to select all of the text in selected text box" + "description": "Edit menu comand to select all of the text in selected text box", + "androidKey": "conversation_list_batch__menu_select_all" }, "editMenuStartSpeaking": { "message": "Start speaking", @@ -149,7 +159,8 @@ }, "loading": { "message": "Loading...", - "description": "Message shown on the loading screen before we've loaded any messages" + "description": "Message shown on the loading screen before we've loaded any messages", + "androidKey": "ConversationListFragment_loading" }, "optimizingApplication": { "message": "Optimizing application...", @@ -223,15 +234,19 @@ }, "view": { "message": "View", - "description": "Used as a label on a button allowing user to see more information" + "description": "Used as a label on a button allowing user to see more information", + "androidKey": "message_recipients_list_item__view", + "camelCase": true }, "youLeftTheGroup": { - "message": "You left the group", - "description": "Displayed when a user can't send a message because they have left the group" + "message": "You have left the group.", + "description": "Displayed when a user can't send a message because they have left the group", + "androidKey": "MessageRecord_left_group" }, "youGotKickedFromGroup": { "message": "You were removed from the group", - "description": "Displayed when a user can't send a message because they have left the group" + "description": "Displayed when a user can't send a message because they have left the group", + "androidKey": "GroupUtil_you_were_removed_from_group" }, "unreadMessage": { "message": "$count$ Unread Message", @@ -241,7 +256,9 @@ "content": "$1", "example": "5" } - } + }, + "androidKey": "ConversationAdapter_n_unread_messages", + "androidKeyCount": "one" }, "unreadMessages": { "message": "$count$ Unread Messages", @@ -251,46 +268,64 @@ "content": "$1", "example": "5" } - } + }, + "androidKey": "ConversationAdapter_n_unread_messages", + "androidKeyCount": "other" }, "youMarkedAsVerified": { - "message": "You marked your Safety Number with $name$ as verified", + "message": "You marked your safety number with $name$ verified", "description": "Shown in the conversation history when the user marks a contact as verified.", "placeholders": { "name": { "content": "$1", "example": "Bob" } + }, + "androidKey": "MessageRecord_you_marked_your_safety_number_with_s_verified", + "androidReplace": { + "%s": "$name$" } }, "youMarkedAsNotVerified": { - "message": "You marked your Safety Number with $name$ as not verified", + "message": "You marked your safety number with $name$ unverified", "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" } + }, + "androidKey": "MessageRecord_you_marked_your_safety_number_with_s_unverified", + "androidReplace": { + "%s": "$name$" } }, "youMarkedAsVerifiedOtherDevice": { - "message": "You marked your Safety Number with $name$ as verified from another device", + "message": "You marked your safety number with $name$ 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" } + }, + "androidKey": "MessageRecord_you_marked_your_safety_number_with_s_verified_from_another_device", + "androidReplace": { + "%s": "$name$" } }, "youMarkedAsNotVerifiedOtherDevice": { - "message": "You marked your Safety Number with $name$ as not verified from another device", + "message": "You marked your safety number with $name$ unverified 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" } + }, + "androidKey": "MessageRecord_you_marked_your_safety_number_with_s_unverified_from_another_device", + "androidReplace": { + "%s": "$name$" } }, "membersNeedingVerification": { @@ -298,20 +333,26 @@ "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." }, "changedSinceVerifiedTitle": { - "message": "Safety Number Changed" + "message": "Safety Number Changed", + "androidKey": "ThreadRecord_safety_number_changed", + "wordCapitalize": true }, "changedSinceVerifiedMultiple": { "message": "Your safety numbers with multiple group members have changed since you last verified. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Your safety number with $name$ has changed since you last verified. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session.", + "message": "Your safety number with $name$ has changed and is no longer verified. This could either mean that someone is trying to intercept your communication, or that $name$ simply reinstalled Session", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { "content": "$1", "example": "Bob" } + }, + "androidKey": "IdentityUtil_unverified_dialog_one", + "androidReplace": { + "%1$s": "$name$" } }, "changedRightAfterVerify": { @@ -329,17 +370,22 @@ "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Your safety number with $name$ has changed recently. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session.", + "message": "Your safety number with $name$ has changed. This could either mean that someone is trying to intercept your communication, or that $name$ simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { "content": "$1", "example": "Bob" } + }, + "androidKey": "ConfirmIdentityDialog_your_safety_number_with_s_has_changed", + "androidReplace": { + "%1$s": "$name$", + "%2$s": "$name$" } }, "identityKeyErrorOnSend": { - "message": "Your safety number with $name$ has changed. This could either mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session. You may wish to verify your saftey number with this contact.", + "message": "Your safety number with $name$ has changed. This could either mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -348,6 +394,17 @@ } } }, + "youMayWishToVerifyContact": { + "message": "You may wish to verify your safety number with this contact.", + "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" + } + }, + "androidKey": "WebRtcCallScreen_you_may_wish_to_verify_this_contact" + }, "sendAnyway": { "message": "Send Anyway", "description": "Used on a warning dialog to make it clear that it might be risky to send the message." @@ -377,11 +434,13 @@ "description": "Link to open the issue tracker" }, "gotIt": { - "message": "Got it!", - "description": "Label for a button that dismisses a dialog. The user clicks it to confirm that they understand the message in the dialog." + "message": "Got it", + "description": "Label for a button that dismisses a dialog. The user clicks it to confirm that they understand the message in the dialog.", + "androidKey": "ExperienceUpgradeActivity_got_it" }, "submit": { - "message": "Submit" + "message": "Submit", + "androidKey": "log_submit_activity__button_submit" }, "verify": { "message": "Mark as verified" @@ -390,13 +449,17 @@ "message": "Mark as not verified" }, "isVerified": { - "message": "You have verified your safety number with $name$.", + "message": "You marked your safety number with $name$ verified", "description": "Summary state shown at top of the safety number screen if user has verified contact.", "placeholders": { "name": { "content": "$1", "example": "Bob" } + }, + "androidKey": "MessageRecord_you_marked_your_safety_number_with_s_verified", + "androidReplace": { + "%s": "$name$" } }, "isNotVerified": { @@ -410,46 +473,56 @@ } }, "verified": { - "message": "Verified" + "message": "Verified", + "androidKey": "verify_display_fragment__verified" }, "newIdentity": { "message": "New safety number", - "description": "Header for a key change dialog" + "description": "Header for a key change dialog", + "androidKey": "MessageDetailsRecipient_new_safety_number" }, "incomingError": { "message": "Error handling incoming message" }, "media": { "message": "Media", - "description": "Header of the default pane in the media gallery, showing images and videos" + "description": "Header of the default pane in the media gallery, showing images and videos", + "androidKey": "MediaOverviewActivity_Media" }, "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)" + "message": "No media", + "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)", + "androidKey": "media_overview_activity__no_media" }, "documents": { "message": "Documents", - "description": "Header of the secondary pane in the media gallery, showing every non-media attachment" + "description": "Header of the secondary pane in the media gallery, showing every non-media attachment", + "androidKey": "MediaOverviewActivity_Documents" }, "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)" + "message": "No documents", + "description": "Message shown to user in the media gallery when there are no messages with document attachments (anything other than images or video)", + "androidKey": "media_overview_documents_fragment__no_documents_found" }, "today": { "message": "Today", - "description": "Section header in the media gallery" + "description": "Section header in the media gallery", + "androidKey": "BucketedThreadMedia_Today" }, "yesterday": { "message": "Yesterday", - "description": "Section header in the media gallery" + "description": "Section header in the media gallery", + "androidKey": "BucketedThreadMedia_Yesterday" }, "thisWeek": { "message": "This Week", - "description": "Section header in the media gallery" + "description": "Section header in the media gallery", + "androidKey": "BucketedThreadMedia_This_week" }, "thisMonth": { "message": "This Month", - "description": "Section header in the media gallery" + "description": "Section header in the media gallery", + "androidKey": "BucketedThreadMedia_This_month" }, "voiceMessage": { "message": "Voice Message", @@ -459,10 +532,6 @@ "message": "For security reasons, this file type cannot be sent", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Session Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", "description": "Shown while Session Desktop is fetching metadata for a url in composition area", @@ -506,18 +575,17 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "Sorry, the selected attachment is too large" + "message": "Attachment exceeds size limits for the type of message you're sending.", + "androidKey": "ConversationActivity_attachment_exceeds_size_limits" }, "unableToLoadAttachment": { - "message": "Unable to load attachment." - }, - "disconnected": { - "message": "Disconnected", - "description": "Displayed when the desktop client cannot connect to the server." + "message": "Sorry, there was an error setting your attachment.", + "androidKey": "ConversationActivity_sorry_there_was_an_error_setting_your_attachment" }, "connecting": { - "message": "Connecting", - "description": "Displayed when the desktop client is currently connecting to the server." + "message": "Connecting...", + "description": "Displayed when the desktop client is currently connecting to the server.", + "androidKey": "CallNotificationBuilder_connecting" }, "offline": { "message": "Offline", @@ -556,13 +624,10 @@ "message": "Report an Issue", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Session Preferences", - "description": "Title of the window that pops up with Session Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "About Session", - "description": "Item under the Help menu, which opens a small about window" + "about": { + "message": "About", + "description": "Item under the Help menu, which opens a small about window", + "androidKey": "recipient_preferences__about" }, "speech": { "message": "Speech", @@ -570,49 +635,54 @@ }, "show": { "message": "Show", - "description": "Command under Window menu, to show the window" + "description": "Command under Window menu, to show the window", + "androidKey": "preferences_notifications__show" }, - "quit": { - "message": "Quit", - "description": "Command in the tray icon menu, to quit the application" - }, - "lokiMessenger": { - "message": "Session" + "sessionMessenger": { + "message": "Session", + "androidKey": "activity_landing_title" }, "search": { "message": "Search", - "description": "Placeholder text in the search input" + "description": "Placeholder text in the search input", + "androidKey": "SearchToolbar_search" }, "noSearchResults": { - "message": "No results for \"$searchTerm$\"", + "message": "No results found for \"$searchTerm$\"", "description": "Shown in the search left pane when no results were found", "placeholders": { "searchTerm": { "content": "$1", "example": "dog" } + }, + "androidKey": "SearchFragment_no_results", + "androidReplace": { + "'%s'": "\"$searchTerm$\"" } }, "conversationsHeader": { "message": "Conversations", - "description": "Shown to separate the types of search results" + "description": "Shown to separate the types of search results", + "androidKey": "SearchFragment_header_conversations" }, "contactsHeader": { "message": "Contacts", - "description": "Shown to separate the types of search results" + "description": "Shown to separate the types of search results", + "androidKey": "SearchFragment_header_contacts" }, "messagesHeader": { - "message": "Conversations", - "description": "Shown to separate the types of search results" + "message": "Messages", + "description": "Shown to separate the types of search results", + "androidKey": "SearchFragment_header_messages" }, "settingsHeader": { - "message": "Settings" + "message": "Settings", + "androidKey": "activity_settings_title" }, "welcomeToSession": { - "message": "Welcome to Session" - }, - "selectAContact": { - "message": "Select a contact or group to start chatting." + "message": "Welcome to Session.", + "androidKey": "ExperienceUpgradeActivity_welcome_to_signal_dgaf" }, "typingAlt": { "message": "Typing animation for this conversation", @@ -628,21 +698,20 @@ } } }, - "sendMessageToContact": { - "message": "Send Message", - "description": "Shown when you are sent a contact and that contact has a session" - }, "home": { - "message": "home", - "description": "Shown on contact detail screen as a label for an address/phone/email" + "message": "Home", + "description": "Shown on contact detail screen as a label for an address/phone/email", + "androidKey": "ContactShareEditActivity_type_home" }, "work": { - "message": "work", - "description": "Shown on contact detail screen as a label for an address/phone/email" + "message": "Work", + "description": "Shown on contact detail screen as a label for an address/phone/email", + "androidKey": "ContactShareEditActivity_type_work" }, "mobile": { - "message": "mobile", - "description": "Shown on contact detail screen as a label for aa phone or email" + "message": "Mobile", + "description": "Shown on contact detail screen as a label for a phone or email", + "androidKey": "ContactShareEditActivity_type_mobile" }, "email": { "message": "email", @@ -670,15 +739,18 @@ }, "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" + "description": "Shown in triple-dot menu next to message to allow user to start crafting a message with a quotation", + "androidKey": "conversation_context__menu_reply_to_message" }, "originalMessageNotFound": { "message": "Original message not found", - "description": "Shown in quote if reference message was not found as message was initially downloaded and processed" + "description": "Shown in quote if reference message was not found as message was initially downloaded and processed", + "androidKey": "ConversationFragment_quoted_message_not_found" }, "originalMessageNotAvailable": { "message": "Original message no longer available", - "description": "Shown in toast if user clicks on quote that references message no longer in database" + "description": "Shown in toast if user clicks on quote that references message no longer in database", + "androidKey": "ConversationFragment_quoted_message_no_longer_available" }, "messageFoundButNotLoaded": { "message": "Original message found, but not loaded. Scroll up to load it.", @@ -690,11 +762,13 @@ }, "you": { "message": "You", - "description": "In Android theme, shown in quote if you or someone else replies to you" + "description": "In Android theme, shown in quote if you or someone else replies to you", + "androidKey": "MediaPreviewActivity_you" }, "audioPermissionNeeded": { - "message": "To send audio messages, allow Session to access your microphone.", - "description": "Shown if the user attempts to send an audio message without audio permssions turned on" + "message": "Session needs microphone access to send audio messages.", + "description": "Shown if the user attempts to send an audio message without audio permssions turned on", + "androidKey": "ConversationActivity_to_send_audio_messages_allow_signal_access_to_your_microphone" }, "allowAccess": { "message": "Allow Access", @@ -702,15 +776,18 @@ }, "audio": { "message": "Audio", - "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" + "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment", + "androidKey": "QuoteView_audio" }, "video": { "message": "Video", - "description": "Shown in a quotation of a message containing a video if no text was originally provided with that video" + "description": "Shown in a quotation of a message containing a video if no text was originally provided with that video", + "androidKey": "QuoteView_video" }, "photo": { "message": "Photo", - "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image" + "description": "Shown in a quotation of a message containing a photo if no text was originally provided with that image", + "androidKey": "QuoteView_photo" }, "cannotUpdate": { "message": "Cannot Update", @@ -721,43 +798,50 @@ "description": "Shown if a general error happened while trying to install update package" }, "ok": { - "message": "OK" - }, - "enter": { - "message": "Enter" + "message": "OK", + "androidKey": "activity_settings_seed_dialog_ok_button_title" }, "yes": { - "message": "Yes" + "message": "Yes", + "androidKey": "ConversationActivity_yes" }, "cancel": { - "message": "Cancel" + "message": "Cancel", + "androidKey": "view_qr_code_cancel_button_title" }, "close": { "message": "Close" }, "continue": { - "message": "Continue" + "message": "Continue", + "androidKey": "RegistrationActivity_continue" }, "devicePairingRequestReceivedLimitTitle": { - "message": "Device linking limit reached." + "message": "Device Limit Reached", + "androidKey": "activity_linked_devices_multi_device_limit_reached_dialog_title" }, "devicePairingRequestReceivedLimitDescription": { - "message": "To change your linked devices, please unlink a device first." + "message": "Sorry, you have too many devices linked already, try removing some", + "androidKey": "DeviceProvisioningActivity_sorry_you_have_too_many_devices_linked_already" }, "devicePairingRequestReceivedNoListenerTitle": { - "message": "Device linking request received." + "message": "Linking Request Received", + "androidKey": "dialog_link_device_master_mode_title_2" }, "devicePairingRequestReceivedNoListenerDescription": { "message": "Device linking request received but you are not on the device linking screen. \nGo to Settings > Device > Link New Device." }, "waitingForDeviceToRegister": { - "message": "Waiting for device to register..." + "message": "Waiting for Device", + "androidKey": "dialog_link_device_master_mode_title_1" }, "pairNewDevicePrompt": { - "message": "Scan the QR Code on your other device" + "message": "Scan the QR code displayed on the device to link", + "androidKey": "device_add_fragment__scan_the_qr_code_displayed_on_the_device_to_link" }, "noPairedDevices": { - "message": "No linked devices" + "message": "You don't have any linked devices yet", + "androidKey": "device_list_fragment__no_devices_linked" }, "deviceIsSecondaryNoPairing": { "message": "This device is a secondary device and so cannot be linked." @@ -766,7 +850,8 @@ "message": "A pairing request is already ongoing. Restart the app if it takes too long." }, "allowPairing": { - "message": "Allow Linking" + "message": "Authorize", + "androidKey": "view_device_linking_authorize_button_title" }, "allowPairingWithDevice": { "message": "Allow linking with this device?" @@ -781,7 +866,9 @@ "message": "Please confirm you want to unlink the following device:" }, "unpairDevice": { - "message": "Unlink Device" + "message": "Unlink Device", + "androidKey": "fragment_device_list_unlink_device_title", + "wordCapitalize": true }, "unpairDeviceWarning": { "message": "Are you sure you want to unlink this device?", @@ -792,22 +879,15 @@ "description": "Warning description for device unlinking in settings view" }, "deviceUnpaired": { - "message": "Device Unlinked" - }, - "clear": { - "message": "Clear" - }, - "copySeed": { - "message": "Copy Seed" - }, - "confirm": { - "message": "Confirm" + "message": "Your device was unlinked successfully", + "androidKey": "activity_linked_devices_unlinking_successful_message" }, "error": { "message": "Error" }, "delete": { - "message": "Delete" + "message": "Delete", + "androidKey": "delete" }, "deletePublicWarning": { "message": "Are you sure? This will permanently remove this message for everyone in this open group." @@ -826,7 +906,9 @@ "description": "Toast message explaining that the user doens't have the rights to delete other people's messages." }, "deleteThisMessage": { - "message": "Delete this message" + "message": "Delete message", + "androidKey": "conversation_context__menu_delete_message", + "description": "action visible in MessageDetail screen" }, "from": { "message": "From", @@ -838,11 +920,13 @@ }, "sent": { "message": "Sent", - "description": "Label for the time a message was sent" + "description": "Label for the time a message was sent", + "androidKey": "message_details_header__sent" }, "received": { "message": "Received", - "description": "Label for the time a message was received" + "description": "Label for the time a message was received", + "androidKey": "message_details_header__received" }, "sendMessage": { "message": " Type your message", @@ -879,29 +963,21 @@ "theirIdentityUnknown": { "message": "You haven't exchanged any messages with this contact yet. Your safety number with them will be available after the first message." }, - "moreInfo": { - "message": "More Info...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" + "moreInformation": { + "message": "More information", + "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen", + "androidKey": "RegistrationActivity_more_information" }, - "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" + "resend": { + "message": "Resend", + "description": "Shown on the drop-down menu for an indinvidaul message, but only if it is an outgoing message that failed to send", + "androidKey": "message_recipients_list_item__resend", + "camelCase": true }, "deleteMessage": { "message": "Delete Message", - "description": "Shown on the drop-down menu for an individual message, deletes single message" - }, - "unsendMessage": { - "message": "Unsend Message", - "description": "Shown on the drop-down menu for an individual message being removed from the server" - }, - "unsendMessages": { - "message": "Unsend Messages", - "description": "Tiitle for prompt and header button for messages being removed from the server" - }, - "messages": { - "message": "Messages", - "description": "Message search result" + "description": "Shown on the drop-down menu for an individual message, deletes single message", + "androidKey": "conversation_context__menu_delete_message" }, "deleteMessages": { "message": "Delete Messages", @@ -927,21 +1003,15 @@ "message": "Permanently delete the messages in this conversation?", "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." }, - "deleteAccount": { - "message": "Delete Account", - "description": "Text for button in settings view to delete account" + "clearAllData": { + "message": "Clear All Data", + "description": "Text for button in settings view to delete account", + "androidKey": "dialog_clear_all_data_title" }, "deleteAccountWarning": { - "message": "Are you sure you want to delete your account?", - "description": "Warning for account deletion in settings view" - }, - "deleteAccountWarningSub": { - "message": "Delete all history, including all messages, sessions, and contacts. Once deleted, these cannot be restored.", - "description": "Warning for account deletion in settings view" - }, - "deleteContact": { - "message": "Delete Contact", - "description": "Confirmation dialog title that asks the user if they really wish to delete the contact. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone." + "message": "This will permanently delete your messages, sessions, and contacts. These cannot be restored", + "description": "Warning for account deletion in settings view", + "androidKey": "dialog_clear_all_data_explanation" }, "deleteContactConfirmation": { "message": "Permanently delete this contact and destroy all sessions?", @@ -995,6 +1065,11 @@ "message": "Add a caption...", "descripton": "Used as the placeholder text in the caption editor text field" }, + "copy": { + "message": "Copy", + "description": "Copy to clipboard button text", + "androidKey": "copy" + }, "save": { "message": "Save", "descripton": "Used as a 'commit changes' button in the Caption Editor for outgoing image attachments" @@ -1048,8 +1123,8 @@ "installTooManyDevices": { "message": "Sorry, you have too many devices linked already. Try removing some." }, + "message": "Permissions", "permissions": { - "message": "Permissions", "description": "Header for permissions section of settings" }, "general": { @@ -1098,10 +1173,6 @@ "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." }, - "deleteAllDataButton": { - "message": "Delete all data", - "description": "Text of the button that deletes all data" - }, "notifications": { "message": "Notifications", "description": "Header for notification settings" @@ -1647,9 +1718,9 @@ "message": "Updating a open group Channel", "description": "Title for the dialog box used to update an existing open group channel" }, - "showSeed": { - "message": "Show Seed", - "description": "Button action that the user can click to view their unique seed" + "showRecoveryPhrase": { + "message": "Show Recovery Phrase", + "description": "Button action that the user can click to view their unique recovery phrase" }, "yourSessionID": { "message": "Your Session ID" @@ -1691,17 +1762,17 @@ "message": "The clipboard content exceeds the maximum password length of $max_pwd_len$ characters.", "description": "Shown when user pastes a password which is longer than MAX_PASSWORD_LEN" }, - "showSeedPasswordRequest": { + "showRecoveryPhrasePasswordRequest": { "message": "Please enter your password", - "description": "Request for user to enter password to show seed." + "description": "Request for user to enter password to show recovery phrase." }, - "seedSavePromptMain": { - "message": "Please save the seed below in a safe location.", - "description": "Prompt on seed modal requesting user to save their seed. Line one" + "recoveryPhraseSavePromptMain": { + "message": "Please save the recovery phrase below in a safe location.", + "description": "Prompt on recovery phrase modal requesting user to save their recovery phrase. Line one" }, - "seedSavePromptAlt": { + "recoveryPhraseSavePromptAlt": { "message": "They can be used to restore your account if you lose access or migrate to a new device.", - "description": "Prompt on seed modal requesting user to save their seed. Line two" + "description": "Prompt on recovery phrase modal requesting user to save their recovery phrase. Line two" }, "QRCodeTitle": { "message": "View My QR Code", @@ -1913,10 +1984,10 @@ "generateSessionID": { "message": "Create Session ID" }, - "mnemonicSeed": { - "message": "Mnemonic Seed" + "recoveryPhrase": { + "message": "Recovery Phrase" }, - "enterSeed": { + "enterRecoveryPhrase": { "message": "Enter Recovery Phrase" }, "displayName": { @@ -1962,7 +2033,7 @@ "linkDevice": { "message": "Link Device" }, - "restoreUsingSeed": { + "restoreUsingRecoveryPhrase": { "message": "Restore From Recovery Phrase" }, "linkDeviceToExistingAccount": { @@ -2022,8 +2093,8 @@ "devicesSettingsTitle": { "message": "Devices" }, - "mnemonicEmpty": { - "message": "Seed is mandatory" + "recoveryPhraseEmpty": { + "message": "Recovery Phrase is mandatory" }, "displayNameEmpty": { "message": "Display Name Is Mandatory" diff --git a/app/menu.js b/app/menu.js index 840bc9214..5996a9598 100644 --- a/app/menu.js +++ b/app/menu.js @@ -143,7 +143,7 @@ exports.createTemplate = (options, messages) => { type: 'separator', }, { - label: messages.aboutSignalDesktop.message, + label: messages.about.message, click: showAbout, }, ], @@ -227,10 +227,10 @@ function updateForMac(template, messages, options) { // Add the OSX-specific Signal Desktop menu at the far left template.unshift({ - label: messages.lokiMessenger.message, + label: messages.sessionMessenger.message, submenu: [ { - label: messages.aboutSignalDesktop.message, + label: messages.about.message, click: showAbout, }, { diff --git a/app/sql.js b/app/sql.js index 301956921..4a246d3c7 100644 --- a/app/sql.js +++ b/app/sql.js @@ -1176,7 +1176,7 @@ async function initialize({ configDir, key, messages, passwordAttempt }) { const buttonIndex = dialog.showMessageBox({ buttons: [ messages.copyErrorAndQuit.message, - messages.deleteAndRestart.message, + messages.clearAllData.message, ], defaultId: 0, detail: redactAll(error.stack), diff --git a/app/tray_icon.js b/app/tray_icon.js index e05781723..f803ac6b0 100644 --- a/app/tray_icon.js +++ b/app/tray_icon.js @@ -97,7 +97,7 @@ function createTrayIcon(getMainWindow, messages) { tray.on('click', tray.showWindow); - tray.setToolTip(messages.lokiMessenger.message); + tray.setToolTip(messages.sessionMessenger.message); tray.updateContextMenu(); return tray; diff --git a/js/models/conversations.js b/js/models/conversations.js index cf1e6e36a..d4e220a33 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -2328,7 +2328,7 @@ }, deleteContact() { - let title = i18n('deleteContact'); + let title = i18n('delete'); let message = i18n('deleteContactConfirmation'); if (this.isGroup()) { @@ -2438,7 +2438,7 @@ if (this.isPrivate()) { return this.get('name'); } - return this.get('name') || i18n('unknownGroup'); + return this.get('name') || i18n('unknown'); }, getTitle() { diff --git a/js/views/app_view.js b/js/views/app_view.js index 046a5c40e..062e12cd3 100644 --- a/js/views/app_view.js +++ b/js/views/app_view.js @@ -234,14 +234,15 @@ this.el.append(dialog.el); }, showLeaveGroupDialog(groupConvo) { - let title = i18n('deleteContact'); - let message = i18n('deleteContactConfirmation'); - - if (groupConvo.isGroup()) { - title = i18n('leaveGroup'); - message = i18n('leaveGroupConfirmation'); + if (!groupConvo.isGroup()) { + throw new Error( + 'showLeaveGroupDialog() called with a non group convo.' + ); } + const title = i18n('leaveGroup'); + const message = i18n('leaveGroupConfirmation'); + window.confirmationDialog({ title, message, diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index 0f7316819..1adc7446b 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -1241,6 +1241,7 @@ contact.getTitle(), contact.getTitle(), ]), + messageSub: i18n('youMayWishToVerifyContact'), okText: i18n('sendAnyway'), resolve: async () => { await contact.updateVerified(); diff --git a/js/views/inbox_view.js b/js/views/inbox_view.js index 9d702b620..a9213a7fc 100644 --- a/js/views/inbox_view.js +++ b/js/views/inbox_view.js @@ -179,7 +179,6 @@ }, render_attributes: { welcomeToSession: i18n('welcomeToSession'), - selectAContact: i18n('selectAContact'), }, events: { click: 'onClick', diff --git a/js/views/network_status_view.js b/js/views/network_status_view.js index de5034f19..db5f468ad 100644 --- a/js/views/network_status_view.js +++ b/js/views/network_status_view.js @@ -72,7 +72,7 @@ // Intentional fallthrough default: { const markOffline = () => { - message = i18n('disconnected'); + message = i18n('offline'); instructions = i18n('checkNetworkConnection'); hasInterruption = true; }; diff --git a/main.js b/main.js index f9bfb59c3..c804782c5 100644 --- a/main.js +++ b/main.js @@ -607,7 +607,7 @@ function showAbout() { width: 500, height: 400, resizable: false, - title: locale.messages.aboutSignalDesktop.message, + title: locale.messages.about.message, autoHideMenuBar: true, backgroundColor: '#2090EA', show: false, @@ -649,7 +649,7 @@ async function showDebugLogWindow() { width: Math.max(size[0] - 100, WINDOW_SIZE.minWidth), height: Math.max(size[1] - 100, WINDOW_SIZE.minHeight), resizable: false, - title: locale.messages.signalDesktopPreferences.message, + title: locale.messages.debugLog.message, autoHideMenuBar: true, backgroundColor: '#FFFFFF', show: false, @@ -697,7 +697,7 @@ async function showPermissionsPopupWindow() { width: Math.min(400, size[0]), height: Math.min(150, size[1]), resizable: false, - title: locale.messages.signalDesktopPreferences.message, + title: locale.messages.permissions.message, autoHideMenuBar: true, backgroundColor: '#FFFFFF', show: false, diff --git a/ts/components/SearchResults.tsx b/ts/components/SearchResults.tsx index 8f7f39c09..8532a3984 100644 --- a/ts/components/SearchResults.tsx +++ b/ts/components/SearchResults.tsx @@ -79,7 +79,7 @@ export class SearchResults extends React.Component {
{hideMessagesHeader ? null : (
- {i18n('messages')} + {i18n('messagesHeader')}
)} {messages.map(message => ( diff --git a/ts/components/conversation/ContactDetail.tsx b/ts/components/conversation/ContactDetail.tsx index 2c209b624..5a16ddbfe 100644 --- a/ts/components/conversation/ContactDetail.tsx +++ b/ts/components/conversation/ContactDetail.tsx @@ -81,50 +81,7 @@ export class ContactDetail extends React.Component { i18n: (key: string, values?: Array) => string; onSendMessage: () => void; }) { - if (!hasSignalAccount) { - return null; - } - - // We don't want the overall click handler for this element to fire, so we stop - // propagation before handing control to the caller's callback. - const onClick = (e: React.MouseEvent<{}>): void => { - e.stopPropagation(); - onSendMessage(); - }; - - return ( -
- -
- ); - } - - public renderEmail(items: Array | undefined, i18n: LocalizerType) { - if (!items || items.length === 0) { - return; - } - - return items.map((item: Email) => { - return ( -
-
- {getLabelForEmail(item, i18n)} -
- {item.value} -
- ); - }); + return null; } public renderPhone(items: Array | undefined, i18n: LocalizerType) { @@ -217,7 +174,6 @@ export class ContactDetail extends React.Component { {renderContactShorthand({ contact, isIncoming, module })} {this.renderSendMessage({ hasSignalAccount, i18n, onSendMessage })} {this.renderPhone(contact.number, i18n)} - {this.renderEmail(contact.email, i18n)} {this.renderAddresses(contact.address, i18n)}
); diff --git a/ts/components/conversation/ConversationHeader.tsx b/ts/components/conversation/ConversationHeader.tsx index 71aac74d0..94c0baef5 100644 --- a/ts/components/conversation/ConversationHeader.tsx +++ b/ts/components/conversation/ConversationHeader.tsx @@ -304,13 +304,7 @@ export class ConversationHeader extends React.Component { return ( {this.renderPublicMenuItems()} - {Menu.getCopyMenuItem( - isPublic, - isRss, - isGroup, - onCopyPublicKey, - i18n - )} + {Menu.getCopyMenuItem(isPublic, isRss, isGroup, onCopyPublicKey, i18n)} {Menu.getDeleteMessagesMenuItem(isPublic, onDeleteMessages, i18n)} {Menu.getAddModeratorsMenuItem( amMod, diff --git a/ts/components/conversation/Message.tsx b/ts/components/conversation/Message.tsx index 1b9c464ab..adb0a5022 100644 --- a/ts/components/conversation/Message.tsx +++ b/ts/components/conversation/Message.tsx @@ -658,23 +658,6 @@ export class Message extends React.PureComponent { ); } - public renderSendMessageButton() { - const { contact, i18n } = this.props; - if (!contact || !contact.hasSignalAccount) { - return null; - } - - return ( -
- {i18n('sendMessageToContact')} -
- ); - } - public renderAvatar() { const { authorAvatarPath, @@ -972,7 +955,7 @@ export class Message extends React.PureComponent { }} onClick={wrap(onShowDetail)} > - {i18n('moreInfo')} + {i18n('moreInformation')} {showRetry ? ( { }} onClick={wrap(onRetrySend)} > - {i18n('retrySend')} + {i18n('resend')} ) : null} {isDeletable ? ( @@ -1175,7 +1158,6 @@ export class Message extends React.PureComponent { {this.renderEmbeddedContact()} {this.renderText()} {this.renderMetadata()} - {this.renderSendMessageButton()}
{this.renderError(!isIncoming)} {isRss || multiSelectMode diff --git a/ts/components/conversation/StagedLinkPreview.tsx b/ts/components/conversation/StagedLinkPreview.tsx index 2aa7477b1..d1bc3ae5d 100644 --- a/ts/components/conversation/StagedLinkPreview.tsx +++ b/ts/components/conversation/StagedLinkPreview.tsx @@ -31,7 +31,7 @@ export class StagedLinkPreview extends React.Component { > {!isLoaded ? (
- {i18n('loadingPreview')} + {i18n('loading')}
) : null} {isLoaded && image && isImage ? ( diff --git a/ts/components/session/LeftPaneSettingSection.tsx b/ts/components/session/LeftPaneSettingSection.tsx index 699dcb23b..f0a93c794 100644 --- a/ts/components/session/LeftPaneSettingSection.tsx +++ b/ts/components/session/LeftPaneSettingSection.tsx @@ -178,16 +178,16 @@ export class LeftPaneSettingSection extends React.Component { const { isSecondaryDevice } = this.props; const title = window.i18n( - isSecondaryDevice ? 'unpairDevice' : 'deleteAccount' + isSecondaryDevice ? 'unpairDevice' : 'clearAllData' ); const message = window.i18n( isSecondaryDevice ? 'unpairDeviceWarning' : 'deleteAccountWarning' ); - const messageSub = window.i18n( - isSecondaryDevice ? 'unpairDeviceWarningSub' : 'deleteAccountWarningSub' - ); + const messageSub = isSecondaryDevice + ? window.i18n('unpairDeviceWarningSub') + : ''; window.confirmationDialog({ title, diff --git a/ts/components/session/SessionPasswordPrompt.tsx b/ts/components/session/SessionPasswordPrompt.tsx index 01bb0f9e1..e3b93d81c 100644 --- a/ts/components/session/SessionPasswordPrompt.tsx +++ b/ts/components/session/SessionPasswordPrompt.tsx @@ -215,7 +215,7 @@ export class SessionPasswordPrompt extends React.PureComponent<{}, State> { /> { return ( <> -

{i18n('showSeedPasswordRequest')}

+

{i18n('showRecoveryPhrasePasswordRequest')}

{
- +
@@ -120,13 +117,17 @@ export class SessionSeedModal extends React.Component { <>

- {i18n('seedSavePromptMain')} + {i18n('recoveryPhraseSavePromptMain')}
- {i18n('seedSavePromptAlt')} + + {i18n('recoveryPhraseSavePromptAlt')} +

- {this.state.recoveryPhrase} + + {this.state.recoveryPhrase} +
diff --git a/ts/session/utils/Menu.tsx b/ts/session/utils/Menu.tsx index eb8b54e44..5d14773b1 100644 --- a/ts/session/utils/Menu.tsx +++ b/ts/session/utils/Menu.tsx @@ -54,7 +54,11 @@ function showDeleteMessages(isPublic: boolean): boolean { return !isPublic; } -function showCopyId(isPublic: boolean, isRss: boolean, isGroup: boolean): boolean { +function showCopyId( + isPublic: boolean, + isRss: boolean, + isGroup: boolean +): boolean { return !isGroup && !isRss; } @@ -137,7 +141,7 @@ export function getDeleteContactMenuItem( if (isPublic) { return {i18n('leaveGroup')}; } - return {i18n('deleteContact')}; + return {i18n('delete')}; } return null; } diff --git a/ts/state/selectors/conversations.ts b/ts/state/selectors/conversations.ts index 35f19a9f0..f2189f24e 100644 --- a/ts/state/selectors/conversations.ts +++ b/ts/state/selectors/conversations.ts @@ -48,7 +48,7 @@ function getConversationTitle( if (conversation.type === 'group') { const { i18n } = options; - return i18n('unknownGroup'); + return i18n('unknown'); } return format(conversation.phoneNumber, options); From 90fac8f75ebd65a7915d2b2d92fa1ce27c259985 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 17 Aug 2020 11:44:51 +1000 Subject: [PATCH 053/274] show group members => groupmember --- _locales/en/messages.json | 6 ++---- ts/components/session/SessionGroupSettings.tsx | 2 +- ts/session/utils/Menu.tsx | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index d731e557b..7cb92a5f4 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -939,10 +939,8 @@ "message": "You have blocked the user" }, "groupMembers": { - "message": "Group members" - }, - "showMembers": { - "message": "Show members" + "message": "Group members", + "androidKey": "ConversationActivity_group_members" }, "resetSession": { "message": "Reset Session", diff --git a/ts/components/session/SessionGroupSettings.tsx b/ts/components/session/SessionGroupSettings.tsx index d028563de..16fe944cf 100644 --- a/ts/components/session/SessionGroupSettings.tsx +++ b/ts/components/session/SessionGroupSettings.tsx @@ -278,7 +278,7 @@ export class SessionGroupSettings extends React.Component { role="button" onClick={this.props.onUpdateGroupMembers} > - {window.i18n('showMembers')} + {window.i18n('groupMembers')}
)} {/*
diff --git a/ts/session/utils/Menu.tsx b/ts/session/utils/Menu.tsx index 5d14773b1..939b6f2e8 100644 --- a/ts/session/utils/Menu.tsx +++ b/ts/session/utils/Menu.tsx @@ -262,7 +262,7 @@ export function getShowMemberMenuItem( i18n: LocalizerType ): JSX.Element | null { if (showMemberMenu(Boolean(isPublic), Boolean(isRss), Boolean(isGroup))) { - return {i18n('showMembers')}; + return {i18n('groupMembers')}; } return null; } From 457a8967d658e099aa52e458fd4011d5fe890f88 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 17 Aug 2020 12:12:54 +1000 Subject: [PATCH 054/274] remove beta disclaimer entirely --- _locales/en/messages.json | 12 -------- background.html | 1 - background_test.html | 1 - js/views/beta_release_disclaimer_view.js | 38 ------------------------ js/views/inbox_view.js | 9 ------ stylesheets/_session.scss | 19 ------------ test/index.html | 1 - 7 files changed, 81 deletions(-) delete mode 100644 js/views/beta_release_disclaimer_view.js diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 7cb92a5f4..6615b9be0 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1027,18 +1027,6 @@ "message": "Secure session reset succeeded", "description": "This is a past tense, informational message. In other words, your secure session has been reset." }, - "betaDisclaimerTitle": { - "message": "Thanks for using Session!", - "description": "Title for beta disclaimer modal" - }, - "betaDisclaimerSubtitle": { - "message": "This software is still in its beta phase.", - "description": "Subtitle for beta disclaimer modal" - }, - "betaDisclaimerDescription": { - "message": "While your messages are secured with end-to-end encryption, third parties like your ISP can see who you're talking to while in the beta version. It is also possible that third parties could correlate your public key to your IP address and real identity if they learn your public key.", - "description": "Description for beta disclaimer modal" - }, "quoteThumbnailAlt": { "message": "Thumbnail of image from quoted message", "description": "Used in alt tag of thumbnail images inside of an embedded message quote" diff --git a/background.html b/background.html index db453bb99..589f85826 100644 --- a/background.html +++ b/background.html @@ -493,7 +493,6 @@ - diff --git a/background_test.html b/background_test.html index c6a198b6e..21a5881dd 100644 --- a/background_test.html +++ b/background_test.html @@ -493,7 +493,6 @@ - diff --git a/js/views/beta_release_disclaimer_view.js b/js/views/beta_release_disclaimer_view.js deleted file mode 100644 index 004d3582c..000000000 --- a/js/views/beta_release_disclaimer_view.js +++ /dev/null @@ -1,38 +0,0 @@ -/* global Whisper, window */ - -// eslint-disable-next-line func-names -(function() { - 'use strict'; - - window.Whisper = window.Whisper || {}; - - Whisper.BetaReleaseDisclaimer = Whisper.View.extend({ - className: 'loki-dialog beta-disclaimer-dialog modal', - initialize() { - this.close = this.close.bind(this); - this.render(); - }, - - render() { - this.dialogView = new Whisper.ReactWrapperView({ - className: 'session-beta-disclaimer', - Component: window.Signal.Components.SessionConfirm, - props: { - title: window.i18n('betaDisclaimerTitle'), - message: window.i18n('betaDisclaimerSubtitle'), - messageSub: window.i18n('betaDisclaimerDescription'), - hideCancel: true, - onClickOk: this.close, - }, - }); - - this.$el.append(this.dialogView.el); - return this; - }, - - close() { - window.storage.put('betaReleaseDisclaimerAccepted', true); - this.remove(); - }, - }); -})(); diff --git a/js/views/inbox_view.js b/js/views/inbox_view.js index a9213a7fc..489b0ef8d 100644 --- a/js/views/inbox_view.js +++ b/js/views/inbox_view.js @@ -131,11 +131,6 @@ model: { window: options.window }, }); - if (!window.storage.get('betaReleaseDisclaimerAccepted')) { - // Beta disclaimer disabled. - // this.showBetaReleaseDisclaimer(); - } - if (!options.initialLoadComplete) { this.appLoadingScreen = new Whisper.AppLoadingScreen(); this.appLoadingScreen.render(); @@ -456,10 +451,6 @@ toast.$el.appendTo(this.$('.gutter')); toast.render(); }, - showBetaReleaseDisclaimer() { - const dialog = new Whisper.BetaReleaseDisclaimer(); - this.el.append(dialog.el); - }, }); Whisper.ExpiredAlertBanner = Whisper.View.extend({ diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index c611aa0da..f46ea77fb 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -1400,25 +1400,6 @@ input { width: 20vw; } -.session-beta-disclaimer { - .session-modal { - width: 600px; - - &__header { - font-size: $session-font-lg; - } - - &__body > div:first-child { - padding: $session-margin-lg; - } - - .session-confirm-main-message { - opacity: 0.8; - margin-bottom: $session-margin-xs; - } - } -} - .session-confirm-wrapper { position: absolute; height: 100%; diff --git a/test/index.html b/test/index.html index 7e9022a49..a84932bd8 100644 --- a/test/index.html +++ b/test/index.html @@ -541,7 +541,6 @@ - From fec3a0f64325578f6bb00f68d983a07bea7033f9 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 17 Aug 2020 14:03:51 +1000 Subject: [PATCH 055/274] remove install_view.js --- _locales/en/messages.json | 41 +------ app/menu.js | 10 -- background.html | 96 ----------------- background_test.html | 96 ----------------- js/background.js | 12 --- js/views/app_view.js | 30 ------ js/views/install_view.js | 202 ----------------------------------- main.js | 7 -- preload.js | 4 - test/app/menu_test.js | 1 - test/index.html | 95 ---------------- ts/util/lint/exceptions.json | 99 ----------------- 12 files changed, 1 insertion(+), 692 deletions(-) delete mode 100644 js/views/install_view.js diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 6615b9be0..feb587152 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -145,10 +145,6 @@ "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" @@ -1070,47 +1066,12 @@ } } }, - "linkYourPhone": { - "message": "Link your phone to Session", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Session 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" }, - "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": "Failed to connect to server.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Sorry, you have too many devices linked already. Try removing some." - }, - "message": "Permissions", "permissions": { + "message": "Permissions", "description": "Header for permissions section of settings" }, "general": { diff --git a/app/menu.js b/app/menu.js index 5996a9598..60aa1f49f 100644 --- a/app/menu.js +++ b/app/menu.js @@ -11,7 +11,6 @@ exports.createTemplate = (options, messages) => { openReleaseNotes, openSupportPage, platform, - setupAsNewDevice, setupAsStandalone, setupWithImport, showAbout, @@ -164,10 +163,6 @@ exports.createTemplate = (options, messages) => { fileMenu.submenu.unshift({ type: 'separator', }); - fileMenu.submenu.unshift({ - label: messages.menuSetupAsNewDevice.message, - click: setupAsNewDevice, - }); fileMenu.submenu.unshift({ label: messages.menuSetupWithImport.message, click: setupWithImport, @@ -184,7 +179,6 @@ exports.createTemplate = (options, messages) => { function updateForMac(template, messages, options) { const { includeSetup, - setupAsNewDevice, setupAsStandalone, setupWithImport, showAbout, @@ -208,10 +202,6 @@ function updateForMac(template, messages, options) { label: messages.menuSetupWithImport.message, click: setupWithImport, }, - { - label: messages.menuSetupAsNewDevice.message, - click: setupAsNewDevice, - }, ], }; diff --git a/background.html b/background.html index 589f85826..89ad637d9 100644 --- a/background.html +++ b/background.html @@ -345,101 +345,6 @@ {{/isError}} - - - @@ -494,7 +399,6 @@ - diff --git a/background_test.html b/background_test.html index 21a5881dd..46b076122 100644 --- a/background_test.html +++ b/background_test.html @@ -345,101 +345,6 @@ {{/isError}} - - - @@ -494,7 +399,6 @@ - diff --git a/js/background.js b/js/background.js index bece78657..9ddcf9ae7 100644 --- a/js/background.js +++ b/js/background.js @@ -532,13 +532,6 @@ } ); - Whisper.events.on('setupAsNewDevice', () => { - const { appView } = window.owsDesktopApp; - if (appView) { - appView.openInstaller(); - } - }); - Whisper.events.on('setupAsStandalone', () => { const { appView } = window.owsDesktopApp; if (appView) { @@ -665,11 +658,6 @@ Whisper.events.on('reconnectTimer', () => { appView.inboxView.networkStatusView.setSocketReconnectInterval(60000); }); - Whisper.events.on('contactsync', () => { - if (appView.installView) { - appView.openInbox(); - } - }); window.addEventListener('focus', () => Whisper.Notifications.clear()); window.addEventListener('unload', () => Whisper.Notifications.fastClear()); diff --git a/js/views/app_view.js b/js/views/app_view.js index 062e12cd3..227813039 100644 --- a/js/views/app_view.js +++ b/js/views/app_view.js @@ -11,7 +11,6 @@ Whisper.AppView = Backbone.View.extend({ initialize() { this.inboxView = null; - this.installView = null; this.applyTheme(); this.applyHideMenu(); @@ -72,39 +71,12 @@ ); this.openView(this.importView); }, - finishLightImport() { - const options = { - hasExistingData: true, - }; - this.openInstaller(options); - }, closeImporter() { if (this.importView) { this.importView.remove(); this.importView = null; } }, - openInstaller(options = {}) { - // If we're in the middle of import, we don't want to show the menu options - // allowing the user to switch to other ways to set up the app. If they - // switched back and forth in the middle of a light import, they'd lose all - // that imported data. - if (!options.hasExistingData) { - window.addSetupMenuItems(); - } - - this.resetViews(); - const installView = new Whisper.InstallView(options); - this.installView = installView; - - this.openView(this.installView); - }, - closeInstaller() { - if (this.installView) { - this.installView.remove(); - this.installView = null; - } - }, openStandalone() { window.addSetupMenuItems(); this.resetViews(); @@ -118,7 +90,6 @@ } }, resetViews() { - this.closeInstaller(); this.closeImporter(); this.closeStandalone(); }, @@ -138,7 +109,6 @@ _.defaults(options, { initialLoadComplete: this.initialLoadComplete }); // window.log.info('open inbox'); - this.closeInstaller(); if (!this.inboxView) { // We create the inbox immediately so we don't miss an update to diff --git a/js/views/install_view.js b/js/views/install_view.js deleted file mode 100644 index b45257f40..000000000 --- a/js/views/install_view.js +++ /dev/null @@ -1,202 +0,0 @@ -/* global Whisper, i18n, getAccountManager, $, textsecure, QRCode */ - -/* eslint-disable more/no-then */ - -// eslint-disable-next-line func-names -(function() { - 'use strict'; - - window.Whisper = window.Whisper || {}; - - const Steps = { - INSTALL_SIGNAL: 2, - SCAN_QR_CODE: 3, - ENTER_NAME: 4, - PROGRESS_BAR: 5, - TOO_MANY_DEVICES: 'TooManyDevices', - NETWORK_ERROR: 'NetworkError', - }; - - const DEVICE_NAME_SELECTOR = 'input.device-name'; - const CONNECTION_ERROR = -1; - const TOO_MANY_DEVICES = 411; - - Whisper.InstallView = Whisper.View.extend({ - templateName: 'link-flow-template', - className: 'main full-screen-flow', - events: { - 'click .try-again': 'connect', - 'click .finish': 'finishLinking', - // the actual next step happens in confirmNumber() on submit form #link-phone - }, - initialize(options = {}) { - this.selectStep(Steps.SCAN_QR_CODE); - this.connect(); - this.on('disconnected', this.reconnect); - - // Keep data around if it's a re-link, or the middle of a light import - this.shouldRetainData = - Whisper.Registration.everDone() || options.hasExistingData; - }, - render_attributes() { - let errorMessage; - - if (this.error) { - if ( - this.error.name === 'HTTPError' && - this.error.code === TOO_MANY_DEVICES - ) { - errorMessage = i18n('installTooManyDevices'); - } else if ( - this.error.name === 'HTTPError' && - this.error.code === CONNECTION_ERROR - ) { - errorMessage = i18n('installConnectionFailed'); - } else if (this.error.message === 'websocket closed') { - // AccountManager.registerSecondDevice uses this specific - // 'websocket closed' error message - errorMessage = i18n('installConnectionFailed'); - } - - return { - isError: true, - errorHeader: 'Something went wrong!', - errorMessage, - errorButton: 'Try again', - }; - } - - return { - isStep3: this.step === Steps.SCAN_QR_CODE, - linkYourPhone: i18n('linkYourPhone'), - signalSettings: i18n('signalSettings'), - linkedDevices: i18n('linkedDevices'), - androidFinalStep: i18n('plusButton'), - appleFinalStep: i18n('linkNewDevice'), - - isStep4: this.step === Steps.ENTER_NAME, - chooseName: i18n('chooseDeviceName'), - finishLinkingPhoneButton: i18n('finishLinkingPhone'), - - isStep5: this.step === Steps.PROGRESS_BAR, - syncing: i18n('initialSync'), - }; - }, - selectStep(step) { - this.step = step; - this.render(); - }, - connect() { - this.error = null; - this.selectStep(Steps.SCAN_QR_CODE); - this.clearQR(); - if (this.timeout) { - clearTimeout(this.timeout); - this.timeout = null; - } - - const accountManager = getAccountManager(); - - accountManager - .registerSecondDevice( - this.setProvisioningUrl.bind(this), - this.confirmNumber.bind(this) - ) - .catch(this.handleDisconnect.bind(this)); - }, - handleDisconnect(error) { - window.log.error( - 'provisioning failed', - error && error.stack ? error.stack : error - ); - - this.error = error; - this.render(); - - if (error.message === 'websocket closed') { - this.trigger('disconnected'); - } else if ( - error.name !== 'HTTPError' || - (error.code !== CONNECTION_ERROR && error.code !== TOO_MANY_DEVICES) - ) { - throw error; - } - }, - reconnect() { - if (this.timeout) { - clearTimeout(this.timeout); - this.timeout = null; - } - this.timeout = setTimeout(this.connect.bind(this), 10000); - }, - clearQR() { - this.$('#qr img').remove(); - this.$('#qr canvas').remove(); - this.$('#qr .container').show(); - this.$('#qr').removeClass('ready'); - }, - setProvisioningUrl(url) { - if ($('#qr').length === 0) { - window.log.error('Did not find #qr element in the DOM!'); - return; - } - - this.$('#qr .container').hide(); - this.qr = new QRCode(this.$('#qr')[0]).makeCode(url); - this.$('#qr').removeAttr('title'); - this.$('#qr').addClass('ready'); - }, - setDeviceNameDefault() { - const deviceName = textsecure.storage.user.getDeviceName(); - - this.$(DEVICE_NAME_SELECTOR).val(deviceName || window.getHostName()); - this.$(DEVICE_NAME_SELECTOR).focus(); - }, - finishLinking() { - // We use a form so we get submit-on-enter behavior - this.$('#link-phone').submit(); - }, - confirmNumber() { - const tsp = textsecure.storage.protocol; - - window.removeSetupMenuItems(); - this.selectStep(Steps.ENTER_NAME); - this.setDeviceNameDefault(); - - return new Promise(resolve => { - this.$('#link-phone').submit(e => { - e.stopPropagation(); - e.preventDefault(); - - let name = this.$(DEVICE_NAME_SELECTOR).val(); - name = name.replace(/\0/g, ''); // strip unicode null - if (name.trim().length === 0) { - this.$(DEVICE_NAME_SELECTOR).focus(); - return null; - } - - this.selectStep(Steps.PROGRESS_BAR); - - const finish = () => resolve(name); - - // Delete all data from database unless we're in the middle - // of a re-link, or we are finishing a light import. Without this, - // app restarts at certain times can cause weird things to happen, - // like data from a previous incomplete light import showing up - // after a new install. - if (this.shouldRetainData) { - return finish(); - } - - return tsp.removeAllData().then(finish, error => { - window.log.error( - 'confirmNumber: error clearing database', - error && error.stack ? error.stack : error - ); - finish(); - }); - }); - }); - }, - }); -})(); diff --git a/main.js b/main.js index c804782c5..4bebeafc9 100644 --- a/main.js +++ b/main.js @@ -513,12 +513,6 @@ function setupWithImport() { } } -function setupAsNewDevice() { - if (mainWindow) { - mainWindow.webContents.send('set-up-as-new-device'); - } -} - function setupAsStandalone() { if (mainWindow) { mainWindow.webContents.send('set-up-as-standalone'); @@ -874,7 +868,6 @@ function setupMenu(options) { openSupportPage, platform, setupWithImport, - setupAsNewDevice, setupAsStandalone, }); const template = createTemplate(menuOptions, locale.messages); diff --git a/preload.js b/preload.js index d2f8bb5a6..ea0ea7a7b 100644 --- a/preload.js +++ b/preload.js @@ -231,10 +231,6 @@ ipc.on('set-up-with-import', () => { Whisper.events.trigger('setupWithImport'); }); -ipc.on('set-up-as-new-device', () => { - Whisper.events.trigger('setupAsNewDevice'); -}); - ipc.on('set-up-as-standalone', () => { Whisper.events.trigger('setupAsStandalone'); }); diff --git a/test/app/menu_test.js b/test/app/menu_test.js index e84f8f115..f6ebf31ce 100644 --- a/test/app/menu_test.js +++ b/test/app/menu_test.js @@ -51,7 +51,6 @@ describe('SignalMenu', () => { openSupportPage: null, platform, includeSetup, - setupAsNewDevice: null, setupAsStandalone: null, setupWithImport: null, showAbout: null, diff --git a/test/index.html b/test/index.html index a84932bd8..7c3e0124d 100644 --- a/test/index.html +++ b/test/index.html @@ -363,100 +363,6 @@ {{/isError}} - - - diff --git a/ts/util/lint/exceptions.json b/ts/util/lint/exceptions.json index 562ccbc94..4ff8f304f 100644 --- a/ts/util/lint/exceptions.json +++ b/ts/util/lint/exceptions.json @@ -641,105 +641,6 @@ "updated": "2019-03-08T23:49:08.796Z", "reasonDetail": "Protected from arbitrary input" }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.$('#qr img').remove();", - "lineNumber": 133, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.$('#qr .container').show();", - "lineNumber": 135, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " if ($('#qr').length === 0) {", - "lineNumber": 139, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.$('#qr .container').hide();", - "lineNumber": 144, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.qr = new QRCode(this.$('#qr')[0]).makeCode(url);", - "lineNumber": 145, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.$('#qr').addClass('ready');", - "lineNumber": 147, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.$(DEVICE_NAME_SELECTOR).val(deviceName || window.getHostName());", - "lineNumber": 152, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.$('#link-phone').submit();", - "lineNumber": 157, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.$('#link-phone').submit(e => {", - "lineNumber": 167, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " let name = this.$(DEVICE_NAME_SELECTOR).val();", - "lineNumber": 171, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.$(DEVICE_NAME_SELECTOR).focus();", - "lineNumber": 174, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, { "rule": "jQuery-$(", "path": "js/views/key_verification_view.js", From 5b7c58c0d47d1cc2bf3e47fdb214b895ad53482f Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Mon, 17 Aug 2020 06:57:28 +0200 Subject: [PATCH 056/274] Refresh after unblocking a SessionID without model --- ts/components/session/settings/SessionSettings.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/ts/components/session/settings/SessionSettings.tsx b/ts/components/session/settings/SessionSettings.tsx index 41dc10d82..66cad1767 100644 --- a/ts/components/session/settings/SessionSettings.tsx +++ b/ts/components/session/settings/SessionSettings.tsx @@ -630,6 +630,7 @@ export class SettingsView extends React.Component { await currentModel.unblock(); } else { await BlockedNumberController.unblock(blockedNumber); + this.forceUpdate(); } ToastUtils.push({ title: window.i18n('unblocked'), From 1f228fe6ee401d3ffe7d3bcf9f3b9702cb1d6c8f Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 18 Aug 2020 09:41:48 +1000 Subject: [PATCH 057/274] reduce font size of expire app version alert --- stylesheets/_theme_dark.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stylesheets/_theme_dark.scss b/stylesheets/_theme_dark.scss index aa1d61477..c8270299d 100644 --- a/stylesheets/_theme_dark.scss +++ b/stylesheets/_theme_dark.scss @@ -302,11 +302,11 @@ body.dark-theme { color: black; /* biggest we can make the font without wrapping the current text at minimum app width */ font-family: $session-font-accent; - font-size: 20px; + font-size: 16px; height: 60px; span { - line-height: 36px; + line-height: 45px; } button { From 5739d78ada70908e7ae2f5af6f70cb4b27b9aeb4 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 18 Aug 2020 11:35:58 +1000 Subject: [PATCH 058/274] edit group editing title to match Android --- _locales/en/messages.json | 23 ++++++++----------- js/views/create_group_dialog_view.js | 13 ++++------- js/views/network_status_view.js | 12 ++-------- .../session/SessionGroupSettings.tsx | 4 +--- ts/session/utils/Menu.tsx | 4 +--- 5 files changed, 19 insertions(+), 37 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index feb587152..6a2b5927f 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1645,25 +1645,22 @@ "message": "Select message", "description": "Button action that the user can click to select the message" }, - "copiedMessage": { - "message": "Message text copied", - "description": "A toast message telling the user that the message text was copied" - }, - "editGroupNameOrPicture": { - "message": "Edit group name or picture", - "description": "Button action that the user can click to edit a group name (open)" + "editGroup": { + "message": "Edit group", + "description": "Button action that the user can click to edit a group name (open)", + "androidKey": "conversation__menu_edit_group" }, "editGroupName": { "message": "Edit group name", "description": "Button action that the user can click to edit a group name (closed)" }, "updateGroupDialogTitle": { - "message": "Updating a Closed Group", - "description": "Title for the dialog box used to update an existing private group" - }, - "updatePublicGroupDialogTitle": { - "message": "Updating a open group Channel", - "description": "Title for the dialog box used to update an existing open group channel" + "message": "Updating $name$...", + "description": "Title for the dialog box used to update an existing private group", + "androidKey": "GroupCreateActivity_updating_group", + "androidReplace": { + "%1$s": "$name$" + } }, "showRecoveryPhrase": { "message": "Show Recovery Phrase", diff --git a/js/views/create_group_dialog_view.js b/js/views/create_group_dialog_view.js index c9d00af96..d461cedcb 100644 --- a/js/views/create_group_dialog_view.js +++ b/js/views/create_group_dialog_view.js @@ -12,7 +12,8 @@ this.groupName = groupConvo.get('name'); this.conversation = groupConvo; - this.titleText = i18n('updateGroupDialogTitle'); + this.titleText = i18n('updateGroupDialogTitle', this.groupName); + this.close = this.close.bind(this); this.onSubmit = this.onSubmit.bind(this); this.isPublic = groupConvo.isPublic(); @@ -27,9 +28,7 @@ // public chat settings overrides if (this.isPublic) { // fix the title - this.titleText = `${i18n('updatePublicGroupDialogTitle')}: ${ - this.groupName - }`; + this.titleText = i18n('updateGroupDialogTitle', this.groupName); // I'd much prefer to integrate mods with groupAdmins // but lets discuss first... this.isAdmin = groupConvo.isModerator( @@ -88,9 +87,7 @@ this.avatarPath = groupConvo.getAvatarPath(); if (this.isPublic) { - this.titleText = `${i18n('updatePublicGroupDialogTitle')}: ${ - this.groupName - }`; + this.titleText = i18n('updateGroupDialogTitle', this.groupName); // I'd much prefer to integrate mods with groupAdmins // but lets discuss first... this.isAdmin = groupConvo.isModerator( @@ -100,7 +97,7 @@ this.contactsAndMembers = []; this.existingMembers = []; } else { - this.titleText = i18n('updateGroupDialogTitle'); + this.titleText = i18n('updateGroupDialogTitle', this.groupName); this.isAdmin = groupConvo.get('groupAdmins').includes(ourPK); const convos = window.getConversations().models.filter(d => !!d); diff --git a/js/views/network_status_view.js b/js/views/network_status_view.js index db5f468ad..a780f87cd 100644 --- a/js/views/network_status_view.js +++ b/js/views/network_status_view.js @@ -50,8 +50,6 @@ let message = ''; let instructions = ''; let hasInterruption = false; - let action = null; - let buttonClass = null; const socketStatus = this.getSocketStatus(); switch (socketStatus) { @@ -106,20 +104,14 @@ hasInterruption = true; message = i18n('offline'); instructions = i18n('checkNetworkConnection'); - } else if (!Whisper.Registration.isDone()) { - hasInterruption = true; - message = i18n('unlinked'); - instructions = i18n('unlinkedWarning'); - action = i18n('relink'); - buttonClass = 'openInstaller'; } return { message, instructions, hasInterruption, - action, - buttonClass, + action: null, + buttonClass: null, }; }, update() { diff --git a/ts/components/session/SessionGroupSettings.tsx b/ts/components/session/SessionGroupSettings.tsx index 16fe944cf..c94f09f9a 100644 --- a/ts/components/session/SessionGroupSettings.tsx +++ b/ts/components/session/SessionGroupSettings.tsx @@ -267,9 +267,7 @@ export class SessionGroupSettings extends React.Component { role="button" onClick={this.props.onUpdateGroupName} > - {isPublic - ? window.i18n('editGroupNameOrPicture') - : window.i18n('editGroupName')} + {isPublic ? window.i18n('editGroup') : window.i18n('editGroupName')}
)} {showUpdateGroupMembersButton && ( diff --git a/ts/session/utils/Menu.tsx b/ts/session/utils/Menu.tsx index 939b6f2e8..b0564bac4 100644 --- a/ts/session/utils/Menu.tsx +++ b/ts/session/utils/Menu.tsx @@ -174,9 +174,7 @@ export function getUpdateGroupNameMenuItem( i18n: LocalizerType ): JSX.Element | null { if (showUpdateGroupName(Boolean(amMod), Boolean(isKickedFromGroup))) { - return ( - {i18n('editGroupNameOrPicture')} - ); + return {i18n('editGroup')}; } return null; } From 0b6c915f8f59973fcd3a504864c4c0a5c4526515 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 18 Aug 2020 12:31:03 +1000 Subject: [PATCH 059/274] update translation to match android - part 2 --- _locales/en/messages.json | 472 +++++++++++------- js/models/conversations.js | 4 +- js/models/messages.js | 4 +- js/notifications.js | 4 +- js/views/invite_contacts_dialog_view.js | 2 +- ts/components/DevicePairingDialog.tsx | 2 +- .../conversation/CreateGroupDialog.tsx | 2 +- .../conversation/UpdateGroupMembersDialog.tsx | 3 +- .../conversation/UpdateGroupNameDialog.tsx | 10 +- .../session/LeftPaneContactSection.tsx | 31 +- .../session/LeftPaneMessageSection.tsx | 15 - .../session/SessionPasswordPrompt.tsx | 4 +- ts/components/session/SessionSeedModal.tsx | 4 - ts/components/session/SessionToggle.tsx | 2 +- .../session/settings/SessionSettings.tsx | 2 +- 15 files changed, 302 insertions(+), 259 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 6a2b5927f..d5b3a0d1f 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -32,7 +32,7 @@ "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.", "androidKey": "message_recipients_list_item__view", "addStart": "&", - "camelCase": true + "wordCapitalize": true }, "mainMenuWindow": { "message": "&Window", @@ -64,7 +64,7 @@ "message": "Undo", "description": "Edit menu command to remove recently-typed text", "androidKey": "ConversationListFragment_undo", - "camelCase": true + "wordCapitalize": true }, "editMenuRedo": { "message": "Redo", @@ -232,7 +232,7 @@ "message": "View", "description": "Used as a label on a button allowing user to see more information", "androidKey": "message_recipients_list_item__view", - "camelCase": true + "wordCapitalize": true }, "youLeftTheGroup": { "message": "You have left the group.", @@ -907,12 +907,14 @@ "description": "action visible in MessageDetail screen" }, "from": { - "message": "From", - "description": "Label for the sender of a message" + "message": "From:", + "description": "Label for the sender of a message", + "androidKey": "message_details_header__from" }, "to": { - "message": "to", - "description": "Label for the receiver of a message" + "message": "To:", + "description": "Label for the receiver of a message", + "androidKey": "message_details_header__to" }, "sent": { "message": "Sent", @@ -925,25 +927,30 @@ "androidKey": "message_details_header__received" }, "sendMessage": { - "message": " Type your message", + "message": "Message", "description": "Placeholder text in the message entry field" }, "sendMessageLeftGroup": { - "message": "You left this group" + "message": "You have left the group.", + "androidKey": "MessageRecord_left_group" }, "sendMessageBlockedUser": { - "message": "You have blocked the user" + "message": "You have blocked this contact" }, "groupMembers": { "message": "Group members", "androidKey": "ConversationActivity_group_members" }, "resetSession": { - "message": "Reset Session", - "description": "This is a menu item for resetting the session, using the imperative case, as in a command." + "message": "Reset Secure Session", + "description": "This is a menu item for resetting the session, using the imperative case, as in a command.", + "androidKey": "conversation_secure_verified__menu_reset_secure_session", + "wordCapitalize": true }, "showSafetyNumber": { - "message": "View Safety Number" + "message": "View Safety Number", + "androidKey": "recipient_preferences__view_safety_number", + "wordCapitalize": true }, "verifyHelp": { "message": "If you wish to verify the security of your end-to-end encryption with $name$, compare the numbers above with the numbers on their device.", @@ -964,9 +971,9 @@ }, "resend": { "message": "Resend", - "description": "Shown on the drop-down menu for an indinvidaul message, but only if it is an outgoing message that failed to send", + "description": "Shown on the drop-down menu for an individual message, but only if it is an outgoing message that failed to send", "androidKey": "message_recipients_list_item__resend", - "camelCase": true + "wordCapitalize": true }, "deleteMessage": { "message": "Delete Message", @@ -977,21 +984,21 @@ "message": "Delete Messages", "description": "Menu item for deleting messages, title case." }, - "deleteMessagesForEveryone": { - "message": "Delete messages for everyone", + "deleteMessageForEveryone": { + "message": "Delete Message For Everyone", "description": "Menu item for deleting messages, title case." }, - "deleteMessageForEveryone": { - "message": "Delete message for everyone", + "deleteMessagesForEveryone": { + "message": "Delete Messages For Everyone", "description": "Menu item for deleting messages, title case." }, "deleteForEveryone": { - "message": "Delete for everyone", + "message": "Delete For Everyone", "description": "Menu item for deleting messages, title case." }, "deletePublicConversationConfirmation": { - "message": "Permanently delete the messages locally from this public channel?", - "description": "Confirmation dialog text that asks the user if they really wish to delete the public channel messages locally. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone." + "message": "Permanently delete the messages locally from this open group?", + "description": "Confirmation dialog text that asks the user if they really wish to delete the open group messages locally. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone." }, "deleteConversationConfirmation": { "message": "Permanently delete the messages in this conversation?", @@ -1008,8 +1015,9 @@ "androidKey": "dialog_clear_all_data_explanation" }, "deleteContactConfirmation": { - "message": "Permanently delete this contact and destroy all sessions?", - "description": "Confirmation dialog text that tells the user what will happen if they delete the contact." + "message": "Are you sure you want to delete this conversation?", + "description": "Confirmation dialog text that tells the user what will happen if they delete the contact.", + "androidKey": "activity_home_delete_conversation_dialog_message" }, "sessionResetFailed": { "message": "Secure session reset failed", @@ -1045,7 +1053,8 @@ }, "addACaption": { "message": "Add a caption...", - "descripton": "Used as the placeholder text in the caption editor text field" + "descripton": "Used as the placeholder text in the caption editor text field", + "androidKey": "MediaSendActivity_add_a_caption" }, "copy": { "message": "Copy", @@ -1054,7 +1063,8 @@ }, "save": { "message": "Save", - "descripton": "Used as a 'commit changes' button in the Caption Editor for outgoing image attachments" + "descripton": "Used as a 'commit changes' button in the Caption Editor for outgoing image attachments", + "androidKey": "media_preview__save_title" }, "emojiAlt": { "message": "Emoji image of '$title$'", @@ -1068,7 +1078,8 @@ }, "linkNewDevice": { "message": "Link New Device", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Signal iOS to add a new linked device", + "androidKey": "device_list_fragment__link_new_device" }, "permissions": { "message": "Permissions", @@ -1080,19 +1091,18 @@ }, "linkPreviewsTitle": { "message": "Send Link Previews", - "description": "Option to control creation and send of link previews in setting screen" + "description": "Option to control creation and send of link previews in setting screen", + "androidKey": "preferences__send_link_previews", + "wordCapitalize": true }, "linkPreviewDescription": { - "message": "Link previews supported for Imgur, Instagram, Pinterest, Reddit, and YouTube.", - "description": "Description shown for the Link Preview option " - }, - "linkPreviewsConfirmTitle": { - "message": "Warning" + "message": "Previews are supported for Imgur, Instagram, Pinterest, Reddit, and YouTube links", + "description": "Description shown for the Link Preview option ", + "androidKey": "preferences__previews_are_supported_for" }, "linkPreviewsConfirmMessage": { "message": "You will not have full metadata protection when sending or receiving link previews." }, - "mediaPermissionsTitle": { "message": "Microphone and Camera" }, @@ -1112,17 +1122,10 @@ "message": "You must restart Session to apply your new settings", "description": "Shown when the user changes their spellcheck setting to indicate that they must restart Signal." }, - "clearDataHeader": { - "message": "Clear All Local 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." - }, "notifications": { "message": "Notifications", - "description": "Header for notification settings" + "description": "Header for notification settings", + "androidKey": "preferences__notifications" }, "readReceiptSettingDescription": { "message": "See and share when messages have been read (enables read receipts in all sessions).", @@ -1130,7 +1133,8 @@ }, "readReceiptSettingTitle": { "message": "Read Receipts", - "description": "Title of the read receipts setting" + "description": "Title of the read receipts setting", + "androidKey": "preferences__read_receipts" }, "typingIndicatorsSettingDescription": { "message": "See and share when messages are being typed (applies to all sessions).", @@ -1138,7 +1142,9 @@ }, "typingIndicatorsSettingTitle": { "message": "Typing Indicators", - "description": "Title of the typing indicators setting" + "description": "Title of the typing indicators setting", + "androidKey": "preferences__typing_indicators", + "wordCapitalize": true }, "messageTTL": { "message": "Message TTL", @@ -1157,8 +1163,9 @@ "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "Disable notifications", - "description": "Label for disabling notifications" + "message": "Mute notifications", + "description": "Label for disabling notifications", + "androidKey": "conversation_unmuted__mute_notifications" }, "nameAndMessage": { "message": "Name and content", @@ -1174,19 +1181,25 @@ }, "newMessage": { "message": "New Message", - "description": "Displayed in notifications for only 1 message" + "description": "Displayed in notifications for only 1 message", + "androidKey": "activity_conversation_default_hint" }, "newMessages": { "message": "New Messages", "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" + "message": "Most recent from: $name$", + "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting", + "androidKey": "MessageNotifier_most_recent_from_s", + "androidReplace": { + "%1$s": "$name$" + } }, "notificationFrom": { "message": "From:", - "description": "Displayed in notifications when setting is 'name only' and one message is waiting" + "description": "Displayed in notifications when setting is 'name only' and one message is waiting", + "androidKey": "message_details_header__from" }, "notificationMostRecent": { "message": "Most recent:", @@ -1194,7 +1207,8 @@ }, "sendFailed": { "message": "Send failed", - "description": "Shown on outgoing message if it fails to send" + "description": "Shown on outgoing message if it fails to send", + "androidKey": "conversation_item_sent__send_failed_indicator_description" }, "learnMore": { "message": "Learn more about verifying safety numbers", @@ -1214,15 +1228,13 @@ }, "mediaMessage": { "message": "Media message", - "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." - }, - "sync": { - "message": "Contacts", - "description": "Label for contact and group sync settings" + "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview.", + "androidKey": "ThreadRecord_media_message" }, "timestamp_s": { "message": "now", - "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." + "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble.", + "androidKey": "DateUtils_just_now" }, "timestamp_m": { "message": "1 minute", @@ -1256,6 +1268,10 @@ "content": "$1", "example": "10m" } + }, + "androidKey": "MessageRecord_you_set_disappearing_message_time_to_s", + "androidReplace": { + "%1$s": "$time$" } }, "timerSetOnSync": { @@ -1280,11 +1296,17 @@ "content": "$2", "example": "10m" } + }, + "androidKey": "MessageRecord_s_set_disappearing_message_time_to_s", + "androidReplace": { + "%1$s": "$name$", + "%2$s": "$time$" } }, "timerOption_0_seconds": { "message": "Off", - "description": "Label for option to turn off message expiration in the timer menu" + "description": "Label for option to turn off message expiration in the timer menu", + "androidKey": "expiration_off" }, "timerOption_5_seconds": { "message": "5 seconds", @@ -1332,7 +1354,8 @@ }, "disappearingMessages": { "message": "Disappearing messages", - "description": "Conversation menu option to enable disappearing messages" + "description": "Conversation menu option to enable disappearing messages", + "androidKey": "conversation_expiring_off__disappearing_messages" }, "changeNickname": { "message": "Change Nickname", @@ -1344,7 +1367,8 @@ }, "timerOption_0_seconds_abbreviated": { "message": "off", - "description": "Short format indicating current timer setting in the conversation list snippet" + "description": "Short format indicating current timer setting in the conversation list snippet", + "androidKey": "ApplicationPreferencesActivity_off" }, "timerOption_5_seconds_abbreviated": { "message": "5s", @@ -1392,7 +1416,8 @@ }, "disappearingMessagesDisabled": { "message": "Disappearing messages disabled", - "description": "Displayed in the left pane when the timer is turned off" + "description": "Displayed in the left pane when the timer is turned off", + "androidKey": "ThreadRecord_disappearing_messages_disabled" }, "disabledDisappearingMessages": { "message": "$name$ disabled disappearing messages", @@ -1402,39 +1427,54 @@ "content": "$1", "example": "John" } + }, + "androidKey": "MessageRecord_s_disabled_disappearing_messages", + "androidReplace": { + "%1$s": "$name$" } }, "youDisabledDisappearingMessages": { "message": "You disabled disappearing messages", - "description": "Displayed in the conversation list when the timer is turned off" + "description": "Displayed in the conversation list when the timer is turned off", + "androidKey": "MessageRecord_you_disabled_disappearing_messages" }, "timerSetTo": { - "message": "Timer set to $time$", + "message": "Disappearing message time set to $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" } + }, + "androidKey": "ThreadRecord_disappearing_message_time_updated_to_s", + "androidReplace": { + "%s": "$time$" } }, "safetyNumberChanged": { - "message": "Safety Number has changed", - "description": "A notification shown in the conversation when a contact reinstalls" + "message": "Safety number changed", + "description": "A notification shown in the conversation when a contact reinstalls", + "androidKey": "ThreadRecord_safety_number_changed" }, "safetyNumberChangedGroup": { - "message": "Safety Number with $name$ has changed", + "message": "Your 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" } + }, + "androidKey": "ThreadRecord_your_safety_number_with_s_has_changed", + "androidReplace": { + "%s": "$name$" } }, "verifyNewNumber": { "message": "Verify Safety Number", - "description": "Label on button included with safety number change notification in the conversation" + "description": "Label on button included with safety number change notification in the conversation", + "androidKey": "AndroidManifest__verify_safety_number" }, "yourSafetyNumberWith": { "message": "Your safety number with $name$:", @@ -1447,14 +1487,16 @@ } }, "themeToggleTitle": { - "message": "Light Mode" + "message": "Light", + "androidKey": "preferences__light_theme" }, "themeToggleDescription": { "message": "Choose the theme best suited to you" }, "noteToSelf": { "message": "Note to Self", - "description": "Name for the conversation with your own phone number" + "description": "Name for the conversation with your own phone number", + "androidKey": "note_to_self" }, "hideMenuBarTitle": { "message": "Hide Menu Bar", @@ -1470,19 +1512,12 @@ }, "invalidNumberError": { "message": "Invalid public key", - "description": "When a person inputs a public key that is invalid" - }, - "unlinkedWarning": { - "message": "Relink Session Desktop to your mobile device to continue messaging." - }, - "unlinked": { - "message": "Unlinked" + "description": "When a person inputs a public key that is invalid", + "androidKey": "fragment_new_conversation_invalid_public_key_message" }, "successUnlinked": { - "message": "Your device was unlinked successfully" - }, - "relink": { - "message": "Relink" + "message": "Your device was unlinked successfully", + "androidKey": "activity_landing_device_unlinked_dialog_title" }, "autoUpdateSettingTitle": { "message": "Auto Update" @@ -1503,10 +1538,12 @@ "message": "Restart Session" }, "autoUpdateLaterButtonLabel": { - "message": "Later" + "message": "Later", + "androidKey": "RatingManager_later" }, "autoUpdateDownloadButtonLabel": { - "message": "Download" + "message": "Download", + "androidKey": "audio_view__download_accessibility_description" }, "autoUpdateDownloadedMessage": { "message": "The new update has been downloaded." @@ -1515,13 +1552,17 @@ "message": "Would you like to download the update?" }, "leftTheGroup": { - "message": "$name$ left the group", + "message": "$name$ has left the group.", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { "content": "$1", "example": "Bob" } + }, + "androidKey": "ConversationItem_group_action_left", + "androidReplace": { + "%1$s": "$name$" } }, "multipleLeftTheGroup": { @@ -1536,47 +1577,67 @@ }, "updatedTheGroup": { "message": "Group updated", - "description": "Shown in the conversation history when someone updates the group" + "description": "Shown in the conversation history when someone updates the group", + "androidKey": "ThreadRecord_group_updated" }, "titleIsNow": { "comment": "Do not add a period here, used as a fragment and will break unit test", - "message": "Group name has been set to '$name$'", + "message": "Group name is now '$name$'.", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { "content": "$1", "example": "Book Club" } + }, + "androidKey": "GroupUtil_group_name_is_now", + "androidReplace": { + "%1$s": "$name$" } }, "joinedTheGroup": { - "message": "$name$ joined the group", + "message": "$name$ joined the group.", "description": "Shown in the conversation history when a single person joins the group", "placeholders": { "name": { "content": "$1", "example": "Alice" } + }, + "androidKey": "GroupUtil_joined_the_group", + "androidKeyCount": "one", + "androidReplace": { + "%1$s": "$name$" } }, "multipleJoinedTheGroup": { - "message": "$names$ joined the group", + "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" } + }, + "androidKey": "GroupUtil_joined_the_group", + "androidKeyCount": "other", + "androidReplace": { + "%1$s": "$name$" } }, "kickedFromTheGroup": { - "message": "$name$ was removed from the group", + "message": "$name$ was removed from the group.", "description": "Shown in the conversation history when a single person is removed from the group", "placeholders": { "name": { "content": "$1", "example": "Alice" } + }, + "androidKey": "GroupUtil_removed_from_the_group", + "androidKeyCount": "one", + "androidReplace": { + "%1$s": "$name$" } }, "multipleKickedFromTheGroup": { @@ -1587,24 +1648,28 @@ "content": "$1", "example": "Alice, Bob" } + }, + "androidKey": "GroupUtil_removed_from_the_group", + "androidKeyCount": "other", + "androidReplace": { + "%1$s": "$name$" } }, "blockUser": { - "message": "Block contact" + "message": "Block", + "androidKey": "RecipientPreferenceActivity_block" }, "unblockUser": { - "message": "Unblock contact" + "message": "Unblock", + "androidKey": "RecipientPreferenceActivity_unblock" }, "unblocked": { "message": "Unblocked" }, "blockedSettingsTitle": { "message": "Blocked contacts", - "description": "Shown in the settings page as the heading for the blocked user settings" - }, - "copyPublicKey": { - "message": "Copy Public Key", - "description": "Button action that the user can click to copy their public keys" + "description": "Shown in the settings page as the heading for the blocked user settings", + "androidKey": "preferences_app_protection__blocked_contacts" }, "banUser": { "message": "Ban User", @@ -1624,18 +1689,18 @@ }, "leaveGroup": { "message": "Leave Group", - "description": "Button action that the user can click to leave the group" - }, - "leaveClosedGroup": { - "message": "Leave Closed Group", - "description": "Button action that the user can click to leave the group" + "description": "Button action that the user can click to leave the group", + "androidKey": "conversation__menu_leave_group", + "wordCapitalize": true }, "leaveGroupConfirmation": { "message": "Are you sure you want to leave this group?", - "description": "Confirmation dialog text that tells the user what will happen if they leave the group." + "description": "Confirmation dialog text that tells the user what will happen if they leave the group.", + "androidKey": "activity_home_leave_group_dialog_message" }, "noContactsForGroup": { - "message": "You don't have any contacts to start a group with." + "message": "You don't have any contacts yet", + "androidKey": "activity_create_closed_group_empty_state_message" }, "copyMessage": { "message": "Copy message text", @@ -1663,14 +1728,13 @@ } }, "showRecoveryPhrase": { - "message": "Show Recovery Phrase", - "description": "Button action that the user can click to view their unique recovery phrase" + "message": "Recovery Phrase", + "description": "Button action that the user can click to view their unique recovery phrase", + "androidKey": "activity_settings_recovery_phrase_button_title" }, "yourSessionID": { - "message": "Your Session ID" - }, - "setStatus": { - "message": "Set a status..." + "message": "Your Session ID", + "androidKey": "your_session_id" }, "setAccountPasswordTitle": { "message": "Set Account Password", @@ -1711,34 +1775,35 @@ "description": "Request for user to enter password to show recovery phrase." }, "recoveryPhraseSavePromptMain": { - "message": "Please save the recovery phrase below in a safe location.", - "description": "Prompt on recovery phrase modal requesting user to save their recovery phrase. Line one" - }, - "recoveryPhraseSavePromptAlt": { - "message": "They can be used to restore your account if you lose access or migrate to a new device.", - "description": "Prompt on recovery phrase modal requesting user to save their recovery phrase. Line two" + "message": "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.", + "description": "Prompt on recovery phrase modal requesting user to save their recovery phrase. Line one", + "androidKey": "activity_seed_explanation" }, "QRCodeTitle": { "message": "View My QR Code", - "description": "Title given to QR Code modal" + "description": "Title given to QR Code modal", + "androidKey": "activity_qr_code_view_my_qr_code_tab_title" }, "QRCodeDescription": { "message": "This is your unique public QR Code.
Other users may scan this in order to begin a conversation with you.", "description": "Description given to QRCode modal" }, "invalidOpenGroupUrl": { - "message": "Please enter an open group URL", - "description": "Error message when no server url entered" + "message": "Invalid URL", + "description": "Error message when no server url entered", + "androidKey": "fragment_add_public_chat_invalid_url_message" }, "copiedToClipboard": { - "message": "Copied to clipboard" + "message": "Copied to clipboard", + "androidKey": "copied_to_clipboard" }, "passwordViewTitle": { "message": "Type In Your Password", "description": "The title shown when user needs to type in a password to unlock the messenger" }, "unlock": { - "message": "Unlock" + "message": "Unlock", + "androidKey": "prompt_passphrase_activity__unlock" }, "password": { "message": "Password", @@ -1805,10 +1870,12 @@ "message": "You are already connected to this open group" }, "connectToServerFail": { - "message": "Couldn't join group" + "message": "Couldn't join group", + "androidKey": "activity_join_public_chat_error" }, "connectingToServer": { - "message": "Connecting to server..." + "message": "Connecting...", + "androidKey": "CallNotificationBuilder_connecting" }, "connectToServerSuccess": { "message": "Successfully connected to open group" @@ -1835,11 +1902,13 @@ "message": "Set" }, "remove": { - "message": "Remove" + "message": "Remove", + "androidKey": "ClearProfileActivity_remove" }, "invalidSessionId": { "message": "Invalid Session ID", - "description": "Error string shown when user types an invalid pubkey hex string" + "description": "Error string shown when user types an invalid pubkey hex string", + "androidKey": "invalid_session_id" }, "invalidPubkeyFormat": { "message": "Invalid Pubkey Format", @@ -1857,22 +1926,23 @@ "message": "Not enough nodes currently active for LNS lookup" }, "emptyGroupNameError": { - "message": "Group Name cannot be empty", - "description": "Error message displayed on empty group name" + "message": "Please enter a group name", + "description": "Error message displayed on empty group name", + "androidKey": "activity_create_closed_group_group_name_missing_error" }, - "nonAdminDeleteMember": { - "message": "Only group admin can remove members!" - }, - "editProfileModalTitle": { "message": "Profile", "description": "Title for the Edit Profile modal" }, "groupNamePlaceholder": { - "message": "Group Name" + "message": "Group Name", + "androidKey": "GroupCreateActivity_group_name_hint", + "wordCapitalize": true }, "inviteContacts": { - "message": "Invite Contacts" + "message": "Invite Contacts", + "androidKey": "text_secure_normal__invite_friends", + "wordCapitalize": true }, "addModerators": { "message": "Add Moderators" @@ -1881,7 +1951,8 @@ "message": "Remove Moderators" }, "add": { - "message": "Add" + "message": "Add", + "androidKey": "fragment_add_public_chat_add_button_title_1" }, "groupInvitation": { "message": "Group Invitation" @@ -1911,38 +1982,46 @@ } }, "createAccount": { - "message": "Create Account" + "message": "Create Account", + "androidKey": "activity_display_name_title" }, "signIn": { "message": "Sign In" }, "yourUniqueSessionID": { - "message": "Say hello to your Session ID" + "message": "Say hello to your Session ID", + "androidKey": "activity_register_title" }, "allUsersAreRandomly...": { - "message": "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." + "message": "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.", + "androidKey": "activity_register_explanation" }, "getStarted": { "message": "Get started" }, "generateSessionID": { - "message": "Create Session ID" + "message": "Create Session ID", + "androidKey": "activity_landing_register_button_title" }, "recoveryPhrase": { - "message": "Recovery Phrase" + "message": "Recovery Phrase", + "androidKey": "activity_settings_recovery_phrase_button_title" }, "enterRecoveryPhrase": { - "message": "Enter Recovery Phrase" + "message": "Enter Recovery Phrase", + "androidKey": "activity_restore_seed_edit_text_hint" }, "displayName": { - "message": "Display Name" + "message": "Display Name", + "androidKey": "activity_display_name_name_edit_text_label" }, "anonymous": { "message": "Anonymous", "description": "The name of currently unidentified users" }, "enterDisplayName": { - "message": "Enter a display name" + "message": "Enter a display name", + "androidKey": "activity_display_name_edit_text_hint" }, "optionalPassword": { "message": "Verify Password" @@ -1969,16 +2048,20 @@ "message": "Enter your Session ID below to link this device to your Session ID." }, "enterSessionIDHere": { - "message": "Enter your Session ID" + "message": "Enter your Session ID", + "androidKey": "fragment_enter_session_id_edit_text_hint" }, "continueYourSession": { - "message": "Continue Your Session" + "message": "Continue Your Session", + "androidKey": "activity_landing_restore_button_title" }, "linkDevice": { - "message": "Link Device" + "message": "Link Device", + "androidKey": "activity_link_device_title" }, "restoreUsingRecoveryPhrase": { - "message": "Restore From Recovery Phrase" + "message": "Restore your account", + "androidKey": "activity_restore_title" }, "linkDeviceToExistingAccount": { "message": "Link Device to Existing Session ID" @@ -1996,52 +2079,57 @@ "message": "Welcome to your Session" }, "newSession": { - "message": "New Session" + "message": "New Session", + "androidKey": "activity_create_private_chat_title" }, "searchFor...": { - "message": "Search for conversations, contacts, and messages" + "message": "Search for conversations, contacts, and messages", + "androidKey": "SearchToolbar_search_for_conversations_contacts_and_messages" }, "enterSessionID": { - "message": "Enter Session ID" + "message": "Enter Session ID", + "androidKey": "activity_link_device_enter_session_id_tab_title" }, "enterSessionIDOfRecipient": { - "message": "Enter Session ID of recipient" + "message": "Enter Session ID of recipient", + "androidKey": "fragment_enter_public_key_edit_text_hint" }, "usersCanShareTheir...": { - "message": "Users can share their Session ID by going into their account settings and tapping \"Share Session ID\", or by sharing their QR code." + "message": "Users can share their Session ID by going into their account settings and tapping \"Share Session ID\", or by sharing their QR code.", + "androidKey": "fragment_enter_public_key_explanation" }, "message": { "message": "Message" }, - "edit": { - "message": "Edit" - }, "addContact": { "message": "Add Contact" }, - "createGroup": { - "message": "Create Group" - }, "appearanceSettingsTitle": { - "message": "Appearance" + "message": "Appearance", + "androidKey": "preferences__appearance" }, "permissionSettingsTitle": { "message": "Permissions" }, "privacySettingsTitle": { - "message": "Privacy" + "message": "Privacy", + "androidKey": "recipient_preferences__privacy" }, "notificationsSettingsTitle": { - "message": "Notifications" + "message": "Notifications", + "androidKey": "preferences__notifications" }, "devicesSettingsTitle": { - "message": "Devices" + "message": "Linked devices", + "androidKey": "preferences__linked_devices" }, "recoveryPhraseEmpty": { - "message": "Recovery Phrase is mandatory" + "message": "Enter your recovery phrase", + "androidKey": "activity_restore_seed_edit_text_hint" }, "displayNameEmpty": { - "message": "Display Name Is Mandatory" + "message": "Please pick a display name", + "androidKey": "activity_display_name_display_name_missing_error" }, "members": { "message": "$count$ members", @@ -2053,66 +2141,66 @@ } }, "joinOpenGroup": { - "message": "Join Open Group" + "message": "Join Open Group", + "androidKey": "activity_join_public_chat_title" }, "newClosedGroup": { - "message": "New Closed Group" + "message": "New Closed Group", + "androidKey": "activity_create_closed_group_title" }, "newClosedGroupDescription": { - "message": "Closed groups support up to 10 members and provide the same privacy protections as one-on-one sessions." + "message": "Closed groups support up to 10 members and provide the same privacy protections as one-on-one sessions.", + "androidKey": "activity_create_closed_group_explanation" }, "createClosedGroupNamePrompt": { - "message": "Group Name" + "message": "Group Name", + "androidKey": "GroupCreateActivity_group_name_hint" }, "createClosedGroupPlaceholder": { - "message": "Enter a group name" - }, - "closedGroupCreatedToastTitle": { - "message": "Group created successfully" - }, - "enterOpenGroupURL": { - "message": "Enter Open Group URL" + "message": "Enter a group name", + "androidKey": "activity_create_closed_group_edit_text_hint" }, "openGroupURL": { - "message": "Open Group URL" + "message": "Open Group URL", + "androidKey": "activity_join_public_chat_enter_group_url_tab_title" }, "enterAnOpenGroupURL": { - "message": "Enter an open group URL" + "message": "Enter an open group URL", + "androidKey": "fragment_enter_chat_url_edit_text_hint" }, "next": { - "message": "Next" + "message": "Next", + "androidKey": "RegistrationActivity_next" }, "description": { "message": "Description" }, "secretWords": { - "message": "Secret words" + "message": "Please check that the words below match the ones shown on your other device", + "androidKey": "view_device_linking_explanation_2" }, "pairingDevice": { - "message": "Linking Device" + "message": "Linking Device", + "androidKey": "DeviceProvisioningActivity_content_progress_title" }, "devicePairedSuccessfully": { - "message": "Device linked successfully" + "message": "Your device has been linked successfully", + "androidKey": "view_device_linking_explanation_3" }, "invalidGroupNameTooShort": { - "message": "Please enter a group name" + "message": "Please enter a group name", + "androidKey": "activity_create_closed_group_group_name_missing_error" }, "invalidGroupNameTooLong": { - "message": "Please enter a shorter group name" + "message": "Please enter a shorter group name", + "androidKey": "activity_create_closed_group_group_name_too_long_error" }, "pickClosedGroupMember": { - "message": "Please pick at least 2 group members" + "message": "Please pick at least 2 group members", + "androidKey": "activity_create_closed_group_not_enough_group_members_error" }, "closedGroupMaxSize": { - "message": "A closed group cannot have more than 10 members" - }, - "maxGroupMembersError": { - "message": "Max number of members for small group chats is $maxSize$", - "placeholders": { - "maxSize": { - "content": "$1", - "example": "10" - } - } + "message": "A closed group cannot have more than 10 members", + "androidKey": "activity_create_closed_group_too_many_group_members_error" } } diff --git a/js/models/conversations.js b/js/models/conversations.js index d4e220a33..6bf7dac12 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -2310,10 +2310,8 @@ copyPublicKey() { clipboard.writeText(this.id); - const copiedMessage = i18n('copiedToClipboard'); - window.pushToast({ - title: copiedMessage, + title: i18n('copiedToClipboard'), type: 'success', id: 'copiedToClipboard', }); diff --git a/js/models/messages.js b/js/models/messages.js index 6aca3a49c..53ad520b2 100644 --- a/js/models/messages.js +++ b/js/models/messages.js @@ -996,9 +996,9 @@ clipboard.writeText(this.get('body')); window.pushToast({ - title: i18n('copiedMessage'), + title: i18n('copiedToClipboard'), type: 'success', - id: 'copiedMessage', + id: 'copiedToClipboard', }); }, diff --git a/js/notifications.js b/js/notifications.js index b5120bb6e..4c341e31f 100644 --- a/js/notifications.js +++ b/js/notifications.js @@ -123,9 +123,7 @@ if (messagesNotificationCount === 1) { message = `${i18n('notificationFrom')} ${lastMessageTitle}`; } else { - message = `${i18n( - 'notificationMostRecentFrom' - )} ${lastMessageTitle}`; + message = i18n('notificationMostRecentFrom', lastMessageTitle); } break; } diff --git a/js/views/invite_contacts_dialog_view.js b/js/views/invite_contacts_dialog_view.js index 826dd34a9..c21c8924c 100644 --- a/js/views/invite_contacts_dialog_view.js +++ b/js/views/invite_contacts_dialog_view.js @@ -83,7 +83,7 @@ window.CONSTANTS.SMALL_GROUP_SIZE_LIMIT ) { const msg = window.i18n( - 'maxGroupMembersError', + 'closedGroupMaxSize', window.CONSTANTS.SMALL_GROUP_SIZE_LIMIT ); diff --git a/ts/components/DevicePairingDialog.tsx b/ts/components/DevicePairingDialog.tsx index e8c25dd36..f8a02cd60 100644 --- a/ts/components/DevicePairingDialog.tsx +++ b/ts/components/DevicePairingDialog.tsx @@ -119,9 +119,9 @@ export class DevicePairingDialog extends React.Component { {window.i18n('allowPairingWithDevice')} {this.renderErrors()} +
{window.i18n('secretWords')}
-
{secretWords}
diff --git a/ts/components/conversation/CreateGroupDialog.tsx b/ts/components/conversation/CreateGroupDialog.tsx index 988db1f39..4fe4f72a1 100644 --- a/ts/components/conversation/CreateGroupDialog.tsx +++ b/ts/components/conversation/CreateGroupDialog.tsx @@ -203,7 +203,7 @@ export class CreateGroupDialog extends React.Component { updatedContacts.filter(d => d.checkmarked).length > window.CONSTANTS.SMALL_GROUP_SIZE_LIMIT - 1 ) { - const msg = `${this.props.i18n('maxGroupMembersError')} ${ + const msg = `${this.props.i18n('closedGroupMaxSize')} ${ window.CONSTANTS.SMALL_GROUP_SIZE_LIMIT }`; this.onShowError(msg); diff --git a/ts/components/conversation/UpdateGroupMembersDialog.tsx b/ts/components/conversation/UpdateGroupMembersDialog.tsx index 374a8564e..d42e5fb18 100644 --- a/ts/components/conversation/UpdateGroupMembersDialog.tsx +++ b/ts/components/conversation/UpdateGroupMembersDialog.tsx @@ -216,8 +216,7 @@ export class UpdateGroupMembersDialog extends React.Component { private onMemberClicked(selected: any) { if (selected.existingMember && !this.props.isAdmin) { - this.onShowError(this.props.i18n('nonAdminDeleteMember')); - + window.console.warn('Only group admin can remove members!'); return; } diff --git a/ts/components/conversation/UpdateGroupNameDialog.tsx b/ts/components/conversation/UpdateGroupNameDialog.tsx index 4b8c8c235..ad7f380e7 100644 --- a/ts/components/conversation/UpdateGroupNameDialog.tsx +++ b/ts/components/conversation/UpdateGroupNameDialog.tsx @@ -49,21 +49,19 @@ export class UpdateGroupNameDialog extends React.Component { } public onClickOK() { + const { i18n, onSubmit } = this.props; if (!this.state.groupName.trim()) { - this.onShowError(this.props.i18n('emptyGroupNameError')); + this.onShowError(i18n('emptyGroupNameError')); return; } const avatar = - this.inputEl && - this.inputEl.current && - this.inputEl.current.files && - this.inputEl.current.files.length > 0 + this?.inputEl?.current?.files?.length > 0 ? this.inputEl.current.files[0] : null; // otherwise use the current avatar - this.props.onSubmit(this.state.groupName, avatar); + onSubmit(this.state.groupName, avatar); this.closeDialog(); } diff --git a/ts/components/session/LeftPaneContactSection.tsx b/ts/components/session/LeftPaneContactSection.tsx index 440c4e4a8..4490062e3 100644 --- a/ts/components/session/LeftPaneContactSection.tsx +++ b/ts/components/session/LeftPaneContactSection.tsx @@ -218,35 +218,16 @@ export class LeftPaneContactSection extends React.Component { private renderBottomButtons(): JSX.Element { const { selectedTab } = this.state; - const edit = window.i18n('edit'); const addContact = window.i18n('addContact'); - const createGroup = window.i18n('createGroup'); - const showEditButton = false; return (
- {showEditButton && ( - - )} - {selectedTab === 0 ? ( - - ) : ( - - )} +
); } diff --git a/ts/components/session/LeftPaneMessageSection.tsx b/ts/components/session/LeftPaneMessageSection.tsx index 560597d5e..a64486754 100644 --- a/ts/components/session/LeftPaneMessageSection.tsx +++ b/ts/components/session/LeftPaneMessageSection.tsx @@ -363,21 +363,11 @@ export class LeftPaneMessageSection extends React.Component { } private renderBottomButtons(): JSX.Element { - const edit = window.i18n('edit'); const joinOpenGroup = window.i18n('joinOpenGroup'); const newClosedGroup = window.i18n('newClosedGroup'); - const showEditButton = false; return (
- {showEditButton && ( - - )} - { senderKeys, () => { this.handleToggleOverlay(undefined); - - ToastUtils.push({ - title: window.i18n('closedGroupCreatedToastTitle'), - type: 'success', - }); } ); } diff --git a/ts/components/session/SessionPasswordPrompt.tsx b/ts/components/session/SessionPasswordPrompt.tsx index e3b93d81c..9c6ca55bc 100644 --- a/ts/components/session/SessionPasswordPrompt.tsx +++ b/ts/components/session/SessionPasswordPrompt.tsx @@ -53,13 +53,13 @@ export class SessionPasswordPrompt extends React.PureComponent<{}, State> { ? 'warning-info-area' : 'password-info-area'; const infoTitle = this.state.clearDataView - ? window.i18n('clearDataHeader') + ? window.i18n('clearAllData') : window.i18n('passwordViewTitle'); const buttonGroup = this.state.clearDataView ? this.renderClearDataViewButtons() : this.renderPasswordViewButtons(); const featureElement = this.state.clearDataView ? ( -

{window.i18n('clearDataExplanation')}

+

{window.i18n('deleteAccountWarning')}

) : ( {

{i18n('recoveryPhraseSavePromptMain')} -
- - {i18n('recoveryPhraseSavePromptAlt')} -

diff --git a/ts/components/session/SessionToggle.tsx b/ts/components/session/SessionToggle.tsx index b9df7c319..e56978973 100644 --- a/ts/components/session/SessionToggle.tsx +++ b/ts/components/session/SessionToggle.tsx @@ -9,7 +9,7 @@ interface Props { // setting item in SessionSettings.tsx are like such: // confirmationDialogParams: { // shouldShowConfirm: false, - // title: window.i18n('linkPreviewsConfirmTitle'), + // title: window.i18n('linkPreviewsTitle'), // message: window.i18n('linkPreviewsConfirmMessage'), // okTheme: 'danger', // } diff --git a/ts/components/session/settings/SessionSettings.tsx b/ts/components/session/settings/SessionSettings.tsx index 0a727a4ed..a447706b3 100644 --- a/ts/components/session/settings/SessionSettings.tsx +++ b/ts/components/session/settings/SessionSettings.tsx @@ -387,7 +387,7 @@ export class SettingsView extends React.Component { confirmationDialogParams: { shouldShowConfirm: () => !window.getSettingValue('link-preview-setting'), - title: window.i18n('linkPreviewsConfirmTitle'), + title: window.i18n('linkPreviewsTitle'), message: window.i18n('linkPreviewsConfirmMessage'), okTheme: 'danger', }, From 133d541a4811ed1f63a260d28454c53e7ec027c5 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 18 Aug 2020 13:45:32 +1000 Subject: [PATCH 060/274] fix tests --- js/models/messages.js | 2 +- test/app/fixtures/menu-mac-os-setup.json | 6 +----- test/app/fixtures/menu-mac-os.json | 2 +- .../fixtures/menu-windows-linux-setup.json | 6 +----- test/app/fixtures/menu-windows-linux.json | 2 +- test/models/messages_test.js | 10 ++++----- test/views/network_status_view_test.js | 21 ------------------- 7 files changed, 10 insertions(+), 39 deletions(-) diff --git a/js/models/messages.js b/js/models/messages.js index 53ad520b2..bd69ec79e 100644 --- a/js/models/messages.js +++ b/js/models/messages.js @@ -231,7 +231,7 @@ messages.push(i18n('kickedFromTheGroup', names[0])); } } - return messages.join(', '); + return messages.join(' '); } if (this.isEndSession()) { return i18n(this.getEndSessionTranslationKey()); diff --git a/test/app/fixtures/menu-mac-os-setup.json b/test/app/fixtures/menu-mac-os-setup.json index 861511f8a..ff584845c 100644 --- a/test/app/fixtures/menu-mac-os-setup.json +++ b/test/app/fixtures/menu-mac-os-setup.json @@ -3,7 +3,7 @@ "label": "Session", "submenu": [ { - "label": "About Session", + "label": "About", "click": null }, { @@ -39,10 +39,6 @@ { "label": "Set Up with Import", "click": null - }, - { - "label": "Set Up as New Device", - "click": null } ] }, diff --git a/test/app/fixtures/menu-mac-os.json b/test/app/fixtures/menu-mac-os.json index b2ea56aaf..60851f18d 100644 --- a/test/app/fixtures/menu-mac-os.json +++ b/test/app/fixtures/menu-mac-os.json @@ -3,7 +3,7 @@ "label": "Session", "submenu": [ { - "label": "About Session", + "label": "About", "click": null }, { diff --git a/test/app/fixtures/menu-windows-linux-setup.json b/test/app/fixtures/menu-windows-linux-setup.json index e72303d39..5c07b68d5 100644 --- a/test/app/fixtures/menu-windows-linux-setup.json +++ b/test/app/fixtures/menu-windows-linux-setup.json @@ -6,10 +6,6 @@ "label": "Set Up with Import", "click": null }, - { - "label": "Set Up as New Device", - "click": null - }, { "type": "separator" }, @@ -134,7 +130,7 @@ "type": "separator" }, { - "label": "About Session", + "label": "About", "click": null } ] diff --git a/test/app/fixtures/menu-windows-linux.json b/test/app/fixtures/menu-windows-linux.json index aa6a1171d..de337349e 100644 --- a/test/app/fixtures/menu-windows-linux.json +++ b/test/app/fixtures/menu-windows-linux.json @@ -123,7 +123,7 @@ "type": "separator" }, { - "label": "About Session", + "label": "About", "click": null } ] diff --git a/test/models/messages_test.js b/test/models/messages_test.js index 7b0f7ece0..fbe3e7de8 100644 --- a/test/models/messages_test.js +++ b/test/models/messages_test.js @@ -94,21 +94,21 @@ describe('MessageCollection', () => { message = messages.add({ group_update: { left: 'Alice' } }); assert.equal( message.getDescription(), - 'Alice left the group', + 'Alice has left the group.', 'Notes one person leaving the group.' ); message = messages.add({ group_update: { name: 'blerg' } }); assert.equal( message.getDescription(), - "Group name has been set to 'blerg'", + "Group name is now 'blerg'.", 'Returns a single notice if only group_updates.name changes.' ); message = messages.add({ group_update: { joined: ['Bob'] } }); assert.equal( message.getDescription(), - 'Bob joined the group', + 'Bob joined the group.', 'Returns a single notice if only group_updates.joined changes.' ); @@ -117,7 +117,7 @@ describe('MessageCollection', () => { }); assert.equal( message.getDescription(), - 'Bob, Alice, Eve joined the group', + 'Bob, Alice, Eve joined the group.', 'Notes when >1 person joins the group.' ); @@ -126,7 +126,7 @@ describe('MessageCollection', () => { }); assert.equal( message.getDescription(), - "Group name has been set to 'blerg', Bob joined the group", + "Group name is now 'blerg'. Bob joined the group.", 'Notes when there are multiple changes to group_updates properties.' ); diff --git a/test/views/network_status_view_test.js b/test/views/network_status_view_test.js index 85cb64c68..488ff7101 100644 --- a/test/views/network_status_view_test.js +++ b/test/views/network_status_view_test.js @@ -74,27 +74,6 @@ describe('NetworkStatusView', () => { assert.match(networkStatusView.$el.text(), /Offline/); }); }); - describe('network status when registration is not done', () => { - beforeEach(() => { - Whisper.Registration.remove(); - }); - it('should display an unlinked message', () => { - networkStatusView.update(); - assert.match(networkStatusView.$el.text(), /Relink/); - }); - it('should override socket status', () => { - _([ - WebSocket.CONNECTING, - WebSocket.OPEN, - WebSocket.CLOSING, - WebSocket.CLOSED, - ]).forEach(socketStatusVal => { - socketStatus = socketStatusVal; - networkStatusView.update(); - assert.match(networkStatusView.$el.text(), /Relink/); - }); - }); - }); describe('network status when registration is done', () => { beforeEach(() => { networkStatusView.navigatorOnLine = () => true; From a1824215d4b6f472ede58c86e92e31e5a804a995 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 19 Aug 2020 12:17:54 +1000 Subject: [PATCH 061/274] matching en translations desktop to android & scripts to verify --- _locales/en/messages.json | 78 ++++++++----- tools/mapAndroidTranslationsToDesktop.py | 139 +++++++++++++++++++++++ 2 files changed, 187 insertions(+), 30 deletions(-) create mode 100755 tools/mapAndroidTranslationsToDesktop.py diff --git a/_locales/en/messages.json b/_locales/en/messages.json index d5b3a0d1f..6e013c39e 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -95,7 +95,8 @@ "editMenuSelectAll": { "message": "Select All", "description": "Edit menu comand to select all of the text in selected text box", - "androidKey": "conversation_list_batch__menu_select_all" + "androidKey": "conversation_list_batch__menu_select_all", + "wordCapitalize": true }, "editMenuStartSpeaking": { "message": "Start speaking", @@ -240,7 +241,7 @@ "androidKey": "MessageRecord_left_group" }, "youGotKickedFromGroup": { - "message": "You were removed from the group", + "message": "You were removed from the group.", "description": "Displayed when a user can't send a message because they have left the group", "androidKey": "GroupUtil_you_were_removed_from_group" }, @@ -254,7 +255,11 @@ } }, "androidKey": "ConversationAdapter_n_unread_messages", - "androidKeyCount": "one" + "androidKeyCount": "one", + "androidReplace": { + "%d": "$count$" + }, + "wordCapitalize": true }, "unreadMessages": { "message": "$count$ Unread Messages", @@ -266,7 +271,11 @@ } }, "androidKey": "ConversationAdapter_n_unread_messages", - "androidKeyCount": "other" + "androidKeyCount": "other", + "androidReplace": { + "%d": "$count$" + }, + "wordCapitalize": true }, "youMarkedAsVerified": { "message": "You marked your safety number with $name$ verified", @@ -338,7 +347,7 @@ "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Your safety number with $name$ has changed and is no longer verified. This could either mean that someone is trying to intercept your communication, or that $name$ simply reinstalled Session", + "message": "Your safety number with $name$ has changed and is no longer verified. This could either mean that someone is trying to intercept your communication, or that $name$ simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -513,12 +522,14 @@ "thisWeek": { "message": "This Week", "description": "Section header in the media gallery", - "androidKey": "BucketedThreadMedia_This_week" + "androidKey": "BucketedThreadMedia_This_week", + "wordCapitalize": true }, "thisMonth": { "message": "This Month", "description": "Section header in the media gallery", - "androidKey": "BucketedThreadMedia_This_month" + "androidKey": "BucketedThreadMedia_This_month", + "wordCapitalize": true }, "voiceMessage": { "message": "Voice Message", @@ -734,7 +745,7 @@ "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" }, "replyToMessage": { - "message": "Reply to Message", + "message": "Reply to message", "description": "Shown in triple-dot menu next to message to allow user to start crafting a message with a quotation", "androidKey": "conversation_context__menu_reply_to_message" }, @@ -978,7 +989,8 @@ "deleteMessage": { "message": "Delete Message", "description": "Shown on the drop-down menu for an individual message, deletes single message", - "androidKey": "conversation_context__menu_delete_message" + "androidKey": "conversation_context__menu_delete_message", + "wordCapitalize": true }, "deleteMessages": { "message": "Delete Messages", @@ -1010,7 +1022,7 @@ "androidKey": "dialog_clear_all_data_title" }, "deleteAccountWarning": { - "message": "This will permanently delete your messages, sessions, and contacts. These cannot be restored", + "message": "This will permanently delete your messages, sessions, and contacts.", "description": "Warning for account deletion in settings view", "androidKey": "dialog_clear_all_data_explanation" }, @@ -1053,7 +1065,7 @@ }, "addACaption": { "message": "Add a caption...", - "descripton": "Used as the placeholder text in the caption editor text field", + "description": "Used as the placeholder text in the caption editor text field", "androidKey": "MediaSendActivity_add_a_caption" }, "copy": { @@ -1063,7 +1075,7 @@ }, "save": { "message": "Save", - "descripton": "Used as a 'commit changes' button in the Caption Editor for outgoing image attachments", + "description": "Used as a 'commit changes' button in the Caption Editor for outgoing image attachments", "androidKey": "media_preview__save_title" }, "emojiAlt": { @@ -1079,7 +1091,8 @@ "linkNewDevice": { "message": "Link New Device", "description": "The menu option shown in Signal iOS to add a new linked device", - "androidKey": "device_list_fragment__link_new_device" + "androidKey": "device_list_fragment__link_new_device", + "wordCapitalize": true }, "permissions": { "message": "Permissions", @@ -1134,7 +1147,8 @@ "readReceiptSettingTitle": { "message": "Read Receipts", "description": "Title of the read receipts setting", - "androidKey": "preferences__read_receipts" + "androidKey": "preferences__read_receipts", + "wordCapitalize": true }, "typingIndicatorsSettingDescription": { "message": "See and share when messages are being typed (applies to all sessions).", @@ -1206,9 +1220,10 @@ "description": "Displayed in notifications when setting is 'name and message' and more than one message is waiting" }, "sendFailed": { - "message": "Send failed", + "message": "Send Failed", "description": "Shown on outgoing message if it fails to send", - "androidKey": "conversation_item_sent__send_failed_indicator_description" + "androidKey": "conversation_item_sent__send_failed_indicator_description", + "wordCapitalize": true }, "learnMore": { "message": "Learn more about verifying safety numbers", @@ -1232,9 +1247,10 @@ "androidKey": "ThreadRecord_media_message" }, "timestamp_s": { - "message": "now", + "message": "Now", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble.", - "androidKey": "DateUtils_just_now" + "androidKey": "DateUtils_just_now", + "wordCapitalize": true }, "timestamp_m": { "message": "1 minute", @@ -1420,7 +1436,7 @@ "androidKey": "ThreadRecord_disappearing_messages_disabled" }, "disabledDisappearingMessages": { - "message": "$name$ disabled disappearing messages", + "message": "$name$ disabled disappearing messages.", "description": "Displayed in the conversation list when the timer is turned off", "placeholders": { "name": { @@ -1434,7 +1450,7 @@ } }, "youDisabledDisappearingMessages": { - "message": "You disabled disappearing messages", + "message": "You disabled disappearing messages.", "description": "Displayed in the conversation list when the timer is turned off", "androidKey": "MessageRecord_you_disabled_disappearing_messages" }, @@ -1474,7 +1490,8 @@ "verifyNewNumber": { "message": "Verify Safety Number", "description": "Label on button included with safety number change notification in the conversation", - "androidKey": "AndroidManifest__verify_safety_number" + "androidKey": "AndroidManifest__verify_safety_number", + "wordCapitalize": true }, "yourSafetyNumberWith": { "message": "Your safety number with $name$:", @@ -1611,10 +1628,10 @@ } }, "multipleJoinedTheGroup": { - "message": "$names$ joined the group.", + "message": "$name$ joined the group.", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { - "names": { + "name": { "content": "$1", "example": "Alice, Bob" } @@ -1641,7 +1658,7 @@ } }, "multipleKickedFromTheGroup": { - "message": "$names$ were removed from the group", + "message": "$name$ were removed from the group.", "description": "Shown in the conversation history when more than one person is removed from the group", "placeholders": { "names": { @@ -1775,7 +1792,7 @@ "description": "Request for user to enter password to show recovery phrase." }, "recoveryPhraseSavePromptMain": { - "message": "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.", + "message": "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.", "description": "Prompt on recovery phrase modal requesting user to save their recovery phrase. Line one", "androidKey": "activity_seed_explanation" }, @@ -1982,8 +1999,7 @@ } }, "createAccount": { - "message": "Create Account", - "androidKey": "activity_display_name_title" + "message": "Create Account" }, "signIn": { "message": "Sign In" @@ -2008,7 +2024,7 @@ "androidKey": "activity_settings_recovery_phrase_button_title" }, "enterRecoveryPhrase": { - "message": "Enter Recovery Phrase", + "message": "Enter your recovery phrase", "androidKey": "activity_restore_seed_edit_text_hint" }, "displayName": { @@ -2154,7 +2170,8 @@ }, "createClosedGroupNamePrompt": { "message": "Group Name", - "androidKey": "GroupCreateActivity_group_name_hint" + "androidKey": "GroupCreateActivity_group_name_hint", + "wordCapitalize": true }, "createClosedGroupPlaceholder": { "message": "Enter a group name", @@ -2181,7 +2198,8 @@ }, "pairingDevice": { "message": "Linking Device", - "androidKey": "DeviceProvisioningActivity_content_progress_title" + "androidKey": "DeviceProvisioningActivity_content_progress_title", + "wordCapitalize": true }, "devicePairedSuccessfully": { "message": "Your device has been linked successfully", diff --git a/tools/mapAndroidTranslationsToDesktop.py b/tools/mapAndroidTranslationsToDesktop.py new file mode 100755 index 000000000..a04069446 --- /dev/null +++ b/tools/mapAndroidTranslationsToDesktop.py @@ -0,0 +1,139 @@ +#!/bin/python3 + +import re +import os +from glob import glob +import json +import sys +import xmltodict + +# androidKey +# "androidKeyCount": "one" or "other" used to find matching key with quantity +# replace \\' with ' +# replace \\\" with \" +# "wordCapitalize": true capitalize each words (must be called before addStart) +# "addStart": "&" char to add as start char +# "androidReplace": replace all occurences of key value pair + +allowedItemKeys = ['message', 'description', 'comment', 'placeholders', 'androidKey', 'wordCapitalize', 'androidKeyCount', 'androidReplace', 'addStart'] + +if len(sys.argv) != 3: + print(f"usage: {sys.argv[0]} ") + sys.exit(1) + +dest = sys.argv[1] +androidRoot = sys.argv[2] + +desktopSrc = json.loads(open(f"_locales/en/messages.json", + "r").read()) +desktopDst = json.loads(open(f"_locales/{dest}/messages.json", + "r").read()) + +androidEnValueFile = f"{androidRoot}/res/values/strings.xml" +androidTranslatedValueFile = f"{androidRoot}/res/values-{dest}/strings.xml" +print(f"androidEnValueFile {androidEnValueFile}") +print(f"androidTranslatedValueFile {androidTranslatedValueFile}") + +androidEnXml = open(androidEnValueFile, "r").read() +androidTranslatedXml = open(androidTranslatedValueFile, "r").read() +androidEnJsonSingular = xmltodict.parse(androidEnXml)['resources']['string'] +androidEnJsonPlurals = xmltodict.parse(androidEnXml)['resources']['plurals'] + +androidEnJsonSingular = [dict(item) for item in androidEnJsonSingular] +androidEnJsonPlurals = [dict(item) for item in androidEnJsonPlurals] +androidTranslatedJson = xmltodict.parse(androidTranslatedXml) + +# print(f"androidTranslatedXml {androidTranslatedXml}") +# print(f"\n\n\n\n androidEnJsonSingular {androidEnJsonSingular}") +# print(f"\n\n\n\n androidEnJsonPlurals {androidEnJsonPlurals}") + +missingAndroidKeyCount = 0 + +def findCountInItem(quantityStr, items): + found = [item for item in items if item['@quantity'] == quantityStr] + # print(f'findCountInItem: {found}, quantityStr: {quantityStr}') + + if len(found) != 1: + raise Exception(f'quantityStr not found: {quantityStr} ') + return dict(found[0]) + + +def findByNameSingular(keySearchedFor, singularString): + found = [item for item in singularString if item['@name'] == keySearchedFor] + if len(found) != 1: + raise Exception(f'android key not found: {keySearchedFor} but should have been found') + return found[0] + +def findByNamePlurals(keySearchedFor, pluralsString, quantityStr): + found = [item for item in pluralsString if item['@name'] == keySearchedFor] + if len(found) != 1: + raise Exception(f'android key not found: {keySearchedFor} but should have been found') + found = findCountInItem(quantityStr, found[0]['item']) + + return found + +def validateKeysPresent(items): + for keyItem, valueItem in items: + if keyItem not in allowedItemKeys: + print(f"Invalid key item: {keyItem}") + exit(1) + # print(f"keyItem: '{keyItem}', valueItem: '{valueItem}'") + + +def morphToDesktopSyntax(androidString, desktopItem): + # print(f"androidString: '{androidString}', desktopItem: '{desktopItem}'") + replaced = androidString.replace(r"\'", "'") + # replaced = androidString.replace(r"\’", "'") + # replaced = androidString.replace('’', ) + + if('wordCapitalize' in desktopItem.keys() and desktopItem['wordCapitalize']): + replaced = replaced.title() + + if ('androidReplace' in desktopItem.keys()): + for key, value in desktopItem['androidReplace'].items(): + replaced = replaced.replace(key.title(), value) + replaced = replaced.replace(key, value) + + # print(f"androidString: '{androidString}', replaced: '{replaced}'") + if ('addStart' in desktopItem.keys()): + toAdd = desktopItem['addStart'] + replaced = f'{toAdd}{replaced}' + return replaced + +notMatching = 0 + + +for key, value in desktopSrc.items(): + # print(f"key: '{key}', value: '{value}'") + items = value.items() + validateKeysPresent(items) + if 'androidKey' not in value.keys(): + # print('androidKey not found for {key}') + missingAndroidKeyCount = missingAndroidKeyCount + 1 + continue + androidKey = value['androidKey'] + androidKeyCount = None + if 'androidKeyCount' in value.keys(): + androidKeyCount = value['androidKeyCount'] + # print(f'key: {key}, androidKey: {androidKey}, androidKeyCount: {androidKeyCount}') + itemEnDesktop = desktopSrc[key] + txtEnDesktop = itemEnDesktop['message'] + if androidKeyCount: + itemEnAndroid = findByNamePlurals(androidKey, androidEnJsonPlurals, androidKeyCount) + else: + itemEnAndroid = findByNameSingular(androidKey, androidEnJsonSingular) + txtEnAndroid = itemEnAndroid['#text'] + + morphedEnAndroid = morphToDesktopSyntax(txtEnAndroid, itemEnDesktop) + if (txtEnDesktop != morphedEnAndroid): + print(f'\t\tDOES NOT MATCH: "{txtEnDesktop}" vs "{morphedEnAndroid}", itemEnDesktop: {itemEnDesktop}\n\n') + notMatching = notMatching + 1 + # else: + # print(f'MATCH: "{txtEnDesktop}" vs "{morphedEnAndroid}"') + + + + + +print(f"total keys missing {missingAndroidKeyCount}") # androidKey set on desktop but not found on android EN resources +print(f"total text not matching EN to EN {notMatching}") \ No newline at end of file From 5cebb41b4591d00aba46b7866c40d2f5b00fe0bd Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 19 Aug 2020 15:47:43 +1000 Subject: [PATCH 062/274] add read of translated string to script --- tools/mapAndroidTranslationsToDesktop.py | 101 +++++++++++++++-------- 1 file changed, 65 insertions(+), 36 deletions(-) diff --git a/tools/mapAndroidTranslationsToDesktop.py b/tools/mapAndroidTranslationsToDesktop.py index a04069446..f62bb8fdd 100755 --- a/tools/mapAndroidTranslationsToDesktop.py +++ b/tools/mapAndroidTranslationsToDesktop.py @@ -6,6 +6,7 @@ from glob import glob import json import sys import xmltodict +import traceback # androidKey # "androidKeyCount": "one" or "other" used to find matching key with quantity @@ -31,46 +32,56 @@ desktopDst = json.loads(open(f"_locales/{dest}/messages.json", androidEnValueFile = f"{androidRoot}/res/values/strings.xml" androidTranslatedValueFile = f"{androidRoot}/res/values-{dest}/strings.xml" -print(f"androidEnValueFile {androidEnValueFile}") -print(f"androidTranslatedValueFile {androidTranslatedValueFile}") -androidEnXml = open(androidEnValueFile, "r").read() -androidTranslatedXml = open(androidTranslatedValueFile, "r").read() -androidEnJsonSingular = xmltodict.parse(androidEnXml)['resources']['string'] -androidEnJsonPlurals = xmltodict.parse(androidEnXml)['resources']['plurals'] +def getDictFromFile(filepath, keyToSearch): + xml = open(filepath, "r").read() + asDict = xmltodict.parse(xml)['resources'][keyToSearch] + return [dict(item) for item in asDict] -androidEnJsonSingular = [dict(item) for item in androidEnJsonSingular] -androidEnJsonPlurals = [dict(item) for item in androidEnJsonPlurals] -androidTranslatedJson = xmltodict.parse(androidTranslatedXml) +def getStringFromFileAsJSON(filepath): + return getDictFromFile(filepath, 'string') -# print(f"androidTranslatedXml {androidTranslatedXml}") +def getPluralsFromFileAsJSON(filepath): + return getDictFromFile(filepath, 'plurals') + +# read and extract values from xml file in EN android side +androidEnJsonSingular = getStringFromFileAsJSON(androidEnValueFile) +androidEnJsonPlurals = getPluralsFromFileAsJSON(androidEnValueFile) + +# read and extract values from xml file in DESTINATION LANGUAGE android side +androidDestJsonSingular = getStringFromFileAsJSON(androidTranslatedValueFile) +androidDestJsonPlurals = getPluralsFromFileAsJSON(androidTranslatedValueFile) + +# print(f"androidDestJsonSingular {androidDestJsonSingular}") +# print(f"androidDestJsonPlurals {androidDestJsonPlurals}") # print(f"\n\n\n\n androidEnJsonSingular {androidEnJsonSingular}") # print(f"\n\n\n\n androidEnJsonPlurals {androidEnJsonPlurals}") missingAndroidKeyCount = 0 +notMatchingCount = 0 def findCountInItem(quantityStr, items): found = [item for item in items if item['@quantity'] == quantityStr] # print(f'findCountInItem: {found}, quantityStr: {quantityStr}') if len(found) != 1: - raise Exception(f'quantityStr not found: {quantityStr} ') + raise KeyError(f'quantityStr not found: {quantityStr} ') return dict(found[0]) def findByNameSingular(keySearchedFor, singularString): found = [item for item in singularString if item['@name'] == keySearchedFor] if len(found) != 1: - raise Exception(f'android key not found: {keySearchedFor} but should have been found') + raise KeyError(f'android key singular not found: {keySearchedFor} but should have been found') return found[0] + def findByNamePlurals(keySearchedFor, pluralsString, quantityStr): found = [item for item in pluralsString if item['@name'] == keySearchedFor] if len(found) != 1: - raise Exception(f'android key not found: {keySearchedFor} but should have been found') - found = findCountInItem(quantityStr, found[0]['item']) + raise KeyError(f'android key plurals not found: {keySearchedFor} but should have been found') + return findCountInItem(quantityStr, found[0]['item']) - return found def validateKeysPresent(items): for keyItem, valueItem in items: @@ -80,11 +91,9 @@ def validateKeysPresent(items): # print(f"keyItem: '{keyItem}', valueItem: '{valueItem}'") +# morph a string from android syntax to desktop syntax. Like replacing char, or %s def morphToDesktopSyntax(androidString, desktopItem): - # print(f"androidString: '{androidString}', desktopItem: '{desktopItem}'") replaced = androidString.replace(r"\'", "'") - # replaced = androidString.replace(r"\’", "'") - # replaced = androidString.replace('’', ) if('wordCapitalize' in desktopItem.keys() and desktopItem['wordCapitalize']): replaced = replaced.title() @@ -100,40 +109,60 @@ def morphToDesktopSyntax(androidString, desktopItem): replaced = f'{toAdd}{replaced}' return replaced -notMatching = 0 +def getAndroidItem(androidKey, androidKeyCount, singularJson, pluralsJson): + if androidKeyCount: + return findByNamePlurals(androidKey, pluralsJson, androidKeyCount) + else: + return findByNameSingular(androidKey, singularJson) + +def getAndroidKeyCountFromItem(item): + androidKeyCount = None + if 'androidKeyCount' in item.keys(): + androidKeyCount = item['androidKeyCount'] + return androidKeyCount -for key, value in desktopSrc.items(): - # print(f"key: '{key}', value: '{value}'") - items = value.items() + +################### MAIN ##################### +for key, itemEnDesktop in desktopSrc.items(): + # print(f"key: '{key}', itemEnDesktop: '{itemEnDesktop}'") + items = itemEnDesktop.items() validateKeysPresent(items) - if 'androidKey' not in value.keys(): + if 'androidKey' not in itemEnDesktop.keys(): # print('androidKey not found for {key}') missingAndroidKeyCount = missingAndroidKeyCount + 1 continue - androidKey = value['androidKey'] - androidKeyCount = None - if 'androidKeyCount' in value.keys(): - androidKeyCount = value['androidKeyCount'] + androidKey = itemEnDesktop['androidKey'] + androidKeyCount = getAndroidKeyCountFromItem(itemEnDesktop) # print(f'key: {key}, androidKey: {androidKey}, androidKeyCount: {androidKeyCount}') - itemEnDesktop = desktopSrc[key] txtEnDesktop = itemEnDesktop['message'] - if androidKeyCount: - itemEnAndroid = findByNamePlurals(androidKey, androidEnJsonPlurals, androidKeyCount) - else: - itemEnAndroid = findByNameSingular(androidKey, androidEnJsonSingular) + itemEnAndroid = getAndroidItem(androidKey, androidKeyCount, androidEnJsonSingular, androidEnJsonPlurals) + txtEnAndroid = itemEnAndroid['#text'] morphedEnAndroid = morphToDesktopSyntax(txtEnAndroid, itemEnDesktop) if (txtEnDesktop != morphedEnAndroid): print(f'\t\tDOES NOT MATCH: "{txtEnDesktop}" vs "{morphedEnAndroid}", itemEnDesktop: {itemEnDesktop}\n\n') - notMatching = notMatching + 1 - # else: - # print(f'MATCH: "{txtEnDesktop}" vs "{morphedEnAndroid}"') + notMatchingCount = notMatchingCount + 1 + else: + # if it does match, find the corresponding value on the target language on android + print(f'MATCH: "{txtEnDesktop}" vs "{morphedEnAndroid}"') + try: + textTranslated = getAndroidItem(androidKey, androidKeyCount, androidDestJsonSingular, androidDestJsonPlurals)['#text'] + print(f'textTranslated: "{textTranslated}"') + + textMorphed = morphToDesktopSyntax(textTranslated, itemEnDesktop) + print(f'textMorphed: "{textMorphed}"') + + + + except KeyError: + print('KeyError exception:', traceback.format_exc()) + print(f"total keys missing {missingAndroidKeyCount}") # androidKey set on desktop but not found on android EN resources -print(f"total text not matching EN to EN {notMatching}") \ No newline at end of file +print(f"total text not matching EN to EN {notMatchingCount}") \ No newline at end of file From a3bce9656d5092ba54abb31f531157fd556ac92f Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 19 Aug 2020 16:39:09 +1000 Subject: [PATCH 063/274] just whitespace de locale fix --- _locales/de/messages.json | 130 +++++++++++++++++++------------------- 1 file changed, 65 insertions(+), 65 deletions(-) diff --git a/_locales/de/messages.json b/_locales/de/messages.json index 41c69f59c..f0c980f5b 100644 --- a/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -92,10 +92,10 @@ "description": "Edit menu comand to select all of the text in selected text box" }, "newSession": { - "message": "Neue Session" + "message": "Neue Session" }, "addContact": { - "message": "Kontakt hinzufügen" + "message": "Kontakt hinzufügen" }, "editMenuStartSpeaking": { "message": "Sprachausgabe starten", @@ -158,7 +158,7 @@ "description": "Message shown on the loading screen before we've loaded any messages" }, "or": { - "message": "oder" + "message": "oder" }, "optimizingApplication": { "message": "Anwendung wird optimiert …", @@ -563,81 +563,81 @@ } }, "copiedPublicKey": { - "message": "In Zwischenablage kopiert", - "description": "A toast message telling the user that the key was copied" + "message": "In Zwischenablage kopiert", + "description": "A toast message telling the user that the key was copied" }, "copiedChatId": { - "message": "In Zwischenablage kopiert", - "description": "A toast message telling the user that the key was copied" + "message": "In Zwischenablage kopiert", + "description": "A toast message telling the user that the key was copied" }, "sessionResetOngoing": { - "message": "Verschlüsselung neu gestartet", - "description": "your secure session is currently being reset, waiting for the reset acknowledgment." + "message": "Verschlüsselung neu gestartet", + "description": "your secure session is currently being reset, waiting for the reset acknowledgment." }, "blockUser": { - "message": "Blockieren" + "message": "Blockieren" }, "unblockUser": { - "message": "Freigeben" + "message": "Freigeben" }, "members": { "message": "$count$ mitglied", "placeholders": { "count": { - "content": "$1", - "example": "26" - } + "content": "$1", + "example": "26" + } } }, "noContactsForGroup": { - "message": "Sie haben noch keine Kontakte." + "message": "Sie haben noch keine Kontakte." }, "getStarted": { - "message": "Loslegen" + "message": "Loslegen" }, "createAccount": { - "message": "Konto Erstellen" + "message": "Konto Erstellen" }, "signIn": { - "message": "Einloggen" + "message": "Einloggen" }, "beginYourSession": { "message": "Beginnen
Sie
Ihre
Session." - }, + }, "continue": { - "message": "Fortsetzen" + "message": "Fortsetzen" }, "welcomeToYourSession": { "message": "Willkommen bei Session" - }, + }, "generateSessionID": { "message": "Session ID erstellen" - }, - "yourUniqueSessionID": { + }, + "yourUniqueSessionID": { "message": "Das ist Ihre Session ID." - }, - "allUsersAreRandomly...": { + }, + "allUsersAreRandomly...": { "message": "Ihre Session ID ist die eindeutige Adresse, unter der Personen Sie über Session kontaktieren können. Ihre Session ID ist nicht mit Ihrer realen Identität verbunden, völlig anonym und von Natur aus privat." - }, + }, "leaveOpenGroupConfirmation": { "message": "Möchtest du wirklich diese Gruppe verlassen??", "description": "Confirmation dialog text that tells the user what will happen if they leave the public channel." - }, + }, "leaveClosedGroupConfirmation": { "message": "Möchtest du wirklich diese Gruppe verlassen?", "description": "Confirmation dialog text that tells the user what will happen if they leave the closed group." }, "copyPublicKey": { - "message": "Kopieren", - "description": "Button action that the user can click to copy their public keys" + "message": "Kopieren", + "description": "Button action that the user can click to copy their public keys" }, "copyChatId": { - "message": "Kopieren" + "message": "Kopieren" }, "deleteContact": { "message": "Kontakt löschen", "description": "Confirmation dialog title that asks the user if they really wish to delete the contact. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone." - }, + }, "oneNonImageAtATimeToast": { "message": "Mehrere Anhänge je Nachricht sind ausschließlich bei Bildern erlaubt.", "description": "An error popup when the user has attempted to add an attachment" @@ -645,7 +645,7 @@ "editGroupName": { "message": "Gruppe bearbeiten", "description": "Button action that the user can click to edit a group name (closed)" - }, + }, "cannotMixImageAndNonImageAttachments": { "message": "Du kannst Bilder nicht gemeinsam mit anderen Anhängen in einer Nachricht kombinieren.", "description": "An error popup when the user has attempted to add an attachment" @@ -833,22 +833,22 @@ "description": "Shown in triple-dot menu next to message to allow user to start crafting a message with a quotation" }, "enterOpenGroupURL": { - "message": "Gruppen-URL öffnen" + "message": "Gruppen-URL öffnen" }, "newClosedGroup": { - "message": "Neue geschlossene Gruppe" + "message": "Neue geschlossene Gruppe" }, "createClosedGroupNamePrompt": { - "message": "Gruppenname" + "message": "Gruppenname" }, "createClosedGroupPlaceholder": { - "message": "Geben Sie einen Gruppennamen ein." + "message": "Geben Sie einen Gruppennamen ein." }, "addChannelDescription": { - "message": "Geben Sie eine offene Gruppen-URL ein." + "message": "Geben Sie eine offene Gruppen-URL ein." }, "next": { - "message": "Weiter" + "message": "Weiter" }, "originalMessageNotFound": { "message": "Originalnachricht nicht gefunden", @@ -1019,12 +1019,12 @@ "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." }, "deleteAccount": { - "message": "Alle Daten löschen", - "description": "Text for button in settings view to delete account" + "message": "Alle Daten löschen", + "description": "Text for button in settings view to delete account" }, "deleteAccountWarningSub": { - "message": "Dadurch werden Ihre Nachrichten, Sessions und Kontakte dauerhaft gelöscht.", - "description": "Warning for account deletion in settings view" + "message": "Dadurch werden Ihre Nachrichten, Sessions und Kontakte dauerhaft gelöscht.", + "description": "Warning for account deletion in settings view" }, "sessionEnded": { "message": "Verschlüsselung zurückgesetzt", @@ -1237,16 +1237,16 @@ "description": "Text that links to a support article on verifying safety numbers" }, "appearanceSettingsTitle": { - "message": "Darstellung" + "message": "Darstellung" }, "privacySettingsTitle": { - "message": "Datenschutz" + "message": "Datenschutz" }, "notificationsSettingsTitle": { - "message": "Benachrichtigungen" + "message": "Benachrichtigungen" }, "devicesSettingsTitle": { - "message": "Geräte" + "message": "Geräte" }, "linkPreviewsTitle": { "message": "Link-Vorschauen senden", @@ -1261,34 +1261,34 @@ "description": "Warning notification that this version of the app has expired" }, "readReceiptSettingDescription": { - "message": "Lesebestätigungen aktivieren", - "description": "Description of the read receipts setting" + "message": "Lesebestätigungen aktivieren", + "description": "Description of the read receipts setting" }, "readReceiptSettingTitle": { - "message": "Lesebestätigungen", - "description": "Title of the read receipts setting" + "message": "Lesebestätigungen", + "description": "Title of the read receipts setting" }, "typingIndicatorsSettingDescription": { "message": "sehen und teilen, wann Nachrichten eingetippt werden", "description": "Description of the typing indicators setting" }, "typingIndicatorsSettingTitle": { - "message": "Tipp-Indikatoren", - "description": "Title of the typing indicators setting" + "message": "Tipp-Indikatoren", + "description": "Title of the typing indicators setting" }, "inviteContacts": { - "message": "Freunde einladen" + "message": "Freunde einladen" }, "settingsHeader": { - "message": "Einstellungen" + "message": "Einstellungen" }, "leaveOpenGroup": { - "message": "Gruppe öffnen verlassen", - "description": "Button action that the user can click to leave the group" + "message": "Gruppe öffnen verlassen", + "description": "Button action that the user can click to leave the group" }, "leaveClosedGroup": { - "message": "Geschlossene Gruppe verlassen", - "description": "Button action that the user can click to leave the group" + "message": "Geschlossene Gruppe verlassen", + "description": "Button action that the user can click to leave the group" }, "upgrade": { "message": "Aktualisieren", @@ -1683,22 +1683,22 @@ } }, "joinOpenGroup": { - "message": "Offener Gruppe beitreten" + "message": "Offener Gruppe beitreten" }, "yourSessionID": { - "message": "Ihre Session ID" + "message": "Ihre Session ID" }, "createClosedGroup": { - "message": "Neue geschlossene Gruppe" + "message": "Neue geschlossene Gruppe" }, "searchForAKeyPhrase": { - "message": "Nach Unterhaltungen, Kontakten und Nachrichten suchen" + "message": "Nach Unterhaltungen, Kontakten und Nachrichten suchen" }, "enterSessionID": { - "message": "Session ID eingeben" + "message": "Session ID eingeben" }, "usersCanShareTheir...": { - "message": "Benutzer können ihre Session ID freigeben, indem sie in ihren Einstellungen auf \"Session ID freigeben\" tippen oder ihren QR-Code freigeben." + "message": "Benutzer können ihre Session ID freigeben, indem sie in ihren Einstellungen auf \"Session ID freigeben\" tippen oder ihren QR-Code freigeben." }, "joinedTheGroup": { "message": "$name$ ist der Gruppe beigetreten", @@ -1720,4 +1720,4 @@ } } } -} +} \ No newline at end of file From 3752d8362f0315ec3b9f7af60bc18f9da340a736 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 19 Aug 2020 17:01:52 +1000 Subject: [PATCH 064/274] update de locale with data from android --- _locales/de/messages.json | 256 ++++++++++++++++++++++++++++++++------ 1 file changed, 215 insertions(+), 41 deletions(-) diff --git a/_locales/de/messages.json b/_locales/de/messages.json index f0c980f5b..dbf564179 100644 --- a/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -24,7 +24,7 @@ "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": "&Ansicht", + "message": "&Anzeigen", "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": { @@ -88,7 +88,7 @@ "description": "Title for the Edit Profile modal" }, "editMenuSelectAll": { - "message": "Alles auswählen", + "message": "Alle Auswählen", "description": "Edit menu comand to select all of the text in selected text box" }, "newSession": { @@ -285,11 +285,11 @@ "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" }, "unreadMessage": { - "message": "1 ungelesene Nachricht", + "message": "$count$ Ungelesene Nachricht", "description": "Text for unread message separator, just one message" }, "unreadMessages": { - "message": "$count$ ungelesene Nachrichten", + "message": "$count$ Ungelesene Nachrichten", "description": "Text for unread message separator, with count", "placeholders": { "count": { @@ -347,7 +347,7 @@ "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Deine Sicherheitsnummer mit $name$ hat sich seit eurer letzten Verifikation geändert. Dies könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören, oder aber $name$ hat Signal einfach erneut installiert.", + "message": "Deine Sicherheitsnummer mit $name$ hat sich geändert und ist nicht mehr verifiziert. Dies könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören. Oder $name$ hat Session einfach erneut installiert.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -371,7 +371,7 @@ "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Deine Sicherheitsnummer mit $name$hat sich kürzlich geändert. Dies könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören, oder aber $name$ hat Signal einfach erneut installiert.", + "message": "Deine gemeinsame Sicherheitsnummer mit $name$ hat sich geändert. Dies könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören. Oder $name$ hat Session einfach erneut installiert.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -441,7 +441,7 @@ "description": "" }, "isVerified": { - "message": "Du hast deine Sicherheitsnummer mit $name$ verifiziert.", + "message": "Du hast deine Sicherheitsnummer mit $name$ als verifiziert markiert", "description": "Summary state shown at top of the safety number screen if user has verified contact.", "placeholders": { "name": { @@ -481,7 +481,7 @@ "description": "Header of the default pane in the media gallery, showing images and videos" }, "mediaEmptyState": { - "message": "In dieser Unterhaltung gibt es keine Medieninhalte", + "message": "Keine Medieninhalte", "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)" }, "documents": { @@ -489,7 +489,7 @@ "description": "Header of the secondary pane in the media gallery, showing every non-media attachment" }, "documentsEmptyState": { - "message": "In dieser Unterhaltung gibt es keine Dokumente", + "message": "Keine Dokumente", "description": "Message shown to user in the media gallery when there are no messages with document attachments (anything other than images or video)" }, "today": { @@ -605,7 +605,7 @@ "message": "Beginnen
Sie
Ihre
Session." }, "continue": { - "message": "Fortsetzen" + "message": "Weiter" }, "welcomeToYourSession": { "message": "Willkommen bei Session" @@ -655,11 +655,11 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "Entschuldigung, die ausgewählte Datei überschreitet die maximal erlaubte Nachrichtengröße.", + "message": "Anhang zu groß für die gesendete Nachrichtenart.", "description": "" }, "unableToLoadAttachment": { - "message": "Ausgewählter Anhang kann nicht geladen werden.", + "message": "Leider ist ein Fehler beim Hinzufügen des Anhangs aufgetreten.", "description": "" }, "disconnected": { @@ -745,7 +745,7 @@ "description": "Placeholder text in the search input" }, "noSearchResults": { - "message": "Keine Ergebnisse für »$searchTerm$«", + "message": "Keine Ergebnisse für »%s« gefunden", "description": "Shown in the search left pane when no results were found", "placeholders": { "searchTerm": { @@ -767,7 +767,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Willkommen bei Signal", + "message": "Willkommen bei Session", "description": "" }, "selectAContact": { @@ -881,7 +881,7 @@ } }, "audioPermissionNeeded": { - "message": "Zum Senden von Audionachrichten musst du Signal Desktop den Zugriff auf dein Mikrofon erlauben.", + "message": "Erlaube Session zum Versenden von Sprachnachrichten Zugriff auf dein Mikrofon.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -941,15 +941,15 @@ "description": "" }, "deleteThisMessage": { - "message": "Diese Nachricht löschen", + "message": "Nachrichten löschen", "description": "" }, "from": { - "message": "Von", + "message": "Von:", "description": "Label for the sender of a message" }, "to": { - "message": "an", + "message": "An:", "description": "Label for the receiver of a message" }, "sent": { @@ -973,11 +973,11 @@ "description": "" }, "resetSession": { - "message": "Verschlüsselung neu starten", + "message": "Verschlüsselung Neu Starten", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." }, "showSafetyNumber": { - "message": "Sicherheitsnummer anzeigen", + "message": "Sicherheitsnummer Anzeigen", "description": "" }, "viewAllMedia": { @@ -1007,7 +1007,7 @@ "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": "Nachricht löschen", + "message": "Nachrichten Löschen", "description": "Shown on the drop-down menu for an individual message, deletes single message" }, "deleteMessages": { @@ -1097,7 +1097,7 @@ "description": "The button used in Signal Android to add a new linked device" }, "linkNewDevice": { - "message": "Neues Gerät koppeln", + "message": "Neues Gerät Koppeln", "description": "The menu option shown in Signal iOS to add a new linked device" }, "deviceName": { @@ -1185,7 +1185,7 @@ "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "Benachrichtigungen deaktivieren", + "message": "Stummschalten", "description": "Label for disabling notifications" }, "nameAndMessage": { @@ -1209,7 +1209,7 @@ "description": "Displayed in notifications for multiple messages" }, "notificationMostRecentFrom": { - "message": "Letzte Nachricht von:", + "message": "Neueste von: $name$", "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting" }, "notificationFrom": { @@ -1221,7 +1221,7 @@ "description": "Displayed in notifications when setting is 'name and message' and more than one message is waiting" }, "sendFailed": { - "message": "Versand gescheitert", + "message": "Versand Gescheitert", "description": "Shown on outgoing message if it fails to send" }, "showMore": { @@ -1246,10 +1246,10 @@ "message": "Benachrichtigungen" }, "devicesSettingsTitle": { - "message": "Geräte" + "message": "Gekoppelte Geräte" }, "linkPreviewsTitle": { - "message": "Link-Vorschauen senden", + "message": "Link-Vorschauen Senden", "description": "Option to control creation and send of link previews in setting screen" }, "linkPreviewDescription": { @@ -1277,7 +1277,7 @@ "description": "Title of the typing indicators setting" }, "inviteContacts": { - "message": "Freunde einladen" + "message": "Freunde Einladen" }, "settingsHeader": { "message": "Einstellungen" @@ -1327,7 +1327,7 @@ "description": "Informational text displayed if a sync operation times out." }, "timestamp_s": { - "message": "Gerade eben", + "message": "Jetzt", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." }, "timestamp_m": { @@ -1395,7 +1395,7 @@ "description": "Brief message shown when trying to message a blocked group" }, "youChangedTheTimer": { - "message": "Du hast die Zeitbegrenzung für verschwindende Nachrichten auf $time$ festgelegt", + "message": "Du hast die Zeit für verschwindende Nachrichten auf $time$ festgelegt.", "description": "Message displayed when you change the message expiration timer in a conversation.", "placeholders": { "time": { @@ -1415,7 +1415,7 @@ } }, "theyChangedTheTimer": { - "message": "$name$ hat die Zeitbegrenzung für verschwindende Nachrichten auf $time$ festgelegt", + "message": "$name$ hat die Zeit für verschwindende Nachrichten auf $time$ festgelegt.", "description": "Message displayed when someone else changes the message expiration timer in a conversation.", "placeholders": { "name": { @@ -1429,7 +1429,7 @@ } }, "timerOption_0_seconds": { - "message": "aus", + "message": "Aus", "description": "Label for option to turn off message expiration in the timer menu" }, "timerOption_5_seconds": { @@ -1533,7 +1533,7 @@ "description": "Displayed in the left pane when the timer is turned off" }, "disabledDisappearingMessages": { - "message": "$name$ hat verschwindende Nachrichten deaktiviert", + "message": "$name$ hat verschwindende Nachrichten deaktiviert.", "description": "Displayed in the conversation list when the timer is turned off", "placeholders": { "name": { @@ -1543,11 +1543,11 @@ } }, "youDisabledDisappearingMessages": { - "message": "Du hast verschwindende Nachrichten deaktiviert", + "message": "Du hast verschwindende Nachrichten deaktiviert.", "description": "Displayed in the conversation list when the timer is turned off" }, "timerSetTo": { - "message": "Zeitbegrenzung auf $time$ festgelegt", + "message": "Zeit für verschwindende Nachrichten auf $time$ festgelegt", "description": "Displayed in the conversation list when the timer is updated by some automatic action, or in the left pane", "placeholders": { "time": { @@ -1561,11 +1561,11 @@ "description": "Description for audio notification setting" }, "safetyNumberChanged": { - "message": "Sicherheitsnummer hat sich geändert", + "message": "Geänderte Sicherheitsnummer", "description": "A notification shown in the conversation when a contact reinstalls" }, "safetyNumberChangedGroup": { - "message": "Sicherheitsnummer mit $name$ hat sich geändert", + "message": "Deine Sicherheitsnummer mit $name$ hat sich geändert", "description": "A notification shown in a group conversation when a contact reinstalls, showing the contact name", "placeholders": { "name": { @@ -1575,7 +1575,7 @@ } }, "verifyNewNumber": { - "message": "Sicherheitsnummer verifizieren", + "message": "Sicherheitsnummer Verifizieren", "description": "Label on button included with safety number change notification in the conversation" }, "yourSafetyNumberWith": { @@ -1673,7 +1673,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Gruppenname ist jetzt »$name$«", + "message": "Gruppenname lautet jetzt »$name$«.", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1701,7 +1701,7 @@ "message": "Benutzer können ihre Session ID freigeben, indem sie in ihren Einstellungen auf \"Session ID freigeben\" tippen oder ihren QR-Code freigeben." }, "joinedTheGroup": { - "message": "$name$ ist der Gruppe beigetreten", + "message": "$name$ ist der Gruppe beigetreten.", "description": "Shown in the conversation history when a single person joins the group", "placeholders": { "name": { @@ -1711,7 +1711,7 @@ } }, "multipleJoinedTheGroup": { - "message": "$names$ sind der Gruppe beigetreten", + "message": "$name$ sind der Gruppe beigetreten.", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { "names": { @@ -1719,5 +1719,179 @@ "example": "Alice, Bob" } } + }, + "privacyPolicy": { + "message": "Bedingungen & Datenschutzerklärung" + }, + "unknown": { + "message": "Unbekannt" + }, + "changedSinceVerifiedTitle": { + "message": "Geänderte Sicherheitsnummer" + }, + "youMayWishToVerifyContact": { + "message": "Vielleicht möchtest du deine Sicherheitsnummer mit diesem Kontakt verifizieren." + }, + "about": { + "message": "Über" + }, + "yes": { + "message": "Ja" + }, + "devicePairingRequestReceivedLimitTitle": { + "message": "Gerätelimit erreicht" + }, + "devicePairingRequestReceivedLimitDescription": { + "message": "Es sind bereits zu viele Geräte gekoppelt. Versuche, mindestens eines zu entfernen." + }, + "devicePairingRequestReceivedNoListenerTitle": { + "message": "Verknüpfungsanfrage empfangen" + }, + "waitingForDeviceToRegister": { + "message": "Warten auf Gerät" + }, + "pairNewDevicePrompt": { + "message": "Scanne zum Koppeln den auf dem Gerät angezeigten QR-Code ein" + }, + "noPairedDevices": { + "message": "Keine Geräte gekoppelt" + }, + "deviceUnpaired": { + "message": "Ihr Gerät wurde erfolgreich getrennt." + }, + "sendMessageLeftGroup": { + "message": "Du hast die Gruppe verlassen" + }, + "moreInformation": { + "message": "Mehr Informationen" + }, + "resend": { + "message": "Erneut Senden" + }, + "clearAllData": { + "message": "Alle Daten löschen" + }, + "deleteAccountWarning": { + "message": "Dadurch werden Ihre Nachrichten, Sessions und Kontakte dauerhaft gelöscht." + }, + "deleteContactConfirmation": { + "message": "Möchten Sie diese Unterhaltung wirklich löschen?" + }, + "copy": { + "message": "Kopieren" + }, + "themeToggleTitle": { + "message": "Hell" + }, + "successUnlinked": { + "message": "Ihr Gerät wurde erfolgreich getrennt." + }, + "autoUpdateDownloadButtonLabel": { + "message": "Herunterladen" + }, + "blockedSettingsTitle": { + "message": "Blockierte Kontakte" + }, + "leaveGroup": { + "message": "Gruppe Verlassen" + }, + "leaveGroupConfirmation": { + "message": "Sind Sie sich sicher, dass Sie diese Gruppe verlassen möchten?" + }, + "editGroup": { + "message": "Gruppe bearbeiten" + }, + "updateGroupDialogTitle": { + "message": "$name$ wird aktualisiert …" + }, + "showRecoveryPhrase": { + "message": "Wiederherstellungssatz" + }, + "recoveryPhraseSavePromptMain": { + "message": "Ihr Wiederherstellungssatz ist der Hauptschlüssel für Ihre Session ID. Mit diesem Satz können Sie Ihre Session ID wiederherstellen, wenn Sie den Zugriff auf Ihr Gerät verlieren. Bewahren Sie Ihren Wiederherstellungssatz an einem sicheren Ort auf und geben Sie ihn an niemandem weiter." + }, + "QRCodeTitle": { + "message": "Meinen QR-Code anzeigen" + }, + "copiedToClipboard": { + "message": "In die Zwischenablage kopiert." + }, + "unlock": { + "message": "Entsperren" + }, + "connectToServerFail": { + "message": "Konnte der Gruppe nicht beitreten." + }, + "connectingToServer": { + "message": "Verbindung wird hergestellt …" + }, + "remove": { + "message": "Entfernen" + }, + "invalidSessionId": { + "message": "Ungültige Session ID" + }, + "emptyGroupNameError": { + "message": "Bitte geben Sie einen Gruppennamen ein." + }, + "groupNamePlaceholder": { + "message": "Gruppenname" + }, + "recoveryPhrase": { + "message": "Wiederherstellungssatz" + }, + "enterRecoveryPhrase": { + "message": "Ihr Wiederherstellungssatz" + }, + "enterDisplayName": { + "message": "Geben Sie einen Anzeigenamen ein" + }, + "enterSessionIDHere": { + "message": "Geben Sie Ihre Session ID ein." + }, + "continueYourSession": { + "message": "Ihre Session fortsetzen" + }, + "linkDevice": { + "message": "Gerät verbinden" + }, + "restoreUsingRecoveryPhrase": { + "message": "Ihr Konto wiederherstellen" + }, + "searchFor...": { + "message": "Nach Unterhaltungen, Kontakten und Nachrichten suchen" + }, + "enterSessionIDOfRecipient": { + "message": "Geben Sie eine Session ID ein." + }, + "recoveryPhraseEmpty": { + "message": "Ihr Wiederherstellungssatz" + }, + "displayNameEmpty": { + "message": "Bitte wählen Sie einen Anzeigenamen" + }, + "newClosedGroupDescription": { + "message": "Geschlossene Gruppen unterstützen bis zu 10 Mitglieder und bieten den gleichen Schutz der Privatsphäre wie Einzelgespräche." + }, + "openGroupURL": { + "message": "Gruppen-URL öffnen" + }, + "enterAnOpenGroupURL": { + "message": "Geben Sie eine offene Gruppen-URL ein." + }, + "pairingDevice": { + "message": "Gerät Koppeln" + }, + "invalidGroupNameTooShort": { + "message": "Bitte geben Sie einen Gruppennamen ein." + }, + "invalidGroupNameTooLong": { + "message": "Bitte geben Sie einen kürzeren Gruppennamen ein." + }, + "pickClosedGroupMember": { + "message": "Bitte wählen Sie mindestens zwei Gruppenmitglieder aus." + }, + "closedGroupMaxSize": { + "message": "Eine geschlossene Gruppe kann maximal zehn Mitglieder haben." } } \ No newline at end of file From 331f7b2f4b28d52545808078d660ea01536ba0be Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 19 Aug 2020 17:35:05 +1000 Subject: [PATCH 065/274] update fr translation from android with script --- _locales/fr/messages.json | 354 ++++++++++++++++++++++++++++++++------ 1 file changed, 303 insertions(+), 51 deletions(-) diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index f5226da6d..e91ff706d 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -24,7 +24,7 @@ "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": "&Affichage", + "message": "&Voir", "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": { @@ -32,7 +32,7 @@ "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": "A&ide", + "message": "&Aide", "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": { @@ -84,7 +84,7 @@ "description": "Edit menu command to remove the selected text" }, "editMenuSelectAll": { - "message": "Tout sélectionner", + "message": "Tout Sélectionner", "description": "Edit menu comand to select all of the text in selected text box" }, "editMenuStartSpeaking": { @@ -252,7 +252,7 @@ "description": "The label for yourself when shown in a group member list" }, "view": { - "message": "Afficher", + "message": "Voir", "description": "Used as a label on a button allowing user to see more information" }, "youLeftTheGroup": { @@ -272,11 +272,11 @@ "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" }, "unreadMessage": { - "message": "1 message non lu", + "message": "$count$ Message Non Lu", "description": "Text for unread message separator, just one message" }, "unreadMessages": { - "message": "$count$ messages non lus", + "message": "$count$ Messages Non Lus", "description": "Text for unread message separator, with count", "placeholders": { "count": { @@ -306,7 +306,7 @@ } }, "youMarkedAsVerifiedOtherDevice": { - "message": "Vous avez marqué votre numéro de sécurité avec $name$ comme vérifié à partir d’un autre appareil.", + "message": "Vous avez marqué votre numéro de sécurité avec $name$ comme vérifié à partir d’un autre appareil", "description": "Shown in the conversation history when we discover that the user marked a contact as verified on another device.", "placeholders": { "name": { @@ -334,7 +334,7 @@ "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Votre numéro de sécurité avec $name$ a changé depuis votre dernière conversation. Cela pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit que $name$ a simplement réinstallé Signal.", + "message": "Votre numéro de sécurité avec $name$ a changé et n’est plus vérifié. Cela pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit que $name$ a simplement réinstallé Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -358,7 +358,7 @@ "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Votre numéro de sécurité avec $name$ a changé récemment. Cela pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit que $name$ a simplement réinstallé Signal.", + "message": "Votre numéro de sécurité avec $name$ a changé. Cela pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit que $name$ a simplement réinstallé Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -408,7 +408,7 @@ "description": "Link to open the issue tracker" }, "gotIt": { - "message": "D’accord !", + "message": "D’accord", "description": "Label for a button that dismisses a dialog. The user clicks it to confirm that they understand the message in the dialog." }, "submit": { @@ -428,7 +428,7 @@ "description": "" }, "isVerified": { - "message": "Vous avez vérifié votre numéro de sécurité avec $name$.", + "message": "Vous avez marqué votre numéro de sécurité avec $name$ comme vérifié", "description": "Summary state shown at top of the safety number screen if user has verified contact.", "placeholders": { "name": { @@ -468,7 +468,7 @@ "description": "Header of the default pane in the media gallery, showing images and videos" }, "mediaEmptyState": { - "message": "Vous n’avez aucun fichier média dans cette conversation", + "message": "Aucun média", "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)" }, "documents": { @@ -476,7 +476,7 @@ "description": "Header of the secondary pane in the media gallery, showing every non-media attachment" }, "documentsEmptyState": { - "message": "Vous n’avez aucun document dans cette conversation", + "message": "Aucun document", "description": "Message shown to user in the media gallery when there are no messages with document attachments (anything other than images or video)" }, "today": { @@ -488,11 +488,11 @@ "description": "Section header in the media gallery" }, "thisWeek": { - "message": "Cette semaine", + "message": "Cette Semaine", "description": "Section header in the media gallery" }, "thisMonth": { - "message": "Ce mois", + "message": "Ce Mois", "description": "Section header in the media gallery" }, "unsupportedAttachment": { @@ -562,11 +562,11 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "Désolé, le fichier sélectionné dépasse la limite de taille des messages.", + "message": "La pièce jointe dépasse la limite de taille pour le type de message que vous envoyé.", "description": "" }, "unableToLoadAttachment": { - "message": "Impossible de charger le fichier joint sélectionné.", + "message": "Désolé, une erreur de mise en place de votre pièce jointe est survenue.", "description": "" }, "disconnected": { @@ -574,7 +574,7 @@ "description": "Displayed when the desktop client cannot connect to the server." }, "connecting": { - "message": "Connexion", + "message": "Connexion…", "description": "Displayed when the desktop client is currently connecting to the server." }, "offline": { @@ -648,11 +648,11 @@ "description": "Tooltip for the tray icon" }, "search": { - "message": "Chercher", + "message": "Recherche", "description": "Placeholder text in the search input" }, "noSearchResults": { - "message": "Aucun résultat pour « $searchTerm$ »", + "message": "Aucun résultat n’a été trouvé pour « %s »", "description": "Shown in the search left pane when no results were found", "placeholders": { "searchTerm": { @@ -674,7 +674,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Bienvenue sur Signal", + "message": "Bienvenue sur Session.", "description": "" }, "selectAContact": { @@ -700,15 +700,15 @@ "description": "Shown when you are sent a contact and that contact has a signal account" }, "home": { - "message": "domicile", + "message": "Domicile", "description": "Shown on contact detail screen as a label for an address/phone/email" }, "work": { - "message": "travail", + "message": "Travail", "description": "Shown on contact detail screen as a label for an address/phone/email" }, "mobile": { - "message": "mobile", + "message": "Mobile", "description": "Shown on contact detail screen as a label for aa phone or email" }, "email": { @@ -770,7 +770,7 @@ } }, "audioPermissionNeeded": { - "message": "Afin d’envoyer des messages audio, autorisez Signal Desktop pour ordinateur à accéder à votre micro.", + "message": "Pour envoyer des messages audio, autorisez Session à accéder à votre microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -782,7 +782,7 @@ "description": "A button shown in dialog requesting the user to turn on audio permissions" }, "audio": { - "message": "Audio", + "message": "Contenu audio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" }, "video": { @@ -830,15 +830,15 @@ "description": "" }, "deleteThisMessage": { - "message": "Supprimer ce message", + "message": "Supprimer le message", "description": "" }, "from": { - "message": "De", + "message": "De :", "description": "Label for the sender of a message" }, "to": { - "message": "à", + "message": "À :", "description": "Label for the receiver of a message" }, "sent": { @@ -862,11 +862,11 @@ "description": "" }, "resetSession": { - "message": "Réinitialiser la session", + "message": "Réinitialiser La Session Sécurisée", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." }, "showSafetyNumber": { - "message": "Afficher le numéro de sécurité", + "message": "Afficher Le Numéro De Sécurité", "description": "" }, "viewAllMedia": { @@ -896,7 +896,7 @@ "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": "Supprimer ce message", + "message": "Supprimer Le Message", "description": "Shown on the drop-down menu for an individual message, deletes single message" }, "deleteMessages": { @@ -978,7 +978,7 @@ "description": "The button used in Signal Android to add a new linked device" }, "linkNewDevice": { - "message": "Relier un nouvel appareil", + "message": "Relier Un Nouvel Appareil", "description": "The menu option shown in Signal iOS to add a new linked device" }, "deviceName": { @@ -1066,7 +1066,7 @@ "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "Désactiver les notifications", + "message": "Notifications en sourdine", "description": "Label for disabling notifications" }, "nameAndMessage": { @@ -1090,7 +1090,7 @@ "description": "Displayed in notifications for multiple messages" }, "notificationMostRecentFrom": { - "message": "Les plus récents de :", + "message": "Le plus récent de : $name$", "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting" }, "notificationFrom": { @@ -1102,7 +1102,7 @@ "description": "Displayed in notifications when setting is 'name and message' and more than one message is waiting" }, "sendFailed": { - "message": "Échec d’envoi", + "message": "Échec D’Envoi", "description": "Shown on outgoing message if it fails to send" }, "showMore": { @@ -1126,7 +1126,7 @@ "description": "Label text for button to upgrade the app to the latest version" }, "mediaMessage": { - "message": "Message média", + "message": "Message multimédia", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, "unregisteredUser": { @@ -1158,7 +1158,7 @@ "description": "Informational text displayed if a sync operation times out." }, "timestamp_s": { - "message": "maintenant", + "message": "À L’Instant", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." }, "timestamp_m": { @@ -1226,7 +1226,7 @@ "description": "Brief message shown when trying to message a blocked group" }, "youChangedTheTimer": { - "message": "Vous avez défini l’expiration des messages éphémères à $time$", + "message": "Vous avez défini l’expiration des messages éphémères à $time$.", "description": "Message displayed when you change the message expiration timer in a conversation.", "placeholders": { "time": { @@ -1246,7 +1246,7 @@ } }, "theyChangedTheTimer": { - "message": "$name$ a défini l’expiration des messages éphémères à $time$", + "message": "$name$ a défini l’expiration des messages éphémères à $time$.", "description": "Message displayed when someone else changes the message expiration timer in a conversation.", "placeholders": { "name": { @@ -1312,7 +1312,7 @@ "description": "Conversation menu option to enable disappearing messages" }, "timerOption_0_seconds_abbreviated": { - "message": "Désactivés", + "message": "Désactivé", "description": "Short format indicating current timer setting in the conversation list snippet" }, "timerOption_5_seconds_abbreviated": { @@ -1364,7 +1364,7 @@ "description": "Displayed in the left pane when the timer is turned off" }, "disabledDisappearingMessages": { - "message": "$name$a désactivé les messages éphémères", + "message": "$name$ a désactivé les messages éphémères.", "description": "Displayed in the conversation list when the timer is turned off", "placeholders": { "name": { @@ -1374,11 +1374,11 @@ } }, "youDisabledDisappearingMessages": { - "message": "Vous avez désactivé les messages éphémères", + "message": "Vous avez désactivé les messages éphémères.", "description": "Displayed in the conversation list when the timer is turned off" }, "timerSetTo": { - "message": "L’expiration des messages a été définie à $time$", + "message": "L’expiration des messages éphémères a été définie à $time$", "description": "Displayed in the conversation list when the timer is updated by some automatic action, or in the left pane", "placeholders": { "time": { @@ -1396,7 +1396,7 @@ "description": "A notification shown in the conversation when a contact reinstalls" }, "safetyNumberChangedGroup": { - "message": "Le numéro de sécurité avec $name$ a changé", + "message": "Votre numéro de sécurité avec $name$ a changé", "description": "A notification shown in a group conversation when a contact reinstalls, showing the contact name", "placeholders": { "name": { @@ -1406,7 +1406,7 @@ } }, "verifyNewNumber": { - "message": "Vérifier le numéro de sécurité", + "message": "Vérifier Le Numéro De Sécurité", "description": "Label on button included with safety number change notification in the conversation" }, "yourSafetyNumberWith": { @@ -1480,7 +1480,7 @@ "description": "" }, "leftTheGroup": { - "message": "$name$ a quitté le groupe", + "message": "$name$ a quitté le groupe.", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { @@ -1504,7 +1504,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Le titre est maintenant « $name$ »", + "message": "Le nom du groupe est maintenant « $name$ ».", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1514,7 +1514,7 @@ } }, "joinedTheGroup": { - "message": "$name$ s’est joint au groupe", + "message": "$name$ s’est joint au groupe.", "description": "Shown in the conversation history when a single person joins the group", "placeholders": { "name": { @@ -1524,7 +1524,7 @@ } }, "multipleJoinedTheGroup": { - "message": "$names$ se sont joints au groupe", + "message": "$name$ se sont joints au groupe.", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { "names": { @@ -1532,5 +1532,257 @@ "example": "Alice, Bob" } } + }, + "privacyPolicy": { + "message": "Conditions générales et politique de confidentialité" + }, + "unknown": { + "message": "Inconnu" + }, + "changedSinceVerifiedTitle": { + "message": "Le Numéro De Sécurité A Changé" + }, + "youMayWishToVerifyContact": { + "message": "Vous devriez peut-être vérifier votre numéro de sécurité avec ce contact." + }, + "about": { + "message": "À propos de Session" + }, + "settingsHeader": { + "message": "Paramètres" + }, + "yes": { + "message": "Oui" + }, + "continue": { + "message": "Continuer" + }, + "devicePairingRequestReceivedLimitTitle": { + "message": "Limite d'appareils atteinte" + }, + "devicePairingRequestReceivedLimitDescription": { + "message": "Désolé, trop d’appareils sont déjà reliés. Essayez d’en supprimer" + }, + "devicePairingRequestReceivedNoListenerTitle": { + "message": "Demande de liaison reçue" + }, + "waitingForDeviceToRegister": { + "message": "En attente d'une demande de liaison" + }, + "pairNewDevicePrompt": { + "message": "Balayez le code QR affiché sur l’appareil pour le relier" + }, + "noPairedDevices": { + "message": "Aucun appareil n’est relié" + }, + "deviceUnpaired": { + "message": "Votre appareil a été déconnecté avec succès" + }, + "sendMessageLeftGroup": { + "message": "Vous avez quitté le groupe" + }, + "moreInformation": { + "message": "Plus d’informations" + }, + "resend": { + "message": "Renvoyer" + }, + "clearAllData": { + "message": "Effacer toutes les données" + }, + "deleteAccountWarning": { + "message": "Cela supprimera définitivement vos messages, vos sessions et vos contacts." + }, + "deleteContactConfirmation": { + "message": "Voulez-vous vraiment supprimer cette conversation ?" + }, + "copy": { + "message": "Copier" + }, + "linkPreviewsTitle": { + "message": "Envoyer Des Aperçus De Liens" + }, + "linkPreviewDescription": { + "message": "Les aperçus sont pris en charge pour les liens Imgur, Instagram, Pinterest, Reddit et YouTube" + }, + "readReceiptSettingTitle": { + "message": "Accusés De Lecture" + }, + "typingIndicatorsSettingTitle": { + "message": "Indicateurs De Saisie" + }, + "themeToggleTitle": { + "message": "Clair" + }, + "successUnlinked": { + "message": "Votre appareil a été déconnecté avec succès" + }, + "autoUpdateDownloadButtonLabel": { + "message": "Télécharger" + }, + "blockUser": { + "message": "Bloquer" + }, + "unblockUser": { + "message": "Débloquer" + }, + "blockedSettingsTitle": { + "message": "Contacts bloqués" + }, + "leaveGroup": { + "message": "Quitter Le Groupe" + }, + "leaveGroupConfirmation": { + "message": "Voulez-vous vraiment quitter ce groupe ?" + }, + "noContactsForGroup": { + "message": "Vous n'avez pas encore de contacts" + }, + "editGroup": { + "message": "Modifier le groupe" + }, + "updateGroupDialogTitle": { + "message": "Mise à jour $name$…" + }, + "showRecoveryPhrase": { + "message": "Phrase de récupération" + }, + "yourSessionID": { + "message": "Votre Session ID" + }, + "recoveryPhraseSavePromptMain": { + "message": "Votre phrase de récupération est la clé principale de votre Session ID - vous pouvez l'utiliser pour restaurer votre Session ID si vous perdez l'accès à votre appareil. Conservez la dans un endroit sûr et ne la donnez à personne." + }, + "QRCodeTitle": { + "message": "Afficher mon code QR" + }, + "copiedToClipboard": { + "message": "Copié dans le presse-papier" + }, + "unlock": { + "message": "Déverrouiller" + }, + "connectToServerFail": { + "message": "Impossible de rejoindre le groupe" + }, + "connectingToServer": { + "message": "Connexion…" + }, + "remove": { + "message": "Supprimer" + }, + "invalidSessionId": { + "message": "Session ID non valide" + }, + "emptyGroupNameError": { + "message": "Veuillez saisir un nom de groupe" + }, + "groupNamePlaceholder": { + "message": "Nom Du Groupe" + }, + "inviteContacts": { + "message": "Inviter Des Amis" + }, + "yourUniqueSessionID": { + "message": "Dites bonjour à votre Session ID" + }, + "allUsersAreRandomly...": { + "message": "Votre Session ID est l'identifiant unique que les gens utilisent pour vous contacter dans Session. Sans lien avec votre identité réelle, votre Session ID est complètement anonyme et privé." + }, + "generateSessionID": { + "message": "Créer un Session ID" + }, + "recoveryPhrase": { + "message": "Phrase de récupération" + }, + "enterRecoveryPhrase": { + "message": "Saisissez votre phrase de récupération" + }, + "enterDisplayName": { + "message": "Saisissez un nom d'utilisateur" + }, + "enterSessionIDHere": { + "message": "Saisissez votre Session ID" + }, + "continueYourSession": { + "message": "Continuez votre Session" + }, + "linkDevice": { + "message": "Relier un appareil" + }, + "restoreUsingRecoveryPhrase": { + "message": "Restaurez votre compte" + }, + "newSession": { + "message": "Nouvelle Session" + }, + "searchFor...": { + "message": "Chercher des conversations, des contacts ou des messages" + }, + "enterSessionID": { + "message": "Saisir un Session ID" + }, + "enterSessionIDOfRecipient": { + "message": "Saisissez le Session ID du destinataire" + }, + "usersCanShareTheir...": { + "message": "Les utilisateurs peuvent partager leur Session ID depuis les paramètres du compte ou en utilisant le code QR." + }, + "appearanceSettingsTitle": { + "message": "Apparence" + }, + "privacySettingsTitle": { + "message": "Confidentialité" + }, + "notificationsSettingsTitle": { + "message": "Notifications" + }, + "devicesSettingsTitle": { + "message": "Appareils reliés" + }, + "recoveryPhraseEmpty": { + "message": "Saisissez votre phrase de récupération" + }, + "displayNameEmpty": { + "message": "Veuillez choisir un nom d'utilisateur" + }, + "joinOpenGroup": { + "message": "Joindre un groupe public" + }, + "newClosedGroup": { + "message": "Nouveau groupe privé" + }, + "newClosedGroupDescription": { + "message": "Les groupes privés prennent en charge jusqu'à 10 membres et offrent le même niveau de confidentialité que les sessions individuelles." + }, + "createClosedGroupNamePrompt": { + "message": "Nom Du Groupe" + }, + "createClosedGroupPlaceholder": { + "message": "Saisissez un nom de groupe" + }, + "openGroupURL": { + "message": "URL du groupe public" + }, + "enterAnOpenGroupURL": { + "message": "Saisissez une URL de groupe public" + }, + "next": { + "message": "Suivant" + }, + "pairingDevice": { + "message": "Liaison De L’Appareil" + }, + "invalidGroupNameTooShort": { + "message": "Veuillez saisir un nom de groupe" + }, + "invalidGroupNameTooLong": { + "message": "Veuillez saisir un nom de groupe plus court" + }, + "pickClosedGroupMember": { + "message": "Veuillez sélectionner au moins 2 membres" + }, + "closedGroupMaxSize": { + "message": "Un groupe privé ne peut pas avoir plus de 10 membres" } -} +} \ No newline at end of file From f15a3c98781feae43903f97064ec0cb30f8556ad Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 19 Aug 2020 17:35:35 +1000 Subject: [PATCH 066/274] clean script to map android translation to desktop --- tools/mapAndroidTranslationsToDesktop.py | 42 ++++++++++++++++++------ 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/tools/mapAndroidTranslationsToDesktop.py b/tools/mapAndroidTranslationsToDesktop.py index f62bb8fdd..1056b8570 100755 --- a/tools/mapAndroidTranslationsToDesktop.py +++ b/tools/mapAndroidTranslationsToDesktop.py @@ -1,8 +1,5 @@ #!/bin/python3 -import re -import os -from glob import glob import json import sys import xmltodict @@ -10,14 +7,17 @@ import traceback # androidKey # "androidKeyCount": "one" or "other" used to find matching key with quantity -# replace \\' with ' -# replace \\\" with \" # "wordCapitalize": true capitalize each words (must be called before addStart) # "addStart": "&" char to add as start char # "androidReplace": replace all occurences of key value pair allowedItemKeys = ['message', 'description', 'comment', 'placeholders', 'androidKey', 'wordCapitalize', 'androidKeyCount', 'androidReplace', 'addStart'] +SPECIFIC_LOCALES_MAPPING = { + 'zh_CN': 'zh-rCN', + 'pt_BR': 'pt-rBR' +} + if len(sys.argv) != 3: print(f"usage: {sys.argv[0]} ") sys.exit(1) @@ -27,11 +27,19 @@ androidRoot = sys.argv[2] desktopSrc = json.loads(open(f"_locales/en/messages.json", "r").read()) -desktopDst = json.loads(open(f"_locales/{dest}/messages.json", +destFilePath = f"_locales/{dest}/messages.json" +desktopDest = json.loads(open(destFilePath, "r").read()) androidEnValueFile = f"{androidRoot}/res/values/strings.xml" -androidTranslatedValueFile = f"{androidRoot}/res/values-{dest}/strings.xml" + + +def getAndroidTranslatedFile(androidRoot, dest): + if dest in SPECIFIC_LOCALES_MAPPING.keys(): + return f"{androidRoot}/res/values-{SPECIFIC_LOCALES_MAPPING[dest]}/strings.xml" + return f"{androidRoot}/res/values-{dest}/strings.xml" + +androidTranslatedValueFile = getAndroidTranslatedFile(androidRoot, dest) def getDictFromFile(filepath, keyToSearch): xml = open(filepath, "r").read() @@ -146,19 +154,33 @@ for key, itemEnDesktop in desktopSrc.items(): notMatchingCount = notMatchingCount + 1 else: # if it does match, find the corresponding value on the target language on android - print(f'MATCH: "{txtEnDesktop}" vs "{morphedEnAndroid}"') + # print(f'EN to EN MATCH, continuing... : "{txtEnDesktop}" vs "{morphedEnAndroid}"') try: textTranslated = getAndroidItem(androidKey, androidKeyCount, androidDestJsonSingular, androidDestJsonPlurals)['#text'] - print(f'textTranslated: "{textTranslated}"') + # print(f'textTranslated: "{textTranslated}"') textMorphed = morphToDesktopSyntax(textTranslated, itemEnDesktop) - print(f'textMorphed: "{textMorphed}"') + existingItemTranslated = None + existingTranslation = None + if key in desktopDest.keys(): + existingItemTranslated = desktopDest[key] + existingTranslation = existingItemTranslated['message'] + # print(f'existingItemTranslated: "{existingItemTranslated}"') + if existingTranslation != textMorphed: + print(f'not matching: "{existingTranslation}" and "{textMorphed}"') + if key not in desktopDest.keys(): + desktopDest[key] = {'message': textMorphed} + else: + desktopDest[key]['message'] = textMorphed except KeyError: print('KeyError exception:', traceback.format_exc()) +# write the updated json dict to the file +with open(destFilePath, 'w') as outfile: + json.dump(desktopDest, outfile, indent=4, ensure_ascii=False) From 80d8362b7341aa103a6f571f3e6eebc0c039419f Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 19 Aug 2020 17:39:17 +1000 Subject: [PATCH 067/274] update russian translation with matching android values --- _locales/ru/messages.json | 366 ++++++++++++++++++++++++++++++++------ 1 file changed, 309 insertions(+), 57 deletions(-) diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index 0b67642b2..a3ecec0c7 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -24,7 +24,7 @@ "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": "&Вид", + "message": "&Просмотреть", "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": { @@ -32,7 +32,7 @@ "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": "&Справка", + "message": "&Помощь", "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": { @@ -56,7 +56,7 @@ "description": "Application menu command to close the application" }, "editMenuUndo": { - "message": "Вернуть", + "message": "Отменить", "description": "Edit menu command to remove recently-typed text" }, "editMenuRedo": { @@ -84,7 +84,7 @@ "description": "Edit menu command to remove the selected text" }, "editMenuSelectAll": { - "message": "Выбрать все", + "message": "Выбрать Все", "description": "Edit menu comand to select all of the text in selected text box" }, "editMenuStartSpeaking": { @@ -252,11 +252,11 @@ "description": "The label for yourself when shown in a group member list" }, "view": { - "message": "Просмотр", + "message": "Просмотреть", "description": "Used as a label on a button allowing user to see more information" }, "youLeftTheGroup": { - "message": "Вы покинули группу", + "message": "Вы покинули группу.", "description": "Displayed when a user can't send a message because they have left the group" }, "scrollDown": { @@ -272,11 +272,11 @@ "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" }, "unreadMessage": { - "message": "1 непрочитанное сообщение", + "message": "$count$ Непрочитанное Сообщение", "description": "Text for unread message separator, just one message" }, "unreadMessages": { - "message": "$count$ непрочитанных сообщений", + "message": "Непрочитанных Сообщений: $count$", "description": "Text for unread message separator, with count", "placeholders": { "count": { @@ -286,7 +286,7 @@ } }, "youMarkedAsVerified": { - "message": "Вы пометили свой код безопасности с $name$ как верифицированный.", + "message": "Вы отметили код безопасности с $name$ как подтверждённый", "description": "Shown in the conversation history when the user marks a contact as verified.", "placeholders": { "name": { @@ -296,7 +296,7 @@ } }, "youMarkedAsNotVerified": { - "message": "Вы пометили свой код безопасности с $name$ как не верифицированный.", + "message": "Вы отметили код безопасности с $name$ как неподтверждённый", "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": { @@ -306,7 +306,7 @@ } }, "youMarkedAsVerifiedOtherDevice": { - "message": "Вы пометили свой код безопасности с $name$ как верифицированный на другом устройстве.", + "message": "Вы отметили код безопасности с $name$ как подтверждённый с другого устройства", "description": "Shown in the conversation history when we discover that the user marked a contact as verified on another device.", "placeholders": { "name": { @@ -316,7 +316,7 @@ } }, "youMarkedAsNotVerifiedOtherDevice": { - "message": "Вы пометили свой код безопасности с $name$ как не верифицированный на другом устройстве.", + "message": "Вы отметили код безопасности с $name$ как неподтверждённый с другого устройства", "description": "Shown in the conversation history when we discover that the user marked a contact as not verified on another device.", "placeholders": { "name": { @@ -334,7 +334,7 @@ "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Код безопасности с $name$ изменился с момента последнего подтверждения. Это может означать, что кто-то пытается перехватить ваши сообщения, или $name$ попросту переустановил Signal. ", + "message": "Ваш код безопасности с $name$ изменился и более не считается подтверждённым. Это означает, что либо вашу переписку пытаются перехватить, либо $name$ просто переустановил(а) Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -358,7 +358,7 @@ "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Код безопасности с $name$ изменился. Это может означать, что кто-то пытается перехватить ваши сообщения, или $name$ попросту переустановил Signal.", + "message": "Ваш код безопасности с $name$ изменился. Это означает, что либо вашу переписку пытаются перехватить, либо $name$ просто переустановил(-а) Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -408,7 +408,7 @@ "description": "Link to open the issue tracker" }, "gotIt": { - "message": "Понятно!", + "message": "Понятно", "description": "Label for a button that dismisses a dialog. The user clicks it to confirm that they understand the message in the dialog." }, "submit": { @@ -428,7 +428,7 @@ "description": "" }, "isVerified": { - "message": "Вы подтвердили свой код безопасности с $name$.", + "message": "Вы отметили код безопасности с $name$ как подтверждённый", "description": "Summary state shown at top of the safety number screen if user has verified contact.", "placeholders": { "name": { @@ -448,7 +448,7 @@ } }, "verified": { - "message": "Подтвержденный", + "message": "Подтверждён", "description": "" }, "newIdentity": { @@ -468,7 +468,7 @@ "description": "Header of the default pane in the media gallery, showing images and videos" }, "mediaEmptyState": { - "message": "В этом разговоре нет медиафайлов", + "message": "Нет медиа-файлов", "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)" }, "documents": { @@ -476,7 +476,7 @@ "description": "Header of the secondary pane in the media gallery, showing every non-media attachment" }, "documentsEmptyState": { - "message": "В этом разговоре нет документов", + "message": "Нет документов", "description": "Message shown to user in the media gallery when there are no messages with document attachments (anything other than images or video)" }, "today": { @@ -488,11 +488,11 @@ "description": "Section header in the media gallery" }, "thisWeek": { - "message": "На этой неделе", + "message": "На Этой Неделе", "description": "Section header in the media gallery" }, "thisMonth": { - "message": "В этом месяце", + "message": "В Этом Месяце", "description": "Section header in the media gallery" }, "unsupportedAttachment": { @@ -562,11 +562,11 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "К сожалению, выбранный файл превышает ограничения на размер сообщений.", + "message": "Вложение превышает допустимый размер для того типа сообщения, которое вы отправляете.", "description": "" }, "unableToLoadAttachment": { - "message": "Невозможно загрузить выбранное приложение.", + "message": "Извините, произошла ошибка при обработке вложения.", "description": "" }, "disconnected": { @@ -574,7 +574,7 @@ "description": "Displayed when the desktop client cannot connect to the server." }, "connecting": { - "message": "Соединение", + "message": "Соединяемся...", "description": "Displayed when the desktop client is currently connecting to the server." }, "offline": { @@ -652,7 +652,7 @@ "description": "Placeholder text in the search input" }, "noSearchResults": { - "message": "Нет результатов для \"$searchTerm$\"", + "message": "Результаты не найдены для \"$searchTerm$\"", "description": "Shown in the search left pane when no results were found", "placeholders": { "searchTerm": { @@ -662,7 +662,7 @@ } }, "conversationsHeader": { - "message": "Разговоры", + "message": "Беседы", "description": "Shown to separate the types of search results" }, "contactsHeader": { @@ -674,7 +674,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Добро пожаловать в Signal", + "message": "Добро пожаловать в Session.", "description": "" }, "selectAContact": { @@ -700,15 +700,15 @@ "description": "Shown when you are sent a contact and that contact has a signal account" }, "home": { - "message": "домашний", + "message": "Домашний", "description": "Shown on contact detail screen as a label for an address/phone/email" }, "work": { - "message": "рабочий", + "message": "Рабочий", "description": "Shown on contact detail screen as a label for an address/phone/email" }, "mobile": { - "message": "мобильный", + "message": "Мобильный", "description": "Shown on contact detail screen as a label for aa phone or email" }, "email": { @@ -770,7 +770,7 @@ } }, "audioPermissionNeeded": { - "message": "Чтобы отправлять аудиосообщения, разрешите Signal Desktop доступ к микрофону.", + "message": "Для отправки аудиосообщений разрешите Session доступ к микрофону.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -830,15 +830,15 @@ "description": "" }, "deleteThisMessage": { - "message": "Удалить это сообщение", + "message": "Удалить сообщение", "description": "" }, "from": { - "message": "От", + "message": "От:", "description": "Label for the sender of a message" }, "to": { - "message": "->", + "message": "Кому:", "description": "Label for the receiver of a message" }, "sent": { @@ -862,11 +862,11 @@ "description": "" }, "resetSession": { - "message": "Сбросить сессию", + "message": "Сбросить Защищённый Сеанс", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." }, "showSafetyNumber": { - "message": "Просмотреть код безопасности", + "message": "Просмотреть Код Безопасности", "description": "" }, "viewAllMedia": { @@ -896,7 +896,7 @@ "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": "Удалить сообщение", + "message": "Удалить Сообщение", "description": "Shown on the drop-down menu for an individual message, deletes single message" }, "deleteMessages": { @@ -978,7 +978,7 @@ "description": "The button used in Signal Android to add a new linked device" }, "linkNewDevice": { - "message": "Связать новое устройство", + "message": "Привязать Новое Устройство", "description": "The menu option shown in Signal iOS to add a new linked device" }, "deviceName": { @@ -1066,7 +1066,7 @@ "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "Отключить уведомления", + "message": "Откл. звук уведомлений", "description": "Label for disabling notifications" }, "nameAndMessage": { @@ -1090,7 +1090,7 @@ "description": "Displayed in notifications for multiple messages" }, "notificationMostRecentFrom": { - "message": "Последние от:", + "message": "Последнее от $name$", "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting" }, "notificationFrom": { @@ -1102,7 +1102,7 @@ "description": "Displayed in notifications when setting is 'name and message' and more than one message is waiting" }, "sendFailed": { - "message": "Ошибка отправки", + "message": "Не Удалось Отправить", "description": "Shown on outgoing message if it fails to send" }, "showMore": { @@ -1158,7 +1158,7 @@ "description": "Informational text displayed if a sync operation times out." }, "timestamp_s": { - "message": "сейчас", + "message": "Только Что", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." }, "timestamp_m": { @@ -1226,7 +1226,7 @@ "description": "Brief message shown when trying to message a blocked group" }, "youChangedTheTimer": { - "message": "Вы устанавливаете таймер исчезновения сообщений на $time$", + "message": "Вы установили таймер для исчезающих сообщений на $time$.", "description": "Message displayed when you change the message expiration timer in a conversation.", "placeholders": { "time": { @@ -1246,7 +1246,7 @@ } }, "theyChangedTheTimer": { - "message": "$name$ установил таймер исчезновения сообщений на $time$", + "message": "$name$ установил(а) таймер для исчезающих сообщений на $time$.", "description": "Message displayed when someone else changes the message expiration timer in a conversation.", "placeholders": { "name": { @@ -1260,7 +1260,7 @@ } }, "timerOption_0_seconds": { - "message": "выкл", + "message": "Выключено", "description": "Label for option to turn off message expiration in the timer menu" }, "timerOption_5_seconds": { @@ -1312,7 +1312,7 @@ "description": "Conversation menu option to enable disappearing messages" }, "timerOption_0_seconds_abbreviated": { - "message": "выкл", + "message": "выключена", "description": "Short format indicating current timer setting in the conversation list snippet" }, "timerOption_5_seconds_abbreviated": { @@ -1364,7 +1364,7 @@ "description": "Displayed in the left pane when the timer is turned off" }, "disabledDisappearingMessages": { - "message": "Исчезающие сообщения отключены $name$", + "message": "$name$ отключил исчезающие сообщения.", "description": "Displayed in the conversation list when the timer is turned off", "placeholders": { "name": { @@ -1374,11 +1374,11 @@ } }, "youDisabledDisappearingMessages": { - "message": "Вы отключили исчезающие сообщения", + "message": "Вы отключили исчезающие сообщения.", "description": "Displayed in the conversation list when the timer is turned off" }, "timerSetTo": { - "message": "Таймер установлен на $time$", + "message": "Время исчезновения сообщений – $time$", "description": "Displayed in the conversation list when the timer is updated by some automatic action, or in the left pane", "placeholders": { "time": { @@ -1392,11 +1392,11 @@ "description": "Description for audio notification setting" }, "safetyNumberChanged": { - "message": "Код безопасности был изменен", + "message": "Код безопасности изменился", "description": "A notification shown in the conversation when a contact reinstalls" }, "safetyNumberChangedGroup": { - "message": "Код безопасности c $name$ был изменен.", + "message": "Ваш код безопасности с $name$ изменился.", "description": "A notification shown in a group conversation when a contact reinstalls, showing the contact name", "placeholders": { "name": { @@ -1406,7 +1406,7 @@ } }, "verifyNewNumber": { - "message": "Верифицировать код безопасности", + "message": "Подтвердить Код Безопасности", "description": "Label on button included with safety number change notification in the conversation" }, "yourSafetyNumberWith": { @@ -1480,7 +1480,7 @@ "description": "" }, "leftTheGroup": { - "message": "$name$ покинул(а) группу.", + "message": "$name$ покинул группу.", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { @@ -1504,7 +1504,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Название теперь '$name$'", + "message": "Группа теперь называется «$name$».", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1514,7 +1514,7 @@ } }, "joinedTheGroup": { - "message": "$name$ присоединился(лась) к группе.", + "message": "$name$ присоединился к группе.", "description": "Shown in the conversation history when a single person joins the group", "placeholders": { "name": { @@ -1524,7 +1524,7 @@ } }, "multipleJoinedTheGroup": { - "message": "$names$ присоединился(-лась) к группе.", + "message": "$name$ присоединились к группе.", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { "names": { @@ -1532,5 +1532,257 @@ "example": "Alice, Bob" } } + }, + "privacyPolicy": { + "message": "Положения & Политика конфиденциальности" + }, + "unknown": { + "message": "Неизвестен" + }, + "changedSinceVerifiedTitle": { + "message": "Код Безопасности Изменился" + }, + "youMayWishToVerifyContact": { + "message": "Возможно, вам стоит подтвердить код безопасности с этим контактом." + }, + "about": { + "message": "О Session" + }, + "settingsHeader": { + "message": "Настройки" + }, + "yes": { + "message": "Да" + }, + "continue": { + "message": "Продолжить" + }, + "devicePairingRequestReceivedLimitTitle": { + "message": "Достигнуто предельное кол-во устройств" + }, + "devicePairingRequestReceivedLimitDescription": { + "message": "К сожалению, у вас уже привязано слишком много устройств. Попробуйте отвязать некоторые из них" + }, + "devicePairingRequestReceivedNoListenerTitle": { + "message": "Запрос на привязывание получен" + }, + "waitingForDeviceToRegister": { + "message": "Ожидание устройства" + }, + "pairNewDevicePrompt": { + "message": "Просканируйте QR-код, отображаемый на устройстве, чтобы привязать его" + }, + "noPairedDevices": { + "message": "Нет привязанных устройств" + }, + "deviceUnpaired": { + "message": "Ваше устройство успешно отвязано" + }, + "sendMessageLeftGroup": { + "message": "Вы покинули группу." + }, + "moreInformation": { + "message": "Больше информации" + }, + "resend": { + "message": "Отправить Ещё Раз" + }, + "clearAllData": { + "message": "Очистить все данные" + }, + "deleteAccountWarning": { + "message": "Это навсегда удалит ваши сообщения, сессии и контакты." + }, + "deleteContactConfirmation": { + "message": "Вы уверены, что хотите удалить этот разговор?" + }, + "copy": { + "message": "Копировать" + }, + "linkPreviewsTitle": { + "message": "Отправлять Предпросмотр Ссылки" + }, + "linkPreviewDescription": { + "message": "Предварительный просмотр поддерживается для ссылок Imgur, Instagram, Pinterest, Reddit и YouTube." + }, + "readReceiptSettingTitle": { + "message": "Уведомления О Прочтении" + }, + "typingIndicatorsSettingTitle": { + "message": "Индикаторы Ввода" + }, + "themeToggleTitle": { + "message": "Светлая" + }, + "successUnlinked": { + "message": "Ваше устройство успешно отвязано" + }, + "autoUpdateDownloadButtonLabel": { + "message": "Скачать" + }, + "blockUser": { + "message": "Заблокировать" + }, + "unblockUser": { + "message": "Разблокировать" + }, + "blockedSettingsTitle": { + "message": "Заблокированные контакты" + }, + "leaveGroup": { + "message": "Покинуть Группу" + }, + "leaveGroupConfirmation": { + "message": "Вы уверены, что хотите покинуть эту группу?" + }, + "noContactsForGroup": { + "message": "У вас еще нет контактов" + }, + "editGroup": { + "message": "Редактировать группу" + }, + "updateGroupDialogTitle": { + "message": "Обновляем $name$..." + }, + "showRecoveryPhrase": { + "message": "Секретная фраза" + }, + "yourSessionID": { + "message": "Ваш Session ID" + }, + "recoveryPhraseSavePromptMain": { + "message": "Ваша секретная фраза является главным ключом к вашему Session ID. Вы можете использовать ее для восстановления Session ID, если потеряете доступ к своему устройству. Сохраните свою секретную фразу в безопасном месте, и никому её не передавайте." + }, + "QRCodeTitle": { + "message": "Посмотреть мой QR-код" + }, + "copiedToClipboard": { + "message": "Скопировано в буфер обмена" + }, + "unlock": { + "message": "Открыть" + }, + "connectToServerFail": { + "message": "Не удалось присоединиться к группе" + }, + "connectingToServer": { + "message": "Соединяемся..." + }, + "remove": { + "message": "Удалить" + }, + "invalidSessionId": { + "message": "Неверный Session ID" + }, + "emptyGroupNameError": { + "message": "Пожалуйста, введите название группы" + }, + "groupNamePlaceholder": { + "message": "Название Группы" + }, + "inviteContacts": { + "message": "Пригласить Друзей В Session" + }, + "yourUniqueSessionID": { + "message": "Познакомьтесь со своим Session ID" + }, + "allUsersAreRandomly...": { + "message": "Ваш Session ID - это уникальный адрес, который могут использовать другие люди для связи с вами при помощи Session. Поскольку ваш Session ID никак не связан с вашей настоящей личностью, он по определению является полностью анонимным и конфиденциальным." + }, + "generateSessionID": { + "message": "Создать Session ID" + }, + "recoveryPhrase": { + "message": "Секретная фраза" + }, + "enterRecoveryPhrase": { + "message": "Введите секретную фразу" + }, + "enterDisplayName": { + "message": "Введите отображаемое имя" + }, + "enterSessionIDHere": { + "message": "Введите свой Session ID" + }, + "continueYourSession": { + "message": "Восстановить Session ID" + }, + "linkDevice": { + "message": "Привязать устройство" + }, + "restoreUsingRecoveryPhrase": { + "message": "Восстановите свой аккаунт" + }, + "newSession": { + "message": "Новый Диалог" + }, + "searchFor...": { + "message": "Поиск по разговорам, контактам и сообщениям" + }, + "enterSessionID": { + "message": "Введите Session ID" + }, + "enterSessionIDOfRecipient": { + "message": "Введите Session ID получателя" + }, + "usersCanShareTheir...": { + "message": "Пользователи могут поделиться своим Session ID, зайдя в настройки своей учетной записи и нажав «Отправить Session ID», или поделившись своим QR-кодом." + }, + "appearanceSettingsTitle": { + "message": "Внешний вид" + }, + "privacySettingsTitle": { + "message": "Конфиденциальность" + }, + "notificationsSettingsTitle": { + "message": "Уведомления" + }, + "devicesSettingsTitle": { + "message": "Привязанные устройства" + }, + "recoveryPhraseEmpty": { + "message": "Введите секретную фразу" + }, + "displayNameEmpty": { + "message": "Пожалуйста, выберите отображаемое имя" + }, + "joinOpenGroup": { + "message": "Присоединиться к открытой группе" + }, + "newClosedGroup": { + "message": "Новая закрытая группа" + }, + "newClosedGroupDescription": { + "message": "Закрытые группы поддерживают до 10 участников и обеспечивают те же меры защиты конфиденциальности, что и сессии один-на-один." + }, + "createClosedGroupNamePrompt": { + "message": "Название Группы" + }, + "createClosedGroupPlaceholder": { + "message": "Введите название группы" + }, + "openGroupURL": { + "message": "URL открытой группы" + }, + "enterAnOpenGroupURL": { + "message": "Введите URL открытой группы" + }, + "next": { + "message": "Далее" + }, + "pairingDevice": { + "message": "Привязка Устройства" + }, + "invalidGroupNameTooShort": { + "message": "Пожалуйста, введите название группы" + }, + "invalidGroupNameTooLong": { + "message": "Пожалуйста, введите более короткое имя группы" + }, + "pickClosedGroupMember": { + "message": "Пожалуйста, выберите как минимум 2 участников группы" + }, + "closedGroupMaxSize": { + "message": "В закрытой группе не может быть больше 10 участников" } -} +} \ No newline at end of file From 56eaa46cf00c2784cb6193e46a83a0d9603bd350 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 19 Aug 2020 17:40:08 +1000 Subject: [PATCH 068/274] update italian translation with matching android --- _locales/it/messages.json | 358 ++++++++++++++++++++++++++++++++------ 1 file changed, 305 insertions(+), 53 deletions(-) diff --git a/_locales/it/messages.json b/_locales/it/messages.json index 4f97ab256..85290dfee 100644 --- a/_locales/it/messages.json +++ b/_locales/it/messages.json @@ -24,7 +24,7 @@ "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": "&Vista", + "message": "&Vedi", "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": { @@ -84,7 +84,7 @@ "description": "Edit menu command to remove the selected text" }, "editMenuSelectAll": { - "message": "Seleziona tutto", + "message": "Seleziona Tutto", "description": "Edit menu comand to select all of the text in selected text box" }, "editMenuStartSpeaking": { @@ -252,11 +252,11 @@ "description": "The label for yourself when shown in a group member list" }, "view": { - "message": "Mostra", + "message": "Vedi", "description": "Used as a label on a button allowing user to see more information" }, "youLeftTheGroup": { - "message": "Hai lasciato il gruppo", + "message": "Hai lasciato il gruppo.", "description": "Displayed when a user can't send a message because they have left the group" }, "scrollDown": { @@ -272,11 +272,11 @@ "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" }, "unreadMessage": { - "message": "1 messaggio non letto", + "message": "$count$ Messaggio Non Letto", "description": "Text for unread message separator, just one message" }, "unreadMessages": { - "message": "$count$ messaggi non letti", + "message": "$count$ Messaggi Non Letti", "description": "Text for unread message separator, with count", "placeholders": { "count": { @@ -286,7 +286,7 @@ } }, "youMarkedAsVerified": { - "message": "Hai segnato il numero di sicurezza con $name$ come verificato", + "message": "Hai segnato il codice di sicurezza con $name$ come verificato", "description": "Shown in the conversation history when the user marks a contact as verified.", "placeholders": { "name": { @@ -296,7 +296,7 @@ } }, "youMarkedAsNotVerified": { - "message": "Hai segnato il numero di sicurezza con $name$ come non verificato", + "message": "Hai segnato il codice di sicurezza con $name$ come non verificato", "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": { @@ -306,7 +306,7 @@ } }, "youMarkedAsVerifiedOtherDevice": { - "message": "Hai segnato il numero di sicurezza con $name$ come verificato da un altro dispositivo", + "message": "Hai segnato il codice di sicurezza con $name$ come verificato da un altro dispositivo", "description": "Shown in the conversation history when we discover that the user marked a contact as verified on another device.", "placeholders": { "name": { @@ -316,7 +316,7 @@ } }, "youMarkedAsNotVerifiedOtherDevice": { - "message": "Hai segnato il numero di sicurezza con $name$ come non verificato da un altro dispositivo", + "message": "Hai segnato il codice di sicurezza con $name$ come non verificato da un altro dispositivo", "description": "Shown in the conversation history when we discover that the user marked a contact as not verified on another device.", "placeholders": { "name": { @@ -334,7 +334,7 @@ "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Il codice di sicurezza con $name$ è cambiato dall'ultima verifica. Questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che $name$ ha semplicemente reinstallato Signal.", + "message": "Il codice di sicurezza con $name$ è cambiato. Questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che $name$ ha semplicemente reinstallato Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -358,7 +358,7 @@ "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Di recente il codice di sicurezza con $name$ è cambiato. Questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che $name$ ha semplicemente reinstallato Signal.", + "message": "Il codice di sicurezza con $name$ è cambiato. Questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che $name$ ha semplicemente reinstallato Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -408,7 +408,7 @@ "description": "Link to open the issue tracker" }, "gotIt": { - "message": "Capito!", + "message": "Capito", "description": "Label for a button that dismisses a dialog. The user clicks it to confirm that they understand the message in the dialog." }, "submit": { @@ -428,7 +428,7 @@ "description": "" }, "isVerified": { - "message": "Hai verificato il codice di sicurezza con $name$.", + "message": "Hai segnato il codice di sicurezza con $name$ come verificato", "description": "Summary state shown at top of the safety number screen if user has verified contact.", "placeholders": { "name": { @@ -468,7 +468,7 @@ "description": "Header of the default pane in the media gallery, showing images and videos" }, "mediaEmptyState": { - "message": "Non hai alcun media in questa conversazione", + "message": "Nessun file multimediale", "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)" }, "documents": { @@ -476,7 +476,7 @@ "description": "Header of the secondary pane in the media gallery, showing every non-media attachment" }, "documentsEmptyState": { - "message": "Non hai alcun documento in questa conversazione", + "message": "Nessun documento", "description": "Message shown to user in the media gallery when there are no messages with document attachments (anything other than images or video)" }, "today": { @@ -488,11 +488,11 @@ "description": "Section header in the media gallery" }, "thisWeek": { - "message": "Questa settimana", + "message": "Questa Settimana", "description": "Section header in the media gallery" }, "thisMonth": { - "message": "Questo mese", + "message": "Questo Mese", "description": "Section header in the media gallery" }, "unsupportedAttachment": { @@ -562,11 +562,11 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "Spiacente, il file selezionato supera la dimensione predefinita per il messaggio.", + "message": "L'allegato che stai cercando di inviare supera le dimensioni consentite", "description": "" }, "unableToLoadAttachment": { - "message": "Non è stato possibile caricare l'allegato selezionato.", + "message": "Attenzione, c'è stato un errore nell'inviare il tuo allegato.", "description": "" }, "disconnected": { @@ -574,7 +574,7 @@ "description": "Displayed when the desktop client cannot connect to the server." }, "connecting": { - "message": "In collegamento", + "message": "Connessione in corso...", "description": "Displayed when the desktop client is currently connecting to the server." }, "offline": { @@ -652,7 +652,7 @@ "description": "Placeholder text in the search input" }, "noSearchResults": { - "message": "Nessun risultato per \"$searchTerm$\"", + "message": "Nessun risultato trovato per \"$searchTerm$\"", "description": "Shown in the search left pane when no results were found", "placeholders": { "searchTerm": { @@ -674,7 +674,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Benvenuto in Signal", + "message": "Benvenuto su Session", "description": "" }, "selectAContact": { @@ -700,15 +700,15 @@ "description": "Shown when you are sent a contact and that contact has a signal account" }, "home": { - "message": "casa", + "message": "Casa", "description": "Shown on contact detail screen as a label for an address/phone/email" }, "work": { - "message": "lavoro", + "message": "Lavoro", "description": "Shown on contact detail screen as a label for an address/phone/email" }, "mobile": { - "message": "telefono", + "message": "Cellulare", "description": "Shown on contact detail screen as a label for aa phone or email" }, "email": { @@ -770,7 +770,7 @@ } }, "audioPermissionNeeded": { - "message": "Per inviare messaggi audio, concedi l'accesso al tuo microfono a Signal Desktop", + "message": "Per poter mandare un messaggio audio, permetti a Session di accedere al tuo microfono.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -830,15 +830,15 @@ "description": "" }, "deleteThisMessage": { - "message": "Cancella il messaggio", + "message": "Cancella messaggio", "description": "" }, "from": { - "message": "Da", + "message": "Da:", "description": "Label for the sender of a message" }, "to": { - "message": "a", + "message": "A:", "description": "Label for the receiver of a message" }, "sent": { @@ -862,11 +862,11 @@ "description": "" }, "resetSession": { - "message": "Resetta sessione", + "message": "Azzera La Sessione Sicura", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." }, "showSafetyNumber": { - "message": "Mostra numero di sicurezza", + "message": "Mostra Codice Di Sicurezza", "description": "" }, "viewAllMedia": { @@ -896,7 +896,7 @@ "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": "Elimina messaggio", + "message": "Cancella Messaggio", "description": "Shown on the drop-down menu for an individual message, deletes single message" }, "deleteMessages": { @@ -978,7 +978,7 @@ "description": "The button used in Signal Android to add a new linked device" }, "linkNewDevice": { - "message": "Collega un nuovo dispositivo", + "message": "Collega Nuovo Dispositivo", "description": "The menu option shown in Signal iOS to add a new linked device" }, "deviceName": { @@ -1066,7 +1066,7 @@ "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "Disabilita notifiche", + "message": "Silenzia notifiche", "description": "Label for disabling notifications" }, "nameAndMessage": { @@ -1090,7 +1090,7 @@ "description": "Displayed in notifications for multiple messages" }, "notificationMostRecentFrom": { - "message": "Più recente da:", + "message": "Il più recente da: $name$", "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting" }, "notificationFrom": { @@ -1102,7 +1102,7 @@ "description": "Displayed in notifications when setting is 'name and message' and more than one message is waiting" }, "sendFailed": { - "message": "Invio non riuscito", + "message": "Invio Non Riuscito", "description": "Shown on outgoing message if it fails to send" }, "showMore": { @@ -1158,7 +1158,7 @@ "description": "Informational text displayed if a sync operation times out." }, "timestamp_s": { - "message": "ora", + "message": "Ora", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." }, "timestamp_m": { @@ -1226,7 +1226,7 @@ "description": "Brief message shown when trying to message a blocked group" }, "youChangedTheTimer": { - "message": "Hai impostato il timer dei messaggi a scomparsa a $time$", + "message": "Hai settato i messaggi a scomparsa a $time$.", "description": "Message displayed when you change the message expiration timer in a conversation.", "placeholders": { "time": { @@ -1246,7 +1246,7 @@ } }, "theyChangedTheTimer": { - "message": "$name$ ha impostato il timer dei messaggi a scomparsa a $time$", + "message": "$name$ ha settato i messaggi a scomparsa a $time$", "description": "Message displayed when someone else changes the message expiration timer in a conversation.", "placeholders": { "name": { @@ -1260,7 +1260,7 @@ } }, "timerOption_0_seconds": { - "message": "off", + "message": "Spenti", "description": "Label for option to turn off message expiration in the timer menu" }, "timerOption_5_seconds": { @@ -1364,7 +1364,7 @@ "description": "Displayed in the left pane when the timer is turned off" }, "disabledDisappearingMessages": { - "message": "$name$ ha disabilitato i messaggi a scomparsa", + "message": "$name$ ha disabilitato i messaggi a scomparsa.", "description": "Displayed in the conversation list when the timer is turned off", "placeholders": { "name": { @@ -1374,11 +1374,11 @@ } }, "youDisabledDisappearingMessages": { - "message": "Hai disabilitato i messaggi a scomparsa", + "message": "Hai disabilitato i messaggi a scomparsa.", "description": "Displayed in the conversation list when the timer is turned off" }, "timerSetTo": { - "message": "Timer settato a $time$", + "message": "La scomparsa dei messaggi è settata a $time$", "description": "Displayed in the conversation list when the timer is updated by some automatic action, or in the left pane", "placeholders": { "time": { @@ -1392,11 +1392,11 @@ "description": "Description for audio notification setting" }, "safetyNumberChanged": { - "message": "Il numero di sicurezza è cambiato", + "message": "Codice di sicurezza cambiato", "description": "A notification shown in the conversation when a contact reinstalls" }, "safetyNumberChangedGroup": { - "message": "Il numero di sicurezza con $name$ è cambiato", + "message": "Il codice di sicurezza con $name$ è cambiato.", "description": "A notification shown in a group conversation when a contact reinstalls, showing the contact name", "placeholders": { "name": { @@ -1406,7 +1406,7 @@ } }, "verifyNewNumber": { - "message": "Verifica numero di sicurezza", + "message": "Verifica Numero Sicuro.", "description": "Label on button included with safety number change notification in the conversation" }, "yourSafetyNumberWith": { @@ -1476,11 +1476,11 @@ "description": "" }, "autoUpdateLaterButtonLabel": { - "message": "Dopo", + "message": "Più tardi", "description": "" }, "leftTheGroup": { - "message": "$name$ ha lasciato il gruppo", + "message": "$name$ ha lasciato il gruppo.", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { @@ -1504,7 +1504,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Il titolo ora è \"$name$\"", + "message": "Il nome del gruppo è ora '$name$'.", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1514,7 +1514,7 @@ } }, "joinedTheGroup": { - "message": "$name$ si è unito al gruppo", + "message": "$name$ fa ora parte del gruppo.", "description": "Shown in the conversation history when a single person joins the group", "placeholders": { "name": { @@ -1524,7 +1524,7 @@ } }, "multipleJoinedTheGroup": { - "message": "$names$ si sono uniti al gruppo", + "message": "$name$ fanno ora parte del gruppo.", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { "names": { @@ -1532,5 +1532,257 @@ "example": "Alice, Bob" } } + }, + "privacyPolicy": { + "message": "Termini e Politica sulla privacy" + }, + "unknown": { + "message": "Sconosciuto" + }, + "changedSinceVerifiedTitle": { + "message": "Codice Di Sicurezza Cambiato" + }, + "youMayWishToVerifyContact": { + "message": "Dovresti verificare il codice di sicurezza con questo contatto." + }, + "about": { + "message": "A riguardo" + }, + "settingsHeader": { + "message": "Impostazioni" + }, + "yes": { + "message": "Sì" + }, + "continue": { + "message": "Continua" + }, + "devicePairingRequestReceivedLimitTitle": { + "message": "Limite del dispositivo raggiunto" + }, + "devicePairingRequestReceivedLimitDescription": { + "message": "Siamo spiacenti, hai troppi dispositivi connessi, prova a scollegarne qualcuno" + }, + "devicePairingRequestReceivedNoListenerTitle": { + "message": "Richiesta di collegamento ricevuta" + }, + "waitingForDeviceToRegister": { + "message": "In attesa del dispositivo" + }, + "pairNewDevicePrompt": { + "message": "Scansiona il codice QR visualizzato sul dispositivo da collegare" + }, + "noPairedDevices": { + "message": "Nessun dispositivo collegato" + }, + "deviceUnpaired": { + "message": "Il dispositivo è stato scollegato correttamente" + }, + "sendMessageLeftGroup": { + "message": "Hai lasciato il gruppo." + }, + "moreInformation": { + "message": "Maggiori informazioni" + }, + "resend": { + "message": "Reinvia" + }, + "clearAllData": { + "message": "Elimina tutti i dati" + }, + "deleteAccountWarning": { + "message": "Ciò eliminerà permanentemente i tuoi messaggi, sessioni e contatti." + }, + "deleteContactConfirmation": { + "message": "Sei sicuro di voler eliminare questa conversazione?" + }, + "copy": { + "message": "Copia" + }, + "linkPreviewsTitle": { + "message": "Invia Anteprime Dei Link" + }, + "linkPreviewDescription": { + "message": "Le anteprime sono supportate per link di Imgur, Instagram, Pinterest, Reddit e YouTube." + }, + "readReceiptSettingTitle": { + "message": "Conferme Di Lettura" + }, + "typingIndicatorsSettingTitle": { + "message": "Indicatori Di Scrittura" + }, + "themeToggleTitle": { + "message": "Chiaro" + }, + "successUnlinked": { + "message": "Il dispositivo è stato scollegato correttamente" + }, + "autoUpdateDownloadButtonLabel": { + "message": "Scarica" + }, + "blockUser": { + "message": "Blocca" + }, + "unblockUser": { + "message": "Sblocca" + }, + "blockedSettingsTitle": { + "message": "Contatti bloccati" + }, + "leaveGroup": { + "message": "Abbandona Il Gruppo" + }, + "leaveGroupConfirmation": { + "message": "Sei sicuro di voler lasciare questo gruppo?" + }, + "noContactsForGroup": { + "message": "Non hai ancora nessun contatto" + }, + "editGroup": { + "message": "Modifica gruppo" + }, + "updateGroupDialogTitle": { + "message": "Aggiornamento $name$..." + }, + "showRecoveryPhrase": { + "message": "Frase di recupero" + }, + "yourSessionID": { + "message": "La tua Sessione ID" + }, + "recoveryPhraseSavePromptMain": { + "message": "La frase di recupero è la chiave principale per la Sessione ID: puoi usarla per ripristinare la Sessione ID se perdi l'accesso al dispositivo. Conserva la frase di recupero in un luogo sicuro e non rivelarla a nessuno." + }, + "QRCodeTitle": { + "message": "Visualizza il mio codice QR" + }, + "copiedToClipboard": { + "message": "Copiato negli appunti" + }, + "unlock": { + "message": "Sblocca" + }, + "connectToServerFail": { + "message": "Impossibile unirsi al gruppo" + }, + "connectingToServer": { + "message": "Connessione in corso..." + }, + "remove": { + "message": "Elimina" + }, + "invalidSessionId": { + "message": "Sessione ID non valido" + }, + "emptyGroupNameError": { + "message": "Inserisci un nome per il gruppo" + }, + "groupNamePlaceholder": { + "message": "Nome Del Gruppo" + }, + "inviteContacts": { + "message": "Invita Amici" + }, + "yourUniqueSessionID": { + "message": "Ecco la tua Sessione ID" + }, + "allUsersAreRandomly...": { + "message": "La Sessione ID è l'indirizzo univoco che le persone possono utilizzare per contattarti su una Sessione. Senza alcuna connessione con la tua vera identità, la Sessione ID è totalmente anonimo e privato fin dal incezione." + }, + "generateSessionID": { + "message": "Crea Sessione ID" + }, + "recoveryPhrase": { + "message": "Frase di recupero" + }, + "enterRecoveryPhrase": { + "message": "Inserisci la frase di recupero" + }, + "enterDisplayName": { + "message": "Inserisci il nome da visualizzare" + }, + "enterSessionIDHere": { + "message": "Inserisci la Sessione ID" + }, + "continueYourSession": { + "message": "Continua la Sessione" + }, + "linkDevice": { + "message": "Collega dispositivo" + }, + "restoreUsingRecoveryPhrase": { + "message": "Ripristina il tuo account" + }, + "newSession": { + "message": "Nuova sessione" + }, + "searchFor...": { + "message": "Cerca conversazioni, contatti e messaggi" + }, + "enterSessionID": { + "message": "Inserisci la Sessione ID" + }, + "enterSessionIDOfRecipient": { + "message": "Inserisci la Sessione ID del destinatario" + }, + "usersCanShareTheir...": { + "message": "Gli utenti possono condividere la propria Sessione ID accedendo alle impostazioni del proprio account e toccando Condividi la Sessione ID o condividendo il proprio codice QR." + }, + "appearanceSettingsTitle": { + "message": "Aspetto" + }, + "privacySettingsTitle": { + "message": "Privacy" + }, + "notificationsSettingsTitle": { + "message": "Notifiche" + }, + "devicesSettingsTitle": { + "message": "Dispositivi collegati" + }, + "recoveryPhraseEmpty": { + "message": "Inserisci la frase di recupero" + }, + "displayNameEmpty": { + "message": "Scegli il nome da visualizzare" + }, + "joinOpenGroup": { + "message": "Unisciti a un gruppo aperto" + }, + "newClosedGroup": { + "message": "Nuovo gruppo chiuso" + }, + "newClosedGroupDescription": { + "message": "I gruppi chiusi supportano fino a 10 membri e forniscono le stesse protezioni per la privacy delle sessioni one-to-one." + }, + "createClosedGroupNamePrompt": { + "message": "Nome Del Gruppo" + }, + "createClosedGroupPlaceholder": { + "message": "Inserisci un nome per il gruppo" + }, + "openGroupURL": { + "message": "Apri l'URL del gruppo" + }, + "enterAnOpenGroupURL": { + "message": "Inserisci l'URL di un gruppo aperto" + }, + "next": { + "message": "Avanti" + }, + "pairingDevice": { + "message": "Collegamento Dispositivo" + }, + "invalidGroupNameTooShort": { + "message": "Inserisci un nome per il gruppo" + }, + "invalidGroupNameTooLong": { + "message": "Inserisci un nome gruppo più breve" + }, + "pickClosedGroupMember": { + "message": "Scegli almeno 2 membri del gruppo" + }, + "closedGroupMaxSize": { + "message": "Un gruppo chiuso non può avere più di 10 membri" } -} +} \ No newline at end of file From 3df09a6f33fcb6d10b0e09ab4427ece0b9154d05 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 19 Aug 2020 17:40:42 +1000 Subject: [PATCH 069/274] update spanish translation with matching android ones --- _locales/es/messages.json | 366 ++++++++++++++++++++++++++++++++------ 1 file changed, 309 insertions(+), 57 deletions(-) diff --git a/_locales/es/messages.json b/_locales/es/messages.json index a9f2773e9..a2b91b348 100644 --- a/_locales/es/messages.json +++ b/_locales/es/messages.json @@ -32,7 +32,7 @@ "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": "A&yuda", + "message": "&Ayuda", "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": { @@ -84,7 +84,7 @@ "description": "Edit menu command to remove the selected text" }, "editMenuSelectAll": { - "message": "Seleccionar todo", + "message": "Seleccionar Todo", "description": "Edit menu comand to select all of the text in selected text box" }, "editMenuStartSpeaking": { @@ -144,7 +144,7 @@ "description": "Only available on development modes, menu option to open up the standalone device setup sequence" }, "loading": { - "message": "Cargando …", + "message": "Cargando ...", "description": "Message shown on the loading screen before we've loaded any messages" }, "optimizingApplication": { @@ -252,11 +252,11 @@ "description": "The label for yourself when shown in a group member list" }, "view": { - "message": "Ver más", + "message": "Ver", "description": "Used as a label on a button allowing user to see more information" }, "youLeftTheGroup": { - "message": "Has abandonado el grupo", + "message": "Has abandonado el grupo.", "description": "Displayed when a user can't send a message because they have left the group" }, "scrollDown": { @@ -272,11 +272,11 @@ "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", + "message": "$count$ Mensaje No Leído", "description": "Text for unread message separator, just one message" }, "unreadMessages": { - "message": "$count$ mensajes sin leer", + "message": "$count$ Mensajes No Leídos", "description": "Text for unread message separator, with count", "placeholders": { "count": { @@ -286,7 +286,7 @@ } }, "youMarkedAsVerified": { - "message": "Has marcado las cifras de seguridad con $name$ como verificadas", + "message": "Has marcado tus cifras de seguridad con $name$ como verificadas.", "description": "Shown in the conversation history when the user marks a contact as verified.", "placeholders": { "name": { @@ -296,7 +296,7 @@ } }, "youMarkedAsNotVerified": { - "message": "Has retirado la marca de verificación de tus cifras de seguridad con $name$", + "message": "Has retirado la marca de verificación de tus cifras de seguridad con $name$.", "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": { @@ -306,7 +306,7 @@ } }, "youMarkedAsVerifiedOtherDevice": { - "message": "Has marcado las cifras de seguridad con $name$ como verificadas en otro dispositivo", + "message": "Has marcado tus cifras de seguridad con $name$ como verificadas desde otro dispositivo", "description": "Shown in the conversation history when we discover that the user marked a contact as verified on another device.", "placeholders": { "name": { @@ -316,7 +316,7 @@ } }, "youMarkedAsNotVerifiedOtherDevice": { - "message": "Has retirado la marca de verificación de tus cifras de seguridad con $name$ en otro dispositivo", + "message": "Has retirado la marca de verificación de tus cifras de seguridad con $name$ desde otro dispositivo", "description": "Shown in the conversation history when we discover that the user marked a contact as not verified on another device.", "placeholders": { "name": { @@ -334,7 +334,7 @@ "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Las cifras de seguridad con $name$ han cambiado desde la última vez que las verificaste, lo que significaría que alguien ha tratado de interceptar la comunicación o que $name$ simplemente ha reinstalado Signal.", + "message": "Tu cifras de seguridad con $name$ han cambiado y ya no están verificadas. Esto podría significar que alguien está tratando de interceptar la comunicación, o simplemente que $name$ ha reinstalado Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -358,7 +358,7 @@ "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Las cifras de seguridad con $name$ han cambiado recientemente, lo que significaría que alguien ha tratado de interceptar la comunicación o que $name$ simplemente ha reinstalado Signal.", + "message": "Tus cifras de seguridad con $name$ han cambiado. Esto podría significar que o bien alguien está tratando de interceptar su comunicación, o que $name$ simplemente ha reinstalado Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -408,7 +408,7 @@ "description": "Link to open the issue tracker" }, "gotIt": { - "message": "¡Entendido!", + "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": { @@ -428,7 +428,7 @@ "description": "" }, "isVerified": { - "message": "Has verificado las cifras de seguridad con $name$.", + "message": "Has marcado tus cifras de seguridad con $name$ como verificadas.", "description": "Summary state shown at top of the safety number screen if user has verified contact.", "placeholders": { "name": { @@ -464,11 +464,11 @@ "description": "" }, "media": { - "message": "Adjuntos", + "message": "Multimedia", "description": "Header of the default pane in the media gallery, showing images and videos" }, "mediaEmptyState": { - "message": "No hay ningún adjunto en este chat", + "message": "Sin archivos multimedia", "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)" }, "documents": { @@ -476,7 +476,7 @@ "description": "Header of the secondary pane in the media gallery, showing every non-media attachment" }, "documentsEmptyState": { - "message": "No hay documentos en este chat", + "message": "No hay documentos", "description": "Message shown to user in the media gallery when there are no messages with document attachments (anything other than images or video)" }, "today": { @@ -488,11 +488,11 @@ "description": "Section header in the media gallery" }, "thisWeek": { - "message": "Esta semana", + "message": "Esta Semana", "description": "Section header in the media gallery" }, "thisMonth": { - "message": "Este mes", + "message": "Este Mes", "description": "Section header in the media gallery" }, "unsupportedAttachment": { @@ -562,11 +562,11 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "Lo sentimos, el archivo seleccionado excede las restricciones de tamaño.", + "message": "El adjunto excede los límites de tamaño para el mensaje.", "description": "" }, "unableToLoadAttachment": { - "message": "Fallo al cargar el adjunto seleccionado.", + "message": "Lo sentimos, ha habido un fallo al adjuntar el archivo.", "description": "" }, "disconnected": { @@ -574,7 +574,7 @@ "description": "Displayed when the desktop client cannot connect to the server." }, "connecting": { - "message": "Conectando", + "message": "Conectando ...", "description": "Displayed when the desktop client is currently connecting to the server." }, "offline": { @@ -652,7 +652,7 @@ "description": "Placeholder text in the search input" }, "noSearchResults": { - "message": "Sin resultados para «$searchTerm$»", + "message": "No se encontraron resultados para «%s»", "description": "Shown in the search left pane when no results were found", "placeholders": { "searchTerm": { @@ -674,7 +674,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Bienvenida a Signal", + "message": "Bienvenido a Session.", "description": "" }, "selectAContact": { @@ -700,15 +700,15 @@ "description": "Shown when you are sent a contact and that contact has a signal account" }, "home": { - "message": "domicilio", + "message": "Domicilio", "description": "Shown on contact detail screen as a label for an address/phone/email" }, "work": { - "message": "trabajo", + "message": "Trabajo", "description": "Shown on contact detail screen as a label for an address/phone/email" }, "mobile": { - "message": "móvil", + "message": "Móvil", "description": "Shown on contact detail screen as a label for aa phone or email" }, "email": { @@ -740,7 +740,7 @@ "description": "Shown in triple-dot menu next to message to allow user to start crafting a message with a quotation" }, "originalMessageNotFound": { - "message": "Fallo al buscar el mensaje original", + "message": "No se encuentra el mensaje original", "description": "Shown in quote if reference message was not found as message was initially downloaded and processed" }, "originalMessageNotAvailable": { @@ -756,7 +756,7 @@ "description": "Shown in toast if tries to record a voice note with any staged attachments" }, "you": { - "message": "Para ti", + "message": "Tú", "description": "In Android theme, shown in quote if you or someone else replies to you" }, "replyingTo": { @@ -770,7 +770,7 @@ } }, "audioPermissionNeeded": { - "message": "Para enviar notas de voz, permite a Signal Desktop acceder al micrófono.", + "message": "Para enviar notas de voz y hacer llamadas, permite a Session acceder al micrófono.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -830,15 +830,15 @@ "description": "" }, "deleteThisMessage": { - "message": "Eliminar este mensaje", + "message": "Eliminar mensaje", "description": "" }, "from": { - "message": "De", + "message": "Desde:", "description": "Label for the sender of a message" }, "to": { - "message": "para", + "message": "Para:", "description": "Label for the receiver of a message" }, "sent": { @@ -862,11 +862,11 @@ "description": "" }, "resetSession": { - "message": "Reiniciar sesión", + "message": "Reiniciar Session Segura", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." }, "showSafetyNumber": { - "message": "Ver cifras de seguridad", + "message": "Ver Cifras De Seguridad", "description": "" }, "viewAllMedia": { @@ -896,7 +896,7 @@ "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": "Eliminar este mensaje", + "message": "Eliminar Mensaje", "description": "Shown on the drop-down menu for an individual message, deletes single message" }, "deleteMessages": { @@ -978,7 +978,7 @@ "description": "The button used in Signal Android to add a new linked device" }, "linkNewDevice": { - "message": "Enlazar nuevo dispositivo", + "message": "Enlazar Nuevo Dispositivo", "description": "The menu option shown in Signal iOS to add a new linked device" }, "deviceName": { @@ -1066,7 +1066,7 @@ "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "Desactivar notificaciones", + "message": "Silenciar notificaciones", "description": "Label for disabling notifications" }, "nameAndMessage": { @@ -1090,11 +1090,11 @@ "description": "Displayed in notifications for multiple messages" }, "notificationMostRecentFrom": { - "message": "Más reciente de:", + "message": "Más recientes desde: $name$", "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting" }, "notificationFrom": { - "message": "De:", + "message": "Desde:", "description": "Displayed in notifications when setting is 'name only' and one message is waiting" }, "notificationMostRecent": { @@ -1102,7 +1102,7 @@ "description": "Displayed in notifications when setting is 'name and message' and more than one message is waiting" }, "sendFailed": { - "message": "Fallo al enviar", + "message": "Fallo Al Enviar", "description": "Shown on outgoing message if it fails to send" }, "showMore": { @@ -1158,7 +1158,7 @@ "description": "Informational text displayed if a sync operation times out." }, "timestamp_s": { - "message": "ahora", + "message": "Ahora", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." }, "timestamp_m": { @@ -1226,7 +1226,7 @@ "description": "Brief message shown when trying to message a blocked group" }, "youChangedTheTimer": { - "message": "Has fijado la desaparición de mensajes en $time$", + "message": "Has fijado la desaparición de mensajes en $time$.", "description": "Message displayed when you change the message expiration timer in a conversation.", "placeholders": { "time": { @@ -1246,7 +1246,7 @@ } }, "theyChangedTheTimer": { - "message": "$name$ ha fijado la desaparición de mensajes en $time$", + "message": "$name$ha fijado la desaparición de mensajes en $time$.", "description": "Message displayed when someone else changes the message expiration timer in a conversation.", "placeholders": { "name": { @@ -1260,7 +1260,7 @@ } }, "timerOption_0_seconds": { - "message": "inactivo", + "message": "Inactivo", "description": "Label for option to turn off message expiration in the timer menu" }, "timerOption_5_seconds": { @@ -1360,11 +1360,11 @@ "description": "Very short format indicating current timer setting in the conversation header" }, "disappearingMessagesDisabled": { - "message": "Desaparición de mensajes desactivada", + "message": "Desaparición de mensajes desactivada.", "description": "Displayed in the left pane when the timer is turned off" }, "disabledDisappearingMessages": { - "message": "$name$ ha desactivado la desaparición de mensajes", + "message": "$name$ ha desactivado la desaparición de mensajes.", "description": "Displayed in the conversation list when the timer is turned off", "placeholders": { "name": { @@ -1374,11 +1374,11 @@ } }, "youDisabledDisappearingMessages": { - "message": "Has desactivado la desaparición de mensajes", + "message": "Has desactivado la desaparición de mensajes.", "description": "Displayed in the conversation list when the timer is turned off" }, "timerSetTo": { - "message": "Caducidad de mensajes fijada en $time$", + "message": "El tiempo de desaparición de mensajes se ha fijado en $time$", "description": "Displayed in the conversation list when the timer is updated by some automatic action, or in the left pane", "placeholders": { "time": { @@ -1396,7 +1396,7 @@ "description": "A notification shown in the conversation when a contact reinstalls" }, "safetyNumberChangedGroup": { - "message": "Las cifras de seguridad con $name$ han cambiado", + "message": "Tus cifras de seguridad con $name$ han cambiado.", "description": "A notification shown in a group conversation when a contact reinstalls, showing the contact name", "placeholders": { "name": { @@ -1406,7 +1406,7 @@ } }, "verifyNewNumber": { - "message": "Verificar cifras de seguridad", + "message": "Verificar Cifras De Seguridad", "description": "Label on button included with safety number change notification in the conversation" }, "yourSafetyNumberWith": { @@ -1480,7 +1480,7 @@ "description": "" }, "leftTheGroup": { - "message": "$name$ ha abandonado el grupo", + "message": "$name$ ha abandonado el grupo.", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { @@ -1504,7 +1504,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "El grupo ha pasado a llamarse «$name$»", + "message": "Ahora el nombre del grupo es «$name$».", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1514,7 +1514,7 @@ } }, "joinedTheGroup": { - "message": "$name$ se ha unido al grupo", + "message": "$name$ se ha unido al grupo.", "description": "Shown in the conversation history when a single person joins the group", "placeholders": { "name": { @@ -1524,7 +1524,7 @@ } }, "multipleJoinedTheGroup": { - "message": "$names$ se ha unido al grupo", + "message": "$name$ se han unido al grupo.", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { "names": { @@ -1532,5 +1532,257 @@ "example": "Alice, Bob" } } + }, + "privacyPolicy": { + "message": "Términos y política de privacidad" + }, + "unknown": { + "message": "Desconocido" + }, + "changedSinceVerifiedTitle": { + "message": "Las Cifras De Seguridad Han Cambiado" + }, + "youMayWishToVerifyContact": { + "message": "Puede que desees verificar tus cifras de seguridad con este contacto." + }, + "about": { + "message": "Info" + }, + "settingsHeader": { + "message": "Ajustes" + }, + "yes": { + "message": "Sí" + }, + "continue": { + "message": "Continuar" + }, + "devicePairingRequestReceivedLimitTitle": { + "message": "Límite de dispositivos alcanzado" + }, + "devicePairingRequestReceivedLimitDescription": { + "message": "Lo sentimos, ya tienes demasiados dispositivos enlazados. Elimina alguno" + }, + "devicePairingRequestReceivedNoListenerTitle": { + "message": "Solicitud de vinculación recibida" + }, + "waitingForDeviceToRegister": { + "message": "Esperando el dispositivo" + }, + "pairNewDevicePrompt": { + "message": "Escanea el código QR mostrado en el dispositivo a enlazar" + }, + "noPairedDevices": { + "message": "No hay dispositivos enlazados" + }, + "deviceUnpaired": { + "message": "Tu dispositivo se ha desvinculado correctamente" + }, + "sendMessageLeftGroup": { + "message": "Has abandonado el grupo." + }, + "moreInformation": { + "message": "Más detalles" + }, + "resend": { + "message": "Reenviar" + }, + "clearAllData": { + "message": "Borrar todos los datos" + }, + "deleteAccountWarning": { + "message": "Esto eliminará permanentemente tu ID de Session, incluyendo todos los mensajes, sesiones y contactos." + }, + "deleteContactConfirmation": { + "message": "¿Seguro que quieres eliminar esta conversación?" + }, + "copy": { + "message": "Copiar" + }, + "linkPreviewsTitle": { + "message": "Enviar Previsualizaciones" + }, + "linkPreviewDescription": { + "message": "Las previsualizaciones están disponibles para enlaces hacia Imgur, Instagram, Pinterest, Reddit y YouTube." + }, + "readReceiptSettingTitle": { + "message": "Notificaciones De Lectura" + }, + "typingIndicatorsSettingTitle": { + "message": "Indicadores De Tecleo" + }, + "themeToggleTitle": { + "message": "Claro" + }, + "successUnlinked": { + "message": "Tu dispositivo se ha desvinculado correctamente" + }, + "autoUpdateDownloadButtonLabel": { + "message": "Descargar" + }, + "blockUser": { + "message": "Bloquear" + }, + "unblockUser": { + "message": "Desbloquear" + }, + "blockedSettingsTitle": { + "message": "Contactos bloqueados" + }, + "leaveGroup": { + "message": "Abandonar Grupo" + }, + "leaveGroupConfirmation": { + "message": "¿Seguro que quieres salir de este grupo?" + }, + "noContactsForGroup": { + "message": "Aún no tienes contactos" + }, + "editGroup": { + "message": "Editar grupo" + }, + "updateGroupDialogTitle": { + "message": "Actualizando $name$ ..." + }, + "showRecoveryPhrase": { + "message": "Frase de recuperación" + }, + "yourSessionID": { + "message": "Tu ID de Session" + }, + "recoveryPhraseSavePromptMain": { + "message": "Tu frase de recuperación es la llave maestra de tu ID de Session, puedes usarla para recuperar tu ID de Session en caso de pérdida de acceso a tu dispositivo. Guarda tu frase de recuperación en un lugar seguro y no se la digas a nadie." + }, + "QRCodeTitle": { + "message": "Ver mi código QR" + }, + "copiedToClipboard": { + "message": "Copiado en el portapapeles" + }, + "unlock": { + "message": "Desbloquear" + }, + "connectToServerFail": { + "message": "No te pudiste unir al grupo" + }, + "connectingToServer": { + "message": "Conectando ..." + }, + "remove": { + "message": "Eliminar" + }, + "invalidSessionId": { + "message": "ID de Session no válida" + }, + "emptyGroupNameError": { + "message": "Por favor, ingresa un nombre de grupo" + }, + "groupNamePlaceholder": { + "message": "Nombre Del Grupo" + }, + "inviteContacts": { + "message": "Invitar Amigos" + }, + "yourUniqueSessionID": { + "message": "Saluda a tu ID de Session" + }, + "allUsersAreRandomly...": { + "message": "Tu ID de Session es la dirección única que las personas pueden usar para contactarte en Session. Por diseño, tu ID de Session es totalmente anónima y privada, sin vínculo con tu identidad real." + }, + "generateSessionID": { + "message": "Crear ID de Session" + }, + "recoveryPhrase": { + "message": "Frase de recuperación" + }, + "enterRecoveryPhrase": { + "message": "Ingresa tu frase de recuperación" + }, + "enterDisplayName": { + "message": "Ingresa un nombre para mostrar" + }, + "enterSessionIDHere": { + "message": "Ingresa tu ID de Session" + }, + "continueYourSession": { + "message": "Continúa tu Session" + }, + "linkDevice": { + "message": "Vincular dispositivo" + }, + "restoreUsingRecoveryPhrase": { + "message": "Restaura tu cuenta" + }, + "newSession": { + "message": "Nueva Session" + }, + "searchFor...": { + "message": "Buscar en chats, contactos y mensajes" + }, + "enterSessionID": { + "message": "Session ID" + }, + "enterSessionIDOfRecipient": { + "message": "Ingresa la ID de Session del destinatario" + }, + "usersCanShareTheir...": { + "message": "Los usuarios pueden compartir su ID de Session yendo a los ajustes de su cuenta y pulsando en Compartir ID de Session o compartiendo su código QR" + }, + "appearanceSettingsTitle": { + "message": "Apariencia" + }, + "privacySettingsTitle": { + "message": "Privacidad" + }, + "notificationsSettingsTitle": { + "message": "Notificaciones" + }, + "devicesSettingsTitle": { + "message": "Dispositivos enlazados" + }, + "recoveryPhraseEmpty": { + "message": "Ingresa tu frase de recuperación" + }, + "displayNameEmpty": { + "message": "Por favor, elige un nombre para mostrar" + }, + "joinOpenGroup": { + "message": "Únete al grupo abierto" + }, + "newClosedGroup": { + "message": "Nuevo grupo cerrado" + }, + "newClosedGroupDescription": { + "message": "Los grupos cerrados admiten hasta 10 miembros y brindan las mismas protecciones de privacidad que las sesiones individuales." + }, + "createClosedGroupNamePrompt": { + "message": "Nombre Del Grupo" + }, + "createClosedGroupPlaceholder": { + "message": "Ingresa un nombre de grupo" + }, + "openGroupURL": { + "message": "URL de grupo abierto" + }, + "enterAnOpenGroupURL": { + "message": "Ingresa una URL de grupo abierto" + }, + "next": { + "message": "Siguiente" + }, + "pairingDevice": { + "message": "Enlazar Dispositivo" + }, + "invalidGroupNameTooShort": { + "message": "Por favor, ingresa un nombre de grupo" + }, + "invalidGroupNameTooLong": { + "message": "Por favor, ingresa un nombre de grupo más corto" + }, + "pickClosedGroupMember": { + "message": "Por favor, elige al menos 2 miembros del grupo" + }, + "closedGroupMaxSize": { + "message": "Un grupo cerrado no puede tener más de 10 miembros" } -} +} \ No newline at end of file From 9f232c48449325f6b5d5c3eb45d8088ddb324106 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 19 Aug 2020 17:41:15 +1000 Subject: [PATCH 070/274] update portuguese translation with matching android ones --- _locales/pt_BR/messages.json | 372 +++++++++++++++++++++++++++++------ 1 file changed, 312 insertions(+), 60 deletions(-) diff --git a/_locales/pt_BR/messages.json b/_locales/pt_BR/messages.json index 84136fba0..2626bc3a6 100644 --- a/_locales/pt_BR/messages.json +++ b/_locales/pt_BR/messages.json @@ -24,7 +24,7 @@ "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": "E&xibir", + "message": "&Ver", "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": { @@ -32,7 +32,7 @@ "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": "Aju&da", + "message": "&Ajuda", "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": { @@ -80,11 +80,11 @@ "description": "Edit menu command to insert text from clipboard at cursor location, taking only text and not style information" }, "editMenuDelete": { - "message": "Apagar", + "message": "Excluir", "description": "Edit menu command to remove the selected text" }, "editMenuSelectAll": { - "message": "Selecionar tudo", + "message": "Selecionar Todas", "description": "Edit menu comand to select all of the text in selected text box" }, "editMenuStartSpeaking": { @@ -252,11 +252,11 @@ "description": "The label for yourself when shown in a group member list" }, "view": { - "message": "Exibir", + "message": "Ver", "description": "Used as a label on a button allowing user to see more information" }, "youLeftTheGroup": { - "message": "Voce saiu do grupo", + "message": "Você saiu do grupo.", "description": "Displayed when a user can't send a message because they have left the group" }, "scrollDown": { @@ -272,7 +272,7 @@ "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" }, "unreadMessage": { - "message": "1 Mensagem Não Lida", + "message": "$count$ Mensagem Não Lida", "description": "Text for unread message separator, just one message" }, "unreadMessages": { @@ -286,7 +286,7 @@ } }, "youMarkedAsVerified": { - "message": "Você marcou seu Número de Segurança com $name$ como verificado", + "message": "Você marcou o seu número de segurança com $name$ como verificado", "description": "Shown in the conversation history when the user marks a contact as verified.", "placeholders": { "name": { @@ -296,7 +296,7 @@ } }, "youMarkedAsNotVerified": { - "message": "Você marcou seu Número de Segurança com $name$ como não verificado", + "message": "Você marcou o seu número de segurança com $name$como não verificado", "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": { @@ -306,7 +306,7 @@ } }, "youMarkedAsVerifiedOtherDevice": { - "message": "Você marcou seu Número de Segurança com $name$ como verificado usando outro aparelho", + "message": "Você marcou o seu número de segurança com $name$como verificado a partir de outro dispositivo", "description": "Shown in the conversation history when we discover that the user marked a contact as verified on another device.", "placeholders": { "name": { @@ -316,7 +316,7 @@ } }, "youMarkedAsNotVerifiedOtherDevice": { - "message": "Você marcou seu Número de Segurança com $name$ como não verificado usando outro aparelho", + "message": "Você marcou o seu número de segurança com $name$ como não verificado a partir de outro dispositivo", "description": "Shown in the conversation history when we discover that the user marked a contact as not verified on another device.", "placeholders": { "name": { @@ -334,7 +334,7 @@ "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "O seu número de segurança com $name$mudou desde a última vez que você o verificou. Isso pode significar uma tentativa de interceptação das suas comunicações ou somente que $name$ reinstalou Signal.", + "message": "Seu número de segurança com $name$ mudou e não está verificado. Isso pode significar que alguém está tentando interceptar a sua comunicação ou que $name$ simplesmente reinstalou o Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -358,7 +358,7 @@ "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "O seu número de segurança com $name$mudou. Isso pode significar uma tentativa de interceptação das suas comunicações ou somente que $name$ reinstalou Signal.", + "message": "Seu número de segurança com $name$ mudou. Isso pode significar que alguém está tentando interceptar a sua comunicação ou que $name$ simplesmente reinstalou o Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -408,7 +408,7 @@ "description": "Link to open the issue tracker" }, "gotIt": { - "message": "Entendido!", + "message": "Entendi", "description": "Label for a button that dismisses a dialog. The user clicks it to confirm that they understand the message in the dialog." }, "submit": { @@ -428,7 +428,7 @@ "description": "" }, "isVerified": { - "message": "Você verificou o seu número de segurança com $name$.", + "message": "Você marcou o seu número de segurança com $name$ como verificado", "description": "Summary state shown at top of the safety number screen if user has verified contact.", "placeholders": { "name": { @@ -468,7 +468,7 @@ "description": "Header of the default pane in the media gallery, showing images and videos" }, "mediaEmptyState": { - "message": "Você não possui nenhuma mídia nessa conversa", + "message": "Nenhuma mídia", "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)" }, "documents": { @@ -476,7 +476,7 @@ "description": "Header of the secondary pane in the media gallery, showing every non-media attachment" }, "documentsEmptyState": { - "message": "Você não possui nenhum documento nessa conversa", + "message": "Nenhum documento", "description": "Message shown to user in the media gallery when there are no messages with document attachments (anything other than images or video)" }, "today": { @@ -488,11 +488,11 @@ "description": "Section header in the media gallery" }, "thisWeek": { - "message": "Essa semana", + "message": "Esta Semana", "description": "Section header in the media gallery" }, "thisMonth": { - "message": "Esse mês", + "message": "Este Mês", "description": "Section header in the media gallery" }, "unsupportedAttachment": { @@ -562,11 +562,11 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "Desculpe, o arquivo selecionado excede o tamanho máximo aceito.", + "message": "O anexo excede os limites de tamanho para o tipo de mensagem sendo enviada.", "description": "" }, "unableToLoadAttachment": { - "message": "Não foi possível carregar o anexo selecionado.", + "message": "Desculpe, ocorreu um erro ao anexar o documento.", "description": "" }, "disconnected": { @@ -574,7 +574,7 @@ "description": "Displayed when the desktop client cannot connect to the server." }, "connecting": { - "message": "Conectando…", + "message": "Conectando...", "description": "Displayed when the desktop client is currently connecting to the server." }, "offline": { @@ -648,11 +648,11 @@ "description": "Tooltip for the tray icon" }, "search": { - "message": "Buscar", + "message": "Procurar", "description": "Placeholder text in the search input" }, "noSearchResults": { - "message": "Sem resultados para \"$searchTerm$\"", + "message": "Nenhum resultado encontrado para \"$searchTerm$\"", "description": "Shown in the search left pane when no results were found", "placeholders": { "searchTerm": { @@ -674,7 +674,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Boas-vindas ao Signal", + "message": "Boas-vindas ao Session.", "description": "" }, "selectAContact": { @@ -700,15 +700,15 @@ "description": "Shown when you are sent a contact and that contact has a signal account" }, "home": { - "message": "casa", + "message": "Casa", "description": "Shown on contact detail screen as a label for an address/phone/email" }, "work": { - "message": "trabalho", + "message": "Trabalho", "description": "Shown on contact detail screen as a label for an address/phone/email" }, "mobile": { - "message": "celular", + "message": "Celular", "description": "Shown on contact detail screen as a label for aa phone or email" }, "email": { @@ -770,7 +770,7 @@ } }, "audioPermissionNeeded": { - "message": "Para enviar mensagens de áudio, permita que o Signal Desktop acesse o microfone.", + "message": "Para enviar mensagens de áudio permita ao Session acessar o microfone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -822,7 +822,7 @@ "description": "" }, "delete": { - "message": "Apagar", + "message": "Excluir", "description": "" }, "deleteWarning": { @@ -830,15 +830,15 @@ "description": "" }, "deleteThisMessage": { - "message": "Apagar essa mensagem", + "message": "Excluir mensagem", "description": "" }, "from": { - "message": "De", + "message": "De:", "description": "Label for the sender of a message" }, "to": { - "message": "para", + "message": "Para:", "description": "Label for the receiver of a message" }, "sent": { @@ -862,11 +862,11 @@ "description": "" }, "resetSession": { - "message": "Reiniciar a sessão", + "message": "Reiniciar Sessão Segura", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." }, "showSafetyNumber": { - "message": "Ver número de segurança", + "message": "Ver Número De Segurança", "description": "" }, "viewAllMedia": { @@ -896,7 +896,7 @@ "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": "Excluir", + "message": "Excluir Mensagem", "description": "Shown on the drop-down menu for an individual message, deletes single message" }, "deleteMessages": { @@ -978,7 +978,7 @@ "description": "The button used in Signal Android to add a new linked device" }, "linkNewDevice": { - "message": "Vincular novo dispositivo", + "message": "Vincular Novo Dispositivo", "description": "The menu option shown in Signal iOS to add a new linked device" }, "deviceName": { @@ -1058,7 +1058,7 @@ "description": "Message shown to user when app is disconnected and data deleted" }, "notifications": { - "message": "Notificações ", + "message": "Notificações", "description": "Header for notification settings" }, "notificationSettingsDialog": { @@ -1066,7 +1066,7 @@ "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "Desabilitar notificações", + "message": "Silenciar notificações", "description": "Label for disabling notifications" }, "nameAndMessage": { @@ -1090,7 +1090,7 @@ "description": "Displayed in notifications for multiple messages" }, "notificationMostRecentFrom": { - "message": "Última:", + "message": "Mais recente de: $name$", "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting" }, "notificationFrom": { @@ -1102,7 +1102,7 @@ "description": "Displayed in notifications when setting is 'name and message' and more than one message is waiting" }, "sendFailed": { - "message": "Falha no envio", + "message": "Envio Falhou", "description": "Shown on outgoing message if it fails to send" }, "showMore": { @@ -1126,7 +1126,7 @@ "description": "Label text for button to upgrade the app to the latest version" }, "mediaMessage": { - "message": "Mensagem de mídia (MMS)", + "message": "MMS", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, "unregisteredUser": { @@ -1158,7 +1158,7 @@ "description": "Informational text displayed if a sync operation times out." }, "timestamp_s": { - "message": "agora", + "message": "Agora", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." }, "timestamp_m": { @@ -1226,7 +1226,7 @@ "description": "Brief message shown when trying to message a blocked group" }, "youChangedTheTimer": { - "message": "Você ajustou o cronômetro para $time$", + "message": "Você definiu o tempo de duração das mensagens efêmeras como $time$.", "description": "Message displayed when you change the message expiration timer in a conversation.", "placeholders": { "time": { @@ -1246,7 +1246,7 @@ } }, "theyChangedTheTimer": { - "message": "$name$ ajustou o cronômetro para $time$", + "message": "$name$ definiu o tempo de duração das mensagens efêmeras como $time$.", "description": "Message displayed when someone else changes the message expiration timer in a conversation.", "placeholders": { "name": { @@ -1260,7 +1260,7 @@ } }, "timerOption_0_seconds": { - "message": "desligar", + "message": "Desligado", "description": "Label for option to turn off message expiration in the timer menu" }, "timerOption_5_seconds": { @@ -1312,7 +1312,7 @@ "description": "Conversation menu option to enable disappearing messages" }, "timerOption_0_seconds_abbreviated": { - "message": "desligar", + "message": "desligado", "description": "Short format indicating current timer setting in the conversation list snippet" }, "timerOption_5_seconds_abbreviated": { @@ -1360,11 +1360,11 @@ "description": "Very short format indicating current timer setting in the conversation header" }, "disappearingMessagesDisabled": { - "message": "Mensagens efêmeras desativadas", + "message": "Mensagens efêmeras desabilitadas", "description": "Displayed in the left pane when the timer is turned off" }, "disabledDisappearingMessages": { - "message": "$name$ desativou as mensagens efêmeras", + "message": "$name$ desabilitou as mensagens efêmeras.", "description": "Displayed in the conversation list when the timer is turned off", "placeholders": { "name": { @@ -1374,11 +1374,11 @@ } }, "youDisabledDisappearingMessages": { - "message": "Você desativou as mensagens efêmeras", + "message": "Você desabilitou as mensagens efêmeras.", "description": "Displayed in the conversation list when the timer is turned off" }, "timerSetTo": { - "message": "Cronômetro definido para $time$", + "message": "Expiração da mensagem efêmera definida para $time$", "description": "Displayed in the conversation list when the timer is updated by some automatic action, or in the left pane", "placeholders": { "time": { @@ -1392,11 +1392,11 @@ "description": "Description for audio notification setting" }, "safetyNumberChanged": { - "message": "Mudança do número de segurança", + "message": "Número de segurança alterado", "description": "A notification shown in the conversation when a contact reinstalls" }, "safetyNumberChangedGroup": { - "message": "Seu número de segurança com $name$ mudou", + "message": "Seu número de segurança com $name$ mudou.", "description": "A notification shown in a group conversation when a contact reinstalls, showing the contact name", "placeholders": { "name": { @@ -1406,7 +1406,7 @@ } }, "verifyNewNumber": { - "message": "Verificar número de segurança", + "message": "Verificar Número De Segurança", "description": "Label on button included with safety number change notification in the conversation" }, "yourSafetyNumberWith": { @@ -1428,7 +1428,7 @@ "description": "Label text for dark theme" }, "noteToSelf": { - "message": "Recado para mim", + "message": "Recado pra mim", "description": "Name for the conversation with your own phone number" }, "hideMenuBar": { @@ -1480,7 +1480,7 @@ "description": "" }, "leftTheGroup": { - "message": "$name$ saiu do grupo", + "message": "$name$ saiu do grupo.", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { @@ -1504,7 +1504,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "O nome do grupo agora é '$name$'", + "message": "O nome do grupo agora é '$name$'.", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1514,7 +1514,7 @@ } }, "joinedTheGroup": { - "message": "$name$ entrou no grupo", + "message": "$name$ entrou no grupo.", "description": "Shown in the conversation history when a single person joins the group", "placeholders": { "name": { @@ -1524,7 +1524,7 @@ } }, "multipleJoinedTheGroup": { - "message": "$names$ entrou no grupo", + "message": "$name$ entraram no grupo.", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { "names": { @@ -1532,5 +1532,257 @@ "example": "Alice, Bob" } } + }, + "privacyPolicy": { + "message": "Termos & Política de Privacidade" + }, + "unknown": { + "message": "Desconhecida" + }, + "changedSinceVerifiedTitle": { + "message": "Número De Segurança Alterado" + }, + "youMayWishToVerifyContact": { + "message": "Talvez você queira verificar seu número de segurança com esse contato." + }, + "about": { + "message": "Sobre" + }, + "settingsHeader": { + "message": "Configurações" + }, + "yes": { + "message": "Sim" + }, + "continue": { + "message": "Continuar" + }, + "devicePairingRequestReceivedLimitTitle": { + "message": "Limite de dispositivos atingido" + }, + "devicePairingRequestReceivedLimitDescription": { + "message": "Desculpe, você já possui muitos dispositivos vinculados. Tente remover alguns." + }, + "devicePairingRequestReceivedNoListenerTitle": { + "message": "Solicitação de sincronização recebida" + }, + "waitingForDeviceToRegister": { + "message": "Aguardando dispositivo" + }, + "pairNewDevicePrompt": { + "message": "Escaneie o código QR mostrado no aparelho para vincular" + }, + "noPairedDevices": { + "message": "Nenhum dispositivo vinculado" + }, + "deviceUnpaired": { + "message": "O seu dispositivo foi dessincronizado com sucesso" + }, + "sendMessageLeftGroup": { + "message": "Você saiu do grupo." + }, + "moreInformation": { + "message": "Mais informações" + }, + "resend": { + "message": "Reenviar" + }, + "clearAllData": { + "message": "Limpar todos os dados" + }, + "deleteAccountWarning": { + "message": "Isso excluirá permanentemente suas mensagens, sessões e contatos." + }, + "deleteContactConfirmation": { + "message": "Tem certeza de que deseja excluir esta conversa?" + }, + "copy": { + "message": "Copiar" + }, + "linkPreviewsTitle": { + "message": "Enviar Pré-Visualizações De Links" + }, + "linkPreviewDescription": { + "message": "Visualizações são suportadas para links do Imgur, Instagram, Pinterest, Reddit e YouTube" + }, + "readReceiptSettingTitle": { + "message": "Confirmações De Leitura" + }, + "typingIndicatorsSettingTitle": { + "message": "Indicadores De Digitação" + }, + "themeToggleTitle": { + "message": "Claro" + }, + "successUnlinked": { + "message": "O seu dispositivo foi dessincronizado com sucesso" + }, + "autoUpdateDownloadButtonLabel": { + "message": "Baixar" + }, + "blockUser": { + "message": "Bloquear" + }, + "unblockUser": { + "message": "Desbloquear" + }, + "blockedSettingsTitle": { + "message": "Contatos bloqueados" + }, + "leaveGroup": { + "message": "Sair Do Grupo" + }, + "leaveGroupConfirmation": { + "message": "Tem certeza de que deseja sair deste grupo?" + }, + "noContactsForGroup": { + "message": "Você ainda não possui contatos" + }, + "editGroup": { + "message": "Editar grupo" + }, + "updateGroupDialogTitle": { + "message": "Atualizando $name$..." + }, + "showRecoveryPhrase": { + "message": "Frase de recuperação" + }, + "yourSessionID": { + "message": "Seu ID Session" + }, + "recoveryPhraseSavePromptMain": { + "message": "Sua frase de recuperação é a chave mestra do seu ID Session - você pode usá-la para restaurar seu ID Session se perder o acesso ao seu dispositivo. Armazene sua frase de recuperação em um local seguro e não a entregue a ninguém." + }, + "QRCodeTitle": { + "message": "Ver meu código QR" + }, + "copiedToClipboard": { + "message": "Copiado para a área de transferência" + }, + "unlock": { + "message": "Destrancar" + }, + "connectToServerFail": { + "message": "Não foi possível entrar no grupo" + }, + "connectingToServer": { + "message": "Conectando..." + }, + "remove": { + "message": "Remover" + }, + "invalidSessionId": { + "message": "ID Session inválido" + }, + "emptyGroupNameError": { + "message": "Digite um nome de grupo" + }, + "groupNamePlaceholder": { + "message": "Nome Do Grupo" + }, + "inviteContacts": { + "message": "Convidar Amigos" + }, + "yourUniqueSessionID": { + "message": "Diga olá ao seu ID Session" + }, + "allUsersAreRandomly...": { + "message": "Seu ID Session é o endereço exclusivo que as pessoas podem usar para entrar em contato com você no Session. Sem conexão com sua identidade real, seu ID Session é totalmente anônimo e privado por definição." + }, + "generateSessionID": { + "message": "Criar ID Session" + }, + "recoveryPhrase": { + "message": "Frase de recuperação" + }, + "enterRecoveryPhrase": { + "message": "Digite sua frase de recuperação" + }, + "enterDisplayName": { + "message": "Digite um nome de exibição" + }, + "enterSessionIDHere": { + "message": "Digite seu ID Session" + }, + "continueYourSession": { + "message": "Continuar com seu Session" + }, + "linkDevice": { + "message": "Sincronize dispositivo" + }, + "restoreUsingRecoveryPhrase": { + "message": "Restaurar sua conta" + }, + "newSession": { + "message": "Nova Sessão" + }, + "searchFor...": { + "message": "Buscar conversas, contatos e mensagens" + }, + "enterSessionID": { + "message": "Digite o ID Session" + }, + "enterSessionIDOfRecipient": { + "message": "Digite o ID Session do destinatário" + }, + "usersCanShareTheir...": { + "message": "Os usuários podem compartilhar seus IDs Session acessando as configurações da conta e tocando em Compartilhar ID Session, ou compartilhando o código QR." + }, + "appearanceSettingsTitle": { + "message": "Aparência" + }, + "privacySettingsTitle": { + "message": "Privacidade" + }, + "notificationsSettingsTitle": { + "message": "Notificações" + }, + "devicesSettingsTitle": { + "message": "Dispositivos vinculados" + }, + "recoveryPhraseEmpty": { + "message": "Digite sua frase de recuperação" + }, + "displayNameEmpty": { + "message": "Escolha um nome de exibição" + }, + "joinOpenGroup": { + "message": "Participar em grupo aberto" + }, + "newClosedGroup": { + "message": "Novo grupo fechado" + }, + "newClosedGroupDescription": { + "message": "Grupos fechados suportam até 10 membros e fornecem as mesmas proteções de privacidade que as sessões individuais." + }, + "createClosedGroupNamePrompt": { + "message": "Nome Do Grupo" + }, + "createClosedGroupPlaceholder": { + "message": "Digite o nome do grupo" + }, + "openGroupURL": { + "message": "URL do grupo aberto" + }, + "enterAnOpenGroupURL": { + "message": "Digite a URL do grupo aberto" + }, + "next": { + "message": "Avançar" + }, + "pairingDevice": { + "message": "Vinculando Dispositivo" + }, + "invalidGroupNameTooShort": { + "message": "Digite um nome de grupo" + }, + "invalidGroupNameTooLong": { + "message": "Digite um nome de grupo mais curto" + }, + "pickClosedGroupMember": { + "message": "Escolha pelo menos 2 membros do grupo" + }, + "closedGroupMaxSize": { + "message": "Um grupo fechado não pode ter mais de 10 membros" } -} +} \ No newline at end of file From ed9f4e713e7f0a0155782606f2dc4d0c62dcd692 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 20 Aug 2020 10:19:47 +1000 Subject: [PATCH 071/274] add type for mnemonic.js and replace some calls with recoveryPhrase --- libloki/modules/mnemonic.d.ts | 6 +++++ libtextsecure/account_manager.js | 6 ++--- ts/components/DevicePairingDialog.tsx | 2 +- ts/components/session/SessionSeedModal.tsx | 2 +- .../session/integration/add_contacts_itest.ts | 4 ++-- ts/test/session/integration/common.ts | 24 +++++++++---------- .../session/integration/link_device_itest.ts | 2 +- .../session/integration/open_group_itest.ts | 2 +- .../session/integration/registration_itest.ts | 6 ++--- .../session/integration/sender_keys_itest.ts | 6 ++--- ts/test/session/integration/settings_itest.ts | 2 +- ts/window.d.ts | 3 ++- 12 files changed, 36 insertions(+), 29 deletions(-) create mode 100644 libloki/modules/mnemonic.d.ts diff --git a/libloki/modules/mnemonic.d.ts b/libloki/modules/mnemonic.d.ts new file mode 100644 index 000000000..75c47462c --- /dev/null +++ b/libloki/modules/mnemonic.d.ts @@ -0,0 +1,6 @@ +export interface RecoveryPhraseUtil { + mn_encode(str: string, wordset_name: string): string; + mn_decode(str: string, wordset_name: string): string; + get_languages(): Array; + pubkey_to_secret_words(pubKey?: string): string; +} diff --git a/libtextsecure/account_manager.js b/libtextsecure/account_manager.js index 790584a5f..b30778621 100644 --- a/libtextsecure/account_manager.js +++ b/libtextsecure/account_manager.js @@ -127,7 +127,7 @@ return this.queueTask(() => generateKeypair().then(async identityKeyPair => createAccount(identityKeyPair) - .then(() => this.saveMnemonic(mnemonic)) + .then(() => this.saveRecoveryPhrase(mnemonic)) .then(clearSessionsAndPreKeys) .then(generateKeys) .then(confirmKeys) @@ -507,10 +507,10 @@ const hex = StringView.arrayBufferToHex(seed); return mnemonic.mn_encode(hex, language); }, - getCurrentMnemonic() { + getCurrentRecoveryPhrase() { return textsecure.storage.get('mnemonic'); }, - saveMnemonic(mnemonic) { + saveRecoveryPhrase(mnemonic) { return textsecure.storage.put('mnemonic', mnemonic); }, async registrationDone(number, displayName) { diff --git a/ts/components/DevicePairingDialog.tsx b/ts/components/DevicePairingDialog.tsx index f8a02cd60..fed01c0b8 100644 --- a/ts/components/DevicePairingDialog.tsx +++ b/ts/components/DevicePairingDialog.tsx @@ -73,7 +73,7 @@ export class DevicePairingDialog extends React.Component { public renderFilterRequestsView() { const { currentPubKey, accepted, deviceAlias } = this.state; - let secretWords: undefined; + let secretWords: string | undefined; if (currentPubKey) { secretWords = window.mnemonic.pubkey_to_secret_words(currentPubKey); } diff --git a/ts/components/session/SessionSeedModal.tsx b/ts/components/session/SessionSeedModal.tsx index efed75bf8..094a32258 100644 --- a/ts/components/session/SessionSeedModal.tsx +++ b/ts/components/session/SessionSeedModal.tsx @@ -197,7 +197,7 @@ export class SessionSeedModal extends React.Component { } const manager = await window.getAccountManager(); - const recoveryPhrase = manager.getCurrentMnemonic(); + const recoveryPhrase = manager.getCurrentRecoveryPhrase(); this.setState({ recoveryPhrase, diff --git a/ts/test/session/integration/add_contacts_itest.ts b/ts/test/session/integration/add_contacts_itest.ts index d644284b2..9c1b8429d 100644 --- a/ts/test/session/integration/add_contacts_itest.ts +++ b/ts/test/session/integration/add_contacts_itest.ts @@ -21,12 +21,12 @@ describe('Add contact', function() { await Common.stopStubSnodeServer(); const app1Props = { - mnemonic: Common.TEST_MNEMONIC1, + recoveryPhrase: Common.TEST_RECOVERY_PHRASE_1, displayName: Common.TEST_DISPLAY_NAME1, }; const app2Props = { - mnemonic: Common.TEST_MNEMONIC2, + recoveryPhrase: Common.TEST_RECOVERY_PHRASE_2, displayName: Common.TEST_DISPLAY_NAME2, }; diff --git a/ts/test/session/integration/common.ts b/ts/test/session/integration/common.ts index e10b93900..c642b4d31 100644 --- a/ts/test/session/integration/common.ts +++ b/ts/test/session/integration/common.ts @@ -32,19 +32,19 @@ const ENABLE_LOG = false; // tslint:disable-next-line: no-unnecessary-class export class Common { /* ************** USERS ****************** */ - public static readonly TEST_MNEMONIC1 = + public static readonly TEST_RECOVERY_PHRASE_1 = 'faxed mechanic mocked agony unrest loincloth pencil eccentric boyfriend oasis speedy ribbon faxed'; public static readonly TEST_PUBKEY1 = '0552b85a43fb992f6bdb122a5a379505a0b99a16f0628ab8840249e2a60e12a413'; public static readonly TEST_DISPLAY_NAME1 = 'tester_Alice'; - public static readonly TEST_MNEMONIC2 = + public static readonly TEST_RECOVERY_PHRASE_2 = 'guide inbound jerseys bays nouns basin sulking awkward stockpile ostrich ascend pylons ascend'; public static readonly TEST_PUBKEY2 = '054e1ca8681082dbd9aad1cf6fc89a32254e15cba50c75b5a73ac10a0b96bcbd2a'; public static readonly TEST_DISPLAY_NAME2 = 'tester_Bob'; - public static readonly TEST_MNEMONIC3 = + public static readonly TEST_RECOVERY_PHRASE_3 = 'alpine lukewarm oncoming blender kiwi fuel lobster upkeep vogue simplest gasp fully simplest'; public static readonly TEST_PUBKEY3 = '05f8662b6e83da5a31007cc3ded44c601f191e07999acb6db2314a896048d9036c'; @@ -210,19 +210,19 @@ export class Common { } public static async startAndStub({ - mnemonic, + recoveryPhrase, displayName, env = 'test-integration-session', }: { - mnemonic: string; + recoveryPhrase: string; displayName: string; env?: string; }) { const app = await Common.startAndAssureCleanedApp(env); await Common.startStubSnodeServer(); - if (mnemonic && displayName) { - await Common.restoreFromMnemonic(app, mnemonic, displayName); + if (recoveryPhrase && displayName) { + await Common.restoreFromRecoveryPhrase(app, recoveryPhrase, displayName); // not sure we need Common - rtharp. await Common.timeout(2000); } @@ -240,9 +240,9 @@ export class Common { return appN; } - public static async restoreFromMnemonic( + public static async restoreFromRecoveryPhrase( app: Application, - mnemonic: string, + recoveryPhrase: string, displayName: string ) { await app.client.element(RegistrationPage.registrationTabSignIn).click(); @@ -250,7 +250,7 @@ export class Common { await Common.setValueWrapper( app, RegistrationPage.recoveryPhraseInput, - mnemonic + recoveryPhrase ); await Common.setValueWrapper( @@ -305,13 +305,13 @@ export class Common { public static async startAppsAsFriends() { const app1Props = { - mnemonic: Common.TEST_MNEMONIC1, + recoveryPhrase: Common.TEST_RECOVERY_PHRASE_1, displayName: Common.TEST_DISPLAY_NAME1, stubSnode: true, }; const app2Props = { - mnemonic: Common.TEST_MNEMONIC2, + recoveryPhrase: Common.TEST_RECOVERY_PHRASE_2, displayName: Common.TEST_DISPLAY_NAME2, stubSnode: true, }; diff --git a/ts/test/session/integration/link_device_itest.ts b/ts/test/session/integration/link_device_itest.ts index 16a484c59..f1dbb13c1 100644 --- a/ts/test/session/integration/link_device_itest.ts +++ b/ts/test/session/integration/link_device_itest.ts @@ -21,7 +21,7 @@ describe('Link Device', function() { await Common.killallElectron(); const app1Props = { - mnemonic: Common.TEST_MNEMONIC1, + recoveryPhrase: Common.TEST_RECOVERY_PHRASE_1, displayName: Common.TEST_DISPLAY_NAME1, }; diff --git a/ts/test/session/integration/open_group_itest.ts b/ts/test/session/integration/open_group_itest.ts index ecf8acf07..588bdd160 100644 --- a/ts/test/session/integration/open_group_itest.ts +++ b/ts/test/session/integration/open_group_itest.ts @@ -18,7 +18,7 @@ describe('Open groups', function() { beforeEach(async () => { await Common.killallElectron(); const login = { - mnemonic: Common.TEST_MNEMONIC1, + recoveryPhrase: Common.TEST_RECOVERY_PHRASE_1, displayName: Common.TEST_DISPLAY_NAME1, }; app = await Common.startAndStub(login); diff --git a/ts/test/session/integration/registration_itest.ts b/ts/test/session/integration/registration_itest.ts index cbbcd28bb..6f23d2ea0 100644 --- a/ts/test/session/integration/registration_itest.ts +++ b/ts/test/session/integration/registration_itest.ts @@ -47,7 +47,7 @@ describe('Window Test and Login', function() { await app.client.element(RegistrationPage.restoreFromSeedMode).click(); await app.client .element(RegistrationPage.recoveryPhraseInput) - .setValue(Common.TEST_MNEMONIC1); + .setValue(Common.TEST_RECOVERY_PHRASE_1); await app.client .element(RegistrationPage.displayNameInput) .setValue(Common.TEST_DISPLAY_NAME1); @@ -56,7 +56,7 @@ describe('Window Test and Login', function() { await app.client .element(RegistrationPage.recoveryPhraseInput) .getValue() - .should.eventually.equal(Common.TEST_MNEMONIC1); + .should.eventually.equal(Common.TEST_RECOVERY_PHRASE_1); await app.client .element(RegistrationPage.displayNameInput) .getValue() @@ -107,7 +107,7 @@ describe('Window Test and Login', function() { it('registration: can delete account when logged in', async () => { // login as user1 const login = { - mnemonic: Common.TEST_MNEMONIC1, + recoveryPhrase: Common.TEST_RECOVERY_PHRASE_1, displayName: Common.TEST_DISPLAY_NAME1, }; app = await Common.startAndStub(login); diff --git a/ts/test/session/integration/sender_keys_itest.ts b/ts/test/session/integration/sender_keys_itest.ts index ba1b17783..d20e6492a 100644 --- a/ts/test/session/integration/sender_keys_itest.ts +++ b/ts/test/session/integration/sender_keys_itest.ts @@ -83,19 +83,19 @@ async function testThreeMembers() { // 1. Make three clients A, B, C const app1Props = { - mnemonic: Common.TEST_MNEMONIC1, + recoveryPhrase: Common.TEST_RECOVERY_PHRASE_1, displayName: Common.TEST_DISPLAY_NAME1, stubSnode: true, }; const app2Props = { - mnemonic: Common.TEST_MNEMONIC2, + recoveryPhrase: Common.TEST_RECOVERY_PHRASE_2, displayName: Common.TEST_DISPLAY_NAME2, stubSnode: true, }; const app3Props = { - mnemonic: Common.TEST_MNEMONIC3, + recoveryPhrase: Common.TEST_RECOVERY_PHRASE_3, displayName: Common.TEST_DISPLAY_NAME3, stubSnode: true, }; diff --git a/ts/test/session/integration/settings_itest.ts b/ts/test/session/integration/settings_itest.ts index d97a87ce5..eabdb6a0b 100644 --- a/ts/test/session/integration/settings_itest.ts +++ b/ts/test/session/integration/settings_itest.ts @@ -27,7 +27,7 @@ describe('Settings', function() { await Common.stopStubSnodeServer(); const appProps = { - mnemonic: Common.TEST_MNEMONIC1, + recoveryPhrase: Common.TEST_RECOVERY_PHRASE_1, displayName: Common.TEST_DISPLAY_NAME1, }; diff --git a/ts/window.d.ts b/ts/window.d.ts index d6b245677..bd5d5bfed 100644 --- a/ts/window.d.ts +++ b/ts/window.d.ts @@ -10,6 +10,7 @@ import { SwarmPolling } from './session/snode_api/swarmPolling'; import { LibTextsecure } from '../libtextsecure'; import { ConversationType } from '../js/modules/data'; +import { RecoveryPhraseUtil } from '../libloki/modules/mnemonic'; /* We declare window stuff here instead of global.d.ts because we are importing other declarations. @@ -67,7 +68,7 @@ declare global { lokiPublicChatAPI: LokiPublicChatFactoryInterface; lokiSnodeAPI: LokiSnodeAPI; lokiPublicChatAPI: LokiPublicChatFactoryAPI; - mnemonic: any; + mnemonic: RecoveryPhraseUtil; onLogin: any; passwordUtil: any; pushToast: any; From b9f2c7d7e520c461c7440bdcede6fabc0eebd26c Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 20 Aug 2020 14:54:05 +1000 Subject: [PATCH 072/274] update locale tool to find and clean unused key in .json from english --- tools/compareLocalizedStrings.py | 46 +++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/tools/compareLocalizedStrings.py b/tools/compareLocalizedStrings.py index 3b72b6711..71e5b06e2 100755 --- a/tools/compareLocalizedStrings.py +++ b/tools/compareLocalizedStrings.py @@ -4,27 +4,43 @@ # usage : ./tools/compareLocalizedStrings.py en de import re -import os +from os import path, listdir from glob import glob import json import sys -if len(sys.argv) != 3: - print(f'usage: {sys.argv[0]} ') +LOCALES_FOLDER = './_locales' + + +if len(sys.argv) != 1 and len(sys.argv) != 2: + print(f'usage: {sys.argv[0]} . If compared locale is not set, all found locales will be cleaned') sys.exit(1) -src = sys.argv[1] -dest = sys.argv[2] -print(f'src {src}, dest {dest}') -jsonInEn = json.loads(open(f'_locales/{src}/messages.json', 'r').read()) -jsonInDe = json.loads(open(f'_locales/{dest}/messages.json', 'r').read()) -keysInEn = jsonInEn.keys() -keysInDe = jsonInDe.keys() +if (len(sys.argv) > 1): + localesToCheck = [f'{LOCALES_FOLDER}{sys.argv[1]}'] +else: + localesToCheck = [path.join(LOCALES_FOLDER, o) for o in listdir(LOCALES_FOLDER) if path.isdir(path.join(LOCALES_FOLDER,o))] -print(keysInEn) +for dest in localesToCheck: + if dest == f'{LOCALES_FOLDER}/en': + print('skipping "en" locale...') + continue -for key in keysInEn: - if key not in keysInDe: - print(f'not found in de:{key}') + destFilePath = f'{dest}/messages.json' + # print(f'dest {dest}, destFilePath {destFilePath}') -print(f'total keys in en {len(keysInEn)}') \ No newline at end of file + jsonInSrc = json.loads(open(f'{LOCALES_FOLDER}/en/messages.json', 'r').read()) + jsonInDest = json.loads(open(destFilePath, 'r').read()) + keysInSrc = jsonInSrc.keys() + keysInDest = jsonInDest.keys() + + destMinusSrc = list(set(keysInDest) - set(keysInSrc)) + for key in destMinusSrc: + # print(f'Present in "{dest}" but not found in "{src}": {key}') + del jsonInDest[key] + + print(f'total keys in "{dest}" to remove: {len(destMinusSrc)}') + + # write the updated json dict to the file + with open(destFilePath, 'w') as outfile: + json.dump(jsonInDest, outfile, indent=4, ensure_ascii=False) From 596141723b3799796ad4dc219812253b082f6222 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 20 Aug 2020 14:54:38 +1000 Subject: [PATCH 073/274] clean unused keys for other locales based on 'en' translation --- _locales/ar/messages.json | 370 +---------------------------- _locales/bg/messages.json | 370 +---------------------------- _locales/ca/messages.json | 370 +---------------------------- _locales/cs/messages.json | 370 +---------------------------- _locales/da/messages.json | 370 +---------------------------- _locales/de/messages.json | 423 ---------------------------------- _locales/el/messages.json | 370 +---------------------------- _locales/eo/messages.json | 370 +---------------------------- _locales/es/messages.json | 368 ----------------------------- _locales/es_419/messages.json | 358 +--------------------------- _locales/et/messages.json | 370 +---------------------------- _locales/fa/messages.json | 370 +---------------------------- _locales/fi/messages.json | 370 +---------------------------- _locales/fr/messages.json | 368 ----------------------------- _locales/he/messages.json | 370 +---------------------------- _locales/hi/messages.json | 370 +---------------------------- _locales/hr/messages.json | 370 +---------------------------- _locales/hu/messages.json | 370 +---------------------------- _locales/id/messages.json | 370 +---------------------------- _locales/it/messages.json | 368 ----------------------------- _locales/ja/messages.json | 370 +---------------------------- _locales/km/messages.json | 370 +---------------------------- _locales/kn/messages.json | 370 +---------------------------- _locales/ko/messages.json | 370 +---------------------------- _locales/lt/messages.json | 370 +---------------------------- _locales/mk/messages.json | 370 +---------------------------- _locales/nb/messages.json | 370 +---------------------------- _locales/nl/messages.json | 370 +---------------------------- _locales/nn/messages.json | 370 +---------------------------- _locales/no/messages.json | 370 +---------------------------- _locales/pl/messages.json | 370 +---------------------------- _locales/pt_BR/messages.json | 368 ----------------------------- _locales/pt_PT/messages.json | 370 +---------------------------- _locales/ro/messages.json | 370 +---------------------------- _locales/ru/messages.json | 368 ----------------------------- _locales/sk/messages.json | 370 +---------------------------- _locales/sl/messages.json | 370 +---------------------------- _locales/sq/messages.json | 370 +---------------------------- _locales/sr/messages.json | 370 +---------------------------- _locales/sv/messages.json | 370 +---------------------------- _locales/th/messages.json | 370 +---------------------------- _locales/tr/messages.json | 370 +---------------------------- _locales/uk/messages.json | 370 +---------------------------- _locales/vi/messages.json | 370 +---------------------------- _locales/zh_CN/messages.json | 370 +---------------------------- _locales/zh_TW/messages.json | 370 +---------------------------- 46 files changed, 40 insertions(+), 17011 deletions(-) diff --git a/_locales/ar/messages.json b/_locales/ar/messages.json index 389c7d850..0601de725 100644 --- a/_locales/ar/messages.json +++ b/_locales/ar/messages.json @@ -3,18 +3,10 @@ "message": "Copy error and quit", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Unknown group", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Database Error", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Delete all data and restart", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "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." @@ -35,10 +27,6 @@ "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" @@ -135,10 +123,6 @@ "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" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Archived Conversations", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archive Conversation", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Move Conversation to Inbox", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Choose folder", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Choose file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Load your data", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "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": "your selected location", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "جاري تحديث قاعدة البيانات, قد تستغرق العملية بعض الوقت", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "جاري تحميل الرسائل. $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": "أنا", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "لقد غادرت المجموعة ", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "مرر لأسفل المحادثة ", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "رسالة جديدة بالأسفل", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "رسالة جديدة بالأسفل ", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 رسالة غير مقروءة ", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "إرسال", "description": "" }, - "acceptNewKey": { - "message": "موافقة", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "تم التحقق من رقم الآمان", "description": "" @@ -455,10 +385,6 @@ "message": "رقم آمن جديد", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "رقم الآمان الخاص بك لهذا المستخدم قد تغيرت. وهذا قد يعني بأنه إما أن هناك من يحاول اعتراض اتصالك, أو أن هذا المستخدم ببساطة أعاد تثبيت البرنامج, قد ترغب في التحقق من رقم الآمان الجديد أدناه.", - "description": "" - }, "incomingError": { "message": "Error handling incoming message", "description": "" @@ -495,18 +421,6 @@ "message": "This Month", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "نمط المرفق غير مدعوم. اضغط للحفظ", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "أنقر للحفظ", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "ملف بدون اسم", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "رسالة صوتية", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Attachment type not allowed for security reasons", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Unable to load selected attachment.", "description": "" }, - "disconnected": { - "message": "غير متصّل", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "جاري الاتصال", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "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" @@ -619,14 +521,6 @@ "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": "About Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Speech", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Show", "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" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "بحث", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "مرحبا الى سيجنال Signal", "description": "" }, - "selectAContact": { - "message": "اختر جهة اتصال او مجموعة لبدء محادثه.", - "description": "" - }, "typingAlt": { "message": "Typing animation for this conversation", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "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" @@ -759,16 +633,6 @@ "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" @@ -777,10 +641,6 @@ "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" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "حسنا", "description": "" @@ -809,18 +665,10 @@ "message": "إلغاء", "description": "" }, - "failedToSend": { - "message": "فشل سيغنال في الارسال لبعض المستخدمين. تأكد من الاتصال بالشبكة.", - "description": "" - }, "error": { "message": "خطأ", "description": "" }, - "messageDetail": { - "message": "تفاصيل الرسالة", - "description": "" - }, "delete": { "message": "أحذف ", "description": "" @@ -857,10 +705,6 @@ "message": "أفراد المجموعة", "description": "" }, - "showMembers": { - "message": "أظهر الأفراد", - "description": "" - }, "resetSession": { "message": "تصفير الجلسة", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "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": "If you wish to verify the security of your end-to-end encryption with $name$, compare the numbers above with the numbers on their device.", "description": "", @@ -887,14 +727,6 @@ "message": "لم تقم بتبادل أي رسائل مع هذا المستخدم بعد. رقم الآمان الخاص بك معهم سوف يظهر بعد أول رسالة", "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": "حذف الرسالة", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "حفظ", "description": "" }, - "fileIconAlt": { - "message": "File icon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "سيجنال للحاسوب. مرحبا بك ", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "الحفاظ على الخصوصية أمر ممكن. سيجنال Signal يجعل ذلك سهلا.", - "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": "محاولة الاتصال بالمخدّم فشلت", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "معذرة، لديك أجهزة كثيرة مرتبطة مسبقا. حاول إزالة بعضها.", - "description": "" - }, - "settings": { - "message": "إعدادات", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "السمة", - "description": "Header for theme settings" - }, "permissions": { "message": "Permissions", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "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": "الإشعارات", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Send failed", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "تفاصيل", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "اخفاء التفاصيل", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "تعلم المزيد عن التحقق من أرقام الأمان", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "رسائل الاعلام", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "الرقم غير مسجل", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "جهات الإتصال", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "تحميل كل المجموعات و جهات إتصال التطبيق من جهازك المحمول", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "آخر تحميل في", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "حمل الآن", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "يتم التحميل", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "خطأ في التحميل، تأكد أن الكمبيوتر و هاتفك متصلان بالإنترنت", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "الآن", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 ساعة", "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": "الآن", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "الشهر اليوم", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "تفعيل الإشعارات", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Safety Number has changed", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Light", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Dark", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Note to Self", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Hide menu bar", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "أدخل رقم الهاتف لإضافة جهة الاتصال ", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "رقم خاطئ ", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "الرجاء إعادة ربط سيجنال لسطح المكتب مع هاتفك لمتابعة المراسلة", - "description": "" - }, - "unlinked": { - "message": "غير متصل", - "description": "" - }, - "relink": { - "message": "إعادة ربط", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session update available", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/bg/messages.json b/_locales/bg/messages.json index 26bf2808a..2b6a490d1 100644 --- a/_locales/bg/messages.json +++ b/_locales/bg/messages.json @@ -3,18 +3,10 @@ "message": "Copy error and quit", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Unknown group", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Database Error", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Delete all data and restart", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Файл", "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." @@ -35,10 +27,6 @@ "message": "&Помощ", "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": "Настройки...", - "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": "Скрий", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Инсталация с импортиране", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Инсталиране като ново устройство", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Инсталиране като отделно устройство", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Архивирани разговори", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archive Conversation", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Move Conversation to Inbox", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Изберете папка", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Choose file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Зареждане на данните ви", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Свържете това устройство с телефона си", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "избраното от вас място", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Подновяване на базата данни. Това може да отнеме извесно време...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Зареждане на съобщенията. $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": "Аз", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Напуснахте групата", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Превъртете до края на разговора", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Ново съобщение по-долу", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Нови съобщения по-долу", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 Непрочетено Съобщение", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Изпрати", "description": "" }, - "acceptNewKey": { - "message": "Приемане", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Маркирайте, както е потвърдено", "description": "" @@ -455,10 +385,6 @@ "message": "Нов номер за безопасност", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Номера ви за безопасност с този контакт е променен. Това може да значи че някой се опитва да прихване комуникацията ви, или контакта ви просто е преинсталирал приложението. Потвърдете номерата по-долу.", - "description": "" - }, "incomingError": { "message": "Error handling incoming message", "description": "" @@ -495,18 +421,6 @@ "message": "This Month", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Неподдържан прикачен тип. Натиснете за да го запишете.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Кликнете, за да запазите", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Неназован файл", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Гласово съобщение", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Attachment type not allowed for security reasons", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Unable to load selected attachment.", "description": "" }, - "disconnected": { - "message": "Изключен", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Свързване", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Отворете бележките за изданието", "description": "" }, - "goToForums": { - "message": "Към форумите", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Отворете страницата за поддръжка", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Докладвай Проблем", "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": "Относно Сигнал Десктоп", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Говор", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Покажи", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Скрий", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Изход", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Сигнал Десктоп", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Търсене", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Добре дошли в Сигнал", "description": "" }, - "selectAContact": { - "message": "Изберете контакт или група за да започнете разговор.", - "description": "" - }, "typingAlt": { "message": "Typing animation for this conversation", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "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" @@ -759,16 +633,6 @@ "message": "You", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Отговор до $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" @@ -777,10 +641,6 @@ "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": "Аудио", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "Добре", "description": "" @@ -809,18 +665,10 @@ "message": "Отказ", "description": "" }, - "failedToSend": { - "message": "Неупешно изпращане до някои от получателите. Проверете вашата връзка към мрежата.", - "description": "" - }, "error": { "message": "Грешка", "description": "" }, - "messageDetail": { - "message": "Детайли за съобщението", - "description": "" - }, "delete": { "message": "Изтриване", "description": "" @@ -857,10 +705,6 @@ "message": "Членове на групата", "description": "" }, - "showMembers": { - "message": "Покажи членовете", - "description": "" - }, "resetSession": { "message": "Нулирай сесията", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "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": "Ако искате да потвърдите сигурността на криптирането от край до край с $name$, сравнете номерата по-нагоре с номерата, намиращи се на тяхното устройство.", "description": "", @@ -887,14 +727,6 @@ "message": "Все още не сте се обменяли съобщения с този контакт. Вашият номер за безопасност с него ще бъде на разположение след първото съобщение.", "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" @@ -939,10 +771,6 @@ "message": "Запази", "description": "" }, - "fileIconAlt": { - "message": "File icon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Добре дошли в Сигнал за настолен компютър", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Поверителността е възможна. Сигнал го прави лесно.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Свържете телефона си със Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal Настройки", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Свързани Устройства", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' Бутон", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Свържи Ново Устройство", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Име на Устройството", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Изберете име за устройството", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Завършете свързването на телефона", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Синхронизиране на контакти и групи", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Неуспешна връзка със сървъра.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Съжаляваме, вече имате прекалено много регистрирани устройства. Пробвайте да премахнете някое.", - "description": "" - }, - "settings": { - "message": "Настройки", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Тема", - "description": "Header for theme settings" - }, "permissions": { "message": "Permissions", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Изчистване на данните", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Това ще изчисти всички данни в приложението, премахвайки всички съобщения и запазената информация за профила.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Изчистване на данните", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Изтриване на всички данни?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "На път сте да изтриете цялата информация за запазения профил на приложението, включително всички контакти и всички съобщения. Винаги можете да се свързвате отново с мобилното си устройство, но това няма да възстанови изтритите съобщения.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Изтрийте всички данни", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Прекъсване и изтриване на всички данни", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Известия", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Send failed", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Подробности", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Скрии подробностите", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Научете по-вече за потвърждението на номерата за безопасност.", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Мултимедиино съобщение", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Номерът не е регистриран.", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Контакти", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Импортиране на всички Сигнал групи и контакти от Вашето мобилно устройство.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Последно са импортирани на ", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Импортирай сега", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Импортиране...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Импортирането беше неуспешно. Убедете се че компютърът и телефонът Ви са свързани към интернет.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "сега", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 час", "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": "сега", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Възпроизвеждане на аудио известия", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Safety Number has changed", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Light", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Dark", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Note to Self", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Скрий лентата с менютата", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Въведете телефонен номер за да добавите контакт.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Невалиден номер", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Свържете повторно Сигнал Десктоп към вашето мобилно устройство за да изпращате съобщения.", - "description": "" - }, - "unlinked": { - "message": "Разкачи", - "description": "" - }, - "relink": { - "message": "Свържете отново", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Достъпна е актуализация на Сигнал.", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/ca/messages.json b/_locales/ca/messages.json index 3778704f9..bcf788a19 100644 --- a/_locales/ca/messages.json +++ b/_locales/ca/messages.json @@ -3,18 +3,10 @@ "message": "Copia l'error i surt", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Grup desconegut", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Error de la base de dades", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Suprimeix totes les dades i reinicia", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Fitxer", "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." @@ -35,10 +27,6 @@ "message": "&Ajuda", "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": "Preferències...", - "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": "Amaga", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Configura amb una importació", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Configura com a aparell nou", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Configura com a aparell únic", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Converses arxivades", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Aquestes converses estan arxivades i només apareixeran a la bústia d'entrada si es reben missatges nous.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Arxiva la conversa", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Mou la conversa a la safata d'entrada", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Trieu una carpeta", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Trieu un fitxer", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Carregueu les dades", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Enllaçeu aquest aparell amb el vostre telèfon", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "la ubicació seleccionada", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "S'està actualitzant la base de dades. Això pot trigar una mica...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "S'estan carregant els missatges. Manquen $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": "Jo", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Heu abandonat el grup", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Vés al final de la conversa", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Missatge nou a continuació", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Missatges nous a continuació", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 missatge per llegir", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Tramet", "description": "" }, - "acceptNewKey": { - "message": "Ho accepto", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Marca com a verificat", "description": "" @@ -455,10 +385,6 @@ "message": "Número de seguretat nou", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "El número de seguretat amb aquest contacte ha canviat. Això podria voler dir que algú està provant d'interceptar les vostres comunicacions o que aquest contacte simplement ha reinstal·lat el Signal. Potser hauríeu de verificar el número de seguretat nou.", - "description": "" - }, "incomingError": { "message": "S'ha produït un error en gestionar el missatge rebut", "description": "" @@ -495,18 +421,6 @@ "message": "Aquest mes", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Tipus d'adjunt no admès. Feu clic per a desar.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Feu clic per a desar", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Fitxer sense nom", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Missatge de veu", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Per raons de seguretat, el tipus d'adjunt no es permès ", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Carregant la previsualització...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Previsualització de l'esborrany de la vista en miniatura de l'enllaç $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "No s'ha pogut carregar l'adjunt seleccionat", "description": "" }, - "disconnected": { - "message": "Desconnectat", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "S'està connectant", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Vés a les notes de versió", "description": "" }, - "goToForums": { - "message": "Vés als fòrums", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Vés a la pàgina de suport", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Informeu d'un error", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Preferències del Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Quan al Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Discurs", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Mostra", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Amaga", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Surt", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Cerca", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Benvingut al Signal", "description": "" }, - "selectAContact": { - "message": "Seleccioneu un contacte o grup per a començar el xat.", - "description": "" - }, "typingAlt": { "message": "Animació d'escriptura per a aquesta conversa", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Envia un missatge", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "casa", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Vós", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Resposta per a $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": "Per enviar missatges d'àudio, permeteu que el Signal Desktop tingui accés al micròfon.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Permet l'accés", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Mostra la configuració", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Àudio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "D'acord", "description": "" @@ -809,18 +665,10 @@ "message": "Cancel·la", "description": "" }, - "failedToSend": { - "message": "Ha fallat l'acció d'enviar a alguns remitents. Comproveu la connexió de xarxa.", - "description": "" - }, "error": { "message": "Error", "description": "" }, - "messageDetail": { - "message": "Detall del missatge", - "description": "" - }, "delete": { "message": "Suprimeix", "description": "" @@ -857,10 +705,6 @@ "message": "Membres del grup", "description": "" }, - "showMembers": { - "message": "Mostra els membres", - "description": "" - }, "resetSession": { "message": "Reinicialitza la sessió", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Mostra el número de seguretat", "description": "" }, - "viewAllMedia": { - "message": "Mostra tots els elements multimèdia", - "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 voleu verificar la seguretat de l'encriptació d'extrem a extrem amb $name$, compareu els números anteriors amb els números del seu dispositiu.", "description": "", @@ -887,14 +727,6 @@ "message": "Encara no heu intercanviat cap missatge amb aquest contacte. El vostre número de seguretat amb ells estarà disponible després del primer missatge.", "description": "" }, - "moreInfo": { - "message": "Més informació...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Reintenta l'enviament", - "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": "Suprimeix el missatge", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Desa", "description": "" }, - "fileIconAlt": { - "message": "Icona del fitxer", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Imatge emoji de «$title$»", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Us donem la benvinguda al Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "La privadesa és possible. El Signla la fa fàcil.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Enllaceu el mòbil amb el Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Configuració del Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Aparells enllaçats", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Botó «+»", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Enllaça un aparell nou", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Nom de l'aparell", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Trieu el nom d'aquest aparell", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Acaba l'enllaçament del telèfon", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Sincronització de contactes i grups", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "No s'ha pogut connectar al servidor.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Teniu massa aparells enllaçats. Proveu d'eliminar-ne algun.", - "description": "" - }, - "settings": { - "message": "Configuració", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" - }, "permissions": { "message": "Permisos", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Activa la comprovació ortogràfica del text introduït en el quadre d'edició de missatges", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Buida les dades", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Això buidarà les dades en l'aplicació, suprimint-ne tots els missatges i informació del compte desat.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Buida les dades", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Voleu suprimir totes les dades?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Esteu apunt de suprimir tota la informació del compte desada en aquesta aplicació, incloent-hi tots els contactes i missatges. Sempre podeu enllaçar-ho amb el vostre aparell mòbil una altra vegada, però això no recuperarà els missatges suprimits.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Suprimeix totes les dades", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Desconnexió i supressió de dades", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Notificacions", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "L'enviament ha fallat", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detalls", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Amaga els detalls", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Apreneu-ne més sobre la verificació dels números de seguretat", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Missatge multimèdia", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "El número no està enregistrat.", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Contactes", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importa tots els grups i contactes del Signal des del vostre aparell mòbil.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Última importació feta", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importa-ho ara", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "S'està important...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "La importació ha fallat. Assegureu-vos que l'ordinador i el telèfon estan connectats a internet.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "ara", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 hora", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ h", - "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": "fa $hours$ h", - "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": "fa $minutes$ min", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "ara", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Reprodueix la notificació de so", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "El número de seguretat ha canviat", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Clar", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Fosc", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Notifica-m'ho", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Amaga la barra de menú", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Comença una conversa nova...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Introduïu un número de mòbil per a afegir un contacte.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "El número no és vàlid", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Torneu a enllaçar el Signal Desktop amb el vostre aparell mòbil per a continuar enviant missatges.", - "description": "" - }, - "unlinked": { - "message": "No enllaçat", - "description": "" - }, - "relink": { - "message": "Torna a enllaçar", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Disponible una actualització del Session", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/cs/messages.json b/_locales/cs/messages.json index 8a4fc39f2..6fcec4070 100644 --- a/_locales/cs/messages.json +++ b/_locales/cs/messages.json @@ -3,18 +3,10 @@ "message": "Zkopírovat chybu a ukončit", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Unknown group", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Chyba databáze", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Smazat všechna data a restartovat", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Soubor", "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." @@ -35,10 +27,6 @@ "message": "&Nápověda", "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": "Předvolby...", - "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": "Skrýt", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Nastavit importem", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Nastavit jako nové zařízení", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Nastavit jako samostatné zařízení", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Archivované konverzace", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Tyto konverzace jsou archivované a zobrazí se mezi doručenými zprávami, pokud budou přijaty nové zprávy.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archive Conversation", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Move Conversation to Inbox", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Vybrat složku", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Vybrat soubor", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Nahrajte vaše data", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Připojit zařízení k telefonu", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "Vámi vybraná lokalita", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Aktualizace databáze. To může nějakou chvíli trvat...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Načítání zpráv. $count$ z více...", - "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": "Já", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Opustil jste skupinu", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Přesunout se na konec konverzace", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Nové zprávy níže", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nové zprávy níže", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 Nepřečtená zpráva", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Odeslat", "description": "" }, - "acceptNewKey": { - "message": "Přijmout", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Označit jako ověřené", "description": "" @@ -455,10 +385,6 @@ "message": "Nový bezpečnostní kód", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Bezpečnostní číslo k tomuto kontaktu se vám změnilo. Může to znamenat buď to, že se někdo snaží vaši komunikaci odposlouchávat, nebo si kontakt prostě znovu nainstaloval Signal. Možná si budete chtít bezpečnostní číslo níže ověřit.", - "description": "" - }, "incomingError": { "message": "Chyba při zpracování příchozí zprávy", "description": "" @@ -495,18 +421,6 @@ "message": "Tento měsíc", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Nepodporovaný typ přílohy. Klikněte pro uložení.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Klikněte pro uložení", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Nepojmenovaný soubor", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Hlasová zpráva", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Tento typ přílohy není povolen z bezpečnostních důvodů", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Načítám náhled...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Nelze načít vybranou přílohu.", "description": "" }, - "disconnected": { - "message": "Odpojen", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Připojování", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Přejít na poznámky k vydání", "description": "" }, - "goToForums": { - "message": "Přejít na fórum", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Přejít na stránky podpory", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Nahlásit problém", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Předvolby aplikace Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "O Aplikaci Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Řeč", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Zobrazit", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Skrýt", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Opustit", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Hledat", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Vítejte v Signalu", "description": "" }, - "selectAContact": { - "message": "Vyberte si kontakt nebo skupinu a začněte si povídat.", - "description": "" - }, "typingAlt": { "message": "Typing animation for this conversation", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Odeslat zprávu", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "domov", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Vy", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Odpověď: $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": "Pro posílání audio zpráv potřebuje Signal Desktop přístup k mikrofonu.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Povolit přístup", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Zobrazit nastavení", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Zvuk", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "OK", "description": "" @@ -809,18 +665,10 @@ "message": "Zrušit", "description": "" }, - "failedToSend": { - "message": "Selhalo odeslání některým příjemcům. Zkontrolujte si síťové připojení.", - "description": "" - }, "error": { "message": "Chyba", "description": "" }, - "messageDetail": { - "message": "Podrobnosti zprávy", - "description": "" - }, "delete": { "message": "Vymazat", "description": "" @@ -857,10 +705,6 @@ "message": "Členové skupiny", "description": "" }, - "showMembers": { - "message": "Zobrazit členy", - "description": "" - }, "resetSession": { "message": "Resetovat sezení", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Zobrazit bezpečnostní kód", "description": "" }, - "viewAllMedia": { - "message": "Zobrazit všechna média", - "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": "Pokud chcete zkontrolovat bezpečnost šifrované komunikace s $name$, porovnejte čísla nahoře s čísly na zařízení vašeho kontaktu.", "description": "", @@ -887,14 +727,6 @@ "message": "S tímto kontaktem jste si ještě nevyměnili žádné zprávy. Bezpečnostní číslo k němu bude dostupné po první zprávě.", "description": "" }, - "moreInfo": { - "message": "Více informací...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Odeslat znovu", - "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": "Smazat zprávu", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Uložit", "description": "" }, - "fileIconAlt": { - "message": "File icon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Vítejte v aplikaci Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Soukromí je možné. Signal jej usnadňuje.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Propojit telefon s Signal v počítači", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Nastavení Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Propojená zařízení", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Tlačítko '+'", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Propojit nové zařízení", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Název zařízení", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Zvolte název tohoto zařízení", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Dokončuji propojení s telefonem", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Synchronizuji kontakty a skupiny", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Připojení k serveru selhalo.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Promiňte, ale máte už příliš mnoho propojených zařízení. Zkuste některá odstranit.", - "description": "" - }, - "settings": { - "message": "Nastavení", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Motiv", - "description": "Header for theme settings" - }, "permissions": { "message": "Oprávnění", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Kontrolovat pravopis při psaní zpráv", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Vymazat 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": "Vymazat data", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Vymazat všechna 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": "Vymazat všechna data", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Odpojuji a mažu všechny data", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Oznámení", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Odeslání selhalo", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Podrobnosti", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Skrýt podrobnosti", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Dozvědět se více o ověřování bezpečnostních čísel", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Multimediální zpráva", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Číslo není registrováno", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontakty", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importovat všechny skupiny a kontakty Signalu z mobilního zařízení.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Poslední import", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importovat nyní", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importuje se…", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Import selhal. Zkontrolujte, zda jsou počítač i telefon připojeny k internetu.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "teď", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 hodina", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ hod.", - "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": "Před $hours$ hod.", - "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": "Před $minutes$ min.", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "teď", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Přehrát zvukové upozornění", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Bezpečnostní kód se změnil", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Světlý", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Tmavý", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Poznámka sobě", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Schovat lištu menu", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Zadejte telefonní číslo přidat kontakt.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Neplatné číslo", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Znovu propojte Signel Desktop s mobilním telefonem pro pokračování.", - "description": "" - }, - "unlinked": { - "message": "Odpárováno", - "description": "" - }, - "relink": { - "message": "Přepárovat", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Dostupná aktualizace Session", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/da/messages.json b/_locales/da/messages.json index 57d96b4ea..330a84376 100644 --- a/_locales/da/messages.json +++ b/_locales/da/messages.json @@ -3,18 +3,10 @@ "message": "Kopier fejl og afslut", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Ukendt gruppe", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Databasefejl", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Slet alle data og genstart", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Filer", "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." @@ -35,10 +27,6 @@ "message": "&Hjælp", "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": "Indstillinger", - "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": "Skjul", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Opsætning med import", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Opsætning som ny enhed", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Opsætning som selvstændig enhed", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Arkiveret samtaler", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Disse samtaler arkiveres og vises kun i indbakken, hvis der modtages nye meddelelser.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Arkiver samtalen", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Flyt samtalen til indbakken", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Vælg mappe", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Vælg fil", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Indlæs dine data", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Forbind denne enhed til din telefon", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "din valgte lokation", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Opgraderer database. Det kan godt tage lidt tid...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Indlæser beskeder. $count$ indtil nu...", - "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": "Mig", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Du forlod gruppen", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Scroll til bunden af samtalen", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Ny besked nedenfor", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nye beskeder nedenfor", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 ulæst besked", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Send", "description": "" }, - "acceptNewKey": { - "message": "Acceptér", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Marker som verificeret", "description": "" @@ -455,10 +385,6 @@ "message": "Nyt sikkerhedsnummer", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Dit sikkerhedsnummer med denne kontakt har ændret sig. Dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller at denne kontakt bare har geninstalleret Signal. Du bør overveje at verificere det nye sikkerhedsnummer nedenfor.", - "description": "" - }, "incomingError": { "message": "Fejl i forbindelse med indgående besked", "description": "" @@ -495,18 +421,6 @@ "message": "Denne måned", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Ikke-understøttet vedhæftningstype. Klik for at gemme.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Klik for at gemme", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Unavngiven fil", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Talebesked", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Vedhæftningstype er ikke tilladt af sikkerhedsmæssige årsager", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Indlæser eksempelvisning...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Udkast miniaturebillede til eksempelvisning for $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Kan ikke indlæse den valgte vedhæftning.", "description": "" }, - "disconnected": { - "message": "Afbrudt", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Forbinder", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Gå til udgivelsesnoter", "description": "" }, - "goToForums": { - "message": "Gå til fora", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Gå til supportsiden", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Indmeld en fejl", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop indstillinger", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Om Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Tale", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Vis", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Skjul", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Afslut", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Søg", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Velkommen til Signal", "description": "" }, - "selectAContact": { - "message": "Vælg en kontakt eller gruppe for at komme igang med at chatte.", - "description": "" - }, "typingAlt": { "message": "Skrive animation for denne samtale", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Send besked", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "hjem", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Dig", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Svarer $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": "For at sende talebeskeder skal du lade Signal Desktop få adgang til din mikrofon.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Tillad adgang", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Vis indstillinger", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Lyd", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "Ok", "description": "" @@ -809,18 +665,10 @@ "message": "Afbryd", "description": "" }, - "failedToSend": { - "message": "Kunne ikke sende til nogle modtagere. Kontrollér din internetforbindelse.", - "description": "" - }, "error": { "message": "Fejl", "description": "" }, - "messageDetail": { - "message": "Beskeddetalje", - "description": "" - }, "delete": { "message": "Slet", "description": "" @@ -857,10 +705,6 @@ "message": "Gruppemedlemmer", "description": "" }, - "showMembers": { - "message": "Vis medlemmer", - "description": "" - }, "resetSession": { "message": "Nulstil session", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Vis sikkerhedsnummer", "description": "" }, - "viewAllMedia": { - "message": "Se all mediefiler", - "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": "Hvis du ønsker at verificere sikkerheden af din end-to-end kryptering med $name$ kan du sammenligne numrene ovenfor med numrene på deres enhed.", "description": "", @@ -887,14 +727,6 @@ "message": "Du har ikke udvekslet nogen beskeder med denne kontakt endnu. Dit sikkerhedsnummer med dem vil være tilgængeligt efter den første meddelelse.", "description": "" }, - "moreInfo": { - "message": "Mere info...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Prøv igen", - "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": "Slet besked", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Gem", "description": "" }, - "fileIconAlt": { - "message": "Filikon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji billede af '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Velkommen til Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privatliv er muligt. Signal gør det nemt.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Forbind din telefon til Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal indstillinger", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Forbundne enheder", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+'-knap", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Forbind ny enhed", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Enhedsnavn", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Vælg denne enheds navn", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Afslut tilkobling af telefon", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Synkroniserer kontakter og grupper", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Kunne ikke kontakte serveren.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Beklager, du har for mange enheder forbundet. Prøv at fjerne nogle.", - "description": "" - }, - "settings": { - "message": "Indstillinger", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" - }, "permissions": { "message": "Tilladelser", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Aktiver stavekontrol af beskeder", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Ryd data", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Dette vil rydde alle data i programmet, fjerne alle beskeder og gemte kontooplysninger.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Ryd data", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Slet alle data?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Du er ved at slette alle gemte kontoinformationer, herunder alle kontakter og alle beskeder. Du kan altid tilkoble din mobilenhed på ny, men det vil ikke genoprette slettede beskeder.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Slet alle data", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Afbryder og sletter alle data", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Meddelelser", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Afsendelse fejlede", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detaljer", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Skjul detaljer", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Lær mere om at verificere sikkerhedsnumre", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Mediebesked", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Nummer er ikke registreret", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontakter", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importer alle Signalgrupper og kontakter fra din mobilenhed.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Sidste import:", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importér nu", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importerer...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Importen mislykkedes. Sørg for, at din computer og din telefon er forbundet til internettet.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "nu", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 time", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ t.", - "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$ t. siden", - "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. siden", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "nu", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Afspil lydmeddelelse", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Sikkerhedsnummer har ændret sig", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Lys", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Mørk", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Note til dig selv", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Skjul menulinje", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Start ny samtale...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Indtast et telefonnummer for at tilføje en kontakt.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Ugyldigt nummer", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Tilkobl Signal Desktop din mobilenhed på ny for at fortsætte", - "description": "" - }, - "unlinked": { - "message": "Frakoblet", - "description": "" - }, - "relink": { - "message": "Relink", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Sessionopdatering tilgængelig", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/de/messages.json b/_locales/de/messages.json index dbf564179..b3f384732 100644 --- a/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -3,18 +3,10 @@ "message": "Fehler kopieren und beenden", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Unbekannte Gruppe", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Datenbankfehler", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Alle Daten löschen und neu starten", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Datei", "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." @@ -35,10 +27,6 @@ "message": "&Hilfe", "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": "Einstellungen …", - "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": "Ausblenden", "description": "Application menu command to hide the window" @@ -145,10 +133,6 @@ "message": "Einrichten mit Importieren", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Einrichten als neues Gerät", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Einrichten als eigenständiges Gerät", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -174,30 +158,10 @@ } } }, - "archivedConversations": { - "message": "Archivierte Unterhaltungen", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Diese Unterhaltungen sind archiviert und werden nur dann im Eingang erscheinen, falls neue Nachrichten empfangen werden.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Unterhaltung archivieren", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Unterhaltung in Eingang verschieben", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Ordner wählen", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Datei auswählen", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Lade deine Daten", "description": "Header shown on the first screen in the data import process" @@ -242,24 +206,6 @@ "message": "Dieses Gerät mit deinem Telefon koppeln", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "dein ausgewählter Ort", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Datenbank wird aktualisiert. Dies kann einige Zeit in Anspruch nehmen …", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Nachrichten werden geladen. Bisher $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": "Ich", "description": "The label for yourself when shown in a group member list" @@ -272,18 +218,6 @@ "message": "Du hast die Gruppe verlassen", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Zum Ende der Unterhaltung scrollen", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Neue Nachricht weiter unten", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Neue Nachrichten weiter unten", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "$count$ Ungelesene Nachricht", "description": "Text for unread message separator, just one message" @@ -428,10 +362,6 @@ "message": "Übermitteln", "description": "" }, - "acceptNewKey": { - "message": "Akzeptieren", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Als verifiziert markieren", "description": "" @@ -468,10 +398,6 @@ "message": "Neue Sicherheitsnummer", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Deine Sicherheitsnummer mit diesem Kontakt hat sich geändert. Dies könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören, oder aber dieser Kontakt hat Signal einfach erneut installiert. Vielleicht möchtest du die neue Sicherheitsnummer weiter unten verifizieren.", - "description": "" - }, "incomingError": { "message": "Fehler bei eingehender Nachricht", "description": "" @@ -508,18 +434,6 @@ "message": "Diesen Monat", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Nicht unterstützter Anhangstyp. Zum Speichern anklicken.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Zum Speichern anklicken", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Unbenannte Datei", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Sprachnachricht", "description": "Name for a voice message attachment" @@ -528,10 +442,6 @@ "message": "Anhangstyp aus Sicherheitsgründen nicht erlaubt", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Vorschau wird geladen …", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Miniaturbild des Link-Vorschauentwurfs für $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -562,14 +472,6 @@ } } }, - "copiedPublicKey": { - "message": "In Zwischenablage kopiert", - "description": "A toast message telling the user that the key was copied" - }, - "copiedChatId": { - "message": "In Zwischenablage kopiert", - "description": "A toast message telling the user that the key was copied" - }, "sessionResetOngoing": { "message": "Verschlüsselung neu gestartet", "description": "your secure session is currently being reset, waiting for the reset acknowledgment." @@ -619,25 +521,6 @@ "allUsersAreRandomly...": { "message": "Ihre Session ID ist die eindeutige Adresse, unter der Personen Sie über Session kontaktieren können. Ihre Session ID ist nicht mit Ihrer realen Identität verbunden, völlig anonym und von Natur aus privat." }, - "leaveOpenGroupConfirmation": { - "message": "Möchtest du wirklich diese Gruppe verlassen??", - "description": "Confirmation dialog text that tells the user what will happen if they leave the public channel." - }, - "leaveClosedGroupConfirmation": { - "message": "Möchtest du wirklich diese Gruppe verlassen?", - "description": "Confirmation dialog text that tells the user what will happen if they leave the closed group." - }, - "copyPublicKey": { - "message": "Kopieren", - "description": "Button action that the user can click to copy their public keys" - }, - "copyChatId": { - "message": "Kopieren" - }, - "deleteContact": { - "message": "Kontakt löschen", - "description": "Confirmation dialog title that asks the user if they really wish to delete the contact. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone." - }, "oneNonImageAtATimeToast": { "message": "Mehrere Anhänge je Nachricht sind ausschließlich bei Bildern erlaubt.", "description": "An error popup when the user has attempted to add an attachment" @@ -662,10 +545,6 @@ "message": "Leider ist ein Fehler beim Hinzufügen des Anhangs aufgetreten.", "description": "" }, - "disconnected": { - "message": "Keine Serververbindung", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Verbindung wird hergestellt …", "description": "Displayed when the desktop client is currently connecting to the server." @@ -700,10 +579,6 @@ "message": "Versionshinweise", "description": "" }, - "goToForums": { - "message": "Forum", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Support", "description": "Item under the Help menu, takes you to the support page" @@ -712,14 +587,6 @@ "message": "Problem melden", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Einstellungen für Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Über Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Sprachausgabe", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -728,18 +595,6 @@ "message": "Anzeigen", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Ausblenden", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Beenden", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Suchen", "description": "Placeholder text in the search input" @@ -770,10 +625,6 @@ "message": "Willkommen bei Session", "description": "" }, - "selectAContact": { - "message": "Wähle einen Kontakt oder eine Gruppe aus, um eine Unterhaltung zu beginnen.", - "description": "" - }, "typingAlt": { "message": "Tipp-Animation für diese Unterhaltung", "description": "Used as the 'title' attibute for the typing animation" @@ -788,10 +639,6 @@ } } }, - "sendMessageToContact": { - "message": "Nachricht senden", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "Privat", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -832,9 +679,6 @@ "message": "Auf Nachricht antworten", "description": "Shown in triple-dot menu next to message to allow user to start crafting a message with a quotation" }, - "enterOpenGroupURL": { - "message": "Gruppen-URL öffnen" - }, "newClosedGroup": { "message": "Neue geschlossene Gruppe" }, @@ -844,9 +688,6 @@ "createClosedGroupPlaceholder": { "message": "Geben Sie einen Gruppennamen ein." }, - "addChannelDescription": { - "message": "Geben Sie eine offene Gruppen-URL ein." - }, "next": { "message": "Weiter" }, @@ -870,16 +711,6 @@ "message": "Du", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Antwort auf $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": "Erlaube Session zum Versenden von Sprachnachrichten Zugriff auf dein Mikrofon.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -888,10 +719,6 @@ "message": "Zugriff erlauben", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Einstellungen anzeigen", - "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" @@ -908,10 +735,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "Ok", "description": "" @@ -920,18 +743,10 @@ "message": "Abbrechen", "description": "" }, - "failedToSend": { - "message": "Versand an einige Empfänger gescheitert. Überprüfe deine Netzverbindung.", - "description": "" - }, "error": { "message": "Fehler", "description": "" }, - "messageDetail": { - "message": "Nachrichtendetails", - "description": "" - }, "delete": { "message": "Löschen", "description": "" @@ -968,10 +783,6 @@ "message": "Gruppenmitglieder", "description": "" }, - "showMembers": { - "message": "Mitglieder anzeigen", - "description": "" - }, "resetSession": { "message": "Verschlüsselung Neu Starten", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -980,10 +791,6 @@ "message": "Sicherheitsnummer Anzeigen", "description": "" }, - "viewAllMedia": { - "message": "Alle Medieninhalte anzeigen", - "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": "Falls du die Sicherheit deiner Ende-zu-Ende-Verschlüsselung mit $name$ verifizieren möchtest, vergleiche bitte die oben dargestellte Nummer mit jener auf dem Gerät deines Kontakts.", "description": "", @@ -998,14 +805,6 @@ "message": "Du hast bisher noch keine Nachrichten mit diesem Kontakt ausgetauscht. Eure gemeinsame Sicherheitsnummer wird nach der ersten Nachricht verfügbar sein.", "description": "" }, - "moreInfo": { - "message": "Mehr Details …", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Senden erneut versuchen", - "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": "Nachrichten Löschen", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -1018,14 +817,6 @@ "message": "Soll diese Unterhaltung unwiderruflich gelöscht werden?", "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." }, - "deleteAccount": { - "message": "Alle Daten löschen", - "description": "Text for button in settings view to delete account" - }, - "deleteAccountWarningSub": { - "message": "Dadurch werden Ihre Nachrichten, Sessions und Kontakte dauerhaft gelöscht.", - "description": "Warning for account deletion in settings view" - }, "sessionEnded": { "message": "Verschlüsselung zurückgesetzt", "description": "This is a past tense, informational message. In other words, your secure session has been reset." @@ -1058,10 +849,6 @@ "message": "Speichern", "description": "" }, - "fileIconAlt": { - "message": "Dateisymbol", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emojibild von »$title$«", "description": "Used in the alt tag of all emoji images", @@ -1072,66 +859,10 @@ } } }, - "installWelcome": { - "message": "Willkommen bei Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privatsphäre ist möglich. Signal macht sie einfach.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Kopple dein Telefon mit Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal-Einstellungen", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Gekoppelte Geräte", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "»+«-Schaltfläche", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Neues Gerät Koppeln", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Gerätename", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Wähle einen Namen für dieses Gerät aus", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Koppeln mit Telefon abschließen", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Kontakte und Gruppen werden synchronisiert …", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Verbinden mit Server gescheitert.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Es sind bereits zu viele Geräte gekoppelt. Versuche einige zu entfernen.", - "description": "" - }, - "settings": { - "message": "Einstellungen", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Design", - "description": "Header for theme settings" - }, "permissions": { "message": "Berechtigungen", "description": "Header for permissions section of settings" @@ -1148,34 +879,6 @@ "message": "Rechtschreibprüfung für im Nachrichteneingabefeld eingegebenen Text aktivieren", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Daten löschen", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Dies wird alle Benutzerdaten der Anwendung löschen, d. h. alle Nachrichten und gespeicherten Benutzerkontoinformationen.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Daten löschen", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Alle Daten löschen?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Du bist dabei, alle gespeicherten Benutzerkontoinformationen dieser Anwendung zu löschen, einschließlich aller Kontakte und Nachrichten. Du kannst Signal Desktop jederzeit wieder mit deinem Mobilgerät koppeln, dies wird aber gelöschte Nachrichten nicht wiederherstellen.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Alle Daten löschen", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Verbindung wird getrennt und alle Daten gelöscht", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Benachrichtigungen", "description": "Header for notification settings" @@ -1224,14 +927,6 @@ "message": "Versand Gescheitert", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Details", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Details ausblenden", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Erfahre mehr über das Verifizieren von Sicherheitsnummern", "description": "Text that links to a support article on verifying safety numbers" @@ -1282,14 +977,6 @@ "settingsHeader": { "message": "Einstellungen" }, - "leaveOpenGroup": { - "message": "Gruppe öffnen verlassen", - "description": "Button action that the user can click to leave the group" - }, - "leaveClosedGroup": { - "message": "Geschlossene Gruppe verlassen", - "description": "Button action that the user can click to leave the group" - }, "upgrade": { "message": "Aktualisieren", "description": "Label text for button to upgrade the app to the latest version" @@ -1298,34 +985,6 @@ "message": "Nachricht mit Medieninhalten", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Rufnummer ist nicht registriert", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontakte", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Alle Signal-Gruppen und -Kontakte von deinem Mobilgerät importieren.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Letzter Import am", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Jetzt importieren", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Import wird durchgeführt …", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Importieren gescheitert. Stelle sicher, dass dein Computer und dein Mobilgerät mit dem Internet verbunden sind.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "Jetzt", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1338,50 +997,6 @@ "message": "1 Stunde", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ h", - "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": "vor $hours$ h", - "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": "vor $minutes$ min", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "jetzt", - "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'." @@ -1556,10 +1171,6 @@ } } }, - "audioNotificationDescription": { - "message": "Benachrichtigungston wiedergeben", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Geänderte Sicherheitsnummer", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1588,46 +1199,18 @@ } } }, - "themeLight": { - "message": "Hell", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Dunkel", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Notiz an mich", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Menüleiste ausblenden", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Neue Unterhaltung beginnen …", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Gib zum Hinzufügen eines Kontakts eine Rufnummer ein.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Ungültige Rufnummer", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Kopple Signal Desktop erneut mit deinem Mobilgerät, um weiterhin Nachrichten austauschen zu können.", - "description": "" - }, - "unlinked": { - "message": "Entkoppelt", - "description": "" - }, - "relink": { - "message": "Erneut koppeln", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Aktualisierung für Session verfügbar", "description": "" @@ -1688,12 +1271,6 @@ "yourSessionID": { "message": "Ihre Session ID" }, - "createClosedGroup": { - "message": "Neue geschlossene Gruppe" - }, - "searchForAKeyPhrase": { - "message": "Nach Unterhaltungen, Kontakten und Nachrichten suchen" - }, "enterSessionID": { "message": "Session ID eingeben" }, diff --git a/_locales/el/messages.json b/_locales/el/messages.json index 5a504dadd..4368514fb 100644 --- a/_locales/el/messages.json +++ b/_locales/el/messages.json @@ -3,18 +3,10 @@ "message": "Αντιγραφή λάθους και έξοδος", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Unknown group", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Λάθος της βάσης δεδομένων", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Διαγραφή όλων των δεδομένων και επανεκκίνηση", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Φάκελος", "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." @@ -35,10 +27,6 @@ "message": "&Βοήθεια", "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": "Προτιμήσεις...", - "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": "Απόκρυψη", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Εγκατάσταση με Εισαγωγή", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Διαμόρφωση ως Νέα Συσκευή", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Διαμόρφωση ως Αυτόνομη Συσκευή", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Αρχειοθετημένες Συνομιλίες", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Αυτές οι συνομιλίες είναι αρχειοθετημένες και θα εμφανιστούν στα εισερχόμενα μόνο αν ληφθούν νέα μηνύματα.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archive Conversation", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Move Conversation to Inbox", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Επιλογή φακέλου", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Επιλογή αρχείου", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Φόρτωση δεδομένων", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Σύνδεση αυτής της συσκευής με το τηλέφωνό σας", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "επιλεγμένη τοποθεσία σας", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Αναβάθμιση βάσης δεδομένων. Αυτό μπορεί να πάρει κάποια ώρα...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Φόρτωση μηνυμάτων. $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": "Εγώ", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Αποχωρήσατε από την ομάδα", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Μετάβαση στο τέλος της συνομιλίας", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Νέο μήνυμα παρακάτω", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Νέα μηνύματα παρακάτω", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 μη αναγνωσμένο μήνυμα", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Υποβολή", "description": "" }, - "acceptNewKey": { - "message": "Αποδοχή", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Σημείωση ως επιβεβαιωμένο", "description": "" @@ -455,10 +385,6 @@ "message": "Νέος αριθμός ασφαλείας", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Ο αριθμός ασφαλείας σας με αυτήν την επαφή έχει αλλάξει. Αυτό θα μπορούσε είτε να σημαίνει ότι κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας, είτε αυτή η επαφή απλώς επανεγκαταστήσει το Signal. Ίσως επιθυμείτε να επαληθεύσετε τον νέο αριθμό ασφαλείας παρακάτω.", - "description": "" - }, "incomingError": { "message": "Σφάλμα κατά την διαχείριση εισερχόμενου μηνύματος.", "description": "" @@ -495,18 +421,6 @@ "message": "Αυτό τον μήνα", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Μη υποστηριζόμενος τύπος συνημμένου. Κάντε κλικ για αποθήκευση.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Κάντε κλικ για αποθήκευση.", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Ανώνυμο αρχείο", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Φωνητικό Μήνυμα", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Ο τύπος του συνημμένου δεν επιτρέπεται για λόγους ασφαλείας", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Φόρτωση προεσκόπισης...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Πρόχειρη μικρή προεσκόπιση συνδέσμου για $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Δεν είναι δυνατή η φόρτωση του επιλεγμένου συνημμένου.", "description": "" }, - "disconnected": { - "message": "Αποσυνδεδεμένος/η", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Συνδέεται", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Μετάβαση στις Σημειώσεις Έκδοσης", "description": "" }, - "goToForums": { - "message": "Μετάβαση στα Forum", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Μετάβαση στη Σελίδα Υποστήριξης", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Αναφορά Σφάλματος", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Προτιμήσεις Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Σχετικά με το Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Ομιλία", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Εμφάνιση", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Σμίκρυνση", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Έξοδος", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Αναζήτηση", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Καλώς ορίσατε στο Signal", "description": "" }, - "selectAContact": { - "message": "Επιλέξτε μια επαφή ή μια ομάδα για να ξεκινήσετε την συζήτηση.", - "description": "" - }, "typingAlt": { "message": "Κινούμενη εικόνα που δείχνει πληκτρολόγηση για αυτή τη συζήτηση", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Αποστολή Μηνύματος", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "σπίτι", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Εσείς", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Απάντηση σε $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": "Για να στείλετε μηνύματα ήχου, επιτρέψτε στο Signal Desktop να έχει πρόσβαση στο μικρόφωνό σας.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Επιτρέψτε την Πρόσβαση", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Εμφάνιση Ρυθμίσεων", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Ήχος", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "OK", "description": "" @@ -809,18 +665,10 @@ "message": "Άκυρο", "description": "" }, - "failedToSend": { - "message": "Αποτυχία αποστολής σε μερικούς παραλήπτες. Ελέγξτε τη σύνδεση δικτύου.", - "description": "" - }, "error": { "message": "Σφάλμα", "description": "" }, - "messageDetail": { - "message": "Λεπτομέρειες Μηνύματος", - "description": "" - }, "delete": { "message": "Διαγραφή", "description": "" @@ -857,10 +705,6 @@ "message": "Μέλη ομάδας", "description": "" }, - "showMembers": { - "message": "Εμφάνιση μελών", - "description": "" - }, "resetSession": { "message": "Επανεκκίνηση συνεδρίας", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Εμφάνιση αριθμού ασφαλείας", "description": "" }, - "viewAllMedia": { - "message": "Προβολή όλων των μέσων", - "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": "Αν επιθυμείτε να επιβεβαιώσετε την ασφάλεια της κρυπτογράφησης από άκρο σε άκρο με τον/την $name$, συγκρίνετε τους παραπάνω αριθμούς με τους αριθμούς στη συσκευή τους.", "description": "", @@ -887,14 +727,6 @@ "message": "Δεν έχετε ανταλλάξει ακόμα μηνύματα με αυτήν την επαφή. Ο αριθμός ασφαλείας σας μαζί τους θα είναι διαθέσιμος μετά το πρώτο μήνυμα.", "description": "" }, - "moreInfo": { - "message": "Περισσότερες Πληροφορίες...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Επανάληψη Αποστολής", - "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": "Διαγραφή Μηνύματος", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Αποθήκευση", "description": "" }, - "fileIconAlt": { - "message": "Εικονίδιο αρχείου", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Εικόνα emoji '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Καλώς ορίσατε στο Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Η ιδιωτικότητα είναι εφικτή. Το Signal την κάνει εύκολη.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Σύνδεση τού τηλεφώνου σας με το Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Ρυθμίσεις τού Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Συσχετισμένες Συσκευές ", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Πλήκτρο '+'", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Σύνδεση νέας συσκεύης", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Όνομα συσκεύης", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Επιλέξτε το όνομα αυτής της συσκευής ", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Τέλος σύνδεσης του τηλεφώνου", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Συγχρονισμός ομάδων και επαφών", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Αποτυχία σύνδεσης με τον διακομιστή.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Δυστυχώς, έχετε ήδη πολλές συσκευές συνδεδεμένες. Προσπαθήστε να αφαιρέσετε μερικές.", - "description": "" - }, - "settings": { - "message": "Ρυθμίσεις", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Θέμα", - "description": "Header for theme settings" - }, "permissions": { "message": "Άδειες", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Ενεργοποίηση ορθογραφικού ελέγχου του κειμένου που εισάγεται στο παράθυρο σύνθεσης μηνύματος", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Εκκαθάριση Δεδομένων", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Αυτό θα διαγράψει όλα τα δεδομένα της εφαρμογή, αφαιρώντας όλα τα μηνύματα και τις αποθηκευμένες πληροφορίες λογαριασμού", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Εκκαθάριση δεδομένων", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Διαγραφή όλων των δεδομένων;", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Πρόκειται να διαγράψετε όλες τις αποθηκευμένες πληροφορίες λογαριασμού αυτής της εφαρμογής, συμπεριλαμβανομένων όλων των επαφών και όλων των μηνυμάτων. Μπορείτε πάντα να ξανά συνδέσετε την εφαρμογή με το κινητό σας, αλλά αυτό δεν θα επαναφέρει τα διαγραμμένα μηνύματα.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Διαγραφή όλων των δεδομένων", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Αποσύνδεση και διαγραφή όλων των δεδομένων", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Ειδοποιήσεις", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Αποτυχία αποστολής", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Λεπτομέρειες", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Απόκρυψη λεπτομερειών", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Μάθετε περισσότερα σχετικά με την επιβεβαίωση των αριθμών ασφαλείας", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Μήνυμα μέσου", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Ο αριθμός δεν είναι καταχωρημένος", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Επαφές", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Εισαγωγή όλων των ομάδων και επαφών Signal από το κινητό σας.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Τελευταία εισαγωγή στις", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Εισαγωγή τώρα", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Εισαγωγή...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Η εισαγωγή απέτυχε. Βεβαιωθείτε ότι ο υπολογιστής και το τηλέφωνό σας είναι συνδεδεμένα στο διαδίκτυο.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "τώρα", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 ώρα", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ώρα/ες ", - "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$ώρα/ες πριν", - "description": "Contracted form of 'X hours ago' which works both for singular and plural", - "placeholders": { - "hours": { - "content": "$1", - "example": "2" - } - } - }, - "minutesAgoShort": { - "message": "$minutes$λεπτό/ά", - "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$ λεπτό/ά πριν", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "τώρα", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Αναπαραγωγή ήχου ειδοποίησης", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Ο Αριθμός Ασφαλείας άλλαξε", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Φωτεινό", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Σκοτεινό", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Να μην ξεχάσω ", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Απόκρυψη γραμμής μενού", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Εισαγάγετε έναν αριθμό τηλεφώνου για να προσθέσετε μια επαφή.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Μη έγκυρος αριθμός", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Επανασυνδέστε το Signal Desktop με το κινητό σας για να συνεχίσετε την ανταλλαγή μηνυμάτων.", - "description": "" - }, - "unlinked": { - "message": "Αποσυνδεδεμένο", - "description": "" - }, - "relink": { - "message": "Επανασύνδεση", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Διαθέσιμη ενημέρωση του Session", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/eo/messages.json b/_locales/eo/messages.json index d49537ea2..d21fe1bef 100644 --- a/_locales/eo/messages.json +++ b/_locales/eo/messages.json @@ -3,18 +3,10 @@ "message": "Kopii la eraron kaj eliri", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Nekonata grupo", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Datumbaza eraro", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Forigi ĉiujn datumojn kaj restarti", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Dosiero", "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." @@ -35,10 +27,6 @@ "message": "&Helpo", "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": "Agordoj…", - "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": "Kaŝi", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Agordi kun importo", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Agordi kiel novan aparaton", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Agordi kiel memstaran aparaton", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Enarĥivigitaj interparoloj", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Tiuj interparoloj estas enarĥivigitaj kaj aperos en la ricevujo, nur se novaj mesaĝoj riceviĝas.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Enarĥivigi interparolon", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Movi interparolon al la ricevujo", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Elekti dosierujon", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Elekti dosieron", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Ŝargu viajn datumojn", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Ligi tiun ĉi aparaton al via poŝtelefono", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "via elektita eksportloko", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Ĝisdatigo de la datumbazo. Tio povas daŭri...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Ŝargante mesaĝojn. $count$ ĝis nun…", - "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": "Mi", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Vi forlasis la grupon", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Rulumi al interparola malsupro", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Nova mesaĝo suben", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Novaj mesaĝoj suben", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 nelegata mesaĝo", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Sendi", "description": "" }, - "acceptNewKey": { - "message": "Akcepti", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Marki konfirmita", "description": "" @@ -455,10 +385,6 @@ "message": "Nova sekuriga numero", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Via sekuriga numero kun tiu ĉi kontakto ŝanĝiĝis. Tio povas aŭ signifi, ke iu provas interkapti viajn komunikojn, aŭ ke tiu kontakto simple reinstalis Signal-on. Vi certe volos kontroli la novan sekurigan numeron ĉi-suban.", - "description": "" - }, "incomingError": { "message": "Okazis eraro dum ricevo de mesaĝo", "description": "" @@ -495,18 +421,6 @@ "message": "Ĉimonate", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Nesubtenata tipo de kunsendaĵo. Alklaku por konservi ĝin.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Alklaku por konservi", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Sennoma dosiero", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Voĉa mesaĝo", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Kunsendaĵa tipo ne permesata por sekurecaj kialoj", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Ŝargante antaŭrigardon...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Preparante miniaturan antaŭrigardon de ligilo pri $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Ne eblas ŝargi la elektitan kunsendaĵon.", "description": "" }, - "disconnected": { - "message": "Nekonektite", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Konektante", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Iri al eldonaj notoj", "description": "" }, - "goToForums": { - "message": "Iri al forumoj", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Iri al helppaĝo", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Raporti problemon", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Agordoj de Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Pri Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Parolo", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Malkaŝi", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Kaŝi", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Fini", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Serĉi", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Bonvenon al Signal", "description": "" }, - "selectAContact": { - "message": "Elektu kontakton aŭ grupon por ekparoli.", - "description": "" - }, "typingAlt": { "message": "Tajp-indikiloj por tiu interparolo", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Sendi mesaĝon", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "hejma", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Vi", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Respondo al $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": "Por sendi aŭdajn mesaĝojn, donu al Signal Desktop permeson uzi vian mikrofonon.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Permesi", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Montri agordojn", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Sono", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "Bone", "description": "" @@ -809,18 +665,10 @@ "message": "Nuligi", "description": "" }, - "failedToSend": { - "message": "Malsukcesis sendi al iuj ricevontoj. Kontrolu la retkonekton.", - "description": "" - }, "error": { "message": "Eraro", "description": "" }, - "messageDetail": { - "message": "Detaloj de la mesaĝo", - "description": "" - }, "delete": { "message": "Forigi", "description": "" @@ -857,10 +705,6 @@ "message": "Grupanoj", "description": "" }, - "showMembers": { - "message": "Montri grupanojn", - "description": "" - }, "resetSession": { "message": "Forviŝi seancon", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Montri sekurigan numeron", "description": "" }, - "viewAllMedia": { - "message": "Montru ĉiujn aŭdvidaĵojn", - "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": "Se vi volas kontroli la sekurecon de via tutvoja ĉifrado kun $name$, komparu la ĉi-superajn nombrojn kun la nombroj el lia aŭ ŝia aparato.", "description": "", @@ -887,14 +727,6 @@ "message": "Vi ankoraŭ ne interŝanĝis mesaĝojn kun tiu ĉi kontakto. La sekuriga numero nur disponeblos post la unua mesaĝo.", "description": "" }, - "moreInfo": { - "message": "Pli da informoj…", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Klopodi resendi", - "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": "Forigi mesaĝon", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Konservi", "description": "" }, - "fileIconAlt": { - "message": "Dosierpiktogramo", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoĝibildo de „$title$“", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Bonvenon al Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privateco eblas. Signal tion faciligas.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Ligi vian poŝtelefonon al Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Agordoj de Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Ligitaj aparatoj", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Butono „+“", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Ligi novan aparaton", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Nomo de la aparato", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Elektu la nomon de tiu ĉi aparato", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Fini ligi poŝtelefonon", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Sinkronigo de kontaktoj kaj grupoj", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Malsukcesis konekti al servilo.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Bedaŭrinde, vi havas tro da ligitaj aparatoj. Provu malligi kelkajn.", - "description": "" - }, - "settings": { - "message": "Agordoj", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Etoso", - "description": "Header for theme settings" - }, "permissions": { "message": "Permesoj", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Ŝalti literumilon de teksto entajpita en mesaĝa verkejo", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Forviŝi datumojn", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Tio forviŝos ĉiujn datumojn en la programo, forigante ĉiujn mesaĝojn kaj konservitajn kontinformojn.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Forviŝi datumojn", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Ĉu forigi ĉiujn datumojn?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Vi estas forigonta ĉiujn kontajn informojn el tiu ĉi aplikaĵo, inkluzive de ĉiuj kontaktoj kaj ĉiuj mesaĝoj. Vi povos re-ligi vian porteblan aparaton, sed tio ne restaŭros forigitajn mesaĝojn.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Forigi ĉiujn datumojn", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Malkonektante kaj forigante ĉiujn datumojn", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Sciigojn", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Sendo malsukcesis", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detaloj", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Kaŝi detalojn", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Lernu pli pri kontrolo de sekurigaj numeroj", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Mesaĝo kun enmetitaĵo", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Oni ne registris tiun numeron", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontaktoj", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importi ĉiujn Signal-grupojn kaj kontaktojn el via portebla aparato.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Antaŭa importo je", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importi nun", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importante…", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Importado malsukcesis. Certigu, ke viaj komputilo kaj telefono estas konektitaj al la interreto.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "ĵus", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 horon", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ h", - "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": "antaŭ $hours$ h", - "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": "antaŭ $minutes$ min", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "nun", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Ludi sonan sciigon", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Sekuriga numero ŝanĝiĝis", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Hela", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Malhela", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Noto al mi mem", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Kaŝi la menubreton", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Krei novan interparolon...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Entajpu telefonnumeron por aldoni kontakton.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Nevalida numero", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Re-ligi aplikaĵon Signal Desktop al via portebla aparato por daŭrigi mesaĝadon.", - "description": "" - }, - "unlinked": { - "message": "Malligita", - "description": "" - }, - "relink": { - "message": "Re-ligi", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Ĝisdatiĝo de Session disponeblas", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/es/messages.json b/_locales/es/messages.json index a2b91b348..bfc220320 100644 --- a/_locales/es/messages.json +++ b/_locales/es/messages.json @@ -3,18 +3,10 @@ "message": "Copiar fallo y cerrar Signal", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Grupo sin nombre", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Fallo en la base de datos", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Borrar todos los datos y reiniciar", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Archivo", "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." @@ -35,10 +27,6 @@ "message": "&Ayuda", "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": "Ajustes ...", - "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": "Ocultar", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Configurar con datos a importar", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Configurar como nuevo dispositivo", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Configurar como dispositivo independiente", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Chats archivados", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Estos chats están archivados y sólo aparecerán en el buzón de entrada si recibes nuevos mensajes.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archivar chat", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Devolver chat al buzón de entrada", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Seleccionar carpeta", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Seleccionar adjunto", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Carga tus datos", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Enlaza este dispositivo con tu teléfono", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "Carpeta seleccionada", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Actualizando base de datos. Puede llevar su tiempo …", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Cargando mensajes. $count$ hasta ahora …", - "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" @@ -259,18 +205,6 @@ "message": "Has abandonado el grupo.", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Desliza hasta el final del chat", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Mensaje nuevo abajo ", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Mensajes nuevos abajo", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "$count$ Mensaje No Leído", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Enviar", "description": "" }, - "acceptNewKey": { - "message": "Aceptar", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Marcar como verificado", "description": "" @@ -455,10 +385,6 @@ "message": "Nuevas cifras de seguridad", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Las cifras de seguridad con este contacto han cambiado, lo que significaría que, o bien alguien has tratado de interceptar la comunicación, o que este contacto simplemente ha reinstalado Signal. Tal vez desees verificar las nuevas cifras de seguridad.", - "description": "" - }, "incomingError": { "message": "Fallo al procesar el mensaje recibido", "description": "" @@ -495,18 +421,6 @@ "message": "Este Mes", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Tipo de archivo adjunto no admitido. Haz clic para guardar.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Haz clic para guardar", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Archivo sin nombre", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Nota de voz", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Tipo de adjunto no permitido por razones se seguridad", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Cargando previsualización ...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Preparando miniatura de visualización de enlace para $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Lo sentimos, ha habido un fallo al adjuntar el archivo.", "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." @@ -607,10 +513,6 @@ "message": "Ir a las notas de versión", "description": "" }, - "goToForums": { - "message": "Ir al forum", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Ir a la página de soporte técnico", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Informar de un problema", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Ajustes de Signal Desktop", - "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": "Dictar", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Mostrar", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Ocultar", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Cerrar", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Buscar", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Bienvenido a Session.", "description": "" }, - "selectAContact": { - "message": "Selecciona un contacto o grupo para empezar a chatear.", - "description": "" - }, "typingAlt": { "message": "Animación de tecleo para este chat", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Enviar mensaje", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "Domicilio", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Tú", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Respuesta a $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": "Para enviar notas de voz y hacer llamadas, permite a Session acceder al micrófono.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Permitir acceso", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Mostrar ajustes", - "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" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "Aceptar", "description": "" @@ -809,18 +665,10 @@ "message": "Cancelar", "description": "" }, - "failedToSend": { - "message": "Fallo al enviar a algunos destinatarios. Comprueba la conexión.", - "description": "" - }, "error": { "message": "Fallo", "description": "" }, - "messageDetail": { - "message": "Detalles de mensaje", - "description": "" - }, "delete": { "message": "Eliminar", "description": "" @@ -857,10 +705,6 @@ "message": "Miembros del grupo", "description": "" }, - "showMembers": { - "message": "Mostrar miembros", - "description": "" - }, "resetSession": { "message": "Reiniciar Session Segura", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Ver Cifras De Seguridad", "description": "" }, - "viewAllMedia": { - "message": "Ver todos los adjuntos", - "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 del cifrado con $name$, compara las cifras de arriba con las cifras presentes en el dispositivo de tu contacto.", "description": "", @@ -887,14 +727,6 @@ "message": "No has intercambiado ningún mensaje con este contacto. Las cifras de seguridad estarán disponibles después de enviar el primer mensaje.", "description": "" }, - "moreInfo": { - "message": "Más detalles ...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Volver a enviar", - "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": "Eliminar Mensaje", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Guardar", "description": "" }, - "fileIconAlt": { - "message": "Icono de archivo", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji representando '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Bienvenida 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": "Enlaza tu teléfono con Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Ajustes de Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Dispositivos enlazados", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Botón '+'", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Enlazar Nuevo Dispositivo", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Nombre de dispositivo", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Selecciona un nombre para este dispositivo", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Completar proceso", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Sincronizando contactos y grupos", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Fallo al conectar con el servidor.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Lo sentimos, ya tienes demasiados dispositivos vinculados. Prueba a eliminar algunos.", - "description": "" - }, - "settings": { - "message": "Ajustes", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" - }, "permissions": { "message": "Permisos", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Comprobar la ortografía al escribir el mensaje", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Limpiar datos", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Esto eliminará todos los datos de la aplicación, los mensajes y la información de la cuenta.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Eliminar datos", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "¿Eliminar todos los datos?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Vas a eliminar toda la información de la cuenta de Signal en esta aplicación, incluyendo todos los contactos y mensajes. Siempre puedes volver a enlazar tu dispositivo móvil de nuevo, pero los mensajes eliminados no se restaurarán.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Eliminar todos los datos", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Desconectando y borrando datos", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Notificaciones", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Fallo Al Enviar", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detalles", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Ocultar detalles", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Más información sobre verificación de cifras de seguridad", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "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 registrado", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Contactos", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importa todos los grupos y contactos de Signal desde tu teléfono móvil.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Última actualización: ", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importar ahora", - "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": "Fallo al importar. Asegúrate de que ordenador y teléfono están conectados a 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." @@ -1169,50 +877,6 @@ "message": "1 hora", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ h", - "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": "Hace $hours$ hora(s)", - "description": "Contracted form of 'X hours ago' which works both for singular and plural", - "placeholders": { - "hours": { - "content": "$1", - "example": "2" - } - } - }, - "minutesAgoShort": { - "message": "$minutes$ m", - "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": "Hace $minutes$ minuto(s)", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Reproducir notificaciones sonoras", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Las cifras de seguridad han cambiado", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Claro", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Oscuro", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Notas personales", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Ocultar barra de menú", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Comienza con un chat ...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Introduce un número de teléfono para añadir un contacto.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Número incorrecto", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Vuelve a enlazar Signal Desktop con tu teléfono móvil para continuar intercambiando mensajes.", - "description": "" - }, - "unlinked": { - "message": "Desenlazado", - "description": "" - }, - "relink": { - "message": "Enlazar de nuevo", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Actualización de Session Desktop disponible", "description": "" diff --git a/_locales/es_419/messages.json b/_locales/es_419/messages.json index f7ffb3e81..f94be3257 100644 --- a/_locales/es_419/messages.json +++ b/_locales/es_419/messages.json @@ -19,10 +19,6 @@ "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" @@ -119,10 +115,6 @@ "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" @@ -193,24 +185,6 @@ "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" @@ -223,18 +197,6 @@ "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" @@ -379,10 +341,6 @@ "message": "Enviar", "description": "" }, - "acceptNewKey": { - "message": "Aceptar", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Marcar como verificado", "description": "" @@ -419,10 +377,6 @@ "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": "" @@ -459,34 +413,14 @@ "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." @@ -521,10 +455,6 @@ "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" @@ -533,14 +463,6 @@ "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" @@ -549,30 +471,10 @@ "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" - }, "welcomeToSession": { "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", @@ -583,10 +485,6 @@ } } }, - "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" @@ -639,16 +537,6 @@ "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" @@ -657,10 +545,6 @@ "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" @@ -681,18 +565,10 @@ "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": "" @@ -729,10 +605,6 @@ "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." @@ -741,10 +613,6 @@ "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": "", @@ -759,14 +627,6 @@ "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" @@ -787,14 +647,6 @@ "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" @@ -807,10 +659,6 @@ "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" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -821,66 +669,10 @@ } } }, - "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" @@ -889,42 +681,10 @@ "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" @@ -973,14 +733,6 @@ "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" @@ -989,10 +741,6 @@ "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" @@ -1001,34 +749,6 @@ "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." @@ -1041,50 +761,6 @@ "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'." @@ -1255,10 +931,6 @@ } } }, - "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" @@ -1287,42 +959,14 @@ } } }, - "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 Session disponible", "description": "" @@ -1397,4 +1041,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/et/messages.json b/_locales/et/messages.json index 486023901..0705b2786 100644 --- a/_locales/et/messages.json +++ b/_locales/et/messages.json @@ -3,18 +3,10 @@ "message": "Copy error and quit", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Unknown group", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Database Error", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Delete all data and restart", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Fail", "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." @@ -35,10 +27,6 @@ "message": "A&bi", "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": "Eelistused...", - "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": "Peida", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Seadista importimise abil", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Seadista uue seadmena", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Seadista iseseisva seadmena", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Arhiveeritud vestlused", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Need vestlused on arhiveeritud ja ilmuvad sisendkausta, kui saabub uusi sõnumeid.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archive Conversation", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Move Conversation to Inbox", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Vali kaust", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Vali fail", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Sinu andmete laadimine", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Ühenda see seade enda telefoniga", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "sinu valitud asukoht", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Andmebaasi uuendamine. See võib võtta pisut aega...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Sõnumite laadimine, siiamaani $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": "Mina", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Sa lahkusid grupist", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Keri vestluse lõppu", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Allpool on uus sõnum", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Allpool on uued sõnumid", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 lugemata sõnum", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Postita", "description": "" }, - "acceptNewKey": { - "message": "Nõustun", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Märgi kinnitatuks", "description": "" @@ -455,10 +385,6 @@ "message": "Uus turvanumber", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Sinu turvanumber selle kontaktiga on muutunud. See võib tähendada, et keegi püüab teie suhtlust pealt kuulata või et see kontakt on lihtsalt Signali uuesti paigaldanud. Kontrolli uut turvakoodi allpool.", - "description": "" - }, "incomingError": { "message": "Sissetuleva sõnumi käsitlemisel tekkis tõrge.", "description": "" @@ -495,18 +421,6 @@ "message": "See kuu", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Mittetoetatud manuse tüüp. Klõpsa salvestamiseks.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Salvestamiseks klõpsa", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Nimeta fail", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Häälsõnum", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Manuse tüüp pole turvakaalutlustel lubatud.", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Eelvaate laadimine...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Lingi eelvaate pisipildi mustand: $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Valitud manuse laadimine ei õnnestunud.", "description": "" }, - "disconnected": { - "message": "Ühendus katkestatud", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Ühendamine", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Mine väljalaskemärkmete juurde", "description": "" }, - "goToForums": { - "message": "Mine foorumitesse", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Mine kasutajatoelehele", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Teavita probleemist", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktopi eelistused", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Teave Signal Desktopi kohta", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Kõne", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Näita", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Peida", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Välju", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Otsi", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Tere tulemast Signalisse", "description": "" }, - "selectAContact": { - "message": "Vali kontakt või grupp ja alusta vestlust.", - "description": "" - }, "typingAlt": { "message": "Selle vestluse sisestuse animatsioon", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Saada sõnum", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "kodu", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Sina", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Vastus kasutajale $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": "Audiosõnumite saatmiseks luba Signal Desktopil mikrofoni kasutada.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Luba ligipääs", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Näita sätteid", - "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" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "Sobib", "description": "" @@ -809,18 +665,10 @@ "message": "Loobu", "description": "" }, - "failedToSend": { - "message": "Mõnedele saajatele saatmine ei õnnestunud. Kontrolli enda võrguühendust.", - "description": "" - }, "error": { "message": "Tõrge", "description": "" }, - "messageDetail": { - "message": "Sõnumi üksikasjad", - "description": "" - }, "delete": { "message": "Kustuta", "description": "" @@ -857,10 +705,6 @@ "message": "Grupi liikmed", "description": "" }, - "showMembers": { - "message": "Näita liikmeid", - "description": "" - }, "resetSession": { "message": "Lähtesta seanss", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Näita turvanumbrit", "description": "" }, - "viewAllMedia": { - "message": "Näita kogu meediat", - "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": "Kui soovid kontrollida kasutajaga $name$ suhtluse krüpteerimist, siis võrdle ülalpool olevaid numbreid numbritega tema seadme ekraanil.", "description": "", @@ -887,14 +727,6 @@ "message": "Sa ei ole selle kontaktiga veel ühtegi sõnumit vahetanud. Sinu turvanumber temaga tekib pärast esimest sõnumit.", "description": "" }, - "moreInfo": { - "message": "Rohkem teavet...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Proovi uuesti saata", - "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": "Kustuta sõnum", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Salvesta", "description": "" }, - "fileIconAlt": { - "message": "Faili ikoon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "$title$ emoji-pilt", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Tere tulemast Signal Desktopi kasutama", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privaatsus on võimalik. Signal teeb selle lihtsaks.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Ühenda telefon Signal Desktopiga", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signali sätted", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Ühendatud seadmed", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+'-nupp", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Ühenda uus seade", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Seadme nimi", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Vali selle seadme nimi", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Lõpeta telefoni ühendamine", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Kontaktide ja gruppide sünkimine", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Ühenduse loomine serverisse ei õnnestunud.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Kahjuks on sul juba liiga palju ühendatud seadmeid. Proovi mõni eemaldada.", - "description": "" - }, - "settings": { - "message": "Sätted", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Teema", - "description": "Header for theme settings" - }, "permissions": { "message": "Õigused", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Luba sõnumite kasti teksti õigekirja kontroll", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Eemalda andmed", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Eemaldatakse kõik rakenduse andmed, kustutatakse kõik sõnumid ja salvestatud teave konto kohta.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Eemalda andmed", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Kas kustutada kõik andmed?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Oled kustutamas rakenduses salvestatud infot, kaasa arvatud kõik kontaktid ja sõnumid. Sul on alati võimalus ühendada nutiseade uuesti, aga see ei taasta kustutatud sõnumeid.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Kustuta kõik andmed", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Ühenduse lõpetamine ja kõigi andmete kustutamine", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Teavitused", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Saatmine ei õnnestunud", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Üksikasjad", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Peida üksikasjad", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Täpsem info turvanumbrite kontrollimise kohta", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Meediasõnum", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Number ei ole registreeritud", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontaktid", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Impordi kõik Signali grupid ja kontaktid enda nutiseadmest.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Viimane importimine:", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Impordi nüüd", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importimine...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Importimine ei õnnestunud. Kontrolli üle, et arvuti ja telefon oleksid mõlemad ühendatud internetti.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "nüüd", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 tund", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ t", - "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$ tundi tagasi", - "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 tagasi", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "nüüd", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Mängi audioteavitust", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Turvanumber on muutunud", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Hele", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Tume", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Märkus endale", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Peida menüüriba", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Kontakti lisamiseks sisesta telefoninumber.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Vigane number", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Sõnumite saatmise jätkamiseks ühenda Signal Desktop nutiseadmega.", - "description": "" - }, - "unlinked": { - "message": "Ühendus eemaldatud", - "description": "" - }, - "relink": { - "message": "Ühenda uuesti", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session uuendus on saadaval", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/fa/messages.json b/_locales/fa/messages.json index 67ba7791c..291685eaa 100644 --- a/_locales/fa/messages.json +++ b/_locales/fa/messages.json @@ -3,18 +3,10 @@ "message": "Copy error and quit", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Unknown group", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Database Error", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Delete all data and restart", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&فایل", "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." @@ -35,10 +27,6 @@ "message": "&کمک", "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": "ترجیحات", - "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": "مخفی سازی", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "نصب با استفاده از ایمپورت", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "برپایی به عنوان یک دستگاه جدید", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "برپایی به عنوان یک دستگاه مستقل", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "مکالمه های آرشیو شده", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "این مکالمه ها بایگانی شده اند و اگر پیام های جدید دریافت شوند فقط در صندوق به نمایش در می آیند.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archive Conversation", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Move Conversation to Inbox", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "انتخاب پوشه", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "انتخاب فایل", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "بارگذاری داده هایتان", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "لینک کردن این دستگاه به موبایل", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "مکان انتخابی شما", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "در حال به‌روزرسانی پابگاه داده. ممکن است کمی طول بکشد...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "در حال بارگذاری پیام‌ها. تاکنون $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": "من", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "شما گروه را ترک کرده اید", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "رفتن به پایین گفتگو", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "پیام جدید پایین", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "پیام‌های جدید پایین", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 پیام خوانده نشده", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "ارسال", "description": "" }, - "acceptNewKey": { - "message": "تایید", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "علامت گذاری به عنوان تایید شده", "description": "" @@ -455,10 +385,6 @@ "message": "شماره‌ی امنیتی جدید", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "شماره‌ی امنیتی این مخاطب تغییر کرده‌ است. این می‌تواند به این معنی باشد که کسی در حال نفوذ به ارتباط شما است و یا اینکه مخاطب شما Signal را از نو نصب کرده و حالا شماره‌ی امنیتی جدیدی دارد.", - "description": "" - }, "incomingError": { "message": "خطا در کنترل پیام دریافتی", "description": "" @@ -495,18 +421,6 @@ "message": "این ماه", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "این نوع ضمیمه پشتیبانی نمی‌شود. برای ذخیره کلیک کنید.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "ذخیره", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "فایل بی‌نام", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "پیام صوتی", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "نوع پیوست به دلایل امنیتی مجاز نیست.", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "ناتوانی در بارگذاری پیوست انتخابی.", "description": "" }, - "disconnected": { - "message": "ارتباط قطع شد", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "در حال اتصال", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "رفتن به یادداشت های ریلیز", "description": "" }, - "goToForums": { - "message": "رفتن به انجمن ها", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "رفتن به صفحه پشتیبانی", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "گزارش مشکل", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "ترجیحات Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "درباره Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "صحبت", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "نمایش", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "مخفی سازی", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "خروج", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "جستجو", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "به Signal خوش‌آمدید", "description": "" }, - "selectAContact": { - "message": "برای شروع چت یک مخاطب یا گروه را انتخاب کنید.", - "description": "" - }, "typingAlt": { "message": "در حال تایپ انیمیشن برای این مکالمه", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "فرستادن پیام", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "خانه", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "شما", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "پاسخ به $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": "برای فرستادن پیام های صوتی، به Signal Desktop اجازه دسترسی به میکروفون خود را بدهید.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "اجازه دسترسی بدهید", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "نمایش تنظیمات", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "صوت", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "باشه", "description": "" @@ -809,18 +665,10 @@ "message": "انصراف", "description": "" }, - "failedToSend": { - "message": "ارسال به برخی مخاطبین ناموفق بود. اتصال شبکه‌ی خود را بررسی کنید.", - "description": "" - }, "error": { "message": "خطا", "description": "" }, - "messageDetail": { - "message": "جزئیات پیام", - "description": "" - }, "delete": { "message": "پاک کن", "description": "" @@ -857,10 +705,6 @@ "message": "اعضای گروه", "description": "" }, - "showMembers": { - "message": "نمایش اعضا", - "description": "" - }, "resetSession": { "message": "ایجاد جلسه‌ی امن جدید", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "دیدن شماره امنیتی", "description": "" }, - "viewAllMedia": { - "message": "دیدن تمام مدیا", - "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": "اگر تمایل به تائید امنیت رمزنگاری نقطه-به-نقطه با $name$ هستید، شماره‌ بالا را با شماره نمایش‌یافته در دستگاه مخاطب مقایسه کنید.", "description": "", @@ -887,14 +727,6 @@ "message": "شما هنوز هیچ پیامی با این مخاطب تبادل نکرده‌اید. شماره‌ی امنیتی پس از ارسال و یا دریافت اولین پیام در دسترس خواهد بود.", "description": "" }, - "moreInfo": { - "message": "اطلاعات بیشتر...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "ارسال دوباره", - "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": "حذف پیام", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "ذخیره", "description": "" }, - "fileIconAlt": { - "message": "آیکون فایل", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "تصویر ایموجی '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "به Signal Desktop خوش‌آمدید", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "حفظ حریم خصوصی ممکن است. Signal این کار را راحت‌تر میکند.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "موبایل خود را به Signal Desktop لینک کنید", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "تنظیمات Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "دستگاه های متصل شده", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "دکمه '+'", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "لینک کردن دستگاه جدید", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "نام دستگاه", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "نام این دستگاه را انتخاب کنید", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "پایان لینک کردن گوشی", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "هماهنگ سازی مخاطبین و گروه ها", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "برقراری ارتباط با سرور ناموفق بود.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "متاسفانه دستگاه‌های زیادی را به حسابتان متصل کرده‌اید. تعدادی را حذف کنید.", - "description": "" - }, - "settings": { - "message": "تنظیمات", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "تم", - "description": "Header for theme settings" - }, "permissions": { "message": "دسترسی ها", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "فعال سازی کنترل املاء متن وارد شده در باکس پیام نویسی", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "پاک سازی داده", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "این باعث می شود تمام داده های در برنامه پاک شوند، تمام پیام ها و اطلاعات ذخیره شده حساب کاربری از بین خواهند رفت.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "پاک کردن داده", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "پاک کردن تمام داده ها؟", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "شما در حال پاک کردن تمام اطلاعات ذخیره شده این حساب کاربری میباشید، این اطلاعات شامل تمام مخاطبین و پیام ها می باشد. شما همیشه میتوانید با موبایل خود آن را لینک کنید، اما این پیام های پاک شده را برنمی گرداند.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "پاک کردن تمام داده ها", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "قطع اتصال و پاک کردن تمام داده ها", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "آگاه‌سازی‌ها", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "ارسال ناموفق بود", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "جزئیات", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "جزئیات را پنهان کن", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "درباره‌ی شماره‌ی امنیتی بیشتر بدانید", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "پیام رسانه‌ای", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "این شماره ثبت نشده است!", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "مخاطب‌ها", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "واردسازی لیست تمام گروه‌ها و مخاطب‌های Signal از گوشی موبایل شما.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "آخرین واردسازی ", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "انجام واردسازی", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "در حال واردسازی...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "واردسازی با خطا مواجه شد! لطفا مطمئن شوید که کامپیوتر و موبایل شما به اینترنت متصل هستند.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "همین حالا", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 ساعت", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ساعت", - "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$ ساعت پیش", - "description": "Contracted form of 'X hours ago' which works both for singular and plural", - "placeholders": { - "hours": { - "content": "$1", - "example": "2" - } - } - }, - "minutesAgoShort": { - "message": "$minutes$ دقیقه", - "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$دقیقه پیش", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "اکنون", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Play audio notification", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "شماره امنیتی تغییر یافته است", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "روشن", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "تاریک", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Note to Self", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "پنهان کردن نوار منو", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Enter a phone number to add a contact.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "شماره نامعتبر", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "برای ادامه‌ی استفاده از ‌Signal Desktop، دوباره این برنامه را به Signal موبایل خود متصل نمایید.", - "description": "" - }, - "unlinked": { - "message": "Unlinked", - "description": "" - }, - "relink": { - "message": "Relink", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "به‌روزرسانی Session در دسترس است", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/fi/messages.json b/_locales/fi/messages.json index 9e68fae51..2df7e3f8e 100644 --- a/_locales/fi/messages.json +++ b/_locales/fi/messages.json @@ -3,18 +3,10 @@ "message": "Kopioi virheilmoitus ja lopeta", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Tuntematon ryhmä", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Tietokantavirhe", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Tuhoa kaikki tiedot ja käynnistä uudelleen", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Tiedosto", "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." @@ -35,10 +27,6 @@ "message": "&Ohje", "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": "Asetukset...", - "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": "Piilota", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Asenna tuoduilla tiedoilla", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Asenna uutena laitteena", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Asenna itsenäisenä laitteena", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Arkistoidut keskustelut", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Nämä keskustelut ovat arkistoituja. Ne siirtyvät takaisin postilaatikkoon, jos niihin tulee uusia viestejä", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Arkistoi keskustelu", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Siirrä keskustelu takaisin postilaatikkoon", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Valitse kansio", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Valitse tiedosto", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Tuo tietosi", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Yhdistä tämä laite puhelimeesi", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "valitsemasi kansio", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Päivitetään tietokantaa. Tämä saattaa kestää hetken...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Ladataan viestejä. $count$ ladattu...", - "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": "Minä", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Olet poistunut ryhmästä.", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Vieritä keskustelun loppuun", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Uusi viesti alla", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Uusia viestejä alla", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 lukematon viesti", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Lähetä", "description": "" }, - "acceptNewKey": { - "message": "Hyväksy", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Merkitse varmennetuksi", "description": "" @@ -455,10 +385,6 @@ "message": "Uusi turvanumero", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Turvanumerosi tämän yhteystiedon kanssa on vaihtunut. Tämä voi tarkoittaa joko sitä, että joku yrittää kaapata viestiliikennettänne, tai sitä, että yhteystietosi on yksinkertaisesti uudelleenasentanut Signalin. Saatat haluta varmentaa alla näkyvän turvanumeron.", - "description": "" - }, "incomingError": { "message": "Virhe saapuvan viestin käsittelyssä", "description": "" @@ -495,18 +421,6 @@ "message": "Tämä kuukausi", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Liitetiedoston tyyppiä ei tueta. Tallenna napsauttamalla.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Tallenna napsauttamalla", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Nimeämätön tiedosto", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Ääniviesti", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Turvallisuussyistä tätä tiedostotyyppiä ei voida liittää.", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Ladataan esikatselua...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Linkin $domain$esikatselukuvan luonnos", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Valittua liitettä ei voitu ladata.", "description": "" }, - "disconnected": { - "message": "Ei yhteyttä", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Yhdistetään", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Siirry julkaisutietoihin", "description": "" }, - "goToForums": { - "message": "Siirry keskustelupalstalle", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Siirry tukisivulle", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Ilmoita ongelmasta", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop asetukset", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Tietoja Signal Desktopista", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Puhe", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Näytä", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Piilota", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Lopeta", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Hae", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Tervetuloa Signaliin", "description": "" }, - "selectAContact": { - "message": "Aloita keskustelu valitsemalla jokin yhteystieto tai ryhmä", - "description": "" - }, "typingAlt": { "message": "Kirjoitusanimaatio tälle keskustelulle", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Lähetä viesti", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "koti", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Sinä", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Vastaus: $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": "Lähettääksesi ääniviestejä myönnä Signal Desktopille mikrofonin käyttöoikeus.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Myönnä käyttöoikeus", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Näytä asetukset", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Äänitiedosto", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "OK", "description": "" @@ -809,18 +665,10 @@ "message": "Peruuta", "description": "" }, - "failedToSend": { - "message": "Lähettäminen joillekin vastaanottajille epäonnistui. Tarkista verkkoyhteytesi.", - "description": "" - }, "error": { "message": "Virhe", "description": "" }, - "messageDetail": { - "message": "Viestin tiedot", - "description": "" - }, "delete": { "message": "Poista", "description": "" @@ -857,10 +705,6 @@ "message": "Ryhmän jäsenet", "description": "" }, - "showMembers": { - "message": "Näytä jäsenet", - "description": "" - }, "resetSession": { "message": "Alusta istunto", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Näytä turvanumero", "description": "" }, - "viewAllMedia": { - "message": "Näytä kaikki 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": "Jos haluat varmentaa sinun ja yhteystiedon $name$ välisen salauksen tietoturvan, vertaa ylläolevia numeroita hänen laitteessaan näkyviin numeroihin.", "description": "", @@ -887,14 +727,6 @@ "message": "Et ole lähettänyt tai vastaanottanut vielä viestejä tämän yhteystiedon kanssa. Turvanumero on saatavilla vasta ensimmäisen viestin jälkeen.", "description": "" }, - "moreInfo": { - "message": "Lisätietoja...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Lähetä uudelleen", - "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": "Poista viesti", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Tallenna", "description": "" }, - "fileIconAlt": { - "message": "Tiedoston ikoni", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji kuva: '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Tervetuloa Signal Desktopiin", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Yksityisyys on mahdollista. Signal tekee siitä helppoa.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Yhdistä puhelimesi ja Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal Asetukset", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Yhdistetyt laitteet", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' Nappi", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Yhdistä uusi laite", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Laitteen nimi", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Valitse nimi tälle laitteelle", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Viimeistele yhdistys puhelimeen", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Synkronoidaan yhteystietoja ja ryhmiä", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Palvelimeen ei saada yhteyttä.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Valitettavasti sinulla on jo liian monta laitetta yhdistettynä. Kokeile poistaa joitakin.", - "description": "" - }, - "settings": { - "message": "Asetukset", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Teema", - "description": "Header for theme settings" - }, "permissions": { "message": "Käyttöoikeudet", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Ota käyttöön viestilaatikkoon kirjoitetun tekstin oikeinkirjoituksen tarkistus", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Tyhjennä tiedot.", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Tämä tyhjentää kaikki tiedot tästä sovelluksesta ja poistaa kaikki viestit ja käyttäjätilisi tiedot.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Tyhjennä tiedot.", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Poistetaanko kaikki tiedot?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Olet tuhoamassa tämän ohjelman kaikki käyttäjätiedot, mukaanlukien kaikki yhteystiedot ja viestit. Voit aina yhdistää mobiililaitteesi uudelleen, mutta se ei palauta jo tuhottuja viestejä.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Poista kaikki tiedot", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Katkaistaan yhteyttä ja tuhotaan kaikki tiedot", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Ilmoitukset", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Lähetys epäonnistui", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Lisätietoja", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Piilota lisätiedot", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Lue lisää turvanumeroiden varmentamisesta.", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Mediaviesti", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Numero ei ole rekisteröity.", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Yhteystiedot", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Tuo kaikkien Signal-yhteystietojen ja -ryhmien tiedot mobiililaitteestasi.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Viimeksi tuotu", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Tuo nyt", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Tuodaan...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Tuonti epäonnistui. Varmista, että tietokoneesi ja puhelimesi ovat kytketty Internettiin.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "nyt", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 tunti", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ h", - "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$ h sitten", - "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 sitten", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "nyt", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Käytä ilmoitusääniä", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Turvanumero on vaihtunut", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Vaalea", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Tumma", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Viestit itselleni", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Piilota valikkopalkki", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Aloita uusi keskustelu...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Syötä puhelinnumero lisätäksesi uuden yhteystiedon", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Virheellinen numero", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Jotta voit jatkaa viestittelyä, yhdistä Signal Desktop uudelleen mobiililaitteeseesi.", - "description": "" - }, - "unlinked": { - "message": "Ei yhdistetty", - "description": "" - }, - "relink": { - "message": "Yhdistä uudelleen", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session päivitys saatavilla", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index e91ff706d..3fbc85a5b 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -3,18 +3,10 @@ "message": "Copier l’erreur et quitter", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Groupe inconnu", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Erreur de base de données", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Supprimer toutes les données et relancer", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Fichier", "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." @@ -35,10 +27,6 @@ "message": "&Aide", "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": "Préférences…", - "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": "Cacher", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Configurer avec importation", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Configurer comme nouvel appareil", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Configurer comme appareil autonome", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Conversations archivées", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Ces conversations sont archivées et n’apparaîtront dans la boîte de réception que si de nouveaux messages sont reçus.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archiver la conversation", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Déplacer la conversation vers la boite de réception", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Sélectionner un dossier", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Choisir un fichier", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Chargez vos données", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Relier cet appareil à votre téléphone", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "votre emplacement sélectionné", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Mise à niveau de la base de données. Cela peut prendre un certain temps…", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Chargement des messages. $count$ jusqu’à présent…", - "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": "Moi", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Vous avez quitté le groupe", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Faire défiler vers le bas de la conversation", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Nouveau message ci-dessous", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nouveaux messages ci-dessous", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "$count$ Message Non Lu", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Envoyer", "description": "" }, - "acceptNewKey": { - "message": "Accepter", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Marquer comme vérifié", "description": "" @@ -455,10 +385,6 @@ "message": "Nouveau numéro de sécurité", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Votre numéro de sécurité avec ce contact a changé. Cela pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit que ce contact a simplement réinstallé Signal. Vous devriez peut-être vérifier le nouveau numéro de sécurité ce-dessous.", - "description": "" - }, "incomingError": { "message": "Erreur de traitement du message entrant", "description": "" @@ -495,18 +421,6 @@ "message": "Ce Mois", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Le type de pièce jointe n’est pas pris en charge. Cliquez pour l’enregistrer.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Cliquer pour enregistrer", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Fichier sans nom", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Message vocal", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Le type de fichier joint n’est pas autorisé pour des raisons de sécurité", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Chargement de l’aperçu…", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Brouillon d’imagette d’aperçu de lien pour $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Désolé, une erreur de mise en place de votre pièce jointe est survenue.", "description": "" }, - "disconnected": { - "message": "L’application est déconnectée", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Connexion…", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Accéder aux notes de mise à jour", "description": "" }, - "goToForums": { - "message": "Accéder aux forums", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Accéder à la page d’assistance", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Signaler un problème", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Préférences de Signal Desktop pour ordinateur", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "À propos de Signal Desktop pour ordinateur", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Parole", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Afficher", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Cacher", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Quitter", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop pour ordinateur", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Recherche", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Bienvenue sur Session.", "description": "" }, - "selectAContact": { - "message": "Sélectionnez un contact ou un groupe pour lancer une conversation.", - "description": "" - }, "typingAlt": { "message": "Animation de saisie pour cette conversation", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Envoyer un message", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "Domicile", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Vous", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Réponse à $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": "Pour envoyer des messages audio, autorisez Session à accéder à votre microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Autoriser l’accès", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Afficher les paramètres", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Contenu audio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "Valider", "description": "" @@ -809,18 +665,10 @@ "message": "Annuler", "description": "" }, - "failedToSend": { - "message": "Échec d’envoi à certains destinataires. Veuillez vérifiez votre connexion réseau.", - "description": "" - }, "error": { "message": "Erreur", "description": "" }, - "messageDetail": { - "message": "Détails du message", - "description": "" - }, "delete": { "message": "Supprimer", "description": "" @@ -857,10 +705,6 @@ "message": "Membres du groupe", "description": "" }, - "showMembers": { - "message": "Afficher les membres", - "description": "" - }, "resetSession": { "message": "Réinitialiser La Session Sécurisée", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Afficher Le Numéro De Sécurité", "description": "" }, - "viewAllMedia": { - "message": "Afficher tous les médias", - "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 vous souhaitez vérifier la sécurité de votre chiffrement de bout en bout avec $name$, comparez les numéros ci-dessus avec les numéros sur son appareil.", "description": "", @@ -887,14 +727,6 @@ "message": "Vous n’avez pas encore échangé de messages avec ce contact. Votre numéro de sécurité sera accessible après le premier message.", "description": "" }, - "moreInfo": { - "message": "Plus d’infos…", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Renvoyer", - "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": "Supprimer Le Message", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Enregistrer", "description": "" }, - "fileIconAlt": { - "message": "Icône de fichier", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Image émoji de « $title$ »", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Bienvenue sur Signal Desktop pour ordinateur", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "La confidentialité est possible. Signal la facilite.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Reliez votre téléphone à Signal Desktop pour ordinateur", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Paramètres de Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Appareils reliés", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Bouton « + »", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Relier Un Nouvel Appareil", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Nom de l’appareil ", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Choisissez le nom de cet appareil", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Terminer la liaison de l’appareil", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Synchronisation des contacts et groupes", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Échec de connexion au serveur.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Désolé, trop d’appareils sont déjà reliés. Essayez d’en supprimer.", - "description": "" - }, - "settings": { - "message": "Paramètres", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Thème", - "description": "Header for theme settings" - }, "permissions": { "message": "Autorisations", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Activer la vérification de l’orthographe du texte saisi dans la fenêtre de rédaction des messages", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Suppression des données", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Toutes les données dans l’application seront supprimées, y compris tous les messages et les renseignements de compte enregistrés.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Supprimer les données", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Supprimer toutes les données ?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Vous êtes sur le point de supprimer tous les renseignements de compte enregistrés de cette application, y compris tous les contacts et messages. Vous pourrez toujours relier votre appareil mobile de nouveau, mais cela ne restaurera pas les messages supprimés.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Supprimer toutes les données", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Déconnexion et suppression de toutes les données", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Notifications", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Échec D’Envoi", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Détails", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Cacher les détails", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "En savoir plus sur la vérification des numéros de sécurité", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Message multimédia", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Le numéro n’est pas inscrit", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Contacts", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importer tous les groupes et contacts Signal de votre appareil mobile", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Dernière importation le", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importer maintenant", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importation…", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Échec d’importation. Assurez-vous que votre ordinateur et votre téléphone sont connectés à Internet.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "À L’Instant", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 heure", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ h", - "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": "Il y a $hours$ h", - "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": "Il y a $minutes$ min", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "maintenant", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Jouer une notification sonore", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Le numéro de sécurité a changé", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Clair", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Sombre", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Note à mon intention", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Cacher la barre de menu", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Lancer une nouvelle conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Saisir un numéro de téléphone pour ajouter un contact.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Le numéro est invalide", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Reliez Signal Desktop pour ordinateur à votre appareil mobile de nouveau pour continuer à communiquer.", - "description": "" - }, - "unlinked": { - "message": "Non relié", - "description": "" - }, - "relink": { - "message": "Relier de nouveau", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Une mise à jour de Session est proposée", "description": "" diff --git a/_locales/he/messages.json b/_locales/he/messages.json index 41275a3a1..dd85c5239 100644 --- a/_locales/he/messages.json +++ b/_locales/he/messages.json @@ -3,18 +3,10 @@ "message": "העתק שגיאה וצא", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "קבוצה לא ידועה", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "שגיאת מסד נתונים", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "מחק את כל הנתונים והפעל מחדש", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&קובץ", "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." @@ -35,10 +27,6 @@ "message": "&עזרה", "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": "העדפות...", - "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": "הסתר", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "הגדר עם יבוא", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "הגדר מכשיר חדש", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "הגדר בתור מכשיר עצמאי", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "שיחות מאורכבות", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "שיחות אלו מאורכבות ויופיעו בתיבה הנכנסת רק אם מתקבלות הודעות חדשות.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "ארכב שיחה", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "העבר שיחה אל תיבה נכנסת", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "בחר תיקייה", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "בחר קובץ", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "טען את הנתונים שלך", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "קשר מכשיר זה אל הטלפון שלך", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "המיקום הנבחר שלך", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "משדרג מסד נתונים. זה עשוי לקחת זמן מה...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "טוען הודעות. $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": "אני", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "עזבת את הקבוצה", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "גלול לתחתית השיחה", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "הודעה חדשה מתחת", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "הודעות חדשות מתחת", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "הודעה שלא נקראה 1", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "שלח", "description": "" }, - "acceptNewKey": { - "message": "קבל", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "סמן כמודא", "description": "" @@ -455,10 +385,6 @@ "message": "מספר בטיחות חדש", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "מספר הבטיחות שלך עם איש קשר זה השתנה. זה יכול לעיד שמישהו מנסה ליירט את התקשורת שלך, או שאיש קשר זה פשוט התקין מחדש את Signal. ייתכן שתרצה לוודא את מספר הבטיחות החדש למטה.", - "description": "" - }, "incomingError": { "message": "שגיאה בטיפול בהודעה נכנסת", "description": "" @@ -495,18 +421,6 @@ "message": "החודש", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "קובץ לא נתמך. לחץ כדי לשמור.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "לחץ כדי לשמור", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "קובץ ללא שם", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "הודעה קולית", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "סוג הצרופה אינו מותר מסיבות אבטחה", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "טוען קדם־תצוגה...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "טיוטה של קדם־תצוגה של קישור עבור $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "לא היה ניתן לטעון את הצרופה הנבחרת.", "description": "" }, - "disconnected": { - "message": "מנותק", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "מתחבר", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "לך אל הערות שחרור", "description": "" }, - "goToForums": { - "message": "לך אל פורומים", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "לך אל דף התמיכה", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "דווח על סוגייה", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "העדפות Signal Desktop עבודה", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "אודות Signal Desktop עבודה", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "דיבור", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "הראה", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "הסתר", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "צא", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop עבודה", - "description": "Tooltip for the tray icon" - }, "search": { "message": "חיפוש", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "ברוכים הבאים לסיגנל", "description": "" }, - "selectAContact": { - "message": "בחר איש קשר או קבוצה כדי להתחיל שיחה.", - "description": "" - }, "typingAlt": { "message": "הנפשת הקלדה עבור שיחה זו", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "שלח הודעה", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "בית", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "אתה", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "משיב אל $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": "כדי לשלוח הודעות קוליות, התר אל Signal Desktop עבודה לקבל גישה אל המיקרופון שלך.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "התר גישה", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "הראה הגדרות", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "שמע", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "אישור", "description": "" @@ -809,18 +665,10 @@ "message": "ביטול", "description": "" }, - "failedToSend": { - "message": "נכשל בשליחה אל מספר נמענים. בדוק את חיבור הרשת שלך.", - "description": "" - }, "error": { "message": "שגיאה", "description": "" }, - "messageDetail": { - "message": "פרטי הודעה", - "description": "" - }, "delete": { "message": "מחק", "description": "" @@ -857,10 +705,6 @@ "message": "חברי קבוצה", "description": "" }, - "showMembers": { - "message": "הראה חברי קבוצה", - "description": "" - }, "resetSession": { "message": "אפס שיח", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "הצג מספר בטיחות", "description": "" }, - "viewAllMedia": { - "message": "הצג את כל המדיה", - "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": "אם אתה רוצה לוודא את הביטחון של הצפנת הקצה־אל־קצה שלך עם $name$, השווה את המספרים למעלה עם המספרים במכשיר שלו.", "description": "", @@ -887,14 +727,6 @@ "message": "לא החלפת עדין הודעות כלשהן עם איש קשר זה. מספר הבטיחות שלך איתו יהיה זמין לאחר ההודעה הראשונה.", "description": "" }, - "moreInfo": { - "message": "עוד מידע...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "נסה מחדש שליחה", - "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": "מחק הודעה", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "שמור", "description": "" }, - "fileIconAlt": { - "message": "צלמית קובץ", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "תמונת אימוג'י של '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "ברוך הבא אל Signal Desktop עבודה", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "פרטיות היא אפשרית. Signal הופך את זה לקל.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "שולחן עבודה Signal קשר את הטלפון שלך אל", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "הגדרות Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "מכשירים מקושרים", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "כפתור '+'", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "קשר מכשיר חדש", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "שם מכשיר", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "בחר שם של מכשיר זה", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "סיים קישור טלפון", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "מסנכרן אנשי קשר וקבוצות", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "נכשל בחיבור לשרת.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "סליחה, יש לך כבר יותר מדי מכשירים מקושרים. נסה להסיר קצת.", - "description": "" - }, - "settings": { - "message": "הגדרות", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "ערכת נושא", - "description": "Header for theme settings" - }, "permissions": { "message": "הרשאות", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "אפשר בדיקת איות של מלל המוכנס בתיבת חיבור הודעה", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "נקה נתונים", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "זה ינקה את כל הנתונים ביישום, יסיר את כל ההודעות ומידע שמור של חשבון.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "נקה נתונים", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "למחוק את כל הנתונים?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "אתה עומד למחוק את כל המידע השמור של חשבון של יישום זה, כולל כל אנשי הקשר וההודעות. אתה תמיד יכול לקשר עם המכשיר הנייד שלך שוב, אבל לא תוכל לשחזר הודעות מחוקות.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "מחק את כל הנתונים", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "מתנתק ומוחק את כל הנתונים", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "התראות", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "שליחה נכשלה", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "פרטים", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "הסתר פרטים", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "למד עוד על וידוא מספרי בטיחות", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "הודעת מדיה", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "המספר אינו רשום", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "אנשי קשר", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "ייבא את כל הקבוצות ואנשי הקשר של Signal מהמכשיר הנייד שלך.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "יבוא אחרון בתאריך", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "ייבא כעת", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "מייבא...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "יבוא נכשל. וודא שהמחשב והטלפון שלך מחוברים לאינטרנט.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "כעת", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "שעה 1", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ שע'", - "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$ שע'", - "description": "Contracted form of 'X hours ago' which works both for singular and plural", - "placeholders": { - "hours": { - "content": "$1", - "example": "2" - } - } - }, - "minutesAgoShort": { - "message": "$minutes$ דק'", - "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$ דק'", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "כעת", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "נגן התראת שמע", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "מספר בטיחות השתנה", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "בהיר", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "כהה", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "הערה לעצמי", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "הסתר שורת תפריט", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "התחל שיחה חדשה...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "הכנס מספר טלפון כדי להוסיף איש קשר.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "מספר בלתי תקף", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "קשר מחדש את Signal Desktop עבודה אל המכשיר הנייד שלך כדי להמשיך בשליחת הודעות.", - "description": "" - }, - "unlinked": { - "message": "לא מקושר", - "description": "" - }, - "relink": { - "message": "קשר מחדש", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "עדכון Session זמין", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/hi/messages.json b/_locales/hi/messages.json index 47b15b894..e1a97c8eb 100644 --- a/_locales/hi/messages.json +++ b/_locales/hi/messages.json @@ -3,18 +3,10 @@ "message": "Copy error and quit", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Unknown group", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Database Error", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Delete all data and restart", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "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." @@ -35,10 +27,6 @@ "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" @@ -135,10 +123,6 @@ "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" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Archived Conversations", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archive Conversation", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Move Conversation to Inbox", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "फोल्डर को चुनो", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Choose file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Load your data", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "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": "आपके चयनित स्थान", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "डेटाबेस का उन्नयन इसमें कुछ समय लग सकता है...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "संदेशों को लोड करना$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": "मुझे", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "आपने समूह छोड़ दिया", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "वार्तालाप के नीचे स्क्रॉल करें", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "नीचे नया संदेश", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "नीचे नया संदेश", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 अपठित संदेश", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "जमा करें", "description": "" }, - "acceptNewKey": { - "message": "स्वीकार करें", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "साटिपिट होने का मुहर लगा दे", "description": "" @@ -455,10 +385,6 @@ "message": "नया सुरक्षा नंबर", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "इस संपर्क के साथ आपकी सुरक्षा संख्या बदल गई है इसका मतलब यह हो सकता है कि कोई आपके संचार को अवरुद्ध करने का प्रयास कर रहा है, या इस संपर्क को केवल Signal को पुनः स्थापित किया गया है आप नीचे नई सुरक्षा संख्या को सत्यापित करना चाह सकते हैं।", - "description": "" - }, "incomingError": { "message": "Error handling incoming message", "description": "" @@ -495,18 +421,6 @@ "message": "This Month", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "असमर्थित अनुलग्नक प्रकार सहेजने के लिए क्लिक करें", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "सहेजने के लिए क्लिक करें", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "अनाम फ़ाइल", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "ध्वनि संदेश", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Attachment type not allowed for security reasons", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Unable to load selected attachment.", "description": "" }, - "disconnected": { - "message": "वियोजित", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "जोड़ने", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "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" @@ -619,14 +521,6 @@ "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": "Signal डेस्कटॉप के बारे में", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "भाषण", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "दिखाना", "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" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "सर्च", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "सिग्‍नल में आपका स्वागत है ", "description": "" }, - "selectAContact": { - "message": "लिखचित की शुरुवाद करने के लिए कॉंटॅक्ट या ग्रूप चुने ", - "description": "" - }, "typingAlt": { "message": "Typing animation for this conversation", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "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" @@ -759,16 +633,6 @@ "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" @@ -777,10 +641,6 @@ "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" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "ठीक", "description": "" @@ -809,18 +665,10 @@ "message": "रद्द करें", "description": "" }, - "failedToSend": { - "message": "कुछ प्रप्टकर्ताओ को भेजना संभव नई हो पाया. कृपया अपने इंटरनेट कनेक्षन की जाँच कीजिए ", - "description": "" - }, "error": { "message": " गलती", "description": "" }, - "messageDetail": { - "message": "सन्देश विवरण", - "description": "" - }, "delete": { "message": "हटाना", "description": "" @@ -857,10 +705,6 @@ "message": "समूह के सदस्य", "description": "" }, - "showMembers": { - "message": "सदस्यों को दिखाएं", - "description": "" - }, "resetSession": { "message": "सत्र दोबारा शुरू करे ", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "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": "यदि आप अपने एंड-टू-एंड एन्क्रिप्शन की सुरक्षा की पुष्टि करना चाहते हैं तो$name$ऊपर दिए गए नंबरों की संख्या उनके डिवाइस पर तुलना करें।", "description": "", @@ -887,14 +727,6 @@ "message": "आपने अभी तक इस संपर्क के साथ किसी भी संदेश का आदान-प्रदान नहीं किया है। उनके साथ आपका सुरक्षा नंबर पहले संदेश के बाद उपलब्ध होगा।", "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" @@ -939,10 +771,6 @@ "message": "संरक्षित करें", "description": "" }, - "fileIconAlt": { - "message": "File icon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Signal डेस्कटॉप में आपका स्वागत है", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "गोपनीयता संभव है. Signal उसे आसान बनता है", - "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": "सर्वर से कनेक्ट करने में विफल", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "क्षमा करें, आपके पास बहुत से डिवाइस पहले ही लिंक किए गए हैं कुछ को निकालने का प्रयास करें", - "description": "" - }, - "settings": { - "message": "सेटिंग्स", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "विषय", - "description": "Header for theme settings" - }, "permissions": { "message": "Permissions", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "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": "सूचनाएं", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Send failed", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "विवरण", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "विवरण छुपाए", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "सेफ्टी नंबर की सत्यता के बारे मई अधिक जानकारी प्राप्त करे ", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "मीडिया संदेश", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "संख्या पंजीकृत नहीं है", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "संपर्क", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "अपने मोबाइल डिवाइस से सभी Signal समूहों और संपर्कों को आयात करें", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "पिछले आयात पर", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "अब आयात करें", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "आयात करने", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "आयात असफल रहा। सुनिश्चित करें कि आपका कंप्यूटर और आपका फ़ोन इंटरनेट से कनेक्ट है", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "अभी व", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 घंटा", "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": "अभी व", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "एमएमएम डीडी ", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "ऑडियो सूचना चलाएं", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Safety Number has changed", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Light", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Dark", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Note to Self", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "मेनू बार छुपाएं", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "कोई संपर्क जोड़ने के लिए एक फ़ोन नंबर दर्ज करें", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "अमान्य संख्या", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "संदेश जारी रखने के लिए Signal डेस्कटॉप को अपने मोबाइल डिवाइस पर लिंक करें।", - "description": "" - }, - "unlinked": { - "message": "लिंक रद्द", - "description": "" - }, - "relink": { - "message": "फिर से लिंक", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session update available", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/hr/messages.json b/_locales/hr/messages.json index 85e631556..dd3180d12 100644 --- a/_locales/hr/messages.json +++ b/_locales/hr/messages.json @@ -3,18 +3,10 @@ "message": "Copy error and quit", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Unknown group", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Database Error", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Delete all data and restart", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "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." @@ -35,10 +27,6 @@ "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" @@ -135,10 +123,6 @@ "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" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Arhivirani razgovori", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archive Conversation", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Move Conversation to Inbox", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Odaberi direktorij", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Choose file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Load your data", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "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": "your selected location", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Nadogradnja baze. Ovo može potrajati neko vrijeme...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Učitavanje poruka: $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": "Ja", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Napustili ste grupu", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Spusti se na dno konverzacije", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Nova poruka ispod", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nove poruke ispod", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 nepročitana poruka", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Predaj", "description": "" }, - "acceptNewKey": { - "message": "Prihvati", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Označi provjerenim", "description": "" @@ -455,10 +385,6 @@ "message": "Novi sigurnosni broj", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Vaš sigurnosni broj s ovim kontaktom se promijenio. Ovo može značiti da netko pokušava presresti vašu komunikaciju ili da je kontakt jednostavno reinstalirao Signal. Možda biste htjeli potvrditi novi sigurnosni broj naveden ispod.", - "description": "" - }, "incomingError": { "message": "Error handling incoming message", "description": "" @@ -495,18 +421,6 @@ "message": "This Month", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Nepodržana vrsta privitka. Kliknite za spremanje.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Klikni za spremanje", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Neimenovana datoteka", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Glasovna poruka", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Attachment type not allowed for security reasons", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Unable to load selected attachment.", "description": "" }, - "disconnected": { - "message": "Nepovezano", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Povezivanje", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "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" @@ -619,14 +521,6 @@ "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": "About Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Speech", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Show", "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" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Traži", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Dobrodošli u Signal", "description": "" }, - "selectAContact": { - "message": "Odaberite kontakt ili grupu za početak dopisivanja.", - "description": "" - }, "typingAlt": { "message": "Typing animation for this conversation", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "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" @@ -759,16 +633,6 @@ "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" @@ -777,10 +641,6 @@ "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" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "OK", "description": "" @@ -809,18 +665,10 @@ "message": "Otkaži", "description": "" }, - "failedToSend": { - "message": "Nije uspjelo slanje nekim primateljima. Provjerite svoju mrežnu vezu.", - "description": "" - }, "error": { "message": "Greška", "description": "" }, - "messageDetail": { - "message": "Detalji poruke", - "description": "" - }, "delete": { "message": "Obriši", "description": "" @@ -857,10 +705,6 @@ "message": "Članovi grupe", "description": "" }, - "showMembers": { - "message": "Prikaži članove", - "description": "" - }, "resetSession": { "message": "Ponovno pokreni sesiju", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "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": "Želite li potvrditi sigurnost enkripcije komunikacije s $name$, usporedite ove brojeve s brojevima na njihovom uređaju.", "description": "", @@ -887,14 +727,6 @@ "message": "Još niste razmijienili poruke sa ovim kontaktom. Sigurnosni broj bit će dostupan nakon prve poruke.", "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" @@ -939,10 +771,6 @@ "message": "Spremi", "description": "" }, - "fileIconAlt": { - "message": "File icon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Dobrodošli u Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privatnost je moguća. Signal je čini lakom.", - "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": "Nije uspjelo spajanje na poslužitelj.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Žao nam je, imate već previše povezanih uređaja. Pokušajte ukloniti neke.", - "description": "" - }, - "settings": { - "message": "Postavke", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" - }, "permissions": { "message": "Permissions", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "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": "Obavijesti", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Send failed", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detalji", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Sakrij detalje", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Saznaj više o provjeri sigurnosnih brojeva", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Medijska poruka", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Broj nije registriran", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontakti", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Uvezi sve Signal grupe i kontakte sa mobilnog uređaja.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Posljednji uvoz", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Uvezi sad", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Uvozim...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Uvoz nije uspio. Provjerite jesu li Vaše računalo i mobitel spojeni na internet.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "sada", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 sat", "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": "sada", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Zvučne obavijesti", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Safety Number has changed", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Light", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Dark", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Note to Self", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Hide menu bar", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Unesi telefonski broj za dodavanje kontakta", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Neispravni broj", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Ponovno povežite Signal Desktop sa svojim mobilnim uređajem za nastavak dopisivanja.", - "description": "" - }, - "unlinked": { - "message": "Nepovezano", - "description": "" - }, - "relink": { - "message": "Ponovno povezivanje", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Dostupna nadogradnja za Session", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/hu/messages.json b/_locales/hu/messages.json index 816c2e8d9..c3948c7ae 100644 --- a/_locales/hu/messages.json +++ b/_locales/hu/messages.json @@ -3,18 +3,10 @@ "message": "Hiba másolása és kilépés", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Ismeretlen csoport", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Adatbázishiba", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Összes adat törlése és újraindítás", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Fájl", "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." @@ -35,10 +27,6 @@ "message": "&Súgó", "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": "Beállítások...", - "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": "Elrejtés", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Beállítás importálással", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Beállítás új eszközként", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Beállítás önálló eszközként", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Archív beszélgetések", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Ezek a beszélgetések archiválva vannak, ezért csak akkor jelennek meg újra a bejövő üzenet közt, ha újabb üzenet érkezik.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Beszélgetés archiválása", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Beszélgetés áthelyezése a beérkezett üzenetek közé", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Mappa kiválasztása", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Fájl kiválasztása", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Adataid betöltése", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Jelenlegi eszköz párosítása telefonoddal", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "kiválasztott könyvtár", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Adatbázis frissítése. Ez eltarthat egy darabig...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Üzenetek betöltése. Eddig $count$ db...", - "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": "Én", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Kiléptél a csoportból", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Görgetés a beszélgetés aljára", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Újabb üzenet érkezett", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Újabb üzenetek érkeztek", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 olvasatlan üzenet", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Küldés", "description": "" }, - "acceptNewKey": { - "message": "Elfogadás", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Megjelölés ellenőrzöttként", "description": "" @@ -455,10 +385,6 @@ "message": "Új biztonsági szám", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "A partnerhez kapcsolódó biztonsági számod megváltozott. Ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetést. De az is előfordulhat, hogy partnered egyszerűen újratelepítette a Signal-t. Lentebb lehetőséged van az új biztonsági szám hitelesítésére.", - "description": "" - }, "incomingError": { "message": "Nem sikerült kezelni a bejövő üzenetet.", "description": "" @@ -495,18 +421,6 @@ "message": "Ebben a hónapban", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Ez a csatolmánytípus nem támogatott. Kattints ide a lementéséhez!", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Kattints a mentéshez!", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Névtelen fájl", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Hangüzenet", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "A csatolmánytípus biztonsági okokból nincs engedélyezve", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Előnézet betöltése...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "A $domain$ hivatkozás előnézeti képének vázlata", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Nem sikerült betölteni a kiválasztott csatolmányt.", "description": "" }, - "disconnected": { - "message": "Lecsatlakozva", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Kapcsolódás", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Release notes megnyitása", "description": "" }, - "goToForums": { - "message": "Fórum megnyitása", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Támogatás megnyitása", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Hiba bejelentése", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "A Signal Desktop beállításai", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "A Signal Desktop-ról", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Beszéd", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Megjelenítés", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Elrejtés", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Kilépés", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Keresés", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Üdvözöl a Signal!", "description": "" }, - "selectAContact": { - "message": "Válassz ki egy kontaktot vagy csoportot a beszélgetés elkezdéséhez!", - "description": "" - }, "typingAlt": { "message": "Gépelési animáció ehhez a beszélgetéshez", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Üzenet küldése", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "otthoni", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Te", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Válasz neki: $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": "Hangüzenetek küldéséhez engedélyezd, hogy a Signal Desktop hozzáférjen mikrofonodhoz", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Hozzáférés engedélyezése", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Beállítások megjelenítése", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Hang", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "OK", "description": "" @@ -809,18 +665,10 @@ "message": "Mégsem", "description": "" }, - "failedToSend": { - "message": "Nem sikerült elküldeni az üzenetet néhány címzettnek. Ellenőrizd a hálózati kapcsolatot!", - "description": "" - }, "error": { "message": "Hiba", "description": "" }, - "messageDetail": { - "message": "Üzenet részletei", - "description": "" - }, "delete": { "message": "Törlés", "description": "" @@ -857,10 +705,6 @@ "message": "Csoport tagjai", "description": "" }, - "showMembers": { - "message": "Csoporttagok megjelenítése", - "description": "" - }, "resetSession": { "message": "Biztonságos munkamenet újraindítása", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Biztonsági szám megjelenítése", "description": "" }, - "viewAllMedia": { - "message": "Összes média megtekintése", - "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": "Ha szeretnéd ellenőrizni a végpontok közti titkosítás sértetlenségét $name$ nevű partnereddel, hasonlítsd össze a fenti számokat a partnered eszközén megjelenő számokkal!", "description": "", @@ -887,14 +727,6 @@ "message": "Még nem váltottál üzenetet ezzel a partnerrel. Biztonsági számod az első üzenet elküldését követően lesz elérhető.", "description": "" }, - "moreInfo": { - "message": "További információ...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Újraküldés", - "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": "Üzenet törlése", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Mentés", "description": "" }, - "fileIconAlt": { - "message": "Fájl ikon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "'$title$'-t ábrázoló emoji", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Üdvözöl a Signal Desktop!", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "A magánélet védelme nem lehetetlen. A Signal ezt egyszerűvé teszi.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Telefonod összepárosítása Signal Desktop-pal", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal beállítások", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Párosított eszközök", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' gomb", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Új eszköz párosítása", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Eszköz neve", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Jelenlegi eszköz nevének megadása", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Telefon párosításának befejezése", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Kontaktok és csoportok szinkronizálása", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Nem sikerült csatlakozni a kiszolgálóhoz.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Sajnáljuk, de már túl sok párosított eszközöd van. Próbálj kitörölni néhányat!", - "description": "" - }, - "settings": { - "message": "Beállítások", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Téma", - "description": "Header for theme settings" - }, "permissions": { "message": "Jogosultságok", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Az üzenetíró dobozba gépelt szöveg helyesírás-ellenőrzésének engedélyezése", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Adatok törlése", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Ez kitörli az alkalmazás összes adatát, beleértve üzeneteidet, illetve mentett hozzáférési adataidat is.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Adatok törlése", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Törlöd az összes adatot?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Az alkalmazás felhasználói adatainak törlésére készülsz (beleértve a kontaktokat és az összes üzenetet). A jövőben bármikor lehetőséged nyílik rá, hogy újrapárosítsd mobileszközeidet, de ez nem fogja helyreállítani a törölt üzeneteket.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Összes adat törlése", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Lecsatlakozás és összes adat törlése", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Értesítések", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Küldés sikertelen", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Részletek", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Részletek elrejtése", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Tudj meg többet a bizonsági számok ellenőrzéséről!", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Médiaüzenet", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "A telefonszám nincs regisztrálva", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontaktok", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Az összes Signal csoport és kontakt importálása mobileszközödről.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Utolsó importálás:", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importálás", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importálás folyamatban...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Az importálás nem sikerült. Győződj meg róla, hogy a számítógéped és telefonod csatlakozik-e az internetre!", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "mostanában", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 órája", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ órája", - "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$ órája", - "description": "Contracted form of 'X hours ago' which works both for singular and plural", - "placeholders": { - "hours": { - "content": "$1", - "example": "2" - } - } - }, - "minutesAgoShort": { - "message": "$minutes$ perce", - "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$ perce", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "mostanában", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Hangjelzés", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Biztonsági szám megváltozott", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Világos", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Sötét", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Privát feljegyzés", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Menü elrejtése", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Új beszélgetés megkezdése…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Telefonszám", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Érvénytelen telefonszám", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Párosítsd újra a Signal Desktopot mobilkészülékeiddel az beszélgetés folytatásához!", - "description": "" - }, - "unlinked": { - "message": "Nincs párosítva", - "description": "" - }, - "relink": { - "message": "Újrapárosítás", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session frissítés elérhető", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/id/messages.json b/_locales/id/messages.json index 674e19aeb..d34373711 100644 --- a/_locales/id/messages.json +++ b/_locales/id/messages.json @@ -3,18 +3,10 @@ "message": "Copy error and quit", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Unknown group", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Database Error", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Delete all data and restart", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Berkas", "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." @@ -35,10 +27,6 @@ "message": "&Bantuan", "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": "Preferensi...", - "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": "Sembunyikan", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Siapkan dengan Impor", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Siapkan sebagai Perangkat Baru", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Siapkan untuk Perangkat Berdiri Sendiri", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Percakapan Terarsipkan", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archive Conversation", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Move Conversation to Inbox", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Pilih map", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Pilih berkas", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Memuat data Anda", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Sambungkan perangkat ini dengan telpon Anda", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "lokasi pilihan Anda", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Pemutakhiran basisdata. Ini mungkin memakan waktu lama ...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Memuat pesan $count$ sejauh ini...", - "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": "Saya", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Anda telah meninggalkan group", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Gulir ke bagian bawah pembicaraan", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Pesan baru di bawah", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Pesan baru di bawah", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 Pesan Belum Dibaca", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Kirim", "description": "" }, - "acceptNewKey": { - "message": "Terima", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Tandai terverifikasi", "description": "" @@ -455,10 +385,6 @@ "message": "Nomor keamanan baru", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Nomor keamanan Anda dengan kontak ini telah berubah. Ini bisa berarti ada seseorang mencoba mencegat komunikasi Anda, atau kontak telah menghapus aplikasi Signal. Anda mungkin ingin memverifikasi nomor keamanan baru di bawah.", - "description": "" - }, "incomingError": { "message": "Gagal dalam menangani pesan masuk", "description": "" @@ -495,18 +421,6 @@ "message": "Bulan ini", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Jenis lampiran tidak didukung. Klik untuk menyimpan.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Klik untuk simpan", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "File tanpa nama", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Pesan Suara", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Jenis lampiran tidak diperbolehkan untuk alasan keamanan", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Tidak bisa memuat lampiran yang dipilih.", "description": "" }, - "disconnected": { - "message": "Terputus", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Menghubungi", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Lihat Catatan Rilis", "description": "" }, - "goToForums": { - "message": "Cek Forum", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Cek halaman bantuan", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Laporkan masalah ", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Preferensi Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Mengenai Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Bicara", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Tunjukkan", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Sembunyikan", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Berhenti", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Pencarian", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Selamat datang di Signal", "description": "" }, - "selectAContact": { - "message": "Pilih kontak atau grup untuk mulai mengobrol.", - "description": "" - }, "typingAlt": { "message": "Animasi pengetikan untuk percakapan ini", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Kirim Pesan", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "Beranda", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Anda", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Membalas ke $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": "Untuk mengirimkan pesan suara, izinkan Signal Desktop untuk mengakses mikrofon anda.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Izinkan Akses", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Tunjukkan Pengaturan", - "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" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "OK", "description": "" @@ -809,18 +665,10 @@ "message": "Batal", "description": "" }, - "failedToSend": { - "message": "Gagal mengirim. Cek sambungan jaringan Anda.", - "description": "" - }, "error": { "message": "Galat", "description": "" }, - "messageDetail": { - "message": "Detail Pesan", - "description": "" - }, "delete": { "message": "Hapus", "description": "" @@ -857,10 +705,6 @@ "message": "Anggota Grup", "description": "" }, - "showMembers": { - "message": "Tampilkan anggota", - "description": "" - }, "resetSession": { "message": "Mengatur ulang sesi", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Lihat nomor keamanan", "description": "" }, - "viewAllMedia": { - "message": "Lihat seluruh 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": "Jika Anda ingin memverifikasi keamanan enkripsi antarpengguna dengan $name$, bandingkan angka di atas dengan nomor di perangkat mereka.", "description": "", @@ -887,14 +727,6 @@ "message": "Anda belum mengirim pesan apapun dengan kontak ini. Nomor keamanan Anda dengan kontak ini akan tersedia sesaat setelah pesan pertama.", "description": "" }, - "moreInfo": { - "message": "Informasi Selengkapnya...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Mencoba mengirim kembali", - "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": "Hapus Pesan", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Simpan", "description": "" }, - "fileIconAlt": { - "message": "Ikon Berkas", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Gambar emoji dari '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Selamat datang di Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privasi itu mungkin. Signal membuatnya lebih mudah.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Sambungkan telpon Anda dengan Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Pengaturan Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Perangkat Tersambung", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' Tombol", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Sambungkan Perangkat Baru", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Nama Perangkat", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Pilih nama perangkat Anda", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Selesaikan menghubungkan telepon", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Sinkronisasi dengan kontak dan grup", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Gagal menyambungkan ke peladen.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Maaf, Anda menautkan perangkat terlalu banyak. Coba hapus sebagian.", - "description": "" - }, - "settings": { - "message": "Pengaturan", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" - }, "permissions": { "message": "Perizinan", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Aktifkan pengecek ejaan dalam kotak pesan", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Bersihkan data", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Ini akan menghapus semua data dalam aplikasi, membuang seluruh pesan dan informasi akun terpisah.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Bersihkan data", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Hapus semua data?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Anda akan menghapus semua informasi dari akun Anda dalam aplikasi ini, termasuk semua kontak dan pesan. Anda selalu dapat menghubungkan dengan perangkat seluler Anda lagi, tetapi itu tidak akan memulihkan pesan yang dihapus.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Hapus seluruh data", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Putuskan sambungan dan hapuskan semua data", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Pemberitahuan", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Pengiriman gagal", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detail", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Sembunyikan detail", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Pelajari lebih jauh tentang verifikasi nomor keamanan", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Pesan berisi media", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Nomor tidak terdaftar", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontak", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Impor semua grup Signal dan kontak dari semua perangkat mobil Anda.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Impor terakhir pada", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Impor sekarang", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Impor ...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Impor gagal. Pastikan komputer dan perangkat Anda tersambung ke jaringan internet.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "sekarang", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 jam", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ jam", - "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$ jam yang lalu", - "description": "Contracted form of 'X hours ago' which works both for singular and plural", - "placeholders": { - "hours": { - "content": "$1", - "example": "2" - } - } - }, - "minutesAgoShort": { - "message": "$minutes$ menit", - "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$ menit yang lalu", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "sekarang", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Mainkan suara pemberitahuan", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Angka keamanan telah diganti", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Terang", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Gelap", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Catatan Pribadi", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Sembunyikan kolom menu", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Masukkan nomor telepon untuk menambahkan kontak.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Nomor salah", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Sambungkan kembali Signal Desktop ke perangkat mobil Anda untuk melanjutkan pesan.", - "description": "" - }, - "unlinked": { - "message": "Tidak tersambung", - "description": "" - }, - "relink": { - "message": "Sambungkan kembali", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Tersedia Session versi terbaru", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/it/messages.json b/_locales/it/messages.json index 85290dfee..281610a76 100644 --- a/_locales/it/messages.json +++ b/_locales/it/messages.json @@ -3,18 +3,10 @@ "message": "Copia l'errore ed esci", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Gruppo sconosciuto", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Errore del database", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Elimina tutti i dati e riavvia", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "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." @@ -35,10 +27,6 @@ "message": "&Aiuto", "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": "Preferenze...", - "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": "Nascondi", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Configura con l'importazione", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Configura come nuovo dispositivo", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Imposta come dispositivo autonomo", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Conversazioni archiviate", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Queste conversazioni sono archiviate e compariranno nella lista di chat solo se verranno ricevuti nuovi messaggi.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archivia conversazione", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Ripristina conversazione", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Scegli la cartella", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Scegli file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Carica i tuoi dati", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Collega questo dispositivo con il tuo telefono", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "il percorso selezionato", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Aggiornamento database. Questo potrebbe richiedere del tempo...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Caricamento messaggi. Finora $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": "Me", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Hai lasciato il gruppo.", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Scorri verso la fine della conversazione", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Nuovo messaggio a seguire", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nuovi messaggi a seguire", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "$count$ Messaggio Non Letto", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Invia", "description": "" }, - "acceptNewKey": { - "message": "Accetta", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Segna come verificato", "description": "" @@ -455,10 +385,6 @@ "message": "Nuovo codice di sicurezza", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Il codice di sicurezza con questo contatto è cambiato. Questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che il contatto ha semplicemente reinstallato Signal.", - "description": "" - }, "incomingError": { "message": "Errore messaggio in arrivo", "description": "" @@ -495,18 +421,6 @@ "message": "Questo Mese", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Tipo di allegato non supportato. Clicca per salvare.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Clicca per salvare", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "File senza nome", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Messaggio vocale", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Il tipo di allegato non è consentito per ragioni di sicurezza", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Caricamento anteprima...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Miniatura temporanea anteprima link per $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Attenzione, c'è stato un errore nell'inviare il tuo allegato.", "description": "" }, - "disconnected": { - "message": "Sconnesso", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Connessione in corso...", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Vai alle note di rilascio", "description": "" }, - "goToForums": { - "message": "Vai ai forum", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Vai alla pagina di supporto", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Segnala un problema", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Preferenze di Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Informazioni su Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Parlato", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Mostra", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Nascondi", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Esci", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Cerca", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Benvenuto su Session", "description": "" }, - "selectAContact": { - "message": "Per iniziare una chat seleziona un contatto o un gruppo.", - "description": "" - }, "typingAlt": { "message": "Animazione per battitura per questa conversazione", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Invia messaggio", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "Casa", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Tu", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Rispondendo a $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": "Per poter mandare un messaggio audio, permetti a Session di accedere al tuo microfono.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Consenti accesso", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Mostra le impostazioni", - "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" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "OK", "description": "" @@ -809,18 +665,10 @@ "message": "Annulla", "description": "" }, - "failedToSend": { - "message": "Invio fallito per alcuni destinatari. Controllare la connessione di rete.", - "description": "" - }, "error": { "message": "Errore", "description": "" }, - "messageDetail": { - "message": "Dettagli messaggio", - "description": "" - }, "delete": { "message": "Cancella", "description": "" @@ -857,10 +705,6 @@ "message": "Membri del gruppo", "description": "" }, - "showMembers": { - "message": "Mostra membri", - "description": "" - }, "resetSession": { "message": "Azzera La Sessione Sicura", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Mostra Codice Di Sicurezza", "description": "" }, - "viewAllMedia": { - "message": "Guarda tutti i 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": "Se desideri verificare la sicurezza della tua codifica end-to-end con $name$, confronta i numeri qui sopra con quelli del suo dispositivo.", "description": "", @@ -887,14 +727,6 @@ "message": "Non hai ancora scambiato alcun messaggio con questo contatto. Il codice di sicurezza sarà disponibile dopo il primo messaggio.", "description": "" }, - "moreInfo": { - "message": "Maggiori informazioni...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Riprova a inviare", - "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": "Cancella Messaggio", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Salva", "description": "" }, - "fileIconAlt": { - "message": "Icona del file", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji immagine di '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Benvenuto in Signal per Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "La privacy è possibile. Signal la rende facile.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Collega il tuo telefono a Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Impostazioni di Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Dispositivi collegati", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Bottone \"+\"", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Collega Nuovo Dispositivo", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Nome del dispositivo", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Scegliere il nome di questo dispositivo", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Completa il collegamento del telefono", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Sincronizzazione contatti e gruppi", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Connessione al server non riuscita.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Spiacente, hai troppi dispositivi collegati. Prova a rimuoverne qualcuno.", - "description": "" - }, - "settings": { - "message": "Impostazioni", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" - }, "permissions": { "message": "Permessi", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Abilita il controllo ortografico del testo inserito nella casella di composizione", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Rimuovi dati", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Questo rimuoverà tutti i dati dell'applicazione, compresi i messaggi e le informazioni dell'account.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Rimuovi dati", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Cancellare tutti i dati?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Stai per cancellare tutti i dati salvati nell'applicazione, compresi i contatti e i messaggi. Potrai sempre ricollegare il tuo dispositivo mobile, ma questo non ripristinerà i messaggi cancellati.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Cancella tutti i dati", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Disconnessione e cancellazione di tutti i dati", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Notifiche", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Invio Non Riuscito", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Dettagli", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Nascondi dettagli", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Scopri di più sulla verifica dei codici di sicurezza", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Messaggio multimediale", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Il numero non è registrato", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Contatti", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importa dal tuo dispositivo mobile tutti i contatti e i gruppi Signal.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Ultima importazione il", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importa ora", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importazione...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Importazione fallita. Assicurati che il tuo computer e il tuo telefono siano connessi a Internet.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "Ora", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 ora", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ ore", - "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$ ore fa", - "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$ minuti fa", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "ora", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Avvia notifica audio", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Codice di sicurezza cambiato", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Chiaro", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Scuro", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Note personali", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Nascondi la barra del menu", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Inizia una nuova conversazione...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Scrivi un numero da aggiungere ai contatti", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Numero non valido", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Per continuare a scrivere messaggi ricollega Signal Desktop al tuo dispositivo mobile.", - "description": "" - }, - "unlinked": { - "message": "Scollegato", - "description": "" - }, - "relink": { - "message": "Ricollegato", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Aggiornamento Session disponibile", "description": "" diff --git a/_locales/ja/messages.json b/_locales/ja/messages.json index 1b60fd00f..36cd03d12 100644 --- a/_locales/ja/messages.json +++ b/_locales/ja/messages.json @@ -3,18 +3,10 @@ "message": "Copy error and quit", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Unknown group", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Database Error", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Delete all data and restart", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "ファイル (&F)", "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." @@ -35,10 +27,6 @@ "message": "ヘルプ (&H)", "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": "設定...", - "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": "最小化", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "インポートデータを使ってセットアップ", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "新しいデバイスとしてセットアップ", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "独立したデバイスとして設定", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "保存済みの会話", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "この会話は保存されます。新しいメッセージが届いた場合だけ受信箱に表示されます。", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archive Conversation", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Move Conversation to Inbox", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "フォルダを選択", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Choose file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "データを読み込む", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "この端末をモバイル端末とリンクする", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "選択したフォルダ", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "データベースを更新しています。しばらく掛かるかも知れません。", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "メッセージを読み込んでいます。今のところ$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": "自分", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "グループを退出しました。", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "一番下までスクロール", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "新着メッセージ", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "新着メッセージ", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 件の未読メッセージ", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "提出", "description": "" }, - "acceptNewKey": { - "message": "受け入れる", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "検証済みにする", "description": "" @@ -455,10 +385,6 @@ "message": "新しい安全番号", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "このコンタクトとの安全番号が変わりました。誰かがこの会話を盗聴しようとしていることか、コンタクトはただ、Signalをまたインストールしたの2つの理由となります。以下の安全番号を確認してください。", - "description": "" - }, "incomingError": { "message": "受信中にエラー", "description": "" @@ -495,18 +421,6 @@ "message": "今月", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "サポートされていない種類の添付ファイルです。クリックして保存してください。", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "クリックして保存", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "無名のファイル", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "音声メッセージ", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "セキュリティ上の理由で許可されていない種類の添付ファイルです", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "選択された添付ファイルをロードできません。", "description": "" }, - "disconnected": { - "message": "接続オフ", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "接続完了", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "リリースノートを閲覧", "description": "" }, - "goToForums": { - "message": "フォーラムに参加", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "サポートページへ", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "バグを報告", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop設定", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Signal Desktop とは", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "スピーチ", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "表示", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "最小化", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "終了", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "検索", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Signalにようこそ", "description": "" }, - "selectAContact": { - "message": "会話を始めるには連絡先かグループを選択してください", - "description": "" - }, "typingAlt": { "message": "Typing animation for this conversation", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "メッセージ送信", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "自宅", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "自分", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "$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": "音声メッセージを送るには、Signalのマイクへのアクセスを許可してください。", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "アクセスを許可する", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "設定を表示", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "音声", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "OK", "description": "" @@ -809,18 +665,10 @@ "message": "キャンセル", "description": "" }, - "failedToSend": { - "message": "宛先の一部で送信に失敗しました。ネットワークの接続をチェックしてください。", - "description": "" - }, "error": { "message": "エラー", "description": "" }, - "messageDetail": { - "message": "メッセージ詳細", - "description": "" - }, "delete": { "message": "削除する", "description": "" @@ -857,10 +705,6 @@ "message": "グループのメンバー", "description": "" }, - "showMembers": { - "message": "メンバーを表示する", - "description": "" - }, "resetSession": { "message": "接触を再設定", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "安全番号を表示する", "description": "" }, - "viewAllMedia": { - "message": "すべてのメディアを表示", - "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": "$name$との端末間暗号の安全性を検証するには,上記の番号が相手端末上の番号と同じか確認してください。", "description": "", @@ -887,14 +727,6 @@ "message": "このコンタクトとまだメッセージを交換していません。最初のメッセージから安全番号は交換します。", "description": "" }, - "moreInfo": { - "message": "詳細...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "再送信する", - "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": "メッセージを削除", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "保存", "description": "" }, - "fileIconAlt": { - "message": "ファイルのアイコン", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "「$title$」の絵文字画像", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Signal Desktopにようこそ", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "プライバシーは守れます。Signalを使えば簡単に。", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "モバイル端末をSignal Desktopにリンクする", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signalの設定", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "リンクされた端末", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' ボタン", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "新規の端末をリンクする", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "デバイス名", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "この端末の名前を選択", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "モバイル端末とのリンクを終了", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "連絡先とグループを同期中", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "サーバーに接続できませんでした", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "結び付けているデバイスが多すぎます。どれかを切り離してください。", - "description": "" - }, - "settings": { - "message": "設定", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "テーマ", - "description": "Header for theme settings" - }, "permissions": { "message": "アクセス許可", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "メッセージボックスに入力されたテキストのスペルチェックを有効にする", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "データ消去", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "アプリケーション中のすべてのメッセージと、保存されたアカウント情報を削除します。", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "データを消去", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "すべてのデータを削除しますか?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "このアプリからすべてのアカウント情報を(連絡先とメッセージも含めて)削除します。また後で再びモバイルデバイスを追加できますが、削除されるメッセージを元に戻すことができません。", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "すべてのデータを削除", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "接続を切って全データを削除しています", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "通知", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "送信できませんでした", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "詳細", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "詳細を隠す", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "安全番号を確認することについて", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "メディアメッセージ", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "宛先の電話番号は登録されていません", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "連絡先", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Signalのグループと連絡先を携帯端末から取り込む", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "最近の取り込みは", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "取り込む", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "取り込み中……", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "取り込みに失敗しました。パソコンと携帯端末がインターネットに接続されているか確認してください。", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "1分以内", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1時間", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$時間", - "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$時間前", - "description": "Contracted form of 'X hours ago' which works both for singular and plural", - "placeholders": { - "hours": { - "content": "$1", - "example": "2" - } - } - }, - "minutesAgoShort": { - "message": "$minutes$分", - "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$分前", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "1分以内", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "音声通知を有効にする", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "安全番号が変更されました", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "ライト", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "ダーク", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "自分のためのメモ", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "メニューバーを最小化", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "電話番号を入力して連絡先を追加する", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "不正な番号です", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "メッセージを継続するために携帯端末と再接続する。", - "description": "" - }, - "unlinked": { - "message": "未接続", - "description": "" - }, - "relink": { - "message": "再接続", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Sessionのアップデートがあります", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/km/messages.json b/_locales/km/messages.json index ce300cfda..fd55b3687 100644 --- a/_locales/km/messages.json +++ b/_locales/km/messages.json @@ -3,18 +3,10 @@ "message": "ចម្លងបញ្ហា និងចាកចេញ", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "ក្រុមមិនស្គាល់", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "បញ្ហាទិន្នន័យ", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "លុបទិន្នន័យទាំងអស់ និងបើកឡើងវិញ", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&ឯកសារ", "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." @@ -35,10 +27,6 @@ "message": "&ជំនួយ", "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": "ចំណង់ចំណូលចិត្ត...", - "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": "លាក់", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "ដំឡើង ជាមួយការនាំចូល", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "ដំឡើង ជាឧបករណ៍ថ្មី", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "ដំឡើង ជាឧបករណ៍ដាច់ដោយឡែក", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "បណ្ណសារសន្ទនា", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "ការសន្ទនាទាំងនេះ នឹងត្រូវធ្វើបណ្ណសារ និងបង្ហាញក្នុងប្រអប់សំបុត្រតែប៉ុណ្ណោះ ប្រសិនបើទទួលបានសារថ្មី។", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "បណ្ណសារការសន្ទនា", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "ផ្លាស់ប្តូរការសន្ទនាទៅប្រអប់សារ", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "ជ្រើសរើសទីតាំងផ្ទុក", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "ជ្រើសរើសឯកសារ", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "ផ្ទុកទិន្នន័យរបស់អ្នក", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "តភ្ជាប់ឧបករណ៍នេះ ទៅកាន់ទូរស័ព្ទរបស់អ្នក", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "ទីតាំងអ្នកបានជ្រើសរើស", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "កំពុងដំឡើងទិន្នន័យ។ វាអាចចំណាយពេលខ្លះ...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "កំពុងផ្ទុកសារ។ $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": "ខ្ញុំ", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "អ្នកបានចាកចេញពីក្រុម", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "រំកិលចុះក្រោមនៃការសន្ទនា", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "សារថ្មីខាងក្រោម", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "សារថ្មីខាងក្រោម", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "សារមិនទាន់អាន 1 ", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "បញ្ជូន", "description": "" }, - "acceptNewKey": { - "message": "យល់ព្រម", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "ដាក់ថាបានផ្ទៀងផ្ទាត់", "description": "" @@ -455,10 +385,6 @@ "message": "លេខសុវត្ថិភាពថ្មី", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "លេខសុវត្ថិភាពរបស់អ្នក ជាមួយលេខទំនាក់ទំនងនេះបានផ្លាស់ប្តូរ។ នេះអាចមានន័យថា មានគេកំពុងព្យាយាមជ្រាតចូលការទំនាក់ទំនងរបស់អ្នក, ឬ លេខទំនាក់ទំនងនេះបានដំឡើង Signal ឡើងវិញ។ អ្នកអាចត្រូវផ្ទៀងផ្ទាត់លេខសុវត្ថិភាពខាងក្រោម។", - "description": "" - }, "incomingError": { "message": "បញ្ហាទទួលសារផ្ញើចូល", "description": "" @@ -495,18 +421,6 @@ "message": "ខែនេះ", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "មិនគាំទ្រប្រភេទឯកសារភ្ជាប់។ ចុច ដើម្បីរក្សាទុក។", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "ចុច ដើម្បីរក្សាទុក", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "ឯកសារគ្មានឈ្មោះ", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "សារសំឡេង", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "ប្រភេទឯកសារភ្ជាប់មិនអនុញ្ញាតសម្រាប់ហេតុផលសុវត្ថិភាព", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "កំពុងផ្ទុកការមើល...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "ការមើលតំណជារូបភាពតូចៗព្រាងសម្រាប់ $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "មិនអាចផ្ទុកឯកសារភ្ជាប់ដែលបានជ្រើសរើស។", "description": "" }, - "disconnected": { - "message": "បានផ្តាច់", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "កំពុងតភ្ជាប់", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "ចូលទៅកាន់កំណត់ចេញថ្មី", "description": "" }, - "goToForums": { - "message": "ចូលទៅកាន់ វេទិកា", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "ចូលទៅកាន់ទំព័រគាំទ្រ", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "រាយការណ៍បញ្ហាមួយ", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "ចំណង់ចំណូលចិត្តSignal Desktop ", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "អំពី Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "សម្តី", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "បង្ហាញ", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "លាក់", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "ចាកចេញ", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "ស្វែងរក", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "ស្វាគមន៍មកកាន់ Signal", "description": "" }, - "selectAContact": { - "message": "ជ្រើសរើសលេខទំនាក់ទំនងមួយ ឬក្រុម ដើម្បីចាប់ផ្តើមការសន្ទនា។", - "description": "" - }, "typingAlt": { "message": "ការវាយចលនាសម្រាប់ការសន្ទនានេះ", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "ផ្ញើសារ", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "ផ្ទះ", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "អ្នក", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "កំពុងឆ្លើយតបទៅកាន់ $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": "ដើម្បីបញ្ជូនសារសំឡេង អនុញ្ញាតឲ្យSignal Desktop ចូលប្រើប្រាស់ម៉ៃក្រូហ្វូនរបស់អ្នក។", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "អនុញ្ញាតចូលប្រើប្រាស់", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "បង្ហាញការកំណត់", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "សំឡេង", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "យល់ព្រម", "description": "" @@ -809,18 +665,10 @@ "message": "លះបង់", "description": "" }, - "failedToSend": { - "message": "បរាជ័យក្នុងការផ្ញើទៅកាន់អ្នកទទួល។ ពិនិត្យការតភ្ជាប់បណ្តាញរបស់អ្នក។", - "description": "" - }, "error": { "message": "បញ្ហា", "description": "" }, - "messageDetail": { - "message": "សារលម្អិត", - "description": "" - }, "delete": { "message": "លុប", "description": "" @@ -857,10 +705,6 @@ "message": "សមាជិកក្រុម", "description": "" }, - "showMembers": { - "message": "បង្ហាញសមាជិក", - "description": "" - }, "resetSession": { "message": "កំណត់ការប្រើប្រាស់ឡើងវិញ", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "បង្ហាញលេខសុវត្ថិភាព", "description": "" }, - "viewAllMedia": { - "message": "បង្ហាញឯកសារមេឌាទាំងអស់", - "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": "បើសិនអ្នកចង់ផ្ទៀងផ្ទាត់សុវត្ថិភាព នៃកូដបនីយកម្មរបស់អ្នកជាមួយ $name$ សូមប្រៀបធៀបលេខខាងលើជាមួយលេខនៅលើឧបករណ៍របស់ពួកគេ។", "description": "", @@ -887,14 +727,6 @@ "message": "អ្នកមិនទាន់បានផ្តោះប្តូរសារណាមួយជាមួយលេខទំនាក់ទំនងនេះទេ។ លេខសុវត្ថិភាពរបស់អ្នកជាមួយគេ នឹងមានបន្ទាប់ពីផ្ញើសារដំបូង។", "description": "" }, - "moreInfo": { - "message": "ព័ត៌មានបន្ថែម...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "ផ្ញើម្តងទៀត", - "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": "លុបសារ", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "រក្សាទុក", "description": "" }, - "fileIconAlt": { - "message": "រូបតំណាងឯកសារ", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "រូបEmoji របស់ '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "ស្វាគមន៍មកកាន់ Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "ភាពឯកជនគឺអាចធ្វើទៅបាន។ Signalធ្វើបានដោយងាយស្រួល។", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "តភ្ជាប់ទូរស័ព្ទរបស់អ្នក ទៅកាន់ Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "ការកំណត់ Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "ឧបករណ៍បានតភ្ជាប់", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' ប៊ូតុង", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "តភ្ជាប់ឧបករណ៍ថ្មី", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "ឈ្មោះឧបករណ៍", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "ជ្រើសរើសឈ្មោះឧបករណ៍នេះ", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "បញ្ចប់ការតភ្ជាប់ទូរស័ព្ទ", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "កំពុងចម្លងបញ្ជីទំនាក់ទំនង និងក្រុម", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "បរាជ័យក្នុងការតភ្ជាប់ទៅកាន់ម៉ាស៊ីនមេ។", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "សុំទោស, អ្នកបានភ្ជាប់ឧបករណ៍ច្រើនរួចហើយ។ ព្យាយាមលុបចោលខ្លះ។", - "description": "" - }, - "settings": { - "message": "ការកំណត់", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "រូបរាង", - "description": "Header for theme settings" - }, "permissions": { "message": "ការអនុញ្ញាត", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "បើកការត្រួតពិនិត្យអក្ខរាវិរុទ្ធនៃពាក្យដែលបានបញ្ចូលក្នុងប្រអប់ផ្ញើសារ", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "សំអាតទិន្នន័យ", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "វានឹងសំអាតទិន្នន័យទាំងអស់ក្នុងកម្មវិធី, នឹងលុបចោលសារទាំងអស់ និងព័ត៌មានគណនីដែលបានរក្សាទុក។", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "សំអាតទិន្នន័យ", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "លុបចោលទិន្នន័យទាំងអស់?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "អ្នករៀបនឹងលុបព័ត៌មានគណនី ដែលបានរក្សាទុកទាំងអស់​របស់កម្មវិធីនេះ រួមទាំង បញ្ជីទំនាក់ទំនងនិងសារទាំងអស់។ អ្នកតែងតែអាចភ្ជាប់ជាមួយឧបករណ៍ចល័តរបស់អ្នកម្ដងទៀត ប៉ុន្តែវានឹងមិនអាចស្តារសារដែលបានលុបនោះទេ។", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "លុបចោលទិន្នន័យទាំងអស់", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "កំពុងផ្តាច់ និងលុបចោលទិន្នន័យទាំងអស់", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "ការជូនដំណឹង", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "ផ្ញើបរាជ័យ", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "លម្អិត", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "លាក់ ខ្លឹមសារលម្អិត", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "ស្វែងយល់បន្ថែមពីការផ្ទៀងផ្ទាត់លេខសុវត្ថិភាព", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "សារមេឌា", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "លេខ មិនបានចុះឈ្មោះ", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "បញ្ជីទំនាក់ទំនង", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "នាំចូលក្រុម និងបញ្ជីទំនាក់ទំនង Signalទាំងអស់ ពីទូរស័ព្ទរបស់អ្នក។", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "នាំចូលចុងក្រោយនៅ", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "នាំចូលឥឡូវ", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "កំពុងនាំចូល...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "ការនាំចូលបរាជ័យ។ ត្រូវប្រាកដថាកុំព្យូទ័រ និងទូរស័ព្ទរបស់អ្នកបានតភ្ជាប់ទៅកាន់អ៊ិនធឺណិត។", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "ឥឡូវ", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 ម៉ោង", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ ម៉ោង", - "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$ ម៉ោង មុន", - "description": "Contracted form of 'X hours ago' which works both for singular and plural", - "placeholders": { - "hours": { - "content": "$1", - "example": "2" - } - } - }, - "minutesAgoShort": { - "message": "$minutes$ នាទី", - "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$ នាទី មុន", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "ឥឡូវ", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "ខែ ថ្ងៃ", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "លេងសំឡេងជូនដំណឹង", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "លេខសុវត្ថិភាពបានផ្លាស់ប្តូរ", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "ភ្លឺ", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "ងងឹត", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "កំណត់ចំណាំ", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "លាក់របារម៉ឺនុយ", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "ចាប់ផ្តើមការសន្ទនាថ្មី...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "បញ្ចូលលេខទូរស័ព្ទ ដើម្បីបន្ថែមលេខទំនាក់ទំនង។", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "លេខមិនត្រឹមត្រូវ", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "តភ្ជាប់ Signal Desktop ទៅកាន់ទូរស័ព្ទរបស់អ្នកឡើងវិញ ដើម្បីបន្តការផ្ញើសារ។", - "description": "" - }, - "unlinked": { - "message": "បានផ្តាច់", - "description": "" - }, - "relink": { - "message": "តភ្ជាប់ឡើងវិញ", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "មានបច្ចុប្បន្នភាព Session", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/kn/messages.json b/_locales/kn/messages.json index 303de1ea8..28db866f4 100644 --- a/_locales/kn/messages.json +++ b/_locales/kn/messages.json @@ -3,18 +3,10 @@ "message": "Copy error and quit", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Unknown group", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Database Error", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Delete all data and restart", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "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." @@ -35,10 +27,6 @@ "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" @@ -135,10 +123,6 @@ "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" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Archived Conversations", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archive Conversation", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Move Conversation to Inbox", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Choose folder", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Choose file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Load your data", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "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": "your selected location", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Upgrading database. This may take some time...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Loading messages. $count$ so far...", - "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": "ನಾನು", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "You left the group", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Scroll to bottom of conversation", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "New message below", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "ಕೆಳಗೆ ಹೊಸ ಸಂದೇಶಗಳು ಇವೆ", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 ಓದದಿರುವ ಸಂದೇಶ", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "ಸಲ್ಲಿಸಿ", "description": "" }, - "acceptNewKey": { - "message": "ಒಪ್ಪಿಕೊಳ್ಳಿ", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Mark as verified", "description": "" @@ -455,10 +385,6 @@ "message": "ಹೊಸ ಸುರಕ್ಷತೆ ಸಂಖ್ಯೆ", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Your safety number with this contact has changed. This could either mean that someone is trying to intercept your communication, or this contact simply reinstalled Signal. You may wish to verify the new safety number below.", - "description": "" - }, "incomingError": { "message": "Error handling incoming message", "description": "" @@ -495,18 +421,6 @@ "message": "This Month", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "ಬೆಂಬಲವಿಲ್ಲದ ಲಗತ್ತಿನ ಪ್ರಕಾರ. ಉಳಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "ಉಳಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Unnamed File", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "ಧ್ವನಿ ಸಂದೇಶ", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Attachment type not allowed for security reasons", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Unable to load selected attachment.", "description": "" }, - "disconnected": { - "message": "ಸಂಪರ್ಕ ಕಡಿತಗೊಂಡಿದೆ", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "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" @@ -619,14 +521,6 @@ "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": "About Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Speech", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "ತೋರಿಸು", "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" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "ಹುಡುಕಿ", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "ಸಿಗ್ನಲ್‌ಗೆ ಸ್ವಾಗತ", "description": "" }, - "selectAContact": { - "message": "ಸಂವಾದ ಪ್ರಾರಂಭಿಸಲು ಸಂಪರ್ಕ ಅಥವಾ ಗುಂಪುನ್ನು ಆಯ್ಕೆಮಾಡಿಕೊಳ್ಳಿ.", - "description": "" - }, "typingAlt": { "message": "Typing animation for this conversation", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "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" @@ -759,16 +633,6 @@ "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" @@ -777,10 +641,6 @@ "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" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "ಸರಿ", "description": "" @@ -809,18 +665,10 @@ "message": "ರದ್ದುಗೊಳಿಸಿ", "description": "" }, - "failedToSend": { - "message": "ಕೆಲವು ಸ್ವೀಕೃತದಾರರಿಗೆ ಕಳುಹಿಸಲಾಗಲ್ಲಿಲ್ಲ. ನಿಮ್ಮ ಜಾಲಬಂಧವನ್ನು ಪರಿಶೀಲಿಸಿ.", - "description": "" - }, "error": { "message": "ದೋಷ", "description": "" }, - "messageDetail": { - "message": "ಸಂದೇಶದ ವಿವರಗಳು", - "description": "" - }, "delete": { "message": "ಅಳಿಸು", "description": "" @@ -857,10 +705,6 @@ "message": "Group members", "description": "" }, - "showMembers": { - "message": "ಸದಸ್ಯರನ್ನು ತೋರಿಸು", - "description": "" - }, "resetSession": { "message": "Reset session", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "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": "If you wish to verify the security of your end-to-end encryption with $name$, compare the numbers above with the numbers on their device.", "description": "", @@ -887,14 +727,6 @@ "message": "ನೀವು ಇನ್ನೂ ಈ ಸಂಪರ್ಕದೊಂದಿಗೆ ಯಾವುದೇ ಸಂದೇಶಗಳನ್ನು ವಿನಿಮಯ ಮಾಡಿಲ್ಲ. ಅವರೊಂದಿಗೆ ನಿಮ್ಮ ಸುರಕ್ಷತಾ ಸಂಖ್ಯೆ ಮೊದಲ ಸಂದೇಶದ ನಂತರ ಲಭ್ಯವಿರುತ್ತದೆ.", "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" @@ -939,10 +771,6 @@ "message": "ಉಳಿಸಿ", "description": "" }, - "fileIconAlt": { - "message": "File icon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Signal ಗಣಕತೆರೆಗೆ ಸ್ವಾಗತ", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "ಖಾಸಗಿತನ ಸಾಧ್ಯ. Signal ಇದನ್ನು ಸುಲಭವಾಗಿಸುತ್ತದೆ.", - "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": "ಪೂರೈಕೆಗಣಕದ ಜೋತೆ ಸಂಪರ್ಕ ವಿಫಲವಾಗಿದೆ.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "ಕ್ಷಮಿಸಿ, ನೀವು ಹಲವಾರು ಸಾಧನಗಳು ಈಗಾಗಲೇ ಜೋಡಿಸಿದ್ದೀರಿ. ಕೆಲವನ್ನು ತೆಗೆದುಹಾಕಲು ಪ್ರಯತ್ನಿಸಿ.", - "description": "" - }, - "settings": { - "message": "ಸಿದ್ಧತೆಗಳು", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Theme", - "description": "Header for theme settings" - }, "permissions": { "message": "Permissions", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "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": "ಸೂಚನೆಗಳು", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Send failed", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "ವಿವರಗಳು", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "ವಿವರಗಳನ್ನು ಮರೆಮಾಡಿ", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Learn more about verifying safety numbers", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "ಮಾಧ್ಯಮ ಸಂದೇಶ", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "ಸಂಖ್ಯೆ ನೋಂದಣಿಯಾಗಿಲ್ಲ", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "ಸಂಪರ್ಕಗಳು", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "ನಿಮ್ಮ ಮೊಬೈಲ್ ಸಾಧನದಿಂದ ಎಲ್ಲಾ Signal ಗುಂಪುಗಳು ಮತ್ತು ಸಂಪರ್ಕಗಳನ್ನು ಆಮದು ಮಾಡಿಕೋಌ", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "ಕಳೆದ ಆಮದು", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "ಈಗ ಆಮದು ಮಾಡಿ", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "ಆಮದು ಮಾಡಲಾಗುತ್ತಿದೆ ...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "ಆಮದು ವಿಫಲವಾಗಿದೆ. ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ ಮತ್ತು ನಿಮ್ಮ ಫೋನ್ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕ ಹೊಂದಿರುವ ಬಗ್ಗೆ ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "ಈಗ", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 ಗಂಟೆ", "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": "ಈಗ", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Play audio notification", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Safety Number has changed", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Light", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Dark", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Note to Self", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Hide menu bar", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Enter a phone number to add a contact.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "ತಪ್ಪಾದ ಸಂಖ್ಯೆ", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "ಸಂದೇಶವನ್ನು ಮುಂದುವರಿಸಲು Signal ಡೆಸ್ಕ್ಟಾಪ್ ಅನ್ನು ನಿಮ್ಮ ಮೊಬೈಲ್ ಸಾಧನಕ್ಕೆ ರಿಲೀಂಕ್ ಮಾಡಿ.", - "description": "" - }, - "unlinked": { - "message": "Unlinked", - "description": "" - }, - "relink": { - "message": "Relink", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session update available", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/ko/messages.json b/_locales/ko/messages.json index 7738b6b41..4b44ab906 100644 --- a/_locales/ko/messages.json +++ b/_locales/ko/messages.json @@ -3,18 +3,10 @@ "message": "Copy error and quit", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Unknown group", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Database Error", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Delete all data and restart", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "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." @@ -35,10 +27,6 @@ "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" @@ -135,10 +123,6 @@ "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" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Archived Conversations", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archive Conversation", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Move Conversation to Inbox", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Choose folder", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Choose file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Load your data", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "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": "your selected location", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Upgrading database. This may take some time...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Loading messages. $count$ so far...", - "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": "Me", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "You left the group", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Scroll to bottom of conversation", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "New message below", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "New messages below", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 Unread Message", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Submit", "description": "" }, - "acceptNewKey": { - "message": "Accept", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Mark as verified", "description": "" @@ -455,10 +385,6 @@ "message": "New safety number", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Your safety number with this contact has changed. This could either mean that someone is trying to intercept your communication, or this contact simply reinstalled Signal. You may wish to verify the new safety number below.", - "description": "" - }, "incomingError": { "message": "Error handling incoming message", "description": "" @@ -495,18 +421,6 @@ "message": "This Month", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Unsupported attachment type. Click to save.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Click to save", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Unnamed File", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "보이스 메시지", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Attachment type not allowed for security reasons", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Unable to load selected attachment.", "description": "" }, - "disconnected": { - "message": "Disconnected", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Connecting", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "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" @@ -619,14 +521,6 @@ "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": "About Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Speech", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Show", "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" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "검색", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Welcome to Signal", "description": "" }, - "selectAContact": { - "message": "Select a contact or group to start chatting.", - "description": "" - }, "typingAlt": { "message": "Typing animation for this conversation", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "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" @@ -759,16 +633,6 @@ "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" @@ -777,10 +641,6 @@ "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" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "OK", "description": "" @@ -809,18 +665,10 @@ "message": "Cancel", "description": "" }, - "failedToSend": { - "message": "Failed to send to some recipients. Check your network connection.", - "description": "" - }, "error": { "message": "에러", "description": "" }, - "messageDetail": { - "message": "Message Detail", - "description": "" - }, "delete": { "message": "Delete", "description": "" @@ -857,10 +705,6 @@ "message": "Group members", "description": "" }, - "showMembers": { - "message": "Show members", - "description": "" - }, "resetSession": { "message": "Reset session", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "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": "If you wish to verify the security of your end-to-end encryption with $name$, compare the numbers above with the numbers on their device.", "description": "", @@ -887,14 +727,6 @@ "message": "You haven't exchanged any messages with this contact yet. Your safety number with them will be available after the first message.", "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" @@ -939,10 +771,6 @@ "message": "저장", "description": "" }, - "fileIconAlt": { - "message": "File icon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Welcome to Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privacy is possible. Signal makes it easy.", - "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": "Failed to connect to server.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Sorry, you have too many devices linked already. Try removing some.", - "description": "" - }, - "settings": { - "message": "Settings", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Theme", - "description": "Header for theme settings" - }, "permissions": { "message": "Permissions", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "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": "Notifications", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Send failed", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Details", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Hide details", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Learn more about verifying safety numbers", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Media message", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Number is not registered", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Contacts", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Import all Signal groups and contacts from your mobile device.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Last import at", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Import now", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importing...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Import failed. Make sure your computer and your phone are connected to the internet.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "now", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 hour", "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": "now", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Play audio notification", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Safety Number has changed", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Light", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Dark", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Note to Self", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Hide menu bar", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Enter a phone number to add a contact.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Invalid number", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Relink Signal Desktop to your mobile device to continue messaging.", - "description": "" - }, - "unlinked": { - "message": "Unlinked", - "description": "" - }, - "relink": { - "message": "Relink", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session update available", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/lt/messages.json b/_locales/lt/messages.json index 6352b544e..97c30d146 100644 --- a/_locales/lt/messages.json +++ b/_locales/lt/messages.json @@ -3,18 +3,10 @@ "message": "Kopijuoti klaidą ir išeiti", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Nežinoma grupė", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Duomenų bazės klaida", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Ištrinti visus duomenis ir paleisti iš naujo", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Failas", "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." @@ -35,10 +27,6 @@ "message": "&Pagalba", "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": "Nuostatos…", - "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": "Slėpti", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Nusistatyti importavimą", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Nusistatyti kaip naują įrenginį", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Nusistatyti kaip atskirą įrenginį", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Archyvuoti pokalbiai", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Šie pokalbiai yra archyvuoti ir atsiras skyrelyje Gauta tik tuomet, jei bus gautos naujos žinutės.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archyvuoti pokalbį", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Perkelti pokalbį į skyrelį Gauta", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Pasirinkti aplanką", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Pasirinkti failą", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Įkelkite savo duomenis", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Susieti šį įrenginį su jūsų telefonu", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "jūsų pasirinkta vieta", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Naujinama duomenų bazė. Tai gali šiek tiek užtrukti...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Įkeliamos žinutės. Jau $count$ įkelta...", - "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": "Aš", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Jūs išėjote iš grupės", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Slinkti į pokalbio apačią", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Nauja žinutė žemiau", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Naujos žinutės žemiau", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 neskaityta žinutė", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Pateikti", "description": "" }, - "acceptNewKey": { - "message": "Priimti", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Žymėti kaip patvirtintą", "description": "" @@ -455,10 +385,6 @@ "message": "Naujas saugumo numeris", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Jūsų saugumo numeris su šiuo kontaktu pasikeitė. Tai gali reikšti, kad arba kažkas bando perimti jūsų susirašinėjimą, arba šis kontaktas, tiesiog, iš naujo įdiegė Signal. Jūs, tikriausiai, žemiau norėtumėte patvirtinti naują saugumo numerį.", - "description": "" - }, "incomingError": { "message": "Klaida, apdorojant gaunamą žinutę", "description": "" @@ -495,18 +421,6 @@ "message": "Šį mėnesį", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Nepalaikomas priedo tipas. Spustelėkite, kad įrašytumėte.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Spustelkite, norėdami įrašyti", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Bevardis failas", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Balso žinutė", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Priedo tipas saugumo sumetimais yra neleidžiamas", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Įkeliama peržiūra...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Juodraštinė miniatiūrinė nuorodos peržiūra, skirta $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Nepavyko įkelti pasirinkto priedo.", "description": "" }, - "disconnected": { - "message": "Atsijungta", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Jungiamasi", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Pereiti į laidos informaciją", "description": "" }, - "goToForums": { - "message": "Pereiti į forumus", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Pereiti į palaikymo puslapį", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Pranešti apie klaidą", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop nuostatos", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Apie Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Šneka", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Rodyti", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Slėpti", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Išeiti", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Ieškoti", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Sveiki atvykę į Signal", "description": "" }, - "selectAContact": { - "message": "Pasirinkite kontaktą ar grupę, kad pradėtumėte pokalbį.", - "description": "" - }, "typingAlt": { "message": "Rašymo animacija šiam pokalbiui", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Siųsti žinutę", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "namų", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Jūs", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Atsako naudotojui $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": "Norėdami siųsti garso žinutes, suteikite Signal Desktop prieigą prie savo mikrofono.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Leisti prieigą", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Rodyti nustatymus", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Garso įrašas", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "Gerai", "description": "" @@ -809,18 +665,10 @@ "message": "Atsisakyti", "description": "" }, - "failedToSend": { - "message": "Nepavyko išsiųsti kai kuriems gavėjams. Patikrinkite savo tinklo ryšį.", - "description": "" - }, "error": { "message": "Klaida", "description": "" }, - "messageDetail": { - "message": "Žinutės informacija", - "description": "" - }, "delete": { "message": "Ištrinti", "description": "" @@ -857,10 +705,6 @@ "message": "Grupės dalyviai", "description": "" }, - "showMembers": { - "message": "Rodyti dalyvius", - "description": "" - }, "resetSession": { "message": "Atstatyti seansą", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Rodyti saugumo numerį", "description": "" }, - "viewAllMedia": { - "message": "Rodyti visą mediją", - "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": "Jeigu norite patvirtinti savo ištisinio šifravimo su $name$ saugumą, palyginkite aukščiau esančius numerius su numeriais šio asmens įrenginyje.", "description": "", @@ -887,14 +727,6 @@ "message": "Jūs su šiuo kontaktu dar nesate apsikeitę jokiomis žinutėmis. Jūsų saugumo numeris bus prieinamas po pirmosios žinutės.", "description": "" }, - "moreInfo": { - "message": "Daugiau informacijos...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Bandyti siųsti dar kartą", - "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": "Ištrinti žinutę", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Įrašyti", "description": "" }, - "fileIconAlt": { - "message": "Failo piktograma", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Šypsenėlė \"$title$\"", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Sveiki atvykę į Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privatumas yra įmanomas. Signal jį padaro lengvą.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Susiekite savo telefoną su Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal nustatymai", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Susieti įrenginiai", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "\"+\" mygtukas", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Susieti naują įrenginį", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Įrenginio pavadinimas", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Pasirinkite šio įrenginio pavadinimą", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Užbaigti telefono susiejimą", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Sinchronizuojami kontaktai ir grupės", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Nepavyko prisijungti prie serverio.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Atleiskite, jūs jau turite per daug susietų įrenginių. Pabandykite kai kuriuos pašalinti.", - "description": "" - }, - "settings": { - "message": "Nustatymai", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" - }, "permissions": { "message": "Leidimai", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Įjungti rašybos tikrinimą tekstui, kuris įvedamas į žinutės rašymo langelį", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Išvalyti duomenis", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Tai išvalys visus programoje esančius duomenis ir pašalins visas žinutes bei įrašytą paskyros informaciją.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Išvalyti duomenis", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Ištrinti visus duomenis?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Jūs ketinate ištrinti visą įrašytą šios programos paskyros informaciją, įskaitant visus kontaktus ir visas žinutes. Jūs visada ir vėl galite susieti programą su savo mobiliuoju įrenginiu, tačiau tai neatkurs ištrintų žinučių.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Ištrinti visus duomenis", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Atsijungiama ir ištrinami visi duomenys", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Pranešimai", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Išsiuntimas nepavyko", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Išsamesnė informacija", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Slėpti išsamesnę informaciją", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Sužinoti daugiau apie saugumo numerių patvirtinimą", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Medija žinutė", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Numeris nėra registruotas", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontaktai", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importuoti visas Signal grupes ir kontaktus iš jūsų mobiliojo įrenginio.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Paskutinis importavimas ties", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importuoti dabar", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importuojama...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Importavimas nepavyko. Įsitikinkite, kad jūsų kompiuteris ir telefonas yra prijungti prie interneto.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "dabar", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 valanda", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ val.", - "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": "prieš $hours$ val.", - "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": "prieš $minutes$ min.", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "dabar", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Groti garso pranešimus", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Pasikeitė saugumo numeris", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Šviesi", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Tamsi", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Pastabos sau", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Slėpti meniu juostą", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Pradėti naują pokalbį…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Įveskite kontakto, kurį norite pridėti, numerį.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Neteisingas numeris", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Norėdami tęsti susirašinėjimą, iš naujo susiekite Signal Desktop su savo mobiliuoju įrenginiu.", - "description": "" - }, - "unlinked": { - "message": "Atsietas", - "description": "" - }, - "relink": { - "message": "Susieti iš naujo", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Yra prieinamas Session atnaujinimas", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/mk/messages.json b/_locales/mk/messages.json index 9224fad9d..c5da4e062 100644 --- a/_locales/mk/messages.json +++ b/_locales/mk/messages.json @@ -3,18 +3,10 @@ "message": "Copy error and quit", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Unknown group", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Database Error", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Delete all data and restart", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "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." @@ -35,10 +27,6 @@ "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" @@ -135,10 +123,6 @@ "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" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Archived Conversations", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archive Conversation", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Move Conversation to Inbox", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Choose folder", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Choose file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Load your data", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "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": "your selected location", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Upgrading database. This may take some time...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Loading messages. $count$ so far...", - "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": "Me", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "You left the group", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Scroll to bottom of conversation", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "New message below", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "New messages below", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 Unread Message", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Испрати", "description": "" }, - "acceptNewKey": { - "message": "Accept", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Mark as verified", "description": "" @@ -455,10 +385,6 @@ "message": "New safety number", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Your safety number with this contact has changed. This could either mean that someone is trying to intercept your communication, or this contact simply reinstalled Signal. You may wish to verify the new safety number below.", - "description": "" - }, "incomingError": { "message": "Error handling incoming message", "description": "" @@ -495,18 +421,6 @@ "message": "This Month", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Неподдржан тип на прилог. Кликнете за зачувување.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Click to save", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Unnamed File", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Voice Message", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Attachment type not allowed for security reasons", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Unable to load selected attachment.", "description": "" }, - "disconnected": { - "message": "Неповрзан", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Connecting", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "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" @@ -619,14 +521,6 @@ "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": "About Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Speech", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Show", "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" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Барај", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Добредојдовте во Signal", "description": "" }, - "selectAContact": { - "message": "Избери контакт или група за разговор", - "description": "" - }, "typingAlt": { "message": "Typing animation for this conversation", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "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" @@ -759,16 +633,6 @@ "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" @@ -777,10 +641,6 @@ "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" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "Во ред", "description": "" @@ -809,18 +665,10 @@ "message": "Откажи", "description": "" }, - "failedToSend": { - "message": "Failed to send to some recipients. Check your network connection.", - "description": "" - }, "error": { "message": "Грешка", "description": "" }, - "messageDetail": { - "message": "Детали за пораката", - "description": "" - }, "delete": { "message": "Delete", "description": "" @@ -857,10 +705,6 @@ "message": "Group members", "description": "" }, - "showMembers": { - "message": "Show members", - "description": "" - }, "resetSession": { "message": "Reset session", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "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": "If you wish to verify the security of your end-to-end encryption with $name$, compare the numbers above with the numbers on their device.", "description": "", @@ -887,14 +727,6 @@ "message": "You haven't exchanged any messages with this contact yet. Your safety number with them will be available after the first message.", "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" @@ -939,10 +771,6 @@ "message": "Зачувај", "description": "" }, - "fileIconAlt": { - "message": "File icon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Welcome to Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privacy is possible. Signal makes it easy.", - "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": "Failed to connect to server.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Sorry, you have too many devices linked already. Try removing some.", - "description": "" - }, - "settings": { - "message": "Settings", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Theme", - "description": "Header for theme settings" - }, "permissions": { "message": "Permissions", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "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": "Notifications", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Send failed", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Details", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Hide details", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Learn more about verifying safety numbers", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Media message", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Number is not registered", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Contacts", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Import all Signal groups and contacts from your mobile device.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Last import at", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Import now", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importing...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Import failed. Make sure your computer and your phone are connected to the internet.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "now", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 hour", "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": "now", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Play audio notification", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Safety Number has changed", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Light", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Dark", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Note to Self", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Hide menu bar", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Enter a phone number to add a contact.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Invalid number", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Relink Signal Desktop to your mobile device to continue messaging.", - "description": "" - }, - "unlinked": { - "message": "Unlinked", - "description": "" - }, - "relink": { - "message": "Relink", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session update available", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/nb/messages.json b/_locales/nb/messages.json index 262e5ee53..5b0e35220 100644 --- a/_locales/nb/messages.json +++ b/_locales/nb/messages.json @@ -3,18 +3,10 @@ "message": "Kopier feil og avslutt", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Ukjent gruppe", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Database feil", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Slett alle data og restart", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Fil", "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." @@ -35,10 +27,6 @@ "message": "&Hjelp", "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": "Innstillinger…", - "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": "Skjul", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Sett Opp med Import", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Sett Opp som Ny Enhet", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Sett Opp som Frittstående Enhet", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Arkiverte Samtaler", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Disse samtalene er arkiverte og vil dukke opp igjen i innboksen om de får nye meldinger.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Arkiver samtalen", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Flytt samtalen til innboksen", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Velg mappe", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Velg fil", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Last inn din data", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Koble denne enheten til telefonen din", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "din valgte posisjon", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Oppgraderer database. Dette kan ta litt tid...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Laster meldinger. $count$så langt...", - "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": "Meg", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Du forlot gruppen", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Rull til bunnen av samtalen", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Ny melding nedenfor", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nye meldinger nedenfor", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 Ulest melding", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Send", "description": "" }, - "acceptNewKey": { - "message": "Godta", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Merk som verifisert", "description": "" @@ -455,10 +385,6 @@ "message": "Nytt sikkerhetsnummer", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Ditt sikkerhetsnummer med denne kontakten er endret. Dette kan enten bety at noen prøver å fange opp kommunikasjonen din, eller denne kontakten kan ha installert Signal på nytt. Du kan ønske å bekrefte det nye sikkerhetsnummeret nedenfor.", - "description": "" - }, "incomingError": { "message": "Feil ved håndtering av innkommende melding", "description": "" @@ -495,18 +421,6 @@ "message": "Denne Måneden", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Vedleggstype støttes ikke. Klikk for å lagre det.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Klikk for å lagre", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Navnløs fil", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Talemelding", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Vedleggstypen er ikke tillatt av sikkerhetsårsaker", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Laster forhåndsvisning...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Utkast miniatyrbilde til linkforhåndsvisning for $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Kunne ikke laste valgt vedlegg.", "description": "" }, - "disconnected": { - "message": "Tilkobling brutt.", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Kobler til", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Se Endringslogg", "description": "" }, - "goToForums": { - "message": "Gå til Forumene", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Gå til Side for Brukerstøtte", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Rapporter et Problem", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Innstillinger for Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Om Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Tale", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Vis", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Skjul", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Avslutt", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Søk", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Velkommen til Signal!", "description": "" }, - "selectAContact": { - "message": "Velg en kontakt eller gruppe for å chatte", - "description": "" - }, "typingAlt": { "message": "Markør som viser at noen holder på å skrive i samtalen.", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Send Melding", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "hjem", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Du", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Svarer til $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": "For å sende lydmeldinger, gi Signal Desktop tilgang til mikrofonen din.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Tillat Tilgang", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Vis Innstillnger", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Lyd", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "OK", "description": "" @@ -809,18 +665,10 @@ "message": "Avbryt", "description": "" }, - "failedToSend": { - "message": "Kunne ikke sende til noen mottakere. Sjekk nettverkstilkoblingen.", - "description": "" - }, "error": { "message": "Feil", "description": "" }, - "messageDetail": { - "message": "Meldingsdetaljer", - "description": "" - }, "delete": { "message": "Slett", "description": "" @@ -857,10 +705,6 @@ "message": "Gruppemedlemmer", "description": "" }, - "showMembers": { - "message": "Vis medlemmer", - "description": "" - }, "resetSession": { "message": "Nullstill økten", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Vis sikkerhetsnummer", "description": "" }, - "viewAllMedia": { - "message": "Se alle 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": "Hvis du ønsker å verifisere sikkerheten til din ende-til-ende kryptering med $name$, sammenlign tallene ovenfor med tallene på deres enhet.", "description": "", @@ -887,14 +727,6 @@ "message": "Du har ikke utvekslet noen meldinger med denne kontakten ennå. Ditt sikkerhetsnummer med dem vil være tilgjengelig etter den første meldingen.", "description": "" }, - "moreInfo": { - "message": "Mer info...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Send på nytt", - "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": "Slett Melding", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Lagre", "description": "" }, - "fileIconAlt": { - "message": "Filikon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji-bilde av «$title$»", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Velkommen til Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Personvern er mulig. Signal gjør det enkelt.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Koble til telefonen din til Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Instillinger for Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Tilkoblede enheter", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' Knapp", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Koble Til En Ny Enhet", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Enhetsnavn", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Velg denne enhetens navn", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Fullfør tilkoblingen av telefon", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Synkroniserer kontaker og grupper", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Kunne ikke koble til tjeneren.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Beklager. Du har for mange enheter tilkoblet. Prøv å fjern noen.", - "description": "" - }, - "settings": { - "message": "Innstillinger", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" - }, "permissions": { "message": "Tillatelser", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Slå på stavekontroll av tekst du skriver i meldingsvinduet", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Slett data", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Dette vil slette alle data i appen, inkludert alle meldinger og lagret kontoinformasjon.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Slett data", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Slett alle data?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Du er i ferd med å slette alt av denne applikasjonens lagrede brukerinformasjon, inkludert alle kontakter og meldinger. Du kan alltid koble til telefonen din igjen, men dette vil ikke gjenopprette slettede meldinger.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Slett alle data", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Kobler fra og sletter alle data", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Varslinger", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Sending feilet", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detaljer", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Skjul detaljer", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Lær mer om å bekrefte sikkerhetsnummer", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Mediemelding", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Nummeret er ikke registrert", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontakt", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importer alle Signal grupper og kontakter fra din mobile enhet.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Siste import på", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importer nå", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importerer...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Importering mislyktes. Sørg for at datamaskinen og telefonen din er koblet til internett.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "nå", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 time", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ t", - "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$ t siden", - "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 siden", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "nå", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Spill av lydvarsling", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Sikkerhetsnummer er endret", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Lyst", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Mørkt", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Notat til meg selv", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Skjul menylinje", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Start en ny samtale...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Skriv inn et telefonnummer for å legge til en kontakt.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Ugyldig nummer", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Koble sammen Signal Desktop med din mobilenhet på nytt for å fortsette.", - "description": "" - }, - "unlinked": { - "message": "Frakoblet enhet", - "description": "" - }, - "relink": { - "message": "Koble til på nytt", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session oppdatering tilgjengelig", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/nl/messages.json b/_locales/nl/messages.json index 17328b69d..ef0c3f72f 100644 --- a/_locales/nl/messages.json +++ b/_locales/nl/messages.json @@ -3,18 +3,10 @@ "message": "Foutmelding kopiëren en afsluiten", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Onbekende groep", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Databasefout", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Alle gegevens wissen en herstarten", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Bestand", "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." @@ -35,10 +27,6 @@ "message": "&Hulp", "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": "Voorkeuren…", - "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": "Verbergen", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Instellen met importeren", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Instellen als nieuw apparaat", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Instellen als apart apparaat", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Gearchiveerde gesprekken", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Deze gesprekken worden gearchiveerd en zullen alleen in Postvak IN verschijnen als je nieuwe berichten ontvangt.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Gesprek archiveren", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Gesprek verplaatsen naar Postvak IN", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Map kiezen", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Kies bestand", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Laad je gegevens", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Koppel dit apparaat aan je telefoon", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "je geselecteerde locatie", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "De database wordt opgewaardeerd. Dit kan even duren…", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Berichten worden geladen, $count$ tot nu toe…", - "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": "Ik", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Je hebt de groep verlaten", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Scroll naar de onderkant van het gesprek", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Nieuw bericht hieronder", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nieuwe berichten hieronder", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 ongelezen bericht", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Verzenden", "description": "" }, - "acceptNewKey": { - "message": "Aanvaarden", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Markeren als geverifieerd", "description": "" @@ -455,10 +385,6 @@ "message": "Nieuw veiligheidsnummer", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Je veiligheidsnummer met deze contactpersoon is veranderd. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat je contactpersoon Signal opnieuw heeft geïnstalleerd. Het wordt aanbevolen om het nieuwe veiligheidsnummer hieronder met deze persoon te verifiëren.", - "description": "" - }, "incomingError": { "message": "Fout bij het verwerken van een inkomend bericht", "description": "" @@ -495,18 +421,6 @@ "message": "Deze maand", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Niet-ondersteund bestandstype. Klik om op te slaan.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Klik om op te slaan", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Naamloos bestand", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Audiobericht", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Type bijlage niet toegestaan wegens veiligheidsredenen", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Voorbeeld laden…", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Conceptvoorbeeldweergave voor $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Kan geselecteerde bijlage niet laden.", "description": "" }, - "disconnected": { - "message": "Verbinding verbroken", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Aan het verbinden", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Ga naar uitgaveopmerkingen", "description": "" }, - "goToForums": { - "message": "Ga naar forums", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Ga naar ondersteuningspagina", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Meld een probleem", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop-instellingen", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Over Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Spraak", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Tonen", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Verbergen", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Afsluiten", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Zoeken", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Welkom bij Signal", "description": "" }, - "selectAContact": { - "message": "Selecteer een contactpersoon of groep om een gesprek te openen.", - "description": "" - }, "typingAlt": { "message": "Typ-animatie voor dit gesprek", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Bericht verzenden", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "thuis", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Jij", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "In reactie op $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": "Om een audiobericht te versturen moet je Signal Desktop toegang tot de microfoon geven.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Toegang geven", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Toon instellingen", - "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" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "Begrepen", "description": "" @@ -809,18 +665,10 @@ "message": "Annuleren", "description": "" }, - "failedToSend": { - "message": "Verzenden naar bepaalde ontvangers mislukt. Controleer je netwerkverbinding.", - "description": "" - }, "error": { "message": "Fout", "description": "" }, - "messageDetail": { - "message": "Berichtdetails", - "description": "" - }, "delete": { "message": "Wissen", "description": "" @@ -857,10 +705,6 @@ "message": "Groepsleden", "description": "" }, - "showMembers": { - "message": "Leden tonen", - "description": "" - }, "resetSession": { "message": "Sessie opnieuw instellen", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Veiligheidsnummer bekijken", "description": "" }, - "viewAllMedia": { - "message": "Alle media bekijken", - "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": "Als je de beveiliging van je eind-tot-eind-versleuteling met $name$ wilt verifiëren, vergelijk je de nummers hierboven met de nummers op hun apparaat.", "description": "", @@ -887,14 +727,6 @@ "message": "Je hebt nog geen berichten uitgewisseld met deze contactpersoon. Je veiligheidsnummer met hem zal beschikbaar zijn na het eerste bericht.", "description": "" }, - "moreInfo": { - "message": "Meer informatie…", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Opnieuw proberen te verzenden", - "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": "Bericht wissen", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Opslaan", "description": "" }, - "fileIconAlt": { - "message": "Bestandspictogram", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji-afbeelding ‘$title$’", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Welkom bij Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privacy is mogelijk. Signal maakt het gemakkelijk.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Koppel je telefoon aan Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal-instellingen", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Gekoppelde apparaten", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "‘+’-knop", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Nieuw apparaat koppelen", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Apparaatnaam", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Kies de naam van dit apparaat", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Koppelen van telefoon voltooien", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Contacten en groepen worden gesynchroniseerd", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Verbinden met server mislukt.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Sorry, je hebt te veel apparaten gekoppeld. Probeer er enkele te verwijderen.", - "description": "" - }, - "settings": { - "message": "Instellingen", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Thema", - "description": "Header for theme settings" - }, "permissions": { "message": "Toestemmingen", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Gebruik spellingscontrole voor de tekst in het berichtinvoerveld", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Gegevens wissen", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Dit verwijdert alle gegevens in de toepassing, verwijdert alle berichten en opgeslagen accountinformatie.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Gegevens wissen", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Alle gegevens wissen?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Je staat op het punt alle opgeslagen accountgegevens van deze toepassing te wissen, inclusief alle contacten en alle berichten. Je kunt altijd opnieuw koppelen met je mobiele apparaat, maar je gewiste berichten kunnen niet hersteld worden.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Alle gegevens wissen", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Verbinding wordt verbroken en alle gegevens worden verwijderd", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Meldingen", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Verzenden mislukt", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Details", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Details verbergen", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Lees meer over het verifiëren van veiligheidsnummers", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Mediabericht", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Nummer is niet geregistreerd", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Contacten", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importeer alle Signal-groepen en -contacten van je mobiele apparaat.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Laatst geïmporteerd op", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Nu importeren", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Bezig met importeren…", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Importeren mislukt. Zorg ervoor dat je computer en je telefoon met het internet verbonden zijn.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "nu", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 uur", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ u", - "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$ uur geleden", - "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 geleden", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "nu", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Audiomelding afspelen", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Het veiligheidsnummer is veranderd", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Licht", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Donker", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Notitie aan mezelf", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Menubalk verbergen", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Begin een nieuw gesprek…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Voer een telefoonnummer in om een contact toe te voegen.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Ongeldig nummer", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Koppel Signal Desktop opnieuw aan je mobiele apparaat om verder te kunnen chatten.", - "description": "" - }, - "unlinked": { - "message": "Ontkoppeld", - "description": "" - }, - "relink": { - "message": "Opnieuw koppelen", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Update voor Session beschikbaar", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/nn/messages.json b/_locales/nn/messages.json index bfe13d62d..3a0f5a8ba 100644 --- a/_locales/nn/messages.json +++ b/_locales/nn/messages.json @@ -3,18 +3,10 @@ "message": "Kopier feil og avslutt", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Unknown group", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Databasefeil", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Slett all data og start på nytt", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Fil", "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." @@ -35,10 +27,6 @@ "message": "&Hjelp", "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": "Innstillingar …", - "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": "Skjul", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Set opp med import", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Set opp som ny eining", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Set opp som frittståande eining", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Archived Conversations", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archive Conversation", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Move Conversation to Inbox", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Vel mappe", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Vel fil", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Last inn dine data", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Kopla denne eininga til telefonen din", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "din valde posisjon", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Oppgraderer database. Dette kan ta litt tid …", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Lastar meldingar. $count$så langt …", - "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": "Meg", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Du forlét gruppa", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Rull til botnen av samtalen", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Ny melding nedanfor", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nye meldingar nedanfor", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 ulesen melding", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Send", "description": "" }, - "acceptNewKey": { - "message": "Godta", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Marker som godkjent", "description": "" @@ -455,10 +385,6 @@ "message": "Nytt tryggingsnummer", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Tryggingsnummeret ditt med denne kontakten er endra. Dette kan enten bety at nokon prøver å fanga opp kommunikasjonen din, eller denne kontakten kan ha installert Signal på nytt. Du vil kanskje godkjenna det nye tryggingsnummeret nedanfor.", - "description": "" - }, "incomingError": { "message": "Feil ved handtering av innkommande melding", "description": "" @@ -495,18 +421,6 @@ "message": "Denne månaden", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Vedleggstypen er ikkje støtta. Klikk for å lagra det.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Klikk for å lagra", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Namnlaus fil", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Talemelding", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Vedleggstypen er ikkje tillaten av tryggleiksårsaker", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Lastar førehandsvisning …", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Førehandsvisning (kladd) av lenkje til $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Kunne ikkje lasta vald vedlegg.", "description": "" }, - "disconnected": { - "message": "Kopla frå", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Koplar til", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Sjå endringsloggen", "description": "" }, - "goToForums": { - "message": "Gå til foruma", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Gå til brukarstøttesida", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Rapporter eit problem", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Innstillingar for Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Om Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Tale", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Vis", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Skjul", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Avslutt", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Søk", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Velkommen til Signal!", "description": "" }, - "selectAContact": { - "message": "Vel ein kontakt eller ei gruppe for å prata", - "description": "" - }, "typingAlt": { "message": "Markør som viser at nokon held på å skriva i samtalen", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Send melding", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "heim", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Du", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Svarer $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": "Gi Signal Desktop tilgang til mikrofonen din for å senda lydmeldingar.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Gi tilgang", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Vis innstillngar", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Lyd", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "OK", "description": "" @@ -809,18 +665,10 @@ "message": "Avbryt", "description": "" }, - "failedToSend": { - "message": "Kunne ikkje senda til visse mottakarar. Sjekk nettverkstilkoplinga.", - "description": "" - }, "error": { "message": "Feil", "description": "" }, - "messageDetail": { - "message": "Meldingsdetaljar", - "description": "" - }, "delete": { "message": "Slett", "description": "" @@ -857,10 +705,6 @@ "message": "Gruppemedlemmer", "description": "" }, - "showMembers": { - "message": "Vis medlemmer", - "description": "" - }, "resetSession": { "message": "Nullstill økta", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Vis tryggingsnummer", "description": "" }, - "viewAllMedia": { - "message": "Sjå 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": "Viss du vil stadfesta sikkerheita på ende-til-ende-krypteringa med $name$, kan du samanlikna tala over med tala på eininga di.", "description": "", @@ -887,14 +727,6 @@ "message": "Du har ikkje utveksla nokon meldingar med denne kontakten enno. Tryggingsnummeret ditt med dei vil vera tilgjengeleg etter den første meldinga.", "description": "" }, - "moreInfo": { - "message": "Meir info …", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Send på nytt", - "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": "Slett meldinga", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Lagra", "description": "" }, - "fileIconAlt": { - "message": "Filikon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji-bilde av «$title$»", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Velkommen til Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Personvern er mogleg. Signal gjer det enkelt.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Kopla til telefonen din til Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Instillingar for Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Tilkopla einingar", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "«+»-knapp", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Kopla til ei ny eining", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Einingsnamn", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Vel namnet til denne eininga", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Fullfør tilkoplinga av telefon", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Synkroniserer kontaktar og grupper", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Kunne ikkje kopla til tenaren.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Beklagar. Du har for mange einingar tilkopla. Prøv å fjerna nokre.", - "description": "" - }, - "settings": { - "message": "Innstillingar", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" - }, "permissions": { "message": "Tillatingar", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Slå på stavekontroll av tekst du skriv i meldingsvindauget", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Slett data", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Dette vil sletta all data i appen, inkludert alle meldingar og lagra kontoinformasjon.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Slett data", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Slett all data?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Du er i ferd med å sletta alt av den lagra brukarinformasjonen til denne applikasjonen, inkludert alle kontaktar og meldingar. Du kan alltids kopla til telefonen din igjen, men dette vil ikkje retta opp igjen sletta meldingar.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Slett all data", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Koplar frå og slettar all data", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Varslingar", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Sending feila", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detaljar", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Skjul detaljar", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Lær meir om å godkjenna tryggingsnummer", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Mediemelding", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Nummeret er ikkje registrert", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontakt", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importer alle Signal-grupper og kontaktar frå den mobile eininga di.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Siste import var", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importer no", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importerer …", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Klarte ikkje importera. Sørg for at datamaskina og telefonen din er kopla til internett.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "no", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 time", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ t", - "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$ t sidan", - "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 sidan", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "no", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Spel av lydvarsling", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Tryggingsnummeret er endra", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Lyst", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Mørkt", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Notat til meg sjølv", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Skjul menylinje", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Skriv inn eit telefonnummer for å legga til ein kontakt.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Ugyldig nummer", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Kopla saman Signal Desktop med mobileininga di på nytt for å fortsetja.", - "description": "" - }, - "unlinked": { - "message": "Fråkopla eining", - "description": "" - }, - "relink": { - "message": "Kopla til på nytt", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session-oppdatering tilgjengeleg", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/no/messages.json b/_locales/no/messages.json index 8c7cf3ff5..a093b0083 100644 --- a/_locales/no/messages.json +++ b/_locales/no/messages.json @@ -3,18 +3,10 @@ "message": "Copy error and quit", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Unknown group", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Database Error", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Delete all data and restart", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Fil", "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." @@ -35,10 +27,6 @@ "message": "&Hjelp", "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": "Innstillinger…", - "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": "Skjul", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Sett Opp med Import", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Sett Opp som Ny Enhet", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Sett Opp som Frittstående Enhet", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Archived Conversations", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archive Conversation", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Move Conversation to Inbox", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Velg mappe", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Velg fil", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Last inn din data", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Koble denne enheten til telefonen din", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "din valgte posisjon", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Oppgraderer database. Dette kan ta litt tid...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Laster meldinger. $count$så langt...", - "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": "Meg", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Du forlot gruppen", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Rull til bunnen av samtalen", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Ny melding nedenfor", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nye meldinger nedenfor", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 Ulest melding", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Send", "description": "" }, - "acceptNewKey": { - "message": "Godta", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Merk som verifisert", "description": "" @@ -455,10 +385,6 @@ "message": "Nytt sikkerhetsnummer", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Ditt sikkerhetsnummer med denne kontakten er endret. Dette kan enten bety at noen prøver å fange opp kommunikasjonen din, eller denne kontakten kan ha installert Signal på nytt. Du kan ønske å bekrefte det nye sikkerhetsnummeret nedenfor.", - "description": "" - }, "incomingError": { "message": "Feil ved håndtering av innkommende melding", "description": "" @@ -495,18 +421,6 @@ "message": "Denne Måneden", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Vedleggstype støttes ikke. Klikk for å lagre det.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Klikk for å lagre", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Navnløs fil", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Talemelding", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Vedleggstypen er ikke tillatt av sikkerhetsårsaker", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Kunne ikke laste valgt vedlegg.", "description": "" }, - "disconnected": { - "message": "Tilkobling brutt.", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Kobler til", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Se Endringslogg", "description": "" }, - "goToForums": { - "message": "Gå til Forumene", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Gå til Side for Brukerstøtte", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Rapporter et Problem", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Innstillinger for Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Om Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Tale", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Vis", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Skjul", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Avslutt", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Søk", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Velkommen til Signal!", "description": "" }, - "selectAContact": { - "message": "Velg en kontakt eller gruppe for å chatte", - "description": "" - }, "typingAlt": { "message": "Markør som viser at noen holder på å skrive i samtalen.", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Send Melding", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "hjem", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Du", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Svarer til $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": "For å sende lydmeldinger, gi Signal Desktop tilgang til mikrofonen din.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Tillat Tilgang", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Vis Innstillnger", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Lyd", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "OK", "description": "" @@ -809,18 +665,10 @@ "message": "Avbryt", "description": "" }, - "failedToSend": { - "message": "Kunne ikke sende til noen mottakere. Sjekk nettverkstilkoblingen.", - "description": "" - }, "error": { "message": "Feil", "description": "" }, - "messageDetail": { - "message": "Meldingsdetaljer", - "description": "" - }, "delete": { "message": "Slett", "description": "" @@ -857,10 +705,6 @@ "message": "Gruppemedlemmer", "description": "" }, - "showMembers": { - "message": "Vis medlemmer", - "description": "" - }, "resetSession": { "message": "Nullstill økten", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Vis sikkerhetsnummer", "description": "" }, - "viewAllMedia": { - "message": "Se alle 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": "Hvis du ønsker å verifisere sikkerheten til din ende-til-ende kryptering med $name$, sammenlign tallene ovenfor med tallene på deres enhet.", "description": "", @@ -887,14 +727,6 @@ "message": "Du har ikke utvekslet noen meldinger med denne kontakten ennå. Ditt sikkerhetsnummer med dem vil være tilgjengelig etter den første meldingen.", "description": "" }, - "moreInfo": { - "message": "Mer info...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Send på nytt", - "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": "Slett Melding", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Lagre", "description": "" }, - "fileIconAlt": { - "message": "Filikon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji-bilde av «$title$»", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Velkommen til Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Personvern er mulig. Signal gjør det enkelt.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Koble til telefonen din til Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Instillinger for Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Tilkoblede enheter", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' Knapp", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Koble Til En Ny Enhet", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Enhetsnavn", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Velg denne enhetens navn", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Fullfør tilkoblingen av telefon", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Synkroniserer kontaker og grupper", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Kunne ikke koble til tjeneren.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Beklager. Du har for mange enheter tilkoblet. Prøv å fjern noen.", - "description": "" - }, - "settings": { - "message": "Innstillinger", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" - }, "permissions": { "message": "Tillatelser", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Slå på stavekontroll av tekst du skriver i meldingsvinduet", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Slett data", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Dette vil slette alle data i appen, inkludert alle meldinger og lagret kontoinformasjon.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Slett data", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Slett alle data?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Du er i ferd med å slette alt av denne applikasjonens lagrede brukerinformasjon, inkludert alle kontakter og meldinger. Du kan alltid koble til telefonen din igjen, men dette vil ikke gjenopprette slettede meldinger.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Slett alle data", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Kobler fra og sletter alle data", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Varslinger", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Sending feilet", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detaljer", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Skjul detaljer", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Lær mer om å bekrefte sikkerhetsnummer", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Mediemelding", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Nummeret er ikke registrert", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontakt", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importer alle Signal grupper og kontakter fra din mobile enhet.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Siste import på", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importer nå", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importerer...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Importering mislyktes. Sørg for at datamaskinen og telefonen din er koblet til internett.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "nå", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 time", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ t", - "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$ t siden", - "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 siden", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "nå", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Spill av lydvarsling", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Sikkerhetsnummer er endret", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Lyst", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Mørkt", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Note to Self", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Skjul menylinje", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Skriv inn et telefonnummer for å legge til en kontakt.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Ugyldig nummer", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Koble sammen Signal Desktop med din mobilenhet på nytt for å fortsette.", - "description": "" - }, - "unlinked": { - "message": "Frakoblet enhet", - "description": "" - }, - "relink": { - "message": "Koble til på nytt", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session oppdatering tilgjengelig", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/pl/messages.json b/_locales/pl/messages.json index 4a7165d8d..c68d7505d 100644 --- a/_locales/pl/messages.json +++ b/_locales/pl/messages.json @@ -3,18 +3,10 @@ "message": "Skopiuj błąd i zakończ", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Nieznana grupa", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Błąd bazy danych", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Usuń wszystkie dane i uruchom ponownie", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Plik", "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." @@ -35,10 +27,6 @@ "message": "&Pomoc", "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": "Ustawienia...", - "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": "Ukryj", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Skonfiguruj za pomocą importowania", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Skonfiguruj jako nowe urządzenie", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Skonfiguruj jako samodzielne urządzenie", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Zarchiwizowane rozmowy", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Te rozmowy są zarchiwizowane i pojawią się w Odebranych tylko po otrzymaniu nowych wiadomości.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archiwum konwersacji", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Przenieś konwersacje do skrzynki odbiorczej", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Wybierz folder", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Wybierz plik", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Załaduj swoje dane", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Połącz to urządzenie z telefonem", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "wybrana lokalizacja", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Uaktualnianie bazy danych. To może zająć chwilę...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Ładowanie. Załadowanych wiadomości: $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": "Ja", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Opuściłeś(aś) grupę", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Przewiń na koniec konwersacji", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Nowa wiadomość poniżej", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nowe wiadomości poniżej", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 nieprzeczytana wiadomość", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Wyślij", "description": "" }, - "acceptNewKey": { - "message": "Akceptuj", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Oznacz jako zweryfikowany", "description": "" @@ -455,10 +385,6 @@ "message": "Nowy numer bezpieczeństwa", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Numer bezpieczeństwa dla tego kontaktu zmienił się. To może oznaczać, że ktoś próbuje przechwycić Twoją komunikację lub że po prostu kontakt przeinstalował Signal. Możesz zweryfikować jego nowy numer bezpieczeństwa poniżej.", - "description": "" - }, "incomingError": { "message": "Błąd przy obsłudze przychodzącej wiadomości.", "description": "" @@ -495,18 +421,6 @@ "message": "Ten miesiąc", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Nieobsługiwany typ załącznika. Kliknij, aby zapisać.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Kliknij, aby zapisać", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Plik bez nazwy", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Wiadomość głosowa", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Ze względów bezpieczeństwa ten typ załącznika nie jest dozwolony", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Wczytywanie podglądu...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Projekt miniaturki podglądu linku do $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Nie można załadować wybranego załącznika.", "description": "" }, - "disconnected": { - "message": "Odłączony", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Trwa łączenie", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Przejdź do informacji o wersji", "description": "" }, - "goToForums": { - "message": "Przejdź do forum", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Przejdź do strony wsparcia", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Zgłoś problem", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Preferencje", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "O Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Mów", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Pokaż", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Ukryj", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Wyjdź", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Szukaj", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Witamy w Signal", "description": "" }, - "selectAContact": { - "message": "Wybierz kontakt lub grupę aby zacząć rozmowę.", - "description": "" - }, "typingAlt": { "message": "Animacja wskaźnika pisania w tej rozmowie", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Wyślij wiadomość", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "Dom", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Ty", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Odpowiedz $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": "Aby wysyłać wiadomości audio, zezwól aplikacji Signal Desktop na dostęp do mikrofonu.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Zezwól", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Pokaż ustawienia", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Dzwięk", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "OK", "description": "" @@ -809,18 +665,10 @@ "message": "Anuluj", "description": "" }, - "failedToSend": { - "message": "Nie można było wysłać wiadomości do niektórych adresatów. Sprawdź połączenie z internetem.", - "description": "" - }, "error": { "message": "Błąd", "description": "" }, - "messageDetail": { - "message": "Szczegóły wiadomości", - "description": "" - }, "delete": { "message": "Usuń", "description": "" @@ -857,10 +705,6 @@ "message": "Członkowie grupy", "description": "" }, - "showMembers": { - "message": "Pokaż członków", - "description": "" - }, "resetSession": { "message": "Reset sesji", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Zobacz numer bezpieczeństwa", "description": "" }, - "viewAllMedia": { - "message": "Wyświetl wszystkie multimedia", - "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": "Jeżeli życzysz sobie aby sprawdzić bezpieczeństwo Twojego szyfrowanego połączenia z $name$, sprawdź cyfry powyżej z cyframi na jego (jej) urządzeniu.", "description": "", @@ -887,14 +727,6 @@ "message": "Jeszcze nie rozmawiałeś(aś) z tą osobą. Numer bezpieczeństwa będzie dostępny po pierwszej wiadomości.", "description": "" }, - "moreInfo": { - "message": "Więcej informacji...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Spróbuj ponownie wysłać", - "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": "Usuń wiadomość", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Zapisz", "description": "" }, - "fileIconAlt": { - "message": "Ikona pliku", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Ikonka emoji '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Witamy w Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Prywatność jest możliwa i łatwa dzięki Signal.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Połącz swój telefon z Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Ustawienia Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Połączone urządzenia", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' Przycisk", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Połącz nowe urządzenie", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Nazwa urządzenia", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Wybierz nazwę urządzenia", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Zakończ łączenie telefonu", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Trwa synchronizacja grup i kontaktów", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Nie można połączyć się z serwerem.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Niestety, masz za dużo połączonych urządzeń. Spróbuj usunąć kilka.", - "description": "" - }, - "settings": { - "message": "Ustawienia", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Motyw", - "description": "Header for theme settings" - }, "permissions": { "message": "Uprawnienia", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Włącz sprawdzanie pisowni podczas pisania wiadomości", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Wyczyść dane", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Spowoduje to wyczyszczenie wszystkich danych w aplikacji, usunięcie wszystkich wiadomości i zapisanych informacji o koncie.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Wyczyść dane", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Usunąć wszystkie dane?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Zamierzasz usunąć wszystkie zapisane informacje o koncie, w tym wszystkie kontakty i wszystkie wiadomości. Zawsze możesz ponownie połączyć się z urządzeniem mobilnym, ale to nie przywróci usuniętych wiadomości.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Usuń wszystkie dane", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Odłączanie i usuwanie wszystkich danych", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Powiadomienia", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Wysyłanie nie powiodło się", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Szczegóły", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Ukryj szczegóły", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Dowiedz się więcej o weryfikacji numerów bezpieczeństwa", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Wiadomość multimedialna", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Niezarejestrowany numer", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontakty", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Zaimportuj wszystkie grupy i kontakty ze swojego urządzenia mobilnego", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Ostatni import", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importuj", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importowanie...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Import nieudany. Upewnij się, że komputer i urządzenie mobilne mają połączenie z internetem.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "teraz", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 godzina", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ godz", - "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$ godz temu", - "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 temu", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "teraz", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Odtwórz powiadomienie dźwiękowe", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Numer bezpieczeństwa się zmienił", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Jasny", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Ciemny", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Moje notatki", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Ukryj pasek menu", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Rozpocznij nową rozmowę...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Wprowadź numer telefonu, aby dodać kontakt", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Nieprawidłowy numer", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Połącz ponownie Signal Desktop z urządzeniem mobilnym, aby móc dalej wysyłać wiadomości.", - "description": "" - }, - "unlinked": { - "message": "Odłączony", - "description": "" - }, - "relink": { - "message": "Połącz ponownie", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Dostępna aktualizacja aplikacji Session", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/pt_BR/messages.json b/_locales/pt_BR/messages.json index 2626bc3a6..d8e8a7568 100644 --- a/_locales/pt_BR/messages.json +++ b/_locales/pt_BR/messages.json @@ -3,18 +3,10 @@ "message": "Copiar erro e sair", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Grupo desconhecido", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Erro na base de dados", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Apagar todos os dados e reiniciar", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Arquivo", "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." @@ -35,10 +27,6 @@ "message": "&Ajuda", "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": "Preferências...", - "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": "Esconder", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Configurar e importar", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Configurar como Novo Aparelho", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Configurar como Dispositivo Autônomo", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Conversas arquivadas", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Estas conversas estão arquivadas. Elas aparecerão na caixa de entrada somente se novas mensagens forem recebidas.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Arquivar conversa", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Mover conversa para Caixa de Entrada", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Escolher pasta", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Escolher arquivo", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Carregar seus dados", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Religar este aparelho ao seu telefone", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "você escolheu uma localização", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Atualizando a base de dados. Isso pode levar um tempo...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Carregando mensagens. $count$ até agora...", - "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": "Eu", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Você saiu do grupo.", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Deslizar até o início da conversa", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Nova mensagem abaixo", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Novas mensagens abaixo", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "$count$ Mensagem Não Lida", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Enviar", "description": "" }, - "acceptNewKey": { - "message": "Aceitar", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Marcar como verificado", "description": "" @@ -455,10 +385,6 @@ "message": "Novo número de segurança", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "O seu número de segurança com este contato mudou. Isso pode significar uma tentativa de interceptação das suas comunicações ou uma simples reinstalação do Signal. Recomendamos-lhe verificar o novo número de segurança, abaixo.", - "description": "" - }, "incomingError": { "message": "Erro ao receber mensagem", "description": "" @@ -495,18 +421,6 @@ "message": "Este Mês", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Tipo de anexo incompatível. Clique para salvar. ", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Clicar para salvar", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Arquivo sem nome", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Mensagem de Voz", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Tipo de anexo não permitido por motivos de segurança", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Carregando pré-visualização...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Pré-visualização em miniatura do link $domain$ (rascunho)", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Desculpe, ocorreu um erro ao anexar o documento.", "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." @@ -607,10 +513,6 @@ "message": "Ir para Notas de Lançamento", "description": "" }, - "goToForums": { - "message": "Ir para Fóruns", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Ir para Página de Suporte", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Relatar um problema", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Preferências do Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Sobre o Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Fala", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Exibir", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Esconder", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Sair", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Procurar", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Boas-vindas ao Session.", "description": "" }, - "selectAContact": { - "message": "Selecione um contato ou grupo para começar a conversar.", - "description": "" - }, "typingAlt": { "message": "Animação de digitação para esta conversa", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Enviar Mensagem", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "Casa", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Você", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Respondendo para $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": "Para enviar mensagens de áudio permita ao Session acessar o microfone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Permitir acesso", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Mostrar configurações", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Áudio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "OK", "description": "" @@ -809,18 +665,10 @@ "message": "Cancelar", "description": "" }, - "failedToSend": { - "message": "Falha ao enviar para alguns destinatários. Verifique a sua conexão de rede.", - "description": "" - }, "error": { "message": "Erro", "description": "" }, - "messageDetail": { - "message": "Detalhe da mensagem", - "description": "" - }, "delete": { "message": "Excluir", "description": "" @@ -857,10 +705,6 @@ "message": "Membros do grupo", "description": "" }, - "showMembers": { - "message": "Mostrar membros", - "description": "" - }, "resetSession": { "message": "Reiniciar Sessão Segura", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Ver Número De Segurança", "description": "" }, - "viewAllMedia": { - "message": "Ver todas as mídias", - "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": "Se você quiser verificar a segurança da sua criptografia ponta a ponta com $name$, compare os números acima com os números no aparelho dessa pessoa.", "description": "", @@ -887,14 +727,6 @@ "message": "Você ainda não trocou nenhuma mensagem com a pessoa deste contato. O seu número de segurança com ela será disponível após a primeira mensagem.", "description": "" }, - "moreInfo": { - "message": "Detalhes", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Reenviar", - "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": "Excluir Mensagem", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Salvar", "description": "" }, - "fileIconAlt": { - "message": "Ícone do arquivo", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Boas-vindas ao Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privacidade é possível. Signal faz com que ela seja fácil.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Conecte seu telefone ao Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Configurações do Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Dispositivos vinculados", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Botão '+'", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Vincular Novo Dispositivo", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Nome do aparelho", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Escolher o nome deste aparelho", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Terminar a conexão ao celular", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Sincronizando contatos e grupos", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Falha de conexão ao servidor.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Desculpe. Há muitos aparelhos já religados. Tente remover alguns.", - "description": "" - }, - "settings": { - "message": "Configurações", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" - }, "permissions": { "message": "Permissões", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Ativar a verificação ortográfica do texto digitado na caixa de edição de mensagens", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Limpar dados", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Você limpará todos os dados do aplicativo, removendo todas as mensagens e informações de conta salvas.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Limpar dados", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Apagar todos os dados?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Você está prestes a apagar todas as informações de conta salvas no aplicativo, inclusive todos os contatos e todas as mensagens. Você continuará podendo conectar-se ao seu aparelho celular, mas as suas mensagens apagadas não serão restauradas. ", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Apagar todos os dados", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Desconectando e apagando todos os dados", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Notificações", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Envio Falhou", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detalhes", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Ocultar detalhes", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Saiba mais sobre como verificar números de segurança", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "MMS", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Número não registrado", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Contatos", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importar todos os grupos e contatos do seu celular para o Signal. ", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Última importação feita em ", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importar agora", - "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": "Erro ao importar. O seu computador e o seu celular estão conectados à Internet?", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "Agora", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 hora", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ h", - "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": "Há $hours$ h", - "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": "Há $minutes$ min", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "agora", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Tocar notificações em áudio", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Número de segurança alterado", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Claro", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Escuro", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Recado pra mim", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Ocultar a barra de opções", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Iniciar uma conversa…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Inserir um número de telefone para adicionar um contato.", - "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": "Religue Signal Desktop ao seu celular para continuar a enviar mensagens.", - "description": "" - }, - "unlinked": { - "message": "Não-religado", - "description": "" - }, - "relink": { - "message": "Religar", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Atualização do Session disponível", "description": "" diff --git a/_locales/pt_PT/messages.json b/_locales/pt_PT/messages.json index cf50a6fdc..398fb12f8 100644 --- a/_locales/pt_PT/messages.json +++ b/_locales/pt_PT/messages.json @@ -3,18 +3,10 @@ "message": "Copiar erro e sair", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Grupo desconhecido", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Erro na base de dados", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Eliminar todos os dados e reiniciar", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Ficheiro", "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." @@ -35,10 +27,6 @@ "message": "&Ajuda", "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": "Definições...", - "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": "Ocultar", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Configurar com a importação", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Configurar como novo dispositivo", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Configurar como dispositivo autónomo", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Conversas arquivadas", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Estas conversas estão arquivadas e apenas irão aparecer na caixa de entrada caso receba novas mensagens.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Arquivar conversa", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Mover conversas para a caixa de entrada", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Escolher pasta", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Escolher ficheiro", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Carregar os seus dados", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Ligar este dispositivo ao seu telefone", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "a sua localização selecionada", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "A atualizar a base de dados. Isto poderá demorar algum tempo...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "A carregar mensagens. $count$ até agora...", - "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": "Eu", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Você saiu do grupo", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Ir para o fim da conversa", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Nova mensagem abaixo", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Novas mensagens abaixo", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 mensagem por ler", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Submeter", "description": "" }, - "acceptNewKey": { - "message": "Aceitar", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Marcar como verificado", "description": "" @@ -455,10 +385,6 @@ "message": "Novo número de segurança", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "O número de segurança com este contacto foi alterado. Isto pode significar que alguém está a tentar intercetar a sua comunicação, ou que o seu contacto simplesmente reinstalou o Signal. Poderá querer verificar o seu novo número de segurança abaixo.", - "description": "" - }, "incomingError": { "message": "Erro a receber mensagem.", "description": "" @@ -495,18 +421,6 @@ "message": "Este mês", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Anexo com tipo não suportado. Clique para guardar.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Clique para guardar", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Ficheiro sem nome", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Mensagem de voz", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "O tipo de ficheiro deste anexo não é permitido por razões de segurança", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "A carregar a pré-visualização...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Pré-visualização da hiperligação da miniatura do esboço $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Não foi possível carregar o anexo selecionado.", "description": "" }, - "disconnected": { - "message": "Desligado", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "A ligar", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Ir para as notas de lançamento", "description": "" }, - "goToForums": { - "message": "Ir para os fóruns", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Ir para a página de suporte", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Reportar um problema", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Definições do Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Acerca do Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Fala", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Mostrar", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Ocultar", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Sair", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Procurar", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Bem-vindo(a) ao Signal", "description": "" }, - "selectAContact": { - "message": "Selecione um contacto ou grupo para começar a trocar mensagens.", - "description": "" - }, "typingAlt": { "message": "Apresentar escrita com animação para esta conversa.", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Enviar mensagem", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "casa", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Você", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "A responder a $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": "Para enviar mensagens de áudio, permita que o Signal aceda ao seu microfone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Permitir o acesso", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Mostrar definições", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Áudio", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "OK", "description": "" @@ -809,18 +665,10 @@ "message": "Cancelar", "description": "" }, - "failedToSend": { - "message": "Falha ao enviar para alguns destinatários. Verifique a sua ligação à rede", - "description": "" - }, "error": { "message": "Erro", "description": "" }, - "messageDetail": { - "message": "Detalhes da mensagem", - "description": "" - }, "delete": { "message": "Eliminar", "description": "" @@ -857,10 +705,6 @@ "message": "Membros do grupo", "description": "" }, - "showMembers": { - "message": "Mostrar membros", - "description": "" - }, "resetSession": { "message": "Reiniciar sessão", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Ver número de segurança", "description": "" }, - "viewAllMedia": { - "message": "Ver todos os média", - "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": "Se deseja verificar a segurança da sua cifragem ponto-a-ponto com $name$, compare os números acima com os números existentes no dispositivo dessa pessoa.", "description": "", @@ -887,14 +727,6 @@ "message": "Ainda não trocou mensagens com este contacto. O seu número de segurança estará disponível a partir da primeira mensagem.", "description": "" }, - "moreInfo": { - "message": "Mais informação...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Tentar enviar novamente ", - "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": "Eliminar mensagem", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Guardar", "description": "" }, - "fileIconAlt": { - "message": "Ícone do ficheiro", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji de '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "O Signal Desktop dá-lhe as boas-vindas!", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "A privacidade é possível. O Signal torna-a fácil.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Associar o seu telefone ao Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Definições do Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Dispositivos associados", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Botão '+'", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Associar um novo dispositivo", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Nome do dispositivo", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Escolher o nome do dispositivo", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Finalizar a associação ao telefone", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "A sincronizar contactos e grupos", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Falha na ligação ao servidor", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Existem demasiados dispositivos associados. Tente remover alguns.", - "description": "" - }, - "settings": { - "message": "Definições", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" - }, "permissions": { "message": "Permissões", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Ative a verificação ortográfica para o texto introduzido", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Limpar dados", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Isto limpará todos os dados da aplicação, removendo todas as mensagens e os dados guardados da sua conta.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Limpar dados", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Eliminar todos os dados?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Está prestes a eliminar todos os dados de conta guardados da sua aplicação, incluindo todos os contactos e todas as mensagens. Pode sempre associar novamente ao seu telemóvel, mas não irá recuperar as mensagens eliminadas.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Eliminar todos os dados", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "A desligar e a eliminar todos os dados", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Notificações", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Falha no envio", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detalhes", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Ocultar detalhes", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Saiba mais sobre a verificação dos números de segurança", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Mensagem de média", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Número não registado", - "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 os grupos e contactos do Signal a partir do seu dispositivo móvel.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Última importação a ", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importar agora", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "A importar...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Falha na importação. Por favor, confirme que o seu computador e o seu telemóvel se encontram ligados à Internet.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "agora", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 hora", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ h", - "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": "há $hours$h", - "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": "há $minutes$ min", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "agora", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Reproduzir notificação áudio", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "O número de segurança foi alterado", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Claro", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Escuro", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Nota para mim", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Ocultar menu", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Iniciar uma nova conversa…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Introduza um número de telefone para adicionar como 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": "Para continuar a comunicar, volte a associar o Signal Desktop ao seu telemóvel.", - "description": "" - }, - "unlinked": { - "message": "Desassociado", - "description": "" - }, - "relink": { - "message": "Voltar a associar", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Existe uma actualização disponível para o Session", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/ro/messages.json b/_locales/ro/messages.json index de51cd86f..a7771f6a7 100644 --- a/_locales/ro/messages.json +++ b/_locales/ro/messages.json @@ -3,18 +3,10 @@ "message": "Copiază eroare și închide aplicația", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Grup necunoscut", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Eroare de bază de date", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Șterg toate datele și repornește", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Fișier", "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." @@ -35,10 +27,6 @@ "message": "&Ajutor", "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": "Preferințe...", - "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": "Ascunde", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Setează prin import", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Setează ca dispozitiv nou", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Setează ca dispozitiv de sine stătător", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Conversații arhivate", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Conversațiile sunt arhivate și vor apărea doar în Inbox dacă sunt primite mesaje noi.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Arhivați conversația", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Mutați conversația în Inbox", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Alege directorul", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Alegeți fișier", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Încarcă-ți datele", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Asociază acest dispozitiv cu telefonul tău", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "locația ta selectată", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Se actualizează baza de date. Va dura ceva timp...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Se încarcă mesajele. $count$ până acum...", - "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": "Eu", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Ai părăsit grupul", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Derulează în partea de jos a conversației", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Mesaj nou mai jos", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Mesaje noi mai jos", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 Mesaj necitit", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Trimite", "description": "" }, - "acceptNewKey": { - "message": "Acceptă", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Marchează ca fiind verificat", "description": "" @@ -455,10 +385,6 @@ "message": "Număr de siguranță nou", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Numărul de siguranță pentru acest contact s-a schimbat. Asta poate însemna că cineva încearcă să intercepteze comunicarea, sau contactul și-a reinstalat Signal. Ai putea dori să verifici noul număr de siguranță de mai jos.", - "description": "" - }, "incomingError": { "message": "Eroare la procesarea mesajului primit", "description": "" @@ -495,18 +421,6 @@ "message": "Luna asta", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Tipul ataşamentului nu este suportat. Click pentru a salva.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Apasă pentru a salva", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Fișier fără nume", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Mesaj vocal", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Tipul de atașament nu este permis din motive de securitate", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Se încarcă previzualizarea...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Nu s-a putut încărca atașamentul selectat.", "description": "" }, - "disconnected": { - "message": "Deconectat", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Se conectează", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Mergi la Notele de Lansare", "description": "" }, - "goToForums": { - "message": "Mergi la Forumuri", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Mergi la Pagina de Suport", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Raportează o problemă", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Preferințe Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Despre Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Vorbire", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Afișează", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Ascunde", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Închide", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Căutați", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Bun venit la Signal", "description": "" }, - "selectAContact": { - "message": "Alege un contact sau un grup pentru a discuta.", - "description": "" - }, "typingAlt": { "message": "Animații la tastare pentru conversația curentă", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Trimite mesaj", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "acasă", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Tu", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Răspuns de la $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": "Pentru a trimite mesaje audio, permite aplicației Signal Desktop accesul la microfonul tău.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Permite accesul", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Afișează setările", - "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" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "OK", "description": "" @@ -809,18 +665,10 @@ "message": "Anulare", "description": "" }, - "failedToSend": { - "message": "Mesajul nu a putut fi trimis la unii destinatari. Verifică conexiunea la rețea.", - "description": "" - }, "error": { "message": "Eroare", "description": "" }, - "messageDetail": { - "message": "Detalii mesaj", - "description": "" - }, "delete": { "message": "Șterge", "description": "" @@ -857,10 +705,6 @@ "message": "Membrii grupului", "description": "" }, - "showMembers": { - "message": "Afișează membrii", - "description": "" - }, "resetSession": { "message": "Resetează sesiunea", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Afișează numărul de siguranță", "description": "" }, - "viewAllMedia": { - "message": "Vezi toate fișierele 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": "Dacă dorești să verifici numărul tău de siguranță a criptării conexiunii cu $name$, compară numerele de mai sus cu cele de pe dispozitivul lui.", "description": "", @@ -887,14 +727,6 @@ "message": "Nu ai schimbat până acum nici un mesaj cu acest contact. Numărul de siguranță va fi disponibil după primul mesaj.", "description": "" }, - "moreInfo": { - "message": "Mai multe informații...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Încearcă re-trimiterea", - "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": "Şterge mesajul", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Salvează", "description": "" }, - "fileIconAlt": { - "message": "Icoană fișier", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Imagine emoji pentru '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Bun venit la Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Confidențialitatea este posibilă. Signal face asta ușor.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Asociază telefonul tău cu Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Setări Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Dispozitive asociate", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Butonul '+'", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Asociază dispozitiv nou", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Numele dispozitivului", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Alege numele dispozitivului", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Finalizează asocierea telefonului", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Sincronizare contacte și grupuri", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Conectarea la server a eșuat.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Ne pare rău, ai prea multe dispozitive asociate deja. Încearcă să elimini câteva.", - "description": "" - }, - "settings": { - "message": "Setări", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Temă", - "description": "Header for theme settings" - }, "permissions": { "message": "Permisiuni", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Șterge datele", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Această acțiune va șterge toate datele din aplicație, înlăturând toate mesajele și informațiile salvate despre cont", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Șterge datele", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Șterg toate datele?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Ești pe cale să ștergi toate informațiile de cont salvate ale acestei aplicații, inclusiv toate persoanele de contact și toate mesajele. Poți oricând să te conectezi din nou cu dispozitivul mobil, dar mesajele șterse nu vor fi restabilite.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Șterge toate datele", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Deconectare în curs și se șterg toate datele", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Notificări", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Trimitere eșuată", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detalii", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Ascunde detaliile", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Află mai multe despre verificarea numerelor de siguranță.", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Mesaj media", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Numărul nu este înregistrat", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Contacte", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importă toate grupurile și contactele Signal de pe dispozitivul tău mobil.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Ultima importare la", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importă acum", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Se importă...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Importare eșuată. Verifică dacă calculatorul și telefonul sunt conectate la internet.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "acum", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "o oră", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ ore", - "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": "acum $hours$ ore", - "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": "acum $minutes$ minute", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "acum", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Redă notificarea audio", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Numărul de siguranță s-a schimbat", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Deschisă", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Închisă", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Notă personală", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Ascunde bara de meniu", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Pornește o conversație nouă...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Introdu un număr de telefon pentru a adăuga un contact.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Număr invalid", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Asociază din nou Signal Desktop la dispozitivul tău mobil pentru a putea comunica din nou.", - "description": "" - }, - "unlinked": { - "message": "Disociat", - "description": "" - }, - "relink": { - "message": "Asociază din nou", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Este disponibilă o actualizare de Session ", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index a3ecec0c7..ad5e2ab20 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -3,18 +3,10 @@ "message": "Скопировать ошибку и выйти", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Неизвестная группа", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Ошибка базы данных", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Удалить все данные и перезапустить", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Файл", "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." @@ -35,10 +27,6 @@ "message": "&Помощь", "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": "Настройки…", - "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": "Скрыть", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Настроить с импортом", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Настроить как новое устройство", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Настроить как отдельное устройство", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Архивированные разговоры", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Эти разговоры архивированы и будут появляться во Входящих только когда получены новые сообщения.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Архивировать разговор", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Переместить разговор во Входящие", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Выберите папку", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Выберите файл", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Загрузите свои данные", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Свяжите это устройство с телефоном", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "выбранное расположение", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Обновление базы данных. Это может занять некоторое время...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Загрузка сообщений. Уже загружено $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": "Я", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Вы покинули группу.", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Перейти в конец беседы", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Новое сообщение ниже", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Новые сообщения ниже", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "$count$ Непрочитанное Сообщение", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Отправить", "description": "" }, - "acceptNewKey": { - "message": "Принять", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Отметить как подтвержденный", "description": "" @@ -455,10 +385,6 @@ "message": "Новый код безопасности", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Код безопасности с этим контактом изменился. Это может означать, что кто-то пытается перехватить ваши сообщения, или собеседник попросту переустановил Signal. Вы можете подтвердить новый код безопасности указанный ниже.", - "description": "" - }, "incomingError": { "message": "Ошибка при обработке входящего сообщения", "description": "" @@ -495,18 +421,6 @@ "message": "В Этом Месяце", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Неподдерживаемый тип вложения. Нажмите, чтобы сохранить.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Нажмите для сохранения", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Безымянный файл", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Голосовое сообщение", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "По соображениям безопасности этот тип файлов нельзя пересылать в приложениях.", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Загрузка предварительного просмотра...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Черновик миниатюры предварительного просмотра ссылки для $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Извините, произошла ошибка при обработке вложения.", "description": "" }, - "disconnected": { - "message": "Отключен", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Соединяемся...", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Перейти к заметкам о релизе", "description": "" }, - "goToForums": { - "message": "Перейти к форумам", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Перейти на страницу поддержки", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Сообщить о проблеме", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Параметры Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "О Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Речь", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Показать", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Скрыть", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Выйти", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Поиск", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Добро пожаловать в Session.", "description": "" }, - "selectAContact": { - "message": "Выберите контакт или группу для начала общения.", - "description": "" - }, "typingAlt": { "message": "Анимация набора текста для этого разговора", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Отправчить сообщение", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "Домашний", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Вы", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Ответ $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": "Для отправки аудиосообщений разрешите Session доступ к микрофону.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Разрешить доступ", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Показать настройки", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Аудио", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "OK", "description": "" @@ -809,18 +665,10 @@ "message": "Отменить", "description": "" }, - "failedToSend": { - "message": "Не удалось отправить некоторым получателям. Проверьте сетевое соединение.", - "description": "" - }, "error": { "message": "Ошибка", "description": "" }, - "messageDetail": { - "message": "Детали сообщения", - "description": "" - }, "delete": { "message": "Удалить", "description": "" @@ -857,10 +705,6 @@ "message": "Участники группы", "description": "" }, - "showMembers": { - "message": "Показать участников", - "description": "" - }, "resetSession": { "message": "Сбросить Защищённый Сеанс", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Просмотреть Код Безопасности", "description": "" }, - "viewAllMedia": { - "message": "Просмотреть все медиа", - "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": "Если вы хотите подтвердить безопасность вашего соединения с $name$, сравните код, указанные выше, с кодом на устройстве собеседника.", "description": "", @@ -887,14 +727,6 @@ "message": "Вы еще не обменивались сообщениями с данным собеседником. Код безопасности станет доступен после отправки первого сообщения.", "description": "" }, - "moreInfo": { - "message": "Больше информации...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Повторить отправку", - "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": "Удалить Сообщение", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Сохранить", "description": "" }, - "fileIconAlt": { - "message": "Значок файла", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Добро пожаловать в Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Приватное общение возможно. Signal помогает его упростить.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Свяжите свой телефон с Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Настройки Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Связанные устройства", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Кнопка '+'", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Привязать Новое Устройство", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Имя устройства", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Выберите имя этого устройства", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Связывание телефона закончено", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Синхронизация контактов и групп", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Не удалось подключиться к серверу.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Извините, вы привязали слишком много устройств. Попробуйте удалить неиспользуемые устройства.", - "description": "" - }, - "settings": { - "message": "Настройки", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Тема", - "description": "Header for theme settings" - }, "permissions": { "message": "Разрешения", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Включить проверку орфографии текста, введенного в поле создания сообщения", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Очистить данные", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Это действие очистит все данные приложения, удалив все сообщения и информацию об учетной записи.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Очистить данные", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Удалить все данные?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Вы собираетесь удалить всю информацию об учетной записи из этого приложения, включая контакты и сообщения. Вы всегда можете повторно связать ваше мобильное устройство, но это не приведет к восстановлению удаленных сообщений.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Удалить все данные", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Отключение и удаление всех данных", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Уведомления", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Не Удалось Отправить", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Подробнее", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Скрыть детали", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Дополнительные сведения о проверке кодов безопасности", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Медиа-сообщение", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Номер не зарегистрирован", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Контакты", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Импортировать все группы и контакты Signal с мобильного устройства.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Последний импорт в", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Импортировать сейчас", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Импорт...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Ошибка импорта. Убедитесь, что компьютер и мобильное устройство подключены к интернету.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "Только Что", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 час", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ ч.", - "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$ час. назад", - "description": "Contracted form of 'X hours ago' which works both for singular and plural", - "placeholders": { - "hours": { - "content": "$1", - "example": "2" - } - } - }, - "minutesAgoShort": { - "message": "$minutes$ мин.", - "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$ мин. назад", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "сейчас", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Воспроизведение звукового уведомления", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Код безопасности изменился", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Светлая", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Темная", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Заметка для себя", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Скрыть строку меню", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Начать новый разговор…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Введите номер телефона для добавления контакта.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Неверный номер", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Повторно свяжите Signal Desktop с вашим мобильным устройством для продолжения общения.", - "description": "" - }, - "unlinked": { - "message": "Отвязан", - "description": "" - }, - "relink": { - "message": "Привязать", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Доступно обновление Session", "description": "" diff --git a/_locales/sk/messages.json b/_locales/sk/messages.json index 255968466..cb0b50357 100644 --- a/_locales/sk/messages.json +++ b/_locales/sk/messages.json @@ -3,18 +3,10 @@ "message": "Kopírovať a ukončiť", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Neznáma skupina", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Chyba databázy", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Vymazať všetky dáta a reštartovať", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Súbor", "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." @@ -35,10 +27,6 @@ "message": "&Pomocník", "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": "Nastavenia...", - "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": "Skryť", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Nastaviť Importovaním", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Nastaviť ako Nové Zariadenie", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Nastaviť ako Samostatné Zariadenie", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Archivované konverzácie", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archivovať konverzáciu", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Presunúť konverzáciu do doručených", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Zvoľte priečinok", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Vybrať súbor", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Nahrajte svoje dáta", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Pripojte toto zariadenie k vašemu mobilnému telefónu", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "zvolené umiestnenie", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Aktualizácia databázy. Môže to chvíľu trvať...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Nahrávanie správ. $count$ nahraných...", - "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": "Ja", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Opustili ste skupinu", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Späť na koniec", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Nová správa nižšie", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nové správy nižšie", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 Neprečítaná Správa", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Odoslať", "description": "" }, - "acceptNewKey": { - "message": "Prijať", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Označiť ako overené", "description": "" @@ -455,10 +385,6 @@ "message": "Nové bezpečnostné číslo", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Vaše bezpečnostné číslo sa s týmto kontaktom zmenilo. Môže to znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len znovu nainštaloval/a Signal. Odporúčame opätovné overenie bezpečnostného čísla s týmto kontaktom.", - "description": "" - }, "incomingError": { "message": "Chyba pri spracovaní prichádzajúcej správy", "description": "" @@ -495,18 +421,6 @@ "message": "Tento mesiac", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Nepodporovaný typ prílohy. Kliknite pre uloženie.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Kliknite pre uloženie", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Nepomenovaný Súbor", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Hlasová Správa", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Tento typ súboru je z bezpečnostných dôvodov zakázaný", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Načítavam náhľad...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Zvolenú prílohu sa nepodarilo načítať.", "description": "" }, - "disconnected": { - "message": "Odpojený", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Pripojovanie", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Navštíviť Poznámky k Vydaniu", "description": "" }, - "goToForums": { - "message": "Navštíviť Fórum", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Navštíviť Stránku Podpory", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Nahlásiť Problém", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Nastavenia Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "O aplikácii Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Reč", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Zobraziť", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Skryť", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Ukončiť", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Hľadať", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Vitajte v aplikácii Signal", "description": "" }, - "selectAContact": { - "message": "Vyberte si kontakt alebo skupinu a zahájte rozhovor.", - "description": "" - }, "typingAlt": { "message": "Animácia písania pre túto konverzáciu", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Poslať správu", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "domov", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Vy", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Odpoveď pre $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": "Pre posielanie zvukových správ, povoľte aplikácii Signal Desktop prístup k mikrofónu.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Povoliť prístup", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Otvoriť nastavenia", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Zvuk", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "OK", "description": "" @@ -809,18 +665,10 @@ "message": "Zrušiť", "description": "" }, - "failedToSend": { - "message": "Správu sa nepodarilo odoslať niektorým príjemcom. Skontrolujte svoje sieťové pripojenie.", - "description": "" - }, "error": { "message": "Chyba", "description": "" }, - "messageDetail": { - "message": "Podrobnosti správy", - "description": "" - }, "delete": { "message": "Vymazať", "description": "" @@ -857,10 +705,6 @@ "message": "Členy skupiny", "description": "" }, - "showMembers": { - "message": "Zobraziť členov", - "description": "" - }, "resetSession": { "message": "Obnoviť reláciu", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Zobraziť bezpečnostné číslo", "description": "" }, - "viewAllMedia": { - "message": "Zobraziť médiá", - "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": "Keď sa chcete presvedčiť o bezpečnosti šifrovania vašej komunikácie s $name$, porovnajte vyššie uvedené čísla s číslami na druhom zariadení.", "description": "", @@ -887,14 +727,6 @@ "message": "S týmto kontaktom ste si ešte nevymenili žiadne správy. Bezpečnostné číslo bude dostupné po doručení prvej správy.", "description": "" }, - "moreInfo": { - "message": "Viac informácii...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Odoslať znovu", - "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": "Vymazať správu", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Uložiť", "description": "" }, - "fileIconAlt": { - "message": "Ikona súboru", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji \"$title$\"", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Vitajte v aplikácii Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Súkromie je možné. Signal ho uľahčuje.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Pripojte svoj mobilný telefón k Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Nastavenia Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Pripojené zariadenia", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Tlačidlo \"+\"", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Pripojiť Nové Zariadenie", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Názov zariadenia", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Zvoľte názov pre toto zariadenie", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Dokončiť pripojenie mobilného telefónu", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Synchronizácia kontaktov a skupín", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Pripojenie k serveru zlyhalo.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Máte prepojených príliš veľa zariadení. Skúste odstrániť niektoré z nich.", - "description": "" - }, - "settings": { - "message": "Nastavenia", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Motív", - "description": "Header for theme settings" - }, "permissions": { "message": "Povolenia", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Povoliť kontrolu pravopisu textu zadaného do textového poľa", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Mazanie dát", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Týmto zmažete všetky dáta v aplikácii, odstránite všetky správy a informácie o účte.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Vymazať dáta", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Vymazať všetky dáta?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Chystáte sa vymazať všetky informácie o účte vrátane všetkých kontaktov a správ. Opätovné prepojenie aplikácie s mobilným zariadením bude stále možné, avšak bez možnosti obnovy zmazaných správ.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Vymazať všetky dáta", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Odpojovanie a mazanie dát", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Upozornenia", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Odoslanie zlyhalo", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Podrobnosti", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Skryť podrobnosti", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Dozvedieť sa viac o overovaní bezpečnostných čísiel", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Multimediálna správa", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Číslo nie je registrované", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontakty", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importovať všetky skupiny a kontakty Signalu z mobilného zariadenia.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Posledný import", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importovať teraz", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importuje sa...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Import zlyhal. Uistite sa, že váš počítač a mobilný telefón majú prístup k internetu.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "teraz", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 hodina", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ hod", - "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": "pred $hours$ h", - "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": "pred $minutes$ min", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "teraz", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Prehrať zvuk upozornenia", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Zmenilo sa bezpečnosné číslo", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Svetlý", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Tmavý", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Poznámka pre seba", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Skryť ponuku", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Začať nový rozhovor…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Pre pridanie kontaktu zadajte telefónne číslo.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Neplatné číslo", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Pre pokračovanie znovu pripojte Signal Desktop k vašemu mobilnému zariadeniu.", - "description": "" - }, - "unlinked": { - "message": "Odpojené", - "description": "" - }, - "relink": { - "message": "Prepojiť znovu", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Dostupná aktualizácia pre Session", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/sl/messages.json b/_locales/sl/messages.json index a7434c0e3..aa5f29241 100644 --- a/_locales/sl/messages.json +++ b/_locales/sl/messages.json @@ -3,18 +3,10 @@ "message": "Kopiraj napako in zapusti aplikacijo", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Neznana skupina", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Napaka v bazi podatkov", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Izbris vseh podatkov in ponovni zagon", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Datoteka", "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." @@ -35,10 +27,6 @@ "message": "&Pomoč", "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": "Nastavitve ...", - "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": "Skrij", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Nastavi z uvozom podatkov", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Nastavi kot novo napravo", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Nastavi kot samostojno napravo", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Arhivirani pogovori", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Ti pogovori so bili premaknjeni v arhiv in se bodo znova pojavili v nabiralniku, če prejmete novo sporočilo.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Premakni pogovor v arhiv", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Več pogovorov v nabiralnik", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Izberite mapo", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Izberite datoteko", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Naložite svoje podatke", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Povežite napravo s svojim telefonom", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "izbrana lokacija", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Posodabljam zbirko podatkov. To lahko traja nekaj časa ...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Nalagam sporočila. $count$ doslej ...", - "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": "Jaz", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Zapustili ste skupino", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Pomaknite se na dno pogovora", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Novo sporočilo spodaj", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nova sporočila spodaj", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 novo sporočilo", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Objavi", "description": "" }, - "acceptNewKey": { - "message": "Sprejmi", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Označi kot potrjeno.", "description": "" @@ -455,10 +385,6 @@ "message": "Novo varnostno število", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Vaše varnostno število s to osebo je bilo spremenjeno. To lahko pomeni, da poskuša nekdo prestrezati vajino komunikacijo ali pa je vaš partner zgolj na novo namestil aplikacijo Signal. Novo varnostno število lahko preverite spodaj.", - "description": "" - }, "incomingError": { "message": "Napaka pri obdelavi dohodnega sporočila", "description": "" @@ -495,18 +421,6 @@ "message": "Ta mesec", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Nepodprta vrsta priponke. Kliknite, če jo želite shraniti.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Shrani", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Neimenovana datoteka", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Glasovno sporočilo", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Ta vrsta priponke iz varnostnih razlogov ni dovoljena", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Nalagam predogled ...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Osnutek predogledne sličice povezave na: $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Izbrane priponke ni bilo mogoče zagnati.", "description": "" }, - "disconnected": { - "message": "Povezava je prekinjena", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Povezujem", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Opombe k izdaji", "description": "" }, - "goToForums": { - "message": "Forumi", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Podporna stran", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Prijava napake", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Nastavitve Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "O aplikaciji Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Nagovor", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Prikaži", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Skrij", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Končaj", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Iskanje", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Dobrodošli v aplikaciji Signal", "description": "" }, - "selectAContact": { - "message": "Izberite osebo ali skupino in začnite s pogovorom.", - "description": "" - }, "typingAlt": { "message": "Animacija tipkanja za ta pogovor", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Pošlji sporočilo", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "doma", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Vi", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Odgovor uporabniku $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": "Za pošiljanje glasovnih sporočil potrebuje aplikacija Signal Desktop dostop do vašega mikrofona.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Dovoli dostop", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Prikaži nastavitve", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Zvok", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "OK", "description": "" @@ -809,18 +665,10 @@ "message": "Prekliči", "description": "" }, - "failedToSend": { - "message": "Pošiljanje nekaterim prejemnikom ni uspelo. Preverite povezavo z omrežjem.", - "description": "" - }, "error": { "message": "Napaka", "description": "" }, - "messageDetail": { - "message": "Podrobnosti sporočila", - "description": "" - }, "delete": { "message": "Izbriši", "description": "" @@ -857,10 +705,6 @@ "message": "Člani skupine", "description": "" }, - "showMembers": { - "message": "Prikaži člane", - "description": "" - }, "resetSession": { "message": "Ponastavi sejo", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Preglej varnostno število", "description": "" }, - "viewAllMedia": { - "message": "Vse medijske datoteke", - "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": "Če želite preveriti varnost od konca do konca šifrirane komunikacije z uporabnikom $name$, primerjajte gornje število s številom na njegovi napravi.", "description": "", @@ -887,14 +727,6 @@ "message": "S to osebo še niste izmenjali sporočil. Vajino varnostno število bo na voljo po prvem poslanem sporočilu.", "description": "" }, - "moreInfo": { - "message": "Več informacij ...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Ponovno pošlji", - "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": "Izbriši sporočilo", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Shrani", "description": "" }, - "fileIconAlt": { - "message": "Ikona datoteke", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji znak za '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Dobrodošli v aplikaciji Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Zasebnost obstaja. Signal jo naredi preprosto.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Povežite svoj telefon z aplikacijo Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Nastavitve Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Povezane naprave", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Gumb '+'", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Poveži novo napravo", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Ime naprave", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Izberite ime te naprave", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Zaključujem povezavo s telefonom", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Usklajujem stike in skupine", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Ne morem se povezati s strežnikom.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Na žalost imate dodanih preveč naprav. Poskusite odstraniti kakšno izmed njih.", - "description": "" - }, - "settings": { - "message": "Nastavitve", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" - }, "permissions": { "message": "Dovoljenja", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Vklop črkovalnika v okencu za vnašanje sporočila", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Izbris podatkov", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "S tem boste izbrisali vse podatke v aplikaciji, odstranili vsa sporočila in podatke o računu.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Izbris podatkov", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Želite izbrisati vse podatke?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Ste pred korakom, s katerim boste izbrisali vse podatke v aplikaciji Signal, vključno s stiki in sporočili. Naknadno se boste lahko zopet povezali s svojo mobilno napravo, a to ne bo povrnilo izbrisanih sporočil.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Izbris vseh podatkov", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Odjava in brisanje vseh podatkov", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Obvestila", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Pošiljanje ni uspelo", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Podrobnosti", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Skrij podrobnosti", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Več o verifikaciji varnostnih števil", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Multimedijsko sporočilo", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Številka ni registrirana", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Stiki", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Uvoz stikov in skupin Signal iz mobilne naprave.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Nazadnje uvoženo: ", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Uvozi zdaj", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Uvažam ...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Uvoz ni bil uspešen. Preverite, da sta vaša mobilna naprava in računalnik povezana z internetom.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "ravnokar", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 uro", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ h", - "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": "Pred $hours$ h", - "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": "Pred $minutes$ min", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "ravnokar", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Predvajaj zvočna obvestila", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Varnostno število je bilo spremenjeno", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Svetla", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Temna", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Osebna zabeležka", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Skrij menijsko vrstico", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Začni nov pogovor ...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Z vnosom telefonske številke boste ustvarili nov stik", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Neveljavna številka", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Za nadaljevanje komunikacije ponovno povežite aplikacijo Signal Desktop s svojo mobilno napravo.", - "description": "" - }, - "unlinked": { - "message": "Nepovezan", - "description": "" - }, - "relink": { - "message": "Poveži", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Na voljo je posodobitev aplikacije Session", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/sq/messages.json b/_locales/sq/messages.json index 89da7d48d..518927a42 100644 --- a/_locales/sq/messages.json +++ b/_locales/sq/messages.json @@ -3,18 +3,10 @@ "message": "Kopjo gabimin dhe dil", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Grup i panjohur", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Gabim Baze të Dhënash", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Fshiji krejt të dhënat dhe rifillo", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Kartelë", "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." @@ -35,10 +27,6 @@ "message": "&Ndihmë", "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": "Parapëlqime…", - "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": "Fshihe", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Rregulloje me Importim", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Rregulloje si Pajisje të Re", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Rregulloje si Pajisje Më Vete", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Biseda të Arkivuara", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Këto biseda janë të arkivuara dhe do të shfaqen te Të marrë vetëm nëse merren mesazhe të rinj.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Arkivojeni Bisedën", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Kaloje Bisedën te Të marrë", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Zgjidhni dosje", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Zgjidhni kartelë", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Ngarkoni të dhënat tuaja", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Lidheni këtë pajisje me telefonin tuaj", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "te vendi juaj parazgjedhje", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Po përmirësohet baza e të dhënave. Kjo mund të hajë ca kohë…", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Po ngarkohen mesazhe. $count$ deri tani…", - "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": "Unë", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "E keni braktisur grupin", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Rrëshqitni drejt fundit të bisedës", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Mesazh i ri më poshtë", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Mesazhe të rinj më poshtë", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 Mesazh i Palexuar", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Parashtrojeni", "description": "" }, - "acceptNewKey": { - "message": "Pranoje", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Vëri shenjë si i verifikuar", "description": "" @@ -455,10 +385,6 @@ "message": "Numër i ri sigurie", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Numri juaj i sigurisë me këtë kontakt ka ndryshuar. Kjo mund të dojë të thotë se ose dikush po rreket të përgjojë komunikimin tuaj, ose se ky kontakt thjesht riinstaloi Signal-in. Mund të donit të verifikoni numrin e ri të sigurisë më poshtë.", - "description": "" - }, "incomingError": { "message": "Gabim në trajtimin e mesazhit ardhës", "description": "" @@ -495,18 +421,6 @@ "message": "Këtë Muaj", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Lloj bashkëngjitjeje i pambuluar. Klikoni që të ruhet.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Klikoni që të ruhet", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Kartelë Pa Emër", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Mesazh Zanor", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Lloj bashkëngjitjeje i palejuar për arsye sigurie", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Po ngarkohet Paraparja…", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Paraparje lidhjeje miniature skice për $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "S’arrihet të ngarkohet bashkëngjitja e përzgjedhur.", "description": "" }, - "disconnected": { - "message": "I shkëputur", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Po lidhet", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Kalo te Shënime Versioni", "description": "" }, - "goToForums": { - "message": "Kalo te Forumet", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Kalo te Faqja e Asistencës", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Njoftoni një Problem", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Parapëlqime për Signal-in në Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Mbi Signal-in për Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "E folur", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Shfaqe", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Fshihe", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Dil", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Kërko", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Mirë se vini te Signal-i", "description": "" }, - "selectAContact": { - "message": "Përzgjidhni një kontakt ose grup që të filloni të fjaloseni.", - "description": "" - }, "typingAlt": { "message": "Animacion shtypjesh për këtë bisedë", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Dërgo Mesazh", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "shtëpie", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Ju", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Përgjigje për $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": "Për të dërguar mesazhe audio, lejojeni Signal-in për Desktop të përdorë mikrofonin tuaj.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Lejoje Përdorimin", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Shfaq Rregullime", - "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" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "OK", "description": "" @@ -809,18 +665,10 @@ "message": "Anuloje", "description": "" }, - "failedToSend": { - "message": "Dështoi dërgimi te disa marrës. Kontrolloni lidhjen tuaj në rrjet.", - "description": "" - }, "error": { "message": "Gabim", "description": "" }, - "messageDetail": { - "message": "Hollësi Mesazhi", - "description": "" - }, "delete": { "message": "Fshije", "description": "" @@ -857,10 +705,6 @@ "message": "Anëtarë grupi", "description": "" }, - "showMembers": { - "message": "Shfaq anëtarët", - "description": "" - }, "resetSession": { "message": "Rinis sesionin", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Shihni numër sigurie", "description": "" }, - "viewAllMedia": { - "message": "Shihni krejt mediat", - "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": "Nëse doni të verifikoni sigurinë e fshehtëzimit tuaj skaj-më-skaj me $name$, krahasoni numrat më sipër me numrat në pajisjen e tij.", "description": "", @@ -887,14 +727,6 @@ "message": "S’keni shkëmbyer ende ndonjë mesazh me këtë grup. Numri juaj i sigurisë me të do të jetë i passhëm pas mesazhit të parë.", "description": "" }, - "moreInfo": { - "message": "Më Tepër të Dhëna…", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Riprovo Dërgimin", - "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": "Fshije Mesazhin", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Ruaje", "description": "" }, - "fileIconAlt": { - "message": "Ikonë kartele", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Figurë emoji e '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Mirë se vini te Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Privatësia është e mundur. Signal-i e bën të lehtë.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Lidheni telefonin tuaj me Signal-in për Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Rregullime Signal-i", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Pajisje të Lidhura", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "Butoni '+'", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Lidhini Pajisje të Re", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Emër pajisjeje", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Zgjidhni emër të kësaj pajisje", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Përfundoje lidhjen e telefonit", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Po njëkohësohen kontakte dhe grupe", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Dështoi lidhja me shërbyesin.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Na ndjeni, keni shumë pajisje të lidhura tashmë. Provoni të hiqni ndoca.", - "description": "" - }, - "settings": { - "message": "Rregullime", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Temë", - "description": "Header for theme settings" - }, "permissions": { "message": "Leje", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Aktivizo kontroll drejtshkrimi të tekstit të dhënë te kutia e hartimit të mesazheve", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Pastroji të Dhënat", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Kjo do të pastrojë krejt të dhënat te aplikacioni, duke hequr krejt mesazhet dhe të dhëna llogarie të ruajtura.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Pastroji të dhënat", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Të fshihen krejt të dhënat?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Ju ndan një hap nga fshirja e krejt të dhënave të llogarisë të ruajtura për këtë aplikacion, përfshi krejt kontaktet dhe krejt mesazhet. Mundeni përherë ta rilidhni pajisjen tuaj celulare, por kjo nuk do të sjellë rikthim të mesazheve të fshirë.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Fshiji krejt të dhënat", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Po bëhet shkëputja dhe fshirja e krejt të dhënave", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Njoftime", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Dërgimi dështoi", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Hollësi", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Fshihi hollësitë", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Mësoni më tepër rreth verifikimit të numrave të sigurisë", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Mesazh media", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Numri s’është i regjistruar", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontakte", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importoni krejt grupet dhe kontaktet Signal nga pajisja juaj celulare.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Importimi i fundit më", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importoji tani", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Po importohen…", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Importimi dështoi. Sigurohuni që kompjuteri dhe telefoni juaj janë të lidhur në internet.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "tani", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 orë", "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 më parë", - "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 më parë", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "tani", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Luaj një tingull njoftimi ", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Ka ndryshuar Numër Sigurie", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "E çelët", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "E errët", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Shënim për Veten", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Fshihe shtyllën e menusë", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Filloni bisedë të re…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Jepni një numër telefoni që të shtohet një kontakt.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Numër i pavlefshëm", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Që të vazhdoni shkëmbim mesazhesh, rilidheni Signal-in për Desktop me pajisjen tuaj celulare.", - "description": "" - }, - "unlinked": { - "message": "Jo e lidhur", - "description": "" - }, - "relink": { - "message": "Rilidhe", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Ka gati përditësim të Session-it", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/sr/messages.json b/_locales/sr/messages.json index 4a6c715d7..b66f1723c 100644 --- a/_locales/sr/messages.json +++ b/_locales/sr/messages.json @@ -3,18 +3,10 @@ "message": "Copy error and quit", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Unknown group", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Database Error", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Delete all data and restart", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "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." @@ -35,10 +27,6 @@ "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" @@ -135,10 +123,6 @@ "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" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Archived Conversations", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archive Conversation", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Move Conversation to Inbox", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Одаберите фолдер", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Choose file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Load your data", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "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": "ваша одабрана локација", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Унапређујем базу података. Ово може потрајати неко време...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Учитавање порука. $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": "Ја", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Напустили сте групу", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Иди на крај преписке", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Нова порука испод", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Нове поруке испод", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 непрочитана порука", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Пошаљи", "description": "" }, - "acceptNewKey": { - "message": "Прихвати", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Означи као проверено", "description": "" @@ -455,10 +385,6 @@ "message": "Нова шифра преписке", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Шифра преписке са овим дописником је другачија. Ово значи или да неко пресреће вашу преписку, или је овај дописник једноставно извршио поновну инсталацију Signal-а. Можда желите да верификујете приказану шифру.", - "description": "" - }, "incomingError": { "message": "Error handling incoming message", "description": "" @@ -495,18 +421,6 @@ "message": "This Month", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Тип уграђеног садржаја није подржан. Притисните да би преузели.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Притисните да би сте сачували", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Неименована датотека", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Гласовна порука", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Attachment type not allowed for security reasons", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Unable to load selected attachment.", "description": "" }, - "disconnected": { - "message": "Прекинуто", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Повезујем се", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "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" @@ -619,14 +521,6 @@ "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": "About Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Speech", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Show", "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" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Тражи", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Добродошли у Signal", "description": "" }, - "selectAContact": { - "message": "Започните преписку одабиром дописника или групе.", - "description": "" - }, "typingAlt": { "message": "Typing animation for this conversation", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "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" @@ -759,16 +633,6 @@ "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" @@ -777,10 +641,6 @@ "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" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "У реду", "description": "" @@ -809,18 +665,10 @@ "message": "Одустани", "description": "" }, - "failedToSend": { - "message": "Неким дописницима није послато. Проверите статус мреже.", - "description": "" - }, "error": { "message": "Грешка", "description": "" }, - "messageDetail": { - "message": "Детаљи поруке", - "description": "" - }, "delete": { "message": "Обриши", "description": "" @@ -857,10 +705,6 @@ "message": "Чланови групе", "description": "" }, - "showMembers": { - "message": "Прикажи чланове", - "description": "" - }, "resetSession": { "message": "Обнови везу", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "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": "Ако желите да проверите безбедност ваше end-to-end енкрипције са $name$, упоредите горе приказане бројеве са бројевима на њиховом уређају.", "description": "", @@ -887,14 +727,6 @@ "message": "Морате разменити бар једну поруку са овим дописником. Шифра за дописивање ће се створити након прве преписке.", "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" @@ -939,10 +771,6 @@ "message": "Сачувај", "description": "" }, - "fileIconAlt": { - "message": "File icon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Добродошли у Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Приватност је достижна. Signal вам то олакшава.", - "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": "Неуспешно повезивање са сервером.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Жао нам је, повезали сте превише уређаја. Развежите неке од њих.", - "description": "" - }, - "settings": { - "message": "Подешавања", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Стил", - "description": "Header for theme settings" - }, "permissions": { "message": "Permissions", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "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": "Обавештења", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Send failed", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Опширније", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Основно", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Више о верификацији шифара преписки", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Без текста", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Корисник није регистрован", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Дописници", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Увезите све групе Signal-а и особе са вашег мобилног уређаја.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Задњи пут увежено", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Увези сад", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Увозим...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Увоз неуспешан. Оба уређаја треба да буду повезана на интернет.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "сада", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 час", "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": "сада", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Звучно обавештење", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Safety Number has changed", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Light", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Dark", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Note to Self", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Hide menu bar", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Упишите број телефона за нову особу.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Неисправан број", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Да би наставили дописивање, поново повежите Signal за десктоп са мобилним уређајем.", - "description": "" - }, - "unlinked": { - "message": "Развезано", - "description": "" - }, - "relink": { - "message": "Поново вежи", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Нова верзија Session-а је доступна", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/sv/messages.json b/_locales/sv/messages.json index 53bf2670c..1b2a93295 100644 --- a/_locales/sv/messages.json +++ b/_locales/sv/messages.json @@ -3,18 +3,10 @@ "message": "Kopiera felmeddelande och avsluta", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Okänd grupp", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Databasfel", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Radera all data och starta om", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Arkiv", "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." @@ -35,10 +27,6 @@ "message": "&Hjälp", "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": "Inställningar", - "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": "Göm", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "Ställ in med import", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Ställ in som ny enhet", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Ställ in som fristående enhet", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Arkiverade konversationer", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Konversationerna här är arkiverade och kommer bara visas i inkorgen ifall nya meddelanden tas emot.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Arkivera konversation", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Flytta konversationen till Inkorg", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Välj mapp", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Välj fil", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Läs in din data", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Länka denna enhet till din mobil", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "din valda plats", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Uppgraderar databasen. Detta kan ta lite tid...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Läser in meddelanden. $count$ hittills...", - "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": "Jag", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Du lämnade gruppen", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Rulla till botten av konversationen", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Nytt meddelande nedanför", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Nya meddelanden nedanför", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 oläst meddelande", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Skicka", "description": "" }, - "acceptNewKey": { - "message": "Godkänn", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Märk som verifierat", "description": "" @@ -455,10 +385,6 @@ "message": "Nytt säkerhetsnummer", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Ditt säkerhetsnummer med den här kontakten har ändrats. Detta kan antingen innebära att någon försöker avlyssna din kommunikation, eller att kontakten har ominstallerat Signal. Du kan verifiera det nya säkerhetsnumret nedan.", - "description": "" - }, "incomingError": { "message": "Fel med att hantera inkommande meddelande", "description": "" @@ -495,18 +421,6 @@ "message": "Denna månad", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Okänd filtyp på bilaga. Klicka för att spara.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Klicka för att spara", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Namnlös fil", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Röstmeddelande", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Bilagor av denna typ tillåts inte på grund av säkerhetsskäl", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Läser in förhandsvisning...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Utkast av länkförhandsvisning i miniatyrbild för $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Kunde inte läsa in vald bilaga", "description": "" }, - "disconnected": { - "message": "Frånkopplad", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Ansluter", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Gå till versionsanteckningar", "description": "" }, - "goToForums": { - "message": "Gå till forumet", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Gå till supportsidan", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Rapportera ett fel", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktops preferenser", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Om Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Tal", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Visa", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Göm", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Avsluta", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Sök", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Välkommen till Signal", "description": "" }, - "selectAContact": { - "message": "Välj en kontakt eller grupp för att börja prata.", - "description": "" - }, "typingAlt": { "message": "Skrivanimation för denna konversation", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "Skicka meddelande", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "hem", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Du", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "Svarar till $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": "Om du vill skicka röstmeddelanden måste Signal Desktop ha tillgång till din mikrofon.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Tillåt åtkomst", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Visa inställningar", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Ljud", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "OK", "description": "" @@ -809,18 +665,10 @@ "message": "Avbryt", "description": "" }, - "failedToSend": { - "message": "Kunde inte skicka till vissa mottagare. Kontrollera din internetuppkoppling.", - "description": "" - }, "error": { "message": "Fel", "description": "" }, - "messageDetail": { - "message": "Meddelandedetaljer", - "description": "" - }, "delete": { "message": "Radera", "description": "" @@ -857,10 +705,6 @@ "message": "Gruppmedlemmar", "description": "" }, - "showMembers": { - "message": "Visa medlemmar", - "description": "" - }, "resetSession": { "message": "Återställ session", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Visa säkerhetsnummer", "description": "" }, - "viewAllMedia": { - "message": "Visa alla 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": "Om du vill verifiera krypteringen mellan dig och $name$, jämför siffrorna ovan med siffrorna på deras enhet.", "description": "", @@ -887,14 +727,6 @@ "message": "Du har inte utbytt några meddelanden med denna kontakt ännu. Ditt säkerhetsnummer med dem kommer att vara tillgängliga efter det första meddelandet.", "description": "" }, - "moreInfo": { - "message": "Mer info...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Skicka igen", - "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": "Radera meddelande", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Spara", "description": "" }, - "fileIconAlt": { - "message": "Filikon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emojibild av '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Välkommen till Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Integritet är möjligt. Signal gör det lätt.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Länka din mobil till Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal-inställningar", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Länkade enheter", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+'-knappen", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Länka ny enhet", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Enhetsnamn", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Välj enhetsnamn", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Slutför länkning till mobil", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Synkroniserar kontakter och grupper", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Kunde inte kontakta servern.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Tyvärr har du för många enheter redan länkade. Försök att ta bort några.", - "description": "" - }, - "settings": { - "message": "Inställningar", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" - }, "permissions": { "message": "Behörigheter", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Slå på stavningskontroll för text som anges i meddelandefältet", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Rensa data", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Detta kommer radera all data i applikationen, det tar bort alla meddelanden och sparad kontoinformation.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Radera data", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Radera all data?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Du är på väg att radera alla denna applikations sparade kontoinformation, inklusive alla kontakter och alla meddelanden. Du kan länka till din mobila enhet igen, men det kommer inte återställa de raderade meddelandena.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Radera all data", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Kopplar bort och raderar all data", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Aviseringar", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Att skicka meddelandet misslyckades", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Info", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Göm info", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Lär dig mer om att verifiera säkerhetsnummer", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Mediameddelande", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Numret är inte registrerat", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kontakter", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Importera alla grupper och kontakter från Signal på din mobil.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Senaste import", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Importera nu", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Importerar...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Importen misslyckades. Kontrollera att din dator och din telefon har en fungerande internetuppkoppling.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "nyss", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 timme", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ h", - "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$ t sen", - "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$ minuter sedan", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "nyss", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Spela ljudavisering", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Säkerhetsnumret har ändrats", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Ljust", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Mörkt", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Notera till mig själv", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Göm menyraden", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Starta en ny konversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Ange ett telefonnummer för att lägga till en kontakt.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Felaktigt nummer", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Länka om Signal Desktop till din mobila enhet för att fortsätta skicka meddelanden.", - "description": "" - }, - "unlinked": { - "message": "Olänkad", - "description": "" - }, - "relink": { - "message": "Återkoppla", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Uppdatering för Session tillgänglig", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/th/messages.json b/_locales/th/messages.json index 08d3e2af2..df75cf20b 100644 --- a/_locales/th/messages.json +++ b/_locales/th/messages.json @@ -3,18 +3,10 @@ "message": "Copy error and quit", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Unknown group", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Database Error", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Delete all data and restart", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "ไ&ฟล์", "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." @@ -35,10 +27,6 @@ "message": "&ความช่วยเหลือ", "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": "การกำหนด...", - "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": "ซ่อน", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "ตั้งค่าด้วยการนำเข้า", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "ตั้งค่าให้เป็นอุปกรณ์ใหม่", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "ตั้งค่าเป็นอุปกรณ์สแตนด์อโลน", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Archived Conversations", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archive Conversation", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Move Conversation to Inbox", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "เลือกโฟลเดอร์", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Choose file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "โหลดข้อมูลของคุณ", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "เชื่อมโยงอุปกรณ์นี้กับโทรศัพท์ของคุณ", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "ตำแหน่งที่คุณเลือก", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "กำลังอัพเกรดฐานข้อมูล อาจต้องใช้เวลาสักพักหนึ่ง...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "ถึงตอนนี้กำลังโหลดข้อความไปแล้ว $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": "ฉัน", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "คุณได้ออกจากกลุ่ม", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "เลื่อนไปที่ด้านล่างสุดของการสนทนา", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "ข้อความใหม่ข้างล่าง", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "ข้อความใหม่ข้างล่าง", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 ข้อความที่ยังไม่ได้อ่าน", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "ส่ง", "description": "" }, - "acceptNewKey": { - "message": "ยอมรับ", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "ทำเครื่องหมายว่ายืนยันแล้ว", "description": "" @@ -455,10 +385,6 @@ "message": "รหัสความปลอดภัยใหม่", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "มีการเปลี่ยนแปลงในรหัสความปลอดภัยของคุณกับผู้ติดต่อนี้ นี่อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่ผู้ติดต่อนี้ได้ติดตั้งแอป Signal ใหม่ คุณอาจจะต้องยืนยันรหัสความปลอดภัยใหม่ด้านล่างนี้", - "description": "" - }, "incomingError": { "message": "เกิดข้อผิดพลาดในการจัดการข้อความขาเข้า", "description": "" @@ -495,18 +421,6 @@ "message": "เดือนนี้", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "ประเภทไฟล์แนบที่ไม่รองรับ คลิกเพื่อบันทึก", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "คลิกเพื่อบันทึก", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "ไฟล์ที่ไม่มีชื่อ", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "ข้อความเสียง", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Attachment type not allowed for security reasons", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Unable to load selected attachment.", "description": "" }, - "disconnected": { - "message": "เลิกการเชื่อมต่อแล้ว", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "กำลังเชื่อมต่อ", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "ไปที่บันทึกประจำรุ่น", "description": "" }, - "goToForums": { - "message": "ไปที่ฟอรัม", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "ไปที่หน้าการสนับสนุน", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "รายงานปัญหา", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "การกำหนดลักษณะ Signal Desktop", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "เกี่ยวกับ Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "การพูด", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "แสดง", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "ซ่อน", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "ออก", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "ค้นหา", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "ยินดีต้อนรับสู่ Signal", "description": "" }, - "selectAContact": { - "message": "เลือกผู้ติดต่อหรือกลุ่มเพื่อเริ่มต้นการแชต", - "description": "" - }, "typingAlt": { "message": "Typing animation for this conversation", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "ส่งข้อความ", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "บ้าน", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "คุณ", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "ตอบกลับหา $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": "เพื่อจะส่งข้อความเสียง ต้องอนุญาตให้ Signal Desktop ใช้งานไมโครโฟนของคุณ", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "อนุญาตให้เข้าถึง", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "แสดงการตั้งค่า", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "เสียง", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "ตกลง", "description": "" @@ -809,18 +665,10 @@ "message": "ยกเลิก", "description": "" }, - "failedToSend": { - "message": "ส่งไปยังผู้รับบางคนไม่สำเร็จ ตรวจสอบการเชื่อมต่อเครือข่ายของคุณ", - "description": "" - }, "error": { "message": "ข้อผิดพลาด", "description": "" }, - "messageDetail": { - "message": "รายละเอียดข้อความ", - "description": "" - }, "delete": { "message": "ลบ", "description": "" @@ -857,10 +705,6 @@ "message": "สมาชิกกลุ่ม", "description": "" }, - "showMembers": { - "message": "แสดงสมาชิก", - "description": "" - }, "resetSession": { "message": "ตั้งค่าเซสชันใหม่", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "แสดงรหัสความปลอดภัย", "description": "" }, - "viewAllMedia": { - "message": "ดูสื่อทั้งหมด", - "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": "หากคุณต้องการยืนยันความปลอดภัยในการเข้ารหัสจากต้นทางถึงปลายทางระหว่างคุณกับ $name$ ให้เปรียบเทียบตัวเลขด้านบนกับตัวเลขบนอุปกรณ์ของเขา", "description": "", @@ -887,14 +727,6 @@ "message": "คุณยังไม่ได้แลกเปลี่ยนข้อความใดๆ กับผู้ติดต่อนี้ รหัสความปลอดภัยของคุณกับพวกเขาจะมีให้หลังเริ่มส่งข้อความแรก", "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": "ลบข้อความนี้", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "บันทึก", "description": "" }, - "fileIconAlt": { - "message": "ไอคอนไฟล์", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "รูปอีโมจิของ '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "ยินดีต้อนรับสู่ Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "ความเป็นส่วนตัวเป็นไปได้อย่างง่ายดายด้วย Signal", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "เชื่อมโยงโทรศัพท์ของคุณกับ Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "การตั้งค่า Signal", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "อุปกรณ์ที่เชื่อมโยง", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "ปุ่ม '+'", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "เชื่อมโยงอุปกรณ์ใหม่", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "ชื่ออุปกรณ์", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "เลือกชื่อของอุปกรณ์นี้", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "เชื่อมโยงโทรศัพท์เสร็จสิ้น", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "กำลังซิงค์รายชื่อผู้ติดต่อและกลุ่ม", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "เชื่อมต่อกับเซิร์ฟเวอร์ล้มเหลว", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "ขออภัย คุณมีอุปกรณ์ที่เชื่อมโยงมากเกินไป ลองถอนการเชื่อมโยงจากบางอุปกรณ์บ้าง", - "description": "" - }, - "settings": { - "message": "การตั้งค่า", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "ธีม", - "description": "Header for theme settings" - }, "permissions": { "message": "สิทธิ์", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "Enable spell check of text entered in message composition box", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "ล้างข้อมูล", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "นี่จะเป็นการล้างข้อมูลทั้งหมดในโปรแกรม ลบข้อความทั้งหมดรวมทั้งข้อมูลทางบัญชีที่บันทึกไว้", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "ล้างข้อมูล", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "ลบข้อมูลทั้งหมดหรือ", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "คุณกำลังจะลบข้อมูลบัญชีที่บันทึกไว้ของโปรแกรมนี้ทั้งหมด ซึ่งรวมถึงผู้ติดต่อและข้อความทั้งหมด คุณสามารถเชื่อมต่อกับอุปกรณ์เคลื่อนที่ของคุณใหม่ได้เสมอแต่จะไม่สามารถเรียกคืนข้อความที่ถูกลบไปแล้ว", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "ลบข้อมูลทั้งหมด", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "กำลังยกเลิกการเชื่อมต่อและลบข้อมูลทั้งหมด", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "การแจ้งเตือน", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Send failed", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "รายละเอียด", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "ซ่อนรายละเอียด", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "เรียนรู้เพิ่มเติมเกี่ยวกับการยืนยันรหัสความปลอดภัย", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "ข้อความสื่อ", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "ยังไม่ได้ลงทะเบียนรหัส", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "ผู้ติดต่อ", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "นำเข้ากลุ่มและผู้ติดต่อใน Signal ทั้งหมดจากอุปกรณ์เคลื่อนที่ของคุณ", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "นำเข้าครั้งล่าสุดเมื่อ", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "นำเข้าเดี๋ยวนี้", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "กำลังนำเข้า...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "การนำเข้าล้มเหลว แน่ใจว่าคอมพิวเตอร์และโทรศัพท์ของคุณเชื่อมต่อกับอินเตอร์เน็ตแล้ว", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "เดี๋ยวนี้", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 ชั่วโมง", "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": "เดี๋ยวนี้", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "ดดด ว", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "เล่นการแจ้งเตือนด้วยเสียง", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Safety Number has changed", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Light", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Dark", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Note to Self", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "ซ่อนแถบเมนู", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "ป้อนหมายเลขโทรศัพท์เพื่อเพิ่มผู้ติดต่อ", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "หมายเลขไม่ถูกต้อง", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "เชื่อมโยง Signal Desktop กับอุปกรณ์เคลื่อนที่ของคุณอีกครั้งเพื่อใช้งานการส่งข้อความอย่างต่อเนื่อง", - "description": "" - }, - "unlinked": { - "message": "เลิกเชื่อมโยงแล้ว", - "description": "" - }, - "relink": { - "message": "เชื่อมโยงอีกครั้ง", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "มีการอัพเดทสำหรับ Session", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/tr/messages.json b/_locales/tr/messages.json index 7ee802fd2..697313396 100644 --- a/_locales/tr/messages.json +++ b/_locales/tr/messages.json @@ -3,18 +3,10 @@ "message": "Hatayı kopyala ve çık", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Bilinmeyen grup", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Veritabanı hatası", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Tüm verileri sil ve yeniden başlat", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Dosya", "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." @@ -35,10 +27,6 @@ "message": "&Yardım", "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": "Tercihler...", - "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": "Gizle", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "İçe Aktarma seçeneği ile kur", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "Yeni Cihaz olarak kur", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "Bağımsız Cihaz olarak kur", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Arşivlenmiş Sohbetler", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Bu sohbetler arşivlendi ve sadece yeni iletiler alınırsa gelen kutusunda görünecekler.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Sohbeti Arşivle", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Sohbeti Gelen Kutusuna Taşı", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Klasör seçin", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Dosya seçin", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Verilerinizi yükleyin", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "Bu cihazı telefonunuza bağlayın", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "seçtiğiniz konum", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Veritabanı yükseltiliyor. Bu biraz zaman alabilir...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "İletiler yükleniyor. Şimdiye kadar $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": "Ben", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Gruptan ayrıldınız", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Sohbetin en altına kaydır", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Aşağıda yeni ileti var", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Aşağıda yeni iletiler var", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 Okunmamış İleti", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Gönder", "description": "" }, - "acceptNewKey": { - "message": "Kabul et", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Doğrulanmış olarak işaretle", "description": "" @@ -455,10 +385,6 @@ "message": "Yeni güvenlik numarası", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Bu kişiyle olan güvenlik numaranız değişti. Bu birisinin iletişiminizi kesmeye çalıştığı veya bu kişinin Signal'i yeniden yüklemiş olduğu anlamına gelebilir. Aşağıdaki yeni güvenlik numarasını doğrulamak isteyebilirsiniz.", - "description": "" - }, "incomingError": { "message": "Gelen ileti işlenirken hata oluştu", "description": "" @@ -495,18 +421,6 @@ "message": "Bu Ay", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Desteklenmeyen eklenti türü. Kaydetmek için tıkla.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Kaydetmek için tıkla", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "İsimsiz Dosya", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Sesli İleti", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Eklenti türüne güvenlik sebeplerinden dolayı izin verilmemektedir", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Öz İzleme Yükleniyor...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "$domain$ için bağlantı ön izlemesi küçük resim taslağı", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Seçilen eklenti yüklenemedi.", "description": "" }, - "disconnected": { - "message": "Bağlantı yok", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Bağlanıyor", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "Sürüm Notlarına Git", "description": "" }, - "goToForums": { - "message": "Forumlara Git", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "Destek Sayfasına Git", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "Sorun Bildir", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop Tercihleri", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "Signal Desktop Hakkında", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Konuşma", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Göster", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Gizle", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Çıkış Yap", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Ara", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Signal'e Hoşgeldin", "description": "" }, - "selectAContact": { - "message": "Sohbete başlamak için bir kişi veya grup seçin.", - "description": "" - }, "typingAlt": { "message": "Bu sohbet için yazma animasyonu", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "İleti Gönder", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "ev", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "Siz", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "$name$ Cevaben", - "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": "Sesli iletiler göndermek için, Signal Desktop'ın mikrofonunuza erişimine izin verin.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "Erişimine İzin Ver", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "Ayarları Göster", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "Ses", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "TAMAM", "description": "" @@ -809,18 +665,10 @@ "message": "İptal", "description": "" }, - "failedToSend": { - "message": "Bazı alıcılara gönderilemedi. Ağ bağlantınızı kontrol edin.", - "description": "" - }, "error": { "message": "Hata", "description": "" }, - "messageDetail": { - "message": "İleti Detayı", - "description": "" - }, "delete": { "message": "Sil", "description": "" @@ -857,10 +705,6 @@ "message": "Grup üyeleri", "description": "" }, - "showMembers": { - "message": "Üyeleri göster", - "description": "" - }, "resetSession": { "message": "Oturumu sıfırla", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "Güvenlik numarasını görüntüle", "description": "" }, - "viewAllMedia": { - "message": "Tüm medyaları görüntüle", - "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": "$name$ ile olan uçtan uca şifrelemenizin güvenliğini doğrulamak isterseniz, yukarıdaki numaraları cihazlarındaki numaralarla karşılaştırın.", "description": "", @@ -887,14 +727,6 @@ "message": "Bu kişiyle herhangi bir iletişimde bulunmadınız. Güvenlik numaralarınız ilk iletiden sonra oluşturulacaktır.", "description": "" }, - "moreInfo": { - "message": "Daha Fazla Bilgi...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "Tekrar Gönder", - "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": "İletiyi Sil", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Kaydet", "description": "" }, - "fileIconAlt": { - "message": "Dosya ikonu", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "'$title$' emoji resmi", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Signal Desktop'a Hoş Geldiniz", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Gizlilik mümkün. Signal bunu kolaylaştırır.", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "Signal Desktop'a telefonunuzu bağlayın", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal Ayarları", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "Bağlı cihazlar", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "'+' Düğmesi", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "Yeni Cihaz Bağla", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "Cihaz adı", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "Bu cihazı adlandırın", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "Telefon bağlantısını tamamla", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "Kişiler ve gruplar senkronize ediliyor", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "Sunucuya bağlanılamadı.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Üzgünüz, halihazırda bağlı olan çok fazla cihazınız var. Bazılarını kaldırmayı deneyin.", - "description": "" - }, - "settings": { - "message": "Ayarlar", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Tema", - "description": "Header for theme settings" - }, "permissions": { "message": "İzinler", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "İleti kutusuna girilen sözcüklerin denetlenmesini etkinleştir", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "Verileri Temizle", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "Bu, tüm iletileri ve kayıtlı hesap bilgilerini kaldırarak uygulamadaki tüm verileri temizler.", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "Verileri temizle", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "Tüm veri silinsin mi?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "Tüm kişilerin ve tüm iletilerin dahil olduğu bu uygulamanın tüm kayıtlı hesap bilgilerini silmek üzeresiniz. İstediğiniz zaman mobil cihazınızla tekrar bağlayabilirsiniz, ancak silinen iletiler geri yüklenmeyecektir.", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "Tüm verileri sil", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "Bağlantı kesiliyor ve tüm veriler siliniyor", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "Bildirimler", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Gönderme başarısız", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Detaylar", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Detayları gizle", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Güvenlik numaralarını doğrulama hakkında daha fazla bilgi edinin", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Medya iletisi", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Numara kayıtlı değil", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Kişiler", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Tüm Signal gruplarını ve kişileri mobil cihazınızdan buraya aktarın.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Son senkronize zamanı", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Şimdi içe aktar", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "İçe aktarılıyor...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "İçe aktarma başarısız oldu. Bilgisayarınızın ve telefonunuzun İnternet'e bağlı olduğundan emin olun.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "şimdi", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 saat", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$ s", - "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$ s önce", - "description": "Contracted form of 'X hours ago' which works both for singular and plural", - "placeholders": { - "hours": { - "content": "$1", - "example": "2" - } - } - }, - "minutesAgoShort": { - "message": "$minutes$ dk", - "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$ dk önce", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "şimdi", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Sesli bildirim oynat", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Güvenlik Numarası değişti", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Açık", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Koyu", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Kendime Not", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Menü çubuğunu gizle", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Yeni sohbet başlat…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Kişi eklemek için telefon numarasını girin.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Geçersiz numara", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "İletişime devam etmek için Signal Desktop'ı mobil cihazınıza yeniden bağlayın.", - "description": "" - }, - "unlinked": { - "message": "Bağlantı koparıldı", - "description": "" - }, - "relink": { - "message": "Yeniden bağla", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session güncellemesi mevcut", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/uk/messages.json b/_locales/uk/messages.json index 26b4629cc..abd0ea151 100644 --- a/_locales/uk/messages.json +++ b/_locales/uk/messages.json @@ -3,18 +3,10 @@ "message": "Copy error and quit", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Unknown group", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Database Error", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Delete all data and restart", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "&Файл", "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." @@ -35,10 +27,6 @@ "message": "&Допомога", "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": "Сховати", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "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" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Архівовані розмови", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "Ці розмови — архівовані. Вони з’являтимуться у вхідних лише тоді, коли приходитимуть нові повідомлення.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archive Conversation", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Move Conversation to Inbox", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Choose folder", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Choose file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Load your data", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "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": "Обране місце", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Оновлюється база даних, це займе трохи часу…", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Оновлюємо повідомлення. Бачимо поки $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": "Я", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "Ви покинули групу", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Перейти в кінець бесіди", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Нове повідомлення нижче", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Нові повідомлення нижче", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 непрочитане повідомлення", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Надіслати", "description": "" }, - "acceptNewKey": { - "message": "Прийняти", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Відмітити перевіреним", "description": "" @@ -455,10 +385,6 @@ "message": "Новий код безпеки", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Ваш код безпеки з контактом змінився. Це може означати, що хтось намагається перехопити ваші повідомлення, або співрозмовник просто перевстановив Signal. Ви можете підтвердити новий код безпеки вказаний нижче.", - "description": "" - }, "incomingError": { "message": "Error handling incoming message", "description": "" @@ -495,18 +421,6 @@ "message": "Цей місяць", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Непідтримуваний формат вкладення. Клацніть щоб зберегти.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Натисніть, щоб зберегти", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Безіменний файл", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Голосове повідомлення", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Attachment type not allowed for security reasons", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Unable to load selected attachment.", "description": "" }, - "disconnected": { - "message": "Від'єднано", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "З'єднання", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "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" @@ -619,14 +521,6 @@ "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": "Про Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Розмова", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Показати", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "Сховати", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "Вийти", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Пошук", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Ласкаво просимо до Signal", "description": "" }, - "selectAContact": { - "message": "Оберіть контакт чи групу щоб почати спілкування.", - "description": "" - }, "typingAlt": { "message": "Typing animation for this conversation", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "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" @@ -759,16 +633,6 @@ "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" @@ -777,10 +641,6 @@ "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": "Аудіо", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "Добре", "description": "" @@ -809,18 +665,10 @@ "message": "Відмінити", "description": "" }, - "failedToSend": { - "message": "Не вдалося відіслати деяким адресатам. Перевірте ваше мережеве з'єднання.", - "description": "" - }, "error": { "message": "Помилка", "description": "" }, - "messageDetail": { - "message": "Деталі повідомлення", - "description": "" - }, "delete": { "message": "Видалити", "description": "" @@ -857,10 +705,6 @@ "message": "Члени групи", "description": "" }, - "showMembers": { - "message": "Показати членів групи", - "description": "" - }, "resetSession": { "message": "Скинути сесію", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "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": "Якщо бажаєте перевірити, чи безпечне наскрізне шифрування, коли $name$ надсилає та отримує ваші повідомлення, порівняйте цифри нижче з цифрами на пристрої вашого співрозмовника.", "description": "", @@ -887,14 +727,6 @@ "message": "Ви ще не обмінювалися повідомленнями з даними співрозмовником. Код безпеки стане доступний після першого надсилання повідомлення.", "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": "Видалити повідомлення", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "Зберегти", "description": "" }, - "fileIconAlt": { - "message": "File icon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Ласкаво просимо до Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Приватність - це можливо. Signal робить її досягнення простим.", - "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": "Під’єднані пристрої", - "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": "Під’єднати новий пристрій", "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": "Не вдалося підключитись до сервера.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Вибачте, у вас забагато пов'язаних пристроїв. Видаліть які-небудь.", - "description": "" - }, - "settings": { - "message": "Налаштування", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Тема", - "description": "Header for theme settings" - }, "permissions": { "message": "Permissions", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "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": "Нотифікації", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Send failed", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Деталі", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Сховати деталі", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Дізнатися більше про підтвердження кодів безпеки", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Медіа повідомлення", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Номер не зареєстровано", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Контакти", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Імпортувати всі контакти та групи з вашого мобільного пристрою.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Останній імпорт в", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Імпортувати", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Імпортую...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Імпорт закінчився невдало. Впевніться, що ваш комп'ютер та мобільний пристрій маютть доступ до інтернету.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "зараз", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 година", "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": "зараз", - "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Звукові повідомлення", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Safety Number has changed", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Light", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Dark", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Note to Self", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Сховати стрічку меню", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Введіть номер телефону щоб додати контакт.", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Невірний номер", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Прив'яжіть Signal Desktop до вашого мобільного пристрою для продовження спілкування.", - "description": "" - }, - "unlinked": { - "message": "Відв'язан", - "description": "" - }, - "relink": { - "message": "Прив'язати", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Доступне оновлення Session", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/vi/messages.json b/_locales/vi/messages.json index 9c194999d..cbc17ee1d 100644 --- a/_locales/vi/messages.json +++ b/_locales/vi/messages.json @@ -3,18 +3,10 @@ "message": "Copy error and quit", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "Unknown group", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "Database Error", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "Delete all data and restart", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "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." @@ -35,10 +27,6 @@ "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" @@ -135,10 +123,6 @@ "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" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "Archived Conversations", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "These conversations are archived and will only appear in the Inbox if new messages are received.", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "Archive Conversation", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "Move Conversation to Inbox", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "Choose folder", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "Choose file", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "Load your data", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "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": "your selected location", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "Đang cập nhật dữ liệu. Cần một chút thời gian...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "Loading messages. $count$ so far...", - "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": "Me", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "You left the group", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "Scroll to bottom of conversation", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "Tin nhắn mới bên dưới", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "Tin nhắn mới bên dưới", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 tin nhắn chưa đọc", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "Gửi", "description": "" }, - "acceptNewKey": { - "message": "Chấp nhận", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "Đánh dấu như đã chứng thực", "description": "" @@ -455,10 +385,6 @@ "message": "Số-an-toàn mới", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "Số-an-toàn của bạn với người (liên lạc) này đã thay đổi. Điều này có nghĩa rằng người nào đó đang xâm nhập vào liên lạc của bạn, hoặc đơn giản là người (liên lạc) này đã cài đặt lại Signal. Bạn muốn xác nhận số-an-toàn mới bên dưới.", - "description": "" - }, "incomingError": { "message": "Error handling incoming message", "description": "" @@ -495,18 +421,6 @@ "message": "This Month", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "Không hỗ trợ loại đính kèm. Bấm để lưu.", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "Click để lưu", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "Tập tin không có tên", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "Tin nhắn thoại", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "Attachment type not allowed for security reasons", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "Loading Preview...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "Unable to load selected attachment.", "description": "" }, - "disconnected": { - "message": "Đã ngắt kết nối", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "Đang kết nối", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "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" @@ -619,14 +521,6 @@ "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": "About Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "Speech", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "Show", "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" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "Tìm kiếm", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "Chào mừng đến với Signal", "description": "" }, - "selectAContact": { - "message": "Chọn một liên hệ hoặc nhóm để bắt đầu chat.", - "description": "" - }, "typingAlt": { "message": "Typing animation for this conversation", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "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" @@ -759,16 +633,6 @@ "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" @@ -777,10 +641,6 @@ "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" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "Đồng ý", "description": "" @@ -809,18 +665,10 @@ "message": "Hủy", "description": "" }, - "failedToSend": { - "message": "Không thể gửi đến một số người nhận. Kiểm tra kết nối mạng của bạn.", - "description": "" - }, "error": { "message": "Lỗi", "description": "" }, - "messageDetail": { - "message": "Chi tiết tin nhắn", - "description": "" - }, "delete": { "message": "Delete", "description": "" @@ -857,10 +705,6 @@ "message": "Thành viên", "description": "" }, - "showMembers": { - "message": "Show members", - "description": "" - }, "resetSession": { "message": "Đăng nhập lại", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "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": "If you wish to verify the security of your end-to-end encryption with $name$, compare the numbers above with the numbers on their device.", "description": "", @@ -887,14 +727,6 @@ "message": "Bạn chưa trao đổi tin nhắn nào với liên hệ này. Số an toàn của bạn sẽ có sau tin nhắn đầu tiên.", "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" @@ -939,10 +771,6 @@ "message": "Lưu", "description": "" }, - "fileIconAlt": { - "message": "File icon", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "Emoji image of '$title$'", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "Chào mừng đến với Signal Desktop", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Sự riêng tư là có thể. Signal khiến điều đó trở nên dễ dàng.", - "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": "Kết nối đến máy chủ thất bại.", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "Rất tiếc, bạn có quá nhiều thiết bị đã được kết nối. Thử gỡ bỏ vài thiết bị.", - "description": "" - }, - "settings": { - "message": "Các cài đặt", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "Chủ đề", - "description": "Header for theme settings" - }, "permissions": { "message": "Permissions", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "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": "Thông báo", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "Send failed", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "Chi tiết", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "Ẩn chi tiết", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "Tìm hiểu thêm về xác nhận các số-an-toàn.", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "Tin nhắn đa phương tiện", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "Số điện thoại chưa đăng ký", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "Liên hệ", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "Nhập tất cả liên hệ và nhóm của Signal từ thiết bị di động của bạn.", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "Lần nhập cuối cùng lúc", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "Nhập ngay bây giờ", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "Đăng nhập", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "Nhập thất bại. Chắc chắn rằng máy tính và điện thoại của bạn đã kết nối internet.", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "hiện tại", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 giờ", "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": "hiện tại", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "Tháng Ngày", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "Phát thông báo nhạc hiệu", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "Safety Number has changed", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "Light", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "Dark", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "Note to Self", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "Hide menu bar", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "Start new conversation…", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "Nhập số điện thoại để thêm một liên hệ", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "Số không chính xác", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "Relink Signal Desktop to your mobile device to continue messaging.", - "description": "" - }, - "unlinked": { - "message": "Đã bỏ liên kết", - "description": "" - }, - "relink": { - "message": "Tái liên kết", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session update available", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/zh_CN/messages.json b/_locales/zh_CN/messages.json index 695575f2b..c09778737 100644 --- a/_locales/zh_CN/messages.json +++ b/_locales/zh_CN/messages.json @@ -3,18 +3,10 @@ "message": "复制出错信息并退出", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "未知群", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "数据库错误", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "删除所有数据并重启", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "文件(&F)", "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." @@ -35,10 +27,6 @@ "message": "帮助(&H)", "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": "偏好设置...", - "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": "隐藏", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "使用导入的数据进行配置", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "配置为新设备", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "配置为独立设备", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "已归档对话", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "这些对话已被归档,仅当有新消息到达时,它们才会重新出现在收件箱中。", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "存档会话", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "移动会话到收件箱", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "选择文件夹", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "选择文件", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "加载您的数据", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "将这个设备关联到您的手机", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "您已选的位置", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "更新数据库。这可能需要一点时间...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "加载消息。目前数目 $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": "我", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "你已经离开了群组", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "滚动到对话的底部", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "下面的新消息", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "下面的新消息", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1条未读消息", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "提交", "description": "" }, - "acceptNewKey": { - "message": "接受", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "标记为已确认", "description": "" @@ -455,10 +385,6 @@ "message": "新的安全代码", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "您的此联系人的安全代码已更改。这可能意味着有人试图拦截你的通信,或者这个联系人重新安装了Signal。您可能想验证以下新安全代码。", - "description": "" - }, "incomingError": { "message": "处理传入消息时出错", "description": "" @@ -495,18 +421,6 @@ "message": "本月", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "不支持的附件类型,点击保存。", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "单击保存", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "未命名的文件", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "语音消息", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "为了安全,不允许此附件类型", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "加载预览中...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "待发送的$domain$链接预览", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "无法加载选中的附件。", "description": "" }, - "disconnected": { - "message": "已断开连接", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "正在连接", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "前往发布说明", "description": "" }, - "goToForums": { - "message": "前往论坛", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "前往支持页面", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "反馈问题", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop偏好", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "关于 Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "语音", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "显示", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "隐藏", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "退出", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "桌面版Signal", - "description": "Tooltip for the tray icon" - }, "search": { "message": "搜索", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "欢迎来到Signal", "description": "" }, - "selectAContact": { - "message": "选择一个联系人或群组来开始聊天。", - "description": "" - }, "typingAlt": { "message": "这个对话中的“正在输入”提示", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "发送消息", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "家", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "您", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "回复 $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": "发送音频消息前,请先允许 Signal Desktop访问您的麦克风。", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "允许访问", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "打开设置", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "音频", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "无法更新", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "好", "description": "" @@ -809,18 +665,10 @@ "message": "取消", "description": "" }, - "failedToSend": { - "message": "无法发送给某些收件人,请检查您的网络连接。", - "description": "" - }, "error": { "message": "错误", "description": "" }, - "messageDetail": { - "message": "信息属性", - "description": "" - }, "delete": { "message": "删除", "description": "" @@ -857,10 +705,6 @@ "message": "群组成员", "description": "" }, - "showMembers": { - "message": "显示成员", - "description": "" - }, "resetSession": { "message": "重置会话", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "查看安全码", "description": "" }, - "viewAllMedia": { - "message": "查看所有媒体", - "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": "如果您想要确认与$name$端对端加密是否安全,请将以上数字和对方设备的数字进行比对。", "description": "", @@ -887,14 +727,6 @@ "message": "您还未与该联系人有任何通讯,您的安全代码将会在您对其发送第一条消息后显示。", "description": "" }, - "moreInfo": { - "message": "更多信息...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "重试发送", - "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": "删除消息", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "保存", "description": "" }, - "fileIconAlt": { - "message": "文件图标", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": "“$title$”的表情图片", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "欢迎来到Signal桌面版", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "Signal让隐私保护触手可及。", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "关联您的手机到 Signal Desktop", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal 设置", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "已关联的设备", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "“+” 按键", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "关联新设备", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "设备名称", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "选择这个设备的名称", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "完成手机关联", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "正在同步联系人和群组", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "连接服务器失败", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "很抱歉,您已连接过多的设备,请删除一些然后重试。", - "description": "" - }, - "settings": { - "message": "设置", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "主题", - "description": "Header for theme settings" - }, "permissions": { "message": "权限", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "启用输入框拼写检查", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "清空数据", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "这会清空程序中所有的数据,包括删除所有消息和账号信息。", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "清空数据", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "是否删除所有数据?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "您即将删除本应用所有账户信息,包括全部联系人和消息。您可以随时重新连接移动设备,但这不会恢复已删除的消息。", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "删除所有数据", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "断开连接并删除所有数据", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "提醒", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "发送失败", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "更多", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "隐藏", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "了解更多有关安全代码的信息", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "附件信息", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "号码未注册", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "联系人", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "从您的移动设备导入所有Signal的群组和联系人。", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "最后一次导入于", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "已导入", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "导入中...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "导入失败,确保您的电脑和手机已连网。", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "现在", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1小时", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$小时", - "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$小时前", - "description": "Contracted form of 'X hours ago' which works both for singular and plural", - "placeholders": { - "hours": { - "content": "$1", - "example": "2" - } - } - }, - "minutesAgoShort": { - "message": "$minutes$分钟", - "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$分钟前", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "现在", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "播放语音提醒", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "安全码已改变", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "亮色", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "暗色", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "备忘录", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "隐藏菜单栏", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "开始新会话...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "键入电话号码来添加联系人", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "无效的号码", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "重新链接桌面版Signal到您的移动设备来继续。", - "description": "" - }, - "unlinked": { - "message": "未连接", - "description": "" - }, - "relink": { - "message": "重新连接", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session 有可用更新", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file diff --git a/_locales/zh_TW/messages.json b/_locales/zh_TW/messages.json index b0c5e69b4..20c5780f2 100644 --- a/_locales/zh_TW/messages.json +++ b/_locales/zh_TW/messages.json @@ -3,18 +3,10 @@ "message": "複製錯誤並離開。", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, - "unknownGroup": { - "message": "未知的群組", - "description": "Shown as the name of a group if we don't have any information about it" - }, "databaseError": { "message": "資料庫錯誤", "description": "Shown in a popup if the database cannot start up properly" }, - "deleteAndRestart": { - "message": "刪除所有資料並重新開始。", - "description": "Shown in a popup if the database cannot start up properly; allows user to dalete database and restart" - }, "mainMenuFile": { "message": "檔案(&F)", "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." @@ -35,10 +27,6 @@ "message": "協助(&H)", "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": "偏好設定…", - "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": "隱藏", "description": "Application menu command to hide the window" @@ -135,10 +123,6 @@ "message": "設定匯入", "description": "When the application is not yet set up, menu option to start up the import sequence" }, - "menuSetupAsNewDevice": { - "message": "設定新裝置", - "description": "When the application is not yet set up, menu option to start up the set up as fresh device" - }, "menuSetupAsStandalone": { "message": "設定為獨立的裝置", "description": "Only available on development modes, menu option to open up the standalone device setup sequence" @@ -161,30 +145,10 @@ } } }, - "archivedConversations": { - "message": "封存對話", - "description": "Shown in place of the search box when showing archived conversation list" - }, - "archiveHelperText": { - "message": "這些對話已經封存,並只有在收到新訊息時才會顯示在收件箱中。", - "description": "Shown at the top of the archived converations list in the left pane" - }, - "archiveConversation": { - "message": "歸檔對話", - "description": "Shown in menu for conversation, and moves conversation out of main conversation list" - }, - "moveConversationToInbox": { - "message": "將對話移動到收件夾", - "description": "Undoes Archive Conversation action, and moves archived conversation back to the main conversation list" - }, "chooseDirectory": { "message": "選擇資料夾", "description": "Button to allow the user to find a folder on disk" }, - "chooseFile": { - "message": "選擇檔案", - "description": "Button to allow the user to find a file on disk" - }, "loadDataHeader": { "message": "載入你的資料", "description": "Header shown on the first screen in the data import process" @@ -229,24 +193,6 @@ "message": "此裝置與您的手機連結", "description": "Button shown at end of successful 'light' import process, so the standard linking process still needs to happen" }, - "selectedLocation": { - "message": "你已選擇的位置", - "description": "Message shown as the export location if we didn't capture the target directory" - }, - "upgradingDatabase": { - "message": "正在升級資料庫。這也許會花一些時間...", - "description": "Message shown on the loading screen when we're changing database structure on first run of a new version" - }, - "loadingMessages": { - "message": "正在載入訊息中。目前有 $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": "我", "description": "The label for yourself when shown in a group member list" @@ -259,18 +205,6 @@ "message": "你已離開此群組", "description": "Displayed when a user can't send a message because they have left the group" }, - "scrollDown": { - "message": "捲動至底下對話", - "description": "Alt text for button to take user down to bottom of conversation, shown when user scrolls up" - }, - "messageBelow": { - "message": "底下有一則新訊息", - "description": "Alt text for button to take user down to bottom of conversation with a new message out of screen" - }, - "messagesBelow": { - "message": "底下有新訊息", - "description": "Alt text for button to take user down to bottom of conversation with more than one message out of screen" - }, "unreadMessage": { "message": "1 則未讀訊息", "description": "Text for unread message separator, just one message" @@ -415,10 +349,6 @@ "message": "送出", "description": "" }, - "acceptNewKey": { - "message": "接受", - "description": "Label for a button to accept a new safety number" - }, "verify": { "message": "標記為已驗證", "description": "" @@ -455,10 +385,6 @@ "message": "新的安全碼", "description": "Header for a key change dialog" }, - "identityChanged": { - "message": "你與這個聯絡人的安全碼產生變動。這有可能是有不明人士試圖攔截你的通訊,或是,只因為這個聯絡人重新安裝 Signal。你能驗證下方新的安全碼。", - "description": "" - }, "incomingError": { "message": "在處理來訊時出現錯誤", "description": "" @@ -495,18 +421,6 @@ "message": "本月", "description": "Section header in the media gallery" }, - "unsupportedAttachment": { - "message": "不支援的附加檔案類型。點擊儲存。", - "description": "Displayed for incoming unsupported attachment" - }, - "clickToSave": { - "message": "點擊儲存", - "description": "Hover text for attachment filenames" - }, - "unnamedFile": { - "message": "未命名的檔案", - "description": "Hover text for attachment filenames" - }, "voiceMessage": { "message": "語音訊息", "description": "Name for a voice message attachment" @@ -515,10 +429,6 @@ "message": "因安全考量無法傳送此類附件\n", "description": "Shown in toast when user attempts to send .exe file, for example" }, - "loadingPreview": { - "message": "讀取預覽中...", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area" - }, "stagedPreviewThumbnail": { "message": "$domain$ 的草稿縮圖連結預覽", "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", @@ -569,10 +479,6 @@ "message": "無法上傳所選附件。", "description": "" }, - "disconnected": { - "message": "已斷線", - "description": "Displayed when the desktop client cannot connect to the server." - }, "connecting": { "message": "連線中", "description": "Displayed when the desktop client is currently connecting to the server." @@ -607,10 +513,6 @@ "message": "前往發行紀錄", "description": "" }, - "goToForums": { - "message": "前往論壇", - "description": "Item under the Help menu, takes you to the forums" - }, "goToSupportPage": { "message": "前往支援頁面", "description": "Item under the Help menu, takes you to the support page" @@ -619,14 +521,6 @@ "message": "回報問題", "description": "Item under the Help menu, takes you to GitHub new issue form (title case)" }, - "signalDesktopPreferences": { - "message": "Signal Desktop設定", - "description": "Title of the window that pops up with Signal Desktop preferences in it" - }, - "aboutSignalDesktop": { - "message": "關於 Signal Desktop", - "description": "Item under the Help menu, which opens a small about window" - }, "speech": { "message": "語音", "description": "Item under the Edit menu, with 'start/stop speaking' items below it" @@ -635,18 +529,6 @@ "message": "顯示", "description": "Command under Window menu, to show the window" }, - "hide": { - "message": "隱藏", - "description": "Command in the tray icon menu, to hide the window" - }, - "quit": { - "message": "離開", - "description": "Command in the tray icon menu, to quit the application" - }, - "signalDesktop": { - "message": "Signal Desktop", - "description": "Tooltip for the tray icon" - }, "search": { "message": "搜尋", "description": "Placeholder text in the search input" @@ -677,10 +559,6 @@ "message": "歡迎來到 Signal", "description": "" }, - "selectAContact": { - "message": "選擇一個聯絡人或群組開始聊天。", - "description": "" - }, "typingAlt": { "message": "本次對話中輸入動畫", "description": "Used as the 'title' attibute for the typing animation" @@ -695,10 +573,6 @@ } } }, - "sendMessageToContact": { - "message": "傳送訊息", - "description": "Shown when you are sent a contact and that contact has a signal account" - }, "home": { "message": "主頁", "description": "Shown on contact detail screen as a label for an address/phone/email" @@ -759,16 +633,6 @@ "message": "你", "description": "In Android theme, shown in quote if you or someone else replies to you" }, - "replyingTo": { - "message": "正在回覆給 $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": "要傳送語音訊息,須授權 Siganl 桌面版可以使用您設備的麥克風。 ", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" @@ -777,10 +641,6 @@ "message": "允許存取", "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, - "showSettings": { - "message": "顯示設定", - "description": "A button shown in dialog requesting the user to turn on audio permissions" - }, "audio": { "message": "聲音", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" @@ -797,10 +657,6 @@ "message": "Cannot Update", "description": "Shown as the title of our update error dialogs on windows" }, - "readOnlyVolume": { - "message": "Signal Desktop is likely in a macOS quarantine, and will not be able to auto-update. Please try moving Signal.app to /Applications with Finder.", - "description": "Shown on MacOS if running on a read-only volume and we cannot update" - }, "ok": { "message": "好", "description": "" @@ -809,18 +665,10 @@ "message": "取消", "description": "" }, - "failedToSend": { - "message": "無法傳送給一些接收者。檢查你的網路連線。", - "description": "" - }, "error": { "message": "錯誤", "description": "" }, - "messageDetail": { - "message": "詳細訊息", - "description": "" - }, "delete": { "message": "刪除", "description": "" @@ -857,10 +705,6 @@ "message": "群組成員", "description": "" }, - "showMembers": { - "message": "顯示成員", - "description": "" - }, "resetSession": { "message": "重設對話", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." @@ -869,10 +713,6 @@ "message": "檢視安全碼", "description": "" }, - "viewAllMedia": { - "message": "檢視全部媒體", - "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": "如果你想要你與 $name$ 驗證端對端加密的安全性,比較上方的號碼與他們裝置上的號碼。", "description": "", @@ -887,14 +727,6 @@ "message": "你尚未與這個聯絡人交換訊息。你與他們的安全碼將會在初次送出訊息後生效。", "description": "" }, - "moreInfo": { - "message": "更多資訊...", - "description": "Shown on the drop-down menu for an individual message, takes you to message detail screen" - }, - "retrySend": { - "message": "重新傳送", - "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": "刪除訊息", "description": "Shown on the drop-down menu for an individual message, deletes single message" @@ -939,10 +771,6 @@ "message": "儲存", "description": "" }, - "fileIconAlt": { - "message": "檔案圖示", - "description": "Used in the media gallery documents tab to visually represent a file" - }, "emojiAlt": { "message": " '$title$' 的表情符號圖片", "description": "Used in the alt tag of all emoji images", @@ -953,66 +781,10 @@ } } }, - "installWelcome": { - "message": "歡迎來到 Signal Desktop版", - "description": "Welcome title on the install page" - }, - "installTagline": { - "message": "隱私是有可能的。Signal 讓隱私更簡單。", - "description": "Tagline displayed under 'installWelcome' string on the install page" - }, - "linkYourPhone": { - "message": "您的手機與 Signal Desktop連結", - "description": "Shown on the front page when the application first starst, above the QR code" - }, - "signalSettings": { - "message": "Signal 設定", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "linkedDevices": { - "message": "已連結的裝置", - "description": "Used in the guidance to help people find the 'link new device' area of their Signal mobile app" - }, - "plusButton": { - "message": "「+」按鈕", - "description": "The button used in Signal Android to add a new linked device" - }, "linkNewDevice": { "message": "連結新裝置", "description": "The menu option shown in Signal iOS to add a new linked device" }, - "deviceName": { - "message": "裝置名稱", - "description": "The label in settings panel shown for the user-provided name for this desktop instance" - }, - "chooseDeviceName": { - "message": "選擇此裝置的名稱", - "description": "The header shown on the 'choose device name' screen in the device linking process" - }, - "finishLinkingPhone": { - "message": "完成連結手機", - "description": "The text on the button to finish the linking process, after choosing the device name" - }, - "initialSync": { - "message": "正在同步聯絡人與群組", - "description": "Shown during initial link while contacts and groups are being pulled from mobile device" - }, - "installConnectionFailed": { - "message": "無法連線到伺服器。", - "description": "Displayed when we can't connect to the server." - }, - "installTooManyDevices": { - "message": "抱歉,你已經有太多連結的裝置。試著移除一些。", - "description": "" - }, - "settings": { - "message": "設定", - "description": "Menu item and header for global settings" - }, - "theme": { - "message": "主題", - "description": "Header for theme settings" - }, "permissions": { "message": "許可", "description": "Header for permissions section of settings" @@ -1029,34 +801,6 @@ "message": "在訊息撰寫時啟用文字輸入的拼字檢查", "description": "Description of the media permission description" }, - "clearDataHeader": { - "message": "清除資料", - "description": "Header in the settings dialog for the section dealing with data deletion" - }, - "clearDataExplanation": { - "message": "這會清除所有應用程式的資料,移除所有訊息及已儲存的帳號資訊。", - "description": "Text describing what the clear data button will do." - }, - "clearDataButton": { - "message": "清除資料", - "description": "Button in the settings dialog starting process to delete all data" - }, - "deleteAllDataHeader": { - "message": "刪除所有資料?", - "description": "Header of the full-screen delete data confirmation screen" - }, - "deleteAllDataBody": { - "message": "你即將刪除所有應用程式已儲存的帳號資訊,包含所有聯絡人及訊息。你通常能再與行動裝置連結,但無法還原被刪除的訊息。", - "description": "Text describing what exactly will happen if the user clicks the button to delete all data" - }, - "deleteAllDataButton": { - "message": "刪除所有資料", - "description": "Text of the button that deletes all data" - }, - "deleteAllDataProgress": { - "message": "離線中並刪除所有資料", - "description": "Message shown to user when app is disconnected and data deleted" - }, "notifications": { "message": "通知", "description": "Header for notification settings" @@ -1105,14 +849,6 @@ "message": "傳送失敗", "description": "Shown on outgoing message if it fails to send" }, - "showMore": { - "message": "細節", - "description": "Displays the details of a key change" - }, - "showLess": { - "message": "隱藏細節", - "description": "Hides the details of a key change" - }, "learnMore": { "message": "了解更多關於驗證安全碼", "description": "Text that links to a support article on verifying safety numbers" @@ -1129,34 +865,6 @@ "message": "媒體訊息", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, - "unregisteredUser": { - "message": "號碼尚未註冊", - "description": "Error message displayed when sending to an unregistered user." - }, - "sync": { - "message": "聯絡人", - "description": "Label for contact and group sync settings" - }, - "syncExplanation": { - "message": "從你的行動裝置,匯入 Signal 群組和聯絡人。", - "description": "Explanatory text for sync settings" - }, - "lastSynced": { - "message": "上一次匯入在", - "description": "Label for date and time of last sync operation" - }, - "syncNow": { - "message": "現在匯入", - "description": "Label for a button that syncs contacts and groups from your phone" - }, - "syncing": { - "message": "正在匯入...", - "description": "Label for a disabled sync button while sync is in progress." - }, - "syncFailed": { - "message": "匯入失敗。確認你的電腦與電話都連線到網路。", - "description": "Informational text displayed if a sync operation times out." - }, "timestamp_s": { "message": "現在", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." @@ -1169,50 +877,6 @@ "message": "1 小時", "description": "Brief timestamp for messages sent about one hour ago. Displayed in the conversation list and message bubble." }, - "hoursAgoShort": { - "message": "$hours$小時", - "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$ 小時之前", - "description": "Contracted form of 'X hours ago' which works both for singular and plural", - "placeholders": { - "hours": { - "content": "$1", - "example": "2" - } - } - }, - "minutesAgoShort": { - "message": "$minutes$ 分鐘", - "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$ 分鐘前", - "description": "Contracted form of 'X minutes ago' which works both for singular and plural", - "placeholders": { - "minutes": { - "content": "$1", - "example": "10" - } - } - }, - "justNow": { - "message": "現在", - "description": "Shown if a message is very recent, less than 60 seconds old" - }, "timestampFormat_M": { "message": "MMM D", "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'." @@ -1387,10 +1051,6 @@ } } }, - "audioNotificationDescription": { - "message": "播放通知音效", - "description": "Description for audio notification setting" - }, "safetyNumberChanged": { "message": "安全號碼已變更", "description": "A notification shown in the conversation when a contact reinstalls" @@ -1419,46 +1079,18 @@ } } }, - "themeLight": { - "message": "亮色系", - "description": "Label text for light theme (normal)" - }, - "themeDark": { - "message": "暗色系", - "description": "Label text for dark theme" - }, "noteToSelf": { "message": "給自己的筆記", "description": "Name for the conversation with your own phone number" }, - "hideMenuBar": { - "message": "隱藏選單列", - "description": "Label text for menu bar visibility setting" - }, "startConversation": { "message": "開始新的對話...", "description": "Label underneath number a user enters that is not an existing contact" }, - "newPhoneNumber": { - "message": "輸入電話號碼來加入聯絡人", - "description": "Placeholder for adding a new number to a contact" - }, "invalidNumberError": { "message": "無效號碼", "description": "When a person inputs a number that is invalid" }, - "unlinkedWarning": { - "message": "重新連結 Signal Desktop到你的行動裝置來持續發送訊息。", - "description": "" - }, - "unlinked": { - "message": "未連結的", - "description": "" - }, - "relink": { - "message": "重新連結", - "description": "" - }, "autoUpdateNewVersionTitle": { "message": "Session 可用的更新", "description": "" @@ -1533,4 +1165,4 @@ } } } -} +} \ No newline at end of file From 86fa77966e68a013c72f415796a635d257210dc8 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 20 Aug 2020 15:57:27 +1000 Subject: [PATCH 074/274] add option to add items missing from dest/messages.json from en/messages --- tools/mapAndroidTranslationsToDesktop.py | 33 +++++++++++++++++++----- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/tools/mapAndroidTranslationsToDesktop.py b/tools/mapAndroidTranslationsToDesktop.py index 1056b8570..e5a8f1ba0 100755 --- a/tools/mapAndroidTranslationsToDesktop.py +++ b/tools/mapAndroidTranslationsToDesktop.py @@ -11,7 +11,7 @@ import traceback # "addStart": "&" char to add as start char # "androidReplace": replace all occurences of key value pair -allowedItemKeys = ['message', 'description', 'comment', 'placeholders', 'androidKey', 'wordCapitalize', 'androidKeyCount', 'androidReplace', 'addStart'] +ALLOWED_ITEM_KEYS = ['message', 'description', 'comment', 'placeholders', 'androidKey', 'wordCapitalize', 'androidKeyCount', 'androidReplace', 'addStart'] SPECIFIC_LOCALES_MAPPING = { 'zh_CN': 'zh-rCN', @@ -73,27 +73,30 @@ def findCountInItem(quantityStr, items): # print(f'findCountInItem: {found}, quantityStr: {quantityStr}') if len(found) != 1: - raise KeyError(f'quantityStr not found: {quantityStr} ') + str = f'quantityStr not found: "{quantityStr}"' + raise KeyError(str) return dict(found[0]) def findByNameSingular(keySearchedFor, singularString): found = [item for item in singularString if item['@name'] == keySearchedFor] if len(found) != 1: - raise KeyError(f'android key singular not found: {keySearchedFor} but should have been found') + str = f'android key singular not found: "{keySearchedFor}" but should have been found' + raise KeyError(str) return found[0] def findByNamePlurals(keySearchedFor, pluralsString, quantityStr): found = [item for item in pluralsString if item['@name'] == keySearchedFor] if len(found) != 1: - raise KeyError(f'android key plurals not found: {keySearchedFor} but should have been found') + str = f'android key plurals not found: "{keySearchedFor}" but should have been found' + raise KeyError(str) return findCountInItem(quantityStr, found[0]['item']) def validateKeysPresent(items): for keyItem, valueItem in items: - if keyItem not in allowedItemKeys: + if keyItem not in ALLOWED_ITEM_KEYS: print(f"Invalid key item: {keyItem}") exit(1) # print(f"keyItem: '{keyItem}', valueItem: '{valueItem}'") @@ -129,6 +132,19 @@ def getAndroidKeyCountFromItem(item): androidKeyCount = item['androidKeyCount'] return androidKeyCount +def keysDifference(src, dest): + srcKeys = set(src.keys()) + destKeys = set(dest.keys()) + return list (srcKeys - destKeys) + +def addEnglishItemAsPlaceHolder(desktopDest, itemEnDesktop): + # add only if the key does not already exists on desktopDest + if key not in desktopDest.keys(): + desktopDest[key] = itemEnDesktop + + +# number of keys on src which do not exist at all on 'dest' +# print('keysDifference:', len(keysDifference(desktopSrc, desktopDest))) ################### MAIN ##################### @@ -139,6 +155,8 @@ for key, itemEnDesktop in desktopSrc.items(): if 'androidKey' not in itemEnDesktop.keys(): # print('androidKey not found for {key}') missingAndroidKeyCount = missingAndroidKeyCount + 1 + # ENABLE ME to add a placeholder item from the EN file when it is missing on the target locale + # addEnglishItemAsPlaceHolder(desktopDest, itemEnDesktop) continue androidKey = itemEnDesktop['androidKey'] androidKeyCount = getAndroidKeyCountFromItem(itemEnDesktop) @@ -174,10 +192,11 @@ for key, itemEnDesktop in desktopSrc.items(): else: desktopDest[key]['message'] = textMorphed - except KeyError: print('KeyError exception:', traceback.format_exc()) + + # write the updated json dict to the file with open(destFilePath, 'w') as outfile: json.dump(desktopDest, outfile, indent=4, ensure_ascii=False) @@ -187,4 +206,4 @@ with open(destFilePath, 'w') as outfile: print(f"total keys missing {missingAndroidKeyCount}") # androidKey set on desktop but not found on android EN resources -print(f"total text not matching EN to EN {notMatchingCount}") \ No newline at end of file +print(f"total text not matching EN to EN {notMatchingCount}") From 7df7357990944ae74effa736601894ad5eb22a40 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 20 Aug 2020 15:58:30 +1000 Subject: [PATCH 075/274] update russian translation with english missing key for now --- _locales/ru/messages.json | 447 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 447 insertions(+) diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index ad5e2ab20..46b355c1d 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -1416,5 +1416,452 @@ }, "closedGroupMaxSize": { "message": "В закрытой группе не может быть больше 10 участников" + }, + "contextMenuNoSuggestions": { + "message": "No Suggestions", + "description": "Shown in the context menu for a misspelled word to indicate that there are no suggestions to replace the misspelled word" + }, + "done": { + "message": "Done", + "description": "Button when a specific action is to be done." + }, + "cannotUpdateDetail": { + "message": "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.", + "description": "Shown if a general error happened while trying to install update package" + }, + "close": { + "message": "Close" + }, + "devicePairingRequestReceivedNoListenerDescription": { + "message": "Device linking request received but you are not on the device linking screen. \nGo to Settings > Device > Link New Device." + }, + "deviceIsSecondaryNoPairing": { + "message": "This device is a secondary device and so cannot be linked." + }, + "pairingOngoing": { + "message": "A pairing request is already ongoing. Restart the app if it takes too long." + }, + "allowPairingWithDevice": { + "message": "Allow linking with this device?" + }, + "provideDeviceAlias": { + "message": "Please provide an alias for this linked device" + }, + "showPairingWordsTitle": { + "message": "Linking Secret Words" + }, + "confirmUnpairingTitle": { + "message": "Please confirm you want to unlink the following device:" + }, + "unpairDeviceWarning": { + "message": "Are you sure you want to unlink this device?", + "description": "Warning for device unlinking in settings view" + }, + "unpairDeviceWarningSub": { + "message": "Unlinking this device will delete all history, including all messages, sessions, and contacts from this device.", + "description": "Warning description for device unlinking in settings view" + }, + "deletePublicWarning": { + "message": "Are you sure? This will permanently remove this message for everyone in this open group." + }, + "deleteMultiplePublicWarning": { + "message": "Are you sure? This will permanently remove these messages for everyone in this open group." + }, + "deleteMultipleWarning": { + "message": "Are you sure? Clicking 'delete' will permanently remove these messages from this device only." + }, + "messageDeletionForbidden": { + "message": "You don’t have permission to delete others’ messages", + "description": "Toast message explaining that the user doens't have the rights to delete other people's messages." + }, + "sendMessageBlockedUser": { + "message": "You have blocked this contact" + }, + "deleteMessageForEveryone": { + "message": "Delete Message For Everyone", + "description": "Menu item for deleting messages, title case." + }, + "deleteMessagesForEveryone": { + "message": "Delete Messages For Everyone", + "description": "Menu item for deleting messages, title case." + }, + "deleteForEveryone": { + "message": "Delete For Everyone", + "description": "Menu item for deleting messages, title case." + }, + "deletePublicConversationConfirmation": { + "message": "Permanently delete the messages locally from this open group?", + "description": "Confirmation dialog text that asks the user if they really wish to delete the open group messages locally. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone." + }, + "sessionResetFailed": { + "message": "Secure session reset failed", + "description": "your secure session could not been transmitted to the other participant." + }, + "sessionResetOngoing": { + "message": "Secure session reset in progress", + "description": "your secure session is currently being reset, waiting for the reset acknowledgment." + }, + "linkPreviewsConfirmMessage": { + "message": "You will not have full metadata protection when sending or receiving link previews." + }, + "mediaPermissionsTitle": { + "message": "Microphone and Camera" + }, + "spellCheckTitle": { + "message": "Spell Check", + "description": "Description of the media permission description" + }, + "spellCheckDirty": { + "message": "You must restart Session to apply your new settings", + "description": "Shown when the user changes their spellcheck setting to indicate that they must restart Signal." + }, + "readReceiptSettingDescription": { + "message": "See and share when messages have been read (enables read receipts in all sessions).", + "description": "Description of the read receipts setting" + }, + "typingIndicatorsSettingDescription": { + "message": "See and share when messages are being typed (applies to all sessions).", + "description": "Description of the typing indicators setting" + }, + "messageTTL": { + "message": "Message TTL", + "description": "Title of the Message TTL setting" + }, + "messageTTLSettingDescription": { + "message": "Time to live (how long the recipient will have to collect their messages)", + "description": "Description of the time to live setting" + }, + "zoomFactorSettingTitle": { + "message": "Zoom Factor", + "description": "Title of the Zoom Factor setting" + }, + "clockOutOfSync": { + "message": "Your clock is out of sync. Please update your clock and try again.", + "description": "Notifcation that user's clock is out of sync with Loki's servers." + }, + "messageBodyTooLong": { + "message": "Message body is too long.", + "description": "Shown if the user tries to send more than 64kb of text" + }, + "changeNickname": { + "message": "Change Nickname", + "description": "Conversation menu option to change user nickname" + }, + "clearNickname": { + "message": "Clear nickname", + "description": "Conversation menu option to clear user nickname" + }, + "themeToggleDescription": { + "message": "Choose the theme best suited to you" + }, + "hideMenuBarTitle": { + "message": "Hide Menu Bar", + "description": "Label text for menu bar visibility setting" + }, + "hideMenuBarDescription": { + "message": "Toggle system menu bar visibility", + "description": "Label text for menu bar visibility setting" + }, + "autoUpdateSettingTitle": { + "message": "Auto Update" + }, + "autoUpdateSettingDescription": { + "message": "Automatically check for updates on launch" + }, + "autoUpdateDownloadedMessage": { + "message": "The new update has been downloaded." + }, + "autoUpdateDownloadInstructions": { + "message": "Would you like to download the update?" + }, + "unblocked": { + "message": "Unblocked" + }, + "banUser": { + "message": "Ban User", + "description": "Ban user from open group by public key." + }, + "banUserConfirm": { + "message": "Are you sure you want to ban user?", + "description": "Message shown when confirming user ban." + }, + "userBanned": { + "message": "User banned successfully", + "description": "Toast on succesful user ban." + }, + "userBanFailed": { + "message": "Ban failed!", + "description": "Toast on unsuccesful user ban." + }, + "copyMessage": { + "message": "Copy message text", + "description": "Button action that the user can click to copy their public keys" + }, + "selectMessage": { + "message": "Select message", + "description": "Button action that the user can click to select the message" + }, + "editGroupName": { + "message": "Edit group name", + "description": "Button action that the user can click to edit a group name (closed)" + }, + "setAccountPasswordTitle": { + "message": "Set Account Password", + "description": "Prompt for user to set account password in settings view" + }, + "setAccountPasswordDescription": { + "message": "Require password to unlock Session’s screen. You can still receive message notifications while Screen Lock is enabled. Session’s notification settings allow you to customize information that is displayed", + "description": "Description for set account password setting view" + }, + "changeAccountPasswordTitle": { + "message": "Change Account Password", + "description": "Prompt for user to change account password in settings view" + }, + "changeAccountPasswordDescription": { + "message": "Change your password", + "description": "Description for change account password setting view" + }, + "removeAccountPasswordTitle": { + "message": "Remove Account Password", + "description": "Prompt for user to remove account password in settings view" + }, + "removeAccountPasswordDescription": { + "message": "Remove the password associated with your account", + "description": "Description for remove account password setting view" + }, + "enterPassword": { + "message": "Please enter your password" + }, + "confirmPassword": { + "message": "Confirm password" + }, + "pasteLongPasswordToastTitle": { + "message": "The clipboard content exceeds the maximum password length of $max_pwd_len$ characters.", + "description": "Shown when user pastes a password which is longer than MAX_PASSWORD_LEN" + }, + "showRecoveryPhrasePasswordRequest": { + "message": "Please enter your password", + "description": "Request for user to enter password to show recovery phrase." + }, + "QRCodeDescription": { + "message": "This is your unique public QR Code.
Other users may scan this in order to begin a conversation with you.", + "description": "Description given to QRCode modal" + }, + "passwordViewTitle": { + "message": "Type In Your Password", + "description": "The title shown when user needs to type in a password to unlock the messenger" + }, + "password": { + "message": "Password", + "description": "Placeholder for password input" + }, + "setPassword": { + "message": "Set Password", + "description": "Button action that the user can click to set a password" + }, + "changePassword": { + "message": "Change Password", + "description": "Button action that the user can click to change a password" + }, + "removePassword": { + "message": "Remove Password", + "description": "Button action that the user can click to remove a password" + }, + "maxPasswordAttempts": { + "message": "Invalid Password. Would you like to reset the database?" + }, + "typeInOldPassword": { + "message": "Please type in your old password" + }, + "invalidOldPassword": { + "message": "Old password is invalid" + }, + "invalidPassword": { + "message": "Invalid password" + }, + "noGivenPassword": { + "message": "Please enter your password" + }, + "passwordsDoNotMatch": { + "message": "Passwords do not match" + }, + "setPasswordInvalid": { + "message": "Passwords do not match" + }, + "changePasswordInvalid": { + "message": "The old password you entered is incorrect" + }, + "removePasswordInvalid": { + "message": "Incorrect password" + }, + "setPasswordTitle": { + "message": "Set Password" + }, + "changePasswordTitle": { + "message": "Changed Password" + }, + "removePasswordTitle": { + "message": "Removed Password" + }, + "setPasswordToastDescription": { + "message": "Your password has been set. Please keep it safe." + }, + "changePasswordToastDescription": { + "message": "Your password has been changed. Please keep it safe." + }, + "removePasswordToastDescription": { + "message": "You have removed your password." + }, + "publicChatExists": { + "message": "You are already connected to this open group" + }, + "connectToServerSuccess": { + "message": "Successfully connected to open group" + }, + "setPasswordFail": { + "message": "Failed to set password" + }, + "passwordLengthError": { + "message": "Password must be between 6 and 50 characters long", + "description": "Error string shown to the user when password doesn't meet length criteria" + }, + "passwordTypeError": { + "message": "Password must be a string", + "description": "Error string shown to the user when password is not a string" + }, + "passwordCharacterError": { + "message": "Password must only contain letters, numbers and symbols", + "description": "Error string shown to the user when password contains an invalid character" + }, + "change": { + "message": "Change" + }, + "set": { + "message": "Set" + }, + "invalidPubkeyFormat": { + "message": "Invalid Pubkey Format", + "description": "Error string shown when user types an invalid pubkey format" + }, + "lnsMappingNotFound": { + "message": "There is no LNS mapping associated with this name", + "description": "Shown in toast if user enters an unknown LNS name" + }, + "lnsLookupTimeout": { + "message": "LNS lookup timed out", + "description": "Shown in toast if user enters an unknown LNS name" + }, + "lnsTooFewNodes": { + "message": "Not enough nodes currently active for LNS lookup" + }, + "editProfileModalTitle": { + "message": "Profile", + "description": "Title for the Edit Profile modal" + }, + "addModerators": { + "message": "Add Moderators" + }, + "removeModerators": { + "message": "Remove Moderators" + }, + "groupInvitation": { + "message": "Group Invitation" + }, + "addingContacts": { + "message": "Adding contacts to" + }, + "noContactsToAdd": { + "message": "No contacts to add" + }, + "noMembersInThisGroup": { + "message": "No other members in this group" + }, + "noModeratorsToRemove": { + "message": "no moderators to remove" + }, + "couldNotDecryptMessage": { + "message": "Couldn't decrypt a message" + }, + "confirmSessionRestore": { + "message": "Would you like to start a new session with $pubkey$? Only do so if you know this pubkey.", + "placeholders": { + "pubkey": { + "content": "$1", + "example": "" + } + } + }, + "createAccount": { + "message": "Create Account" + }, + "signIn": { + "message": "Sign In" + }, + "getStarted": { + "message": "Get started" + }, + "anonymous": { + "message": "Anonymous", + "description": "The name of currently unidentified users" + }, + "optionalPassword": { + "message": "Verify Password" + }, + "enterOptionalPassword": { + "message": "Enter password (optional)" + }, + "verifyPassword": { + "message": "Verify Password" + }, + "devicePairingHeaderReassure": { + "message": "Linking may take up to one minute to register on your primary device. Please be patient." + }, + "devicePairingHeader_Step1": { + "message": "Open Session on your other device." + }, + "devicePairingHeader_Step2": { + "message": "Navigate to the Devices section in your user account screen." + }, + "devicePairingHeader_Step3": { + "message": "Select Link New Device to prepare your other device for pairing." + }, + "devicePairingHeader_Step4": { + "message": "Enter your Session ID below to link this device to your Session ID." + }, + "linkDeviceToExistingAccount": { + "message": "Link Device to Existing Session ID" + }, + "or": { + "message": "or" + }, + "ByUsingThisService...": { + "message": "By using this service, you agree to our Terms of Service and Privacy Policy" + }, + "beginYourSession": { + "message": "Begin
your
Session." + }, + "welcomeToYourSession": { + "message": "Welcome to your Session" + }, + "message": { + "message": "Message" + }, + "addContact": { + "message": "Add Contact" + }, + "permissionSettingsTitle": { + "message": "Permissions" + }, + "members": { + "message": "$count$ members", + "placeholders": { + "count": { + "content": "$1", + "example": "26" + } + } + }, + "description": { + "message": "Description" } } \ No newline at end of file From 785efcbe3c51d7cbbb435444945b695bdf6929ab Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 21 Aug 2020 09:29:53 +1000 Subject: [PATCH 076/274] add option to ignore case on match anroidEn - desktopEn --- _locales/en/messages.json | 39 +++++++++++------------- tools/mapAndroidTranslationsToDesktop.py | 8 +++-- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 6e013c39e..37ba354f1 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -259,7 +259,7 @@ "androidReplace": { "%d": "$count$" }, - "wordCapitalize": true + "ignoreCase": true }, "unreadMessages": { "message": "$count$ Unread Messages", @@ -275,7 +275,7 @@ "androidReplace": { "%d": "$count$" }, - "wordCapitalize": true + "ignoreCase": true }, "youMarkedAsVerified": { "message": "You marked your safety number with $name$ verified", @@ -340,7 +340,7 @@ "changedSinceVerifiedTitle": { "message": "Safety Number Changed", "androidKey": "ThreadRecord_safety_number_changed", - "wordCapitalize": true + "ignoreCase": true }, "changedSinceVerifiedMultiple": { "message": "Your safety numbers with multiple group members have changed since you last verified. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Session.", @@ -956,12 +956,12 @@ "message": "Reset Secure Session", "description": "This is a menu item for resetting the session, using the imperative case, as in a command.", "androidKey": "conversation_secure_verified__menu_reset_secure_session", - "wordCapitalize": true + "ignoreCase": true }, "showSafetyNumber": { "message": "View Safety Number", "androidKey": "recipient_preferences__view_safety_number", - "wordCapitalize": true + "ignoreCase": true }, "verifyHelp": { "message": "If you wish to verify the security of your end-to-end encryption with $name$, compare the numbers above with the numbers on their device.", @@ -990,7 +990,7 @@ "message": "Delete Message", "description": "Shown on the drop-down menu for an individual message, deletes single message", "androidKey": "conversation_context__menu_delete_message", - "wordCapitalize": true + "ignoreCase": true }, "deleteMessages": { "message": "Delete Messages", @@ -1092,7 +1092,7 @@ "message": "Link New Device", "description": "The menu option shown in Signal iOS to add a new linked device", "androidKey": "device_list_fragment__link_new_device", - "wordCapitalize": true + "ignoreCase": true }, "permissions": { "message": "Permissions", @@ -1106,7 +1106,7 @@ "message": "Send Link Previews", "description": "Option to control creation and send of link previews in setting screen", "androidKey": "preferences__send_link_previews", - "wordCapitalize": true + "ignoreCase": true }, "linkPreviewDescription": { "message": "Previews are supported for Imgur, Instagram, Pinterest, Reddit, and YouTube links", @@ -1148,7 +1148,7 @@ "message": "Read Receipts", "description": "Title of the read receipts setting", "androidKey": "preferences__read_receipts", - "wordCapitalize": true + "ignoreCase": true }, "typingIndicatorsSettingDescription": { "message": "See and share when messages are being typed (applies to all sessions).", @@ -1158,7 +1158,7 @@ "message": "Typing Indicators", "description": "Title of the typing indicators setting", "androidKey": "preferences__typing_indicators", - "wordCapitalize": true + "ignoreCase": true }, "messageTTL": { "message": "Message TTL", @@ -1222,8 +1222,7 @@ "sendFailed": { "message": "Send Failed", "description": "Shown on outgoing message if it fails to send", - "androidKey": "conversation_item_sent__send_failed_indicator_description", - "wordCapitalize": true + "androidKey": "conversation_item_sent__send_failed_indicator_description" }, "learnMore": { "message": "Learn more about verifying safety numbers", @@ -1249,8 +1248,7 @@ "timestamp_s": { "message": "Now", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble.", - "androidKey": "DateUtils_just_now", - "wordCapitalize": true + "androidKey": "DateUtils_just_now" }, "timestamp_m": { "message": "1 minute", @@ -1491,7 +1489,7 @@ "message": "Verify Safety Number", "description": "Label on button included with safety number change notification in the conversation", "androidKey": "AndroidManifest__verify_safety_number", - "wordCapitalize": true + "ignoreCase": true }, "yourSafetyNumberWith": { "message": "Your safety number with $name$:", @@ -1708,7 +1706,7 @@ "message": "Leave Group", "description": "Button action that the user can click to leave the group", "androidKey": "conversation__menu_leave_group", - "wordCapitalize": true + "ignoreCase": true }, "leaveGroupConfirmation": { "message": "Are you sure you want to leave this group?", @@ -1954,12 +1952,11 @@ "groupNamePlaceholder": { "message": "Group Name", "androidKey": "GroupCreateActivity_group_name_hint", - "wordCapitalize": true + "ignoreCase": true }, "inviteContacts": { "message": "Invite Contacts", - "androidKey": "text_secure_normal__invite_friends", - "wordCapitalize": true + "androidKey": "text_secure_normal__invite_friends" }, "addModerators": { "message": "Add Moderators" @@ -2171,7 +2168,7 @@ "createClosedGroupNamePrompt": { "message": "Group Name", "androidKey": "GroupCreateActivity_group_name_hint", - "wordCapitalize": true + "ignoreCase": true }, "createClosedGroupPlaceholder": { "message": "Enter a group name", @@ -2199,7 +2196,7 @@ "pairingDevice": { "message": "Linking Device", "androidKey": "DeviceProvisioningActivity_content_progress_title", - "wordCapitalize": true + "ignoreCase": true }, "devicePairedSuccessfully": { "message": "Your device has been linked successfully", diff --git a/tools/mapAndroidTranslationsToDesktop.py b/tools/mapAndroidTranslationsToDesktop.py index e5a8f1ba0..496631316 100755 --- a/tools/mapAndroidTranslationsToDesktop.py +++ b/tools/mapAndroidTranslationsToDesktop.py @@ -11,7 +11,7 @@ import traceback # "addStart": "&" char to add as start char # "androidReplace": replace all occurences of key value pair -ALLOWED_ITEM_KEYS = ['message', 'description', 'comment', 'placeholders', 'androidKey', 'wordCapitalize', 'androidKeyCount', 'androidReplace', 'addStart'] +ALLOWED_ITEM_KEYS = ['message', 'description', 'comment', 'placeholders', 'androidKey', 'wordCapitalize', 'androidKeyCount', 'androidReplace', 'addStart', 'ignoreCase'] SPECIFIC_LOCALES_MAPPING = { 'zh_CN': 'zh-rCN', @@ -146,6 +146,10 @@ def addEnglishItemAsPlaceHolder(desktopDest, itemEnDesktop): # number of keys on src which do not exist at all on 'dest' # print('keysDifference:', len(keysDifference(desktopSrc, desktopDest))) +def doesAndroidEnAndDesktopMatches(txtEnDesktop, morphedEnAndroid, desktopItemEn): + if 'ignoreCase' in desktopItemEn.keys() and desktopItemEn['ignoreCase']: + return txtEnDesktop.lower() == morphedEnAndroid.lower() + return txtEnDesktop == morphedEnAndroid ################### MAIN ##################### for key, itemEnDesktop in desktopSrc.items(): @@ -167,7 +171,7 @@ for key, itemEnDesktop in desktopSrc.items(): txtEnAndroid = itemEnAndroid['#text'] morphedEnAndroid = morphToDesktopSyntax(txtEnAndroid, itemEnDesktop) - if (txtEnDesktop != morphedEnAndroid): + if not doesAndroidEnAndDesktopMatches(txtEnDesktop, morphedEnAndroid, itemEnDesktop): print(f'\t\tDOES NOT MATCH: "{txtEnDesktop}" vs "{morphedEnAndroid}", itemEnDesktop: {itemEnDesktop}\n\n') notMatchingCount = notMatchingCount + 1 else: From fed644df499011824bde4e8261d3f659b336d7ee Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 21 Aug 2020 09:35:57 +1000 Subject: [PATCH 077/274] update fr locale removing maj when weird --- _locales/fr/messages.json | 42 +++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index 3fbc85a5b..d10f21e35 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -206,11 +206,11 @@ "description": "Displayed when a user can't send a message because they have left the group" }, "unreadMessage": { - "message": "$count$ Message Non Lu", + "message": "$count$ message non lu", "description": "Text for unread message separator, just one message" }, "unreadMessages": { - "message": "$count$ Messages Non Lus", + "message": "$count$ messages non lus", "description": "Text for unread message separator, with count", "placeholders": { "count": { @@ -472,11 +472,11 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "La pièce jointe dépasse la limite de taille pour le type de message que vous envoyé.", + "message": "La pièce jointe dépasse la limite de taille autorisée.", "description": "" }, "unableToLoadAttachment": { - "message": "Désolé, une erreur de mise en place de votre pièce jointe est survenue.", + "message": "Une erreur est survenue lors du chargement de la pièce jointe.", "description": "" }, "connecting": { @@ -706,11 +706,11 @@ "description": "" }, "resetSession": { - "message": "Réinitialiser La Session Sécurisée", + "message": "Réinitialiser la session sécurisée", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." }, "showSafetyNumber": { - "message": "Afficher Le Numéro De Sécurité", + "message": "Afficher le numéro de sécurité", "description": "" }, "verifyHelp": { @@ -728,7 +728,7 @@ "description": "" }, "deleteMessage": { - "message": "Supprimer Le Message", + "message": "Supprimer le message", "description": "Shown on the drop-down menu for an individual message, deletes single message" }, "deleteMessages": { @@ -782,7 +782,7 @@ } }, "linkNewDevice": { - "message": "Relier Un Nouvel Appareil", + "message": "Relier un nouvel appareil", "description": "The menu option shown in Signal iOS to add a new linked device" }, "permissions": { @@ -846,7 +846,7 @@ "description": "Displayed in notifications when setting is 'name and message' and more than one message is waiting" }, "sendFailed": { - "message": "Échec D’Envoi", + "message": "Échec d’envoi", "description": "Shown on outgoing message if it fails to send" }, "learnMore": { @@ -866,7 +866,7 @@ "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, "timestamp_s": { - "message": "À L’Instant", + "message": "À l’instant", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." }, "timestamp_m": { @@ -1066,7 +1066,7 @@ } }, "verifyNewNumber": { - "message": "Vérifier Le Numéro De Sécurité", + "message": "Vérifier le numéro de sécurité", "description": "Label on button included with safety number change notification in the conversation" }, "yourSafetyNumberWith": { @@ -1172,7 +1172,7 @@ "message": "Inconnu" }, "changedSinceVerifiedTitle": { - "message": "Le Numéro De Sécurité A Changé" + "message": "Le numéro de sécurité a changé" }, "youMayWishToVerifyContact": { "message": "Vous devriez peut-être vérifier votre numéro de sécurité avec ce contact." @@ -1232,16 +1232,16 @@ "message": "Copier" }, "linkPreviewsTitle": { - "message": "Envoyer Des Aperçus De Liens" + "message": "Envoyer des aperçus de liens" }, "linkPreviewDescription": { "message": "Les aperçus sont pris en charge pour les liens Imgur, Instagram, Pinterest, Reddit et YouTube" }, "readReceiptSettingTitle": { - "message": "Accusés De Lecture" + "message": "Accusés de lecture" }, "typingIndicatorsSettingTitle": { - "message": "Indicateurs De Saisie" + "message": "Indicateurs de saisie" }, "themeToggleTitle": { "message": "Clair" @@ -1262,7 +1262,7 @@ "message": "Contacts bloqués" }, "leaveGroup": { - "message": "Quitter Le Groupe" + "message": "Quitter le groupe" }, "leaveGroupConfirmation": { "message": "Voulez-vous vraiment quitter ce groupe ?" @@ -1310,10 +1310,10 @@ "message": "Veuillez saisir un nom de groupe" }, "groupNamePlaceholder": { - "message": "Nom Du Groupe" + "message": "Nom du groupe" }, "inviteContacts": { - "message": "Inviter Des Amis" + "message": "Inviter des amis" }, "yourUniqueSessionID": { "message": "Dites bonjour à votre Session ID" @@ -1388,7 +1388,7 @@ "message": "Les groupes privés prennent en charge jusqu'à 10 membres et offrent le même niveau de confidentialité que les sessions individuelles." }, "createClosedGroupNamePrompt": { - "message": "Nom Du Groupe" + "message": "Nom du groupe" }, "createClosedGroupPlaceholder": { "message": "Saisissez un nom de groupe" @@ -1403,7 +1403,7 @@ "message": "Suivant" }, "pairingDevice": { - "message": "Liaison De L’Appareil" + "message": "Liaison de l’appareil" }, "invalidGroupNameTooShort": { "message": "Veuillez saisir un nom de groupe" @@ -1417,4 +1417,4 @@ "closedGroupMaxSize": { "message": "Un groupe privé ne peut pas avoir plus de 10 membres" } -} \ No newline at end of file +} From a77ba864a301aea2ad4ee8e9233c180c4816aef9 Mon Sep 17 00:00:00 2001 From: Maxim Shishmarev Date: Thu, 20 Aug 2020 18:23:49 +1000 Subject: [PATCH 078/274] Add some russian translations --- _locales/ru/messages.json | 40 +++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index 46b355c1d..711f34022 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -1508,7 +1508,7 @@ "message": "Microphone and Camera" }, "spellCheckTitle": { - "message": "Spell Check", + "message": "Проверка орфографии", "description": "Description of the media permission description" }, "spellCheckDirty": { @@ -1516,11 +1516,11 @@ "description": "Shown when the user changes their spellcheck setting to indicate that they must restart Signal." }, "readReceiptSettingDescription": { - "message": "See and share when messages have been read (enables read receipts in all sessions).", + "message": "Получать и отсылать уведомления о прочтении сообщений (для всех контактов).", "description": "Description of the read receipts setting" }, "typingIndicatorsSettingDescription": { - "message": "See and share when messages are being typed (applies to all sessions).", + "message": "Получать и отсылать уведомления когда вы и ваш собедник набирает сообщение (для всех контактов).", "description": "Description of the typing indicators setting" }, "messageTTL": { @@ -1532,7 +1532,7 @@ "description": "Description of the time to live setting" }, "zoomFactorSettingTitle": { - "message": "Zoom Factor", + "message": "Масштабирование Приложения", "description": "Title of the Zoom Factor setting" }, "clockOutOfSync": { @@ -1555,18 +1555,18 @@ "message": "Choose the theme best suited to you" }, "hideMenuBarTitle": { - "message": "Hide Menu Bar", + "message": "Спрятать Системное Меню", "description": "Label text for menu bar visibility setting" }, "hideMenuBarDescription": { - "message": "Toggle system menu bar visibility", + "message": "Спрятать или показать системное меню", "description": "Label text for menu bar visibility setting" }, "autoUpdateSettingTitle": { - "message": "Auto Update" + "message": "Автоматические обновления" }, "autoUpdateSettingDescription": { - "message": "Automatically check for updates on launch" + "message": "Автоматически проверять на наличие обновлений при запуске" }, "autoUpdateDownloadedMessage": { "message": "The new update has been downloaded." @@ -1594,11 +1594,11 @@ "description": "Toast on unsuccesful user ban." }, "copyMessage": { - "message": "Copy message text", + "message": "Скопировать текст сообщения", "description": "Button action that the user can click to copy their public keys" }, "selectMessage": { - "message": "Select message", + "message": "Выбрать сообщение", "description": "Button action that the user can click to select the message" }, "editGroupName": { @@ -1606,15 +1606,15 @@ "description": "Button action that the user can click to edit a group name (closed)" }, "setAccountPasswordTitle": { - "message": "Set Account Password", + "message": "Установить Пароль", "description": "Prompt for user to set account password in settings view" }, "setAccountPasswordDescription": { - "message": "Require password to unlock Session’s screen. You can still receive message notifications while Screen Lock is enabled. Session’s notification settings allow you to customize information that is displayed", + "message": "Установить пароль для разблокирования Session. Вы продолжите получать уведомления о новых сообщениях когда приложение заблокированно. Содержание уведомлений можно поменять в настройках уведомлений.", "description": "Description for set account password setting view" }, "changeAccountPasswordTitle": { - "message": "Change Account Password", + "message": "Изменить Пароль", "description": "Prompt for user to change account password in settings view" }, "changeAccountPasswordDescription": { @@ -1622,7 +1622,7 @@ "description": "Description for change account password setting view" }, "removeAccountPasswordTitle": { - "message": "Remove Account Password", + "message": "Удалить Пароль", "description": "Prompt for user to remove account password in settings view" }, "removeAccountPasswordDescription": { @@ -1755,7 +1755,7 @@ "message": "Not enough nodes currently active for LNS lookup" }, "editProfileModalTitle": { - "message": "Profile", + "message": "Аккаунт", "description": "Title for the Edit Profile modal" }, "addModerators": { @@ -1792,10 +1792,10 @@ } }, "createAccount": { - "message": "Create Account" + "message": "Создать Аккаунт" }, "signIn": { - "message": "Sign In" + "message": "Войти" }, "getStarted": { "message": "Get started" @@ -1808,7 +1808,7 @@ "message": "Verify Password" }, "enterOptionalPassword": { - "message": "Enter password (optional)" + "message": "Введите пароль (если используется)" }, "verifyPassword": { "message": "Verify Password" @@ -1847,10 +1847,10 @@ "message": "Message" }, "addContact": { - "message": "Add Contact" + "message": "Добавить Контакт" }, "permissionSettingsTitle": { - "message": "Permissions" + "message": "Разрешения" }, "members": { "message": "$count$ members", From 103962f1eb9b16d307c75ab89ff23ac6ca318125 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 21 Aug 2020 12:54:11 +1000 Subject: [PATCH 079/274] cleanup ios theme unused --- stylesheets/_ios.scss | 347 ---------------------------- stylesheets/_session_constants.scss | 2 - stylesheets/_theme_dark.scss | 8 - stylesheets/manifest.scss | 1 - 4 files changed, 358 deletions(-) delete mode 100644 stylesheets/_ios.scss diff --git a/stylesheets/_ios.scss b/stylesheets/_ios.scss deleted file mode 100644 index cf3ba988c..000000000 --- a/stylesheets/_ios.scss +++ /dev/null @@ -1,347 +0,0 @@ -// When paired with an iOS device, this stylesheet will apply - -.ios-theme { - // _modules - - .module-message__container--outgoing { - background-color: $color-signal-blue; - color: $color-white; - } - - .module-message__container--incoming { - background-color: $color-light-10; - color: $color-gray-90; - } - - .module-message__author { - color: $color-gray-90; - } - - .module-message__text { - color: $color-white; - font-size: 14px; - a { - text-decoration: underline; - color: $color-white; - } - } - - .module-message__text--incoming { - color: $color-gray-90; - a { - text-decoration: underline; - color: $color-gray-90; - } - } - - .module-message__metadata__date { - color: $color-white-08; - } - .module-message__metadata__date--incoming { - color: $color-gray-60; - } - .module-message__metadata__date--with-image-no-caption { - color: $color-white; - } - - .module-message__metadata__status-icon--sending { - @include color-svg('../images/sending.svg', $color-white); - } - - .module-message__metadata__status-icon--pow { - @include color-svg('../images/pow.svg', $color-white); - } - - .module-message__metadata__status-icon--sent { - @include color-svg('../images/check-circle-outline.svg', $color-white-08); - } - .module-message__metadata__status-icon--delivered { - @include color-svg('../images/double-check.svg', $color-white-08); - } - .module-message__metadata__status-icon--read { - @include color-svg('../images/read.svg', $color-white-08); - } - - .module-message__metadata__status-icon--with-image-no-caption { - background-color: $color-white; - } - - .module-message__generic-attachment__file-name { - color: $color-white; - } - - .module-message__generic-attachment__file-name--incoming { - color: $color-gray-90; - } - - .module-message__generic-attachment__file-size { - color: $color-white; - } - - .module-message__generic-attachment__file-size--incoming { - color: $color-gray-90; - } - - .module-expire-timer { - background-color: $color-white-08; - } - - .module-expire-timer--incoming { - background-color: $color-gray-60; - } - - .module-quote--outgoing { - border-left-color: $color-white; - background-color: $color-white-06; - } - - .module-quote--incoming { - background-color: $color-signal-blue-025; - border-left-color: $color-signal-blue; - } - - .module-quote__reference-warning--incoming { - background-color: $color-signal-blue-mix; - } - - // When you're composing a new quote - .bottom-bar { - .module-quote { - background-color: $color-signal-blue-025; - border-left-color: $color-signal-blue; - } - } - - .module-embedded-contact__contact-name { - color: $color-white; - } - - .module-embedded-contact__contact-method { - color: $color-white-07; - } - - .module-embedded-contact__contact-name--incoming { - color: $color-gray-90; - } - - .module-embedded-contact__contact-method--incoming { - color: $color-light-60; - } - - .module-typing-animation__dot { - background-color: $color-gray-60; - } - - .module-typing-animation__dot--light { - background-color: $color-gray-60; - } - - .module-spinner__circle--incoming { - background-color: $color-white-04; - } - .module-spinner__arc--incoming { - background-color: $color-gray-60; - } - - .module-spinner__circle--outgoing { - background-color: $color-white-04; - } - .module-spinner__arc--outgoing { - background-color: $color-white; - } - - &.dark-theme { - // _modules - - .module-message__container--outgoing { - background-color: $color-signal-blue; - color: $color-gray-05; - } - - .module-message__container--incoming { - background-color: $color-gray-75; - color: $color-gray-05; - } - - .module-message__author { - color: $color-gray-05; - } - - .module-message__text--incoming { - color: $color-gray-05; - a { - text-decoration: underline; - color: $color-gray-05; - } - } - - .module-message__metadata__status-icon--sending { - @include color-svg('../images/sending.svg', $color-white); - } - - .module-message__metadata__status-icon--pow { - @include color-svg('../images/pow.svg', $color-white); - } - - .module-message__metadata__status-icon--sent { - @include color-svg('../images/check-circle-outline.svg', $color-white-08); - } - .module-message__metadata__status-icon--delivered { - @include color-svg('../images/double-check.svg', $color-white-08); - } - .module-message__metadata__status-icon--read { - @include color-svg('../images/read.svg', $color-white-08); - } - - .module-message__metadata__date { - color: $color-white-08; - } - - .module-message__metadata__date--incoming { - color: $color-gray-25; - } - - .module-message__generic-attachment__file-name--incoming { - color: $color-gray-25; - } - .module-message__generic-attachment__file-size--incoming { - color: $color-gray-25; - } - - .module-expire-timer { - background-color: $color-white-08; - } - - .module-expire-timer--incoming { - background-color: $color-gray-25; - } - - .module-quote--outgoing { - border-left-color: $color-black; - background-color: $color-conversation-blue-shade; - } - - .module-quote--incoming { - background-color: $color-conversation-blue-shade; - border-left-color: $color-signal-blue; - } - - .module-quote__primary__author { - color: $color-gray-05; - } - - .module-quote__primary__text { - color: $color-gray-05; - a { - color: $color-gray-05; - } - } - - .module-quote__primary__type-label { - color: $color-gray-05; - } - - .module-quote__primary__type-label--incoming { - color: $color-gray-05; - } - - .module-quote__primary__author--incoming { - color: $color-gray-05; - } - - .module-quote__primary__text--incoming { - color: $color-gray-05; - a { - color: $color-gray-05; - } - } - - .module-quote__generic-file__text { - color: $color-gray-05; - } - - .module-quote__generic-file__text--incoming { - color: $color-gray-05; - } - - .module-quote__reference-warning { - background-color: $color-white-04; - } - - .module-quote__reference-warning--incoming { - background-color: $color-signal-blue-050; - } - - .module-quote__reference-warning__text { - color: $color-gray-90; - } - - .module-quote__reference-warning__text--incoming { - color: $color-gray-05; - } - - .module-quote__reference-warning__icon { - @include color-svg('../images/broken-link.svg', $color-signal-blue); - } - - .module-quote__reference-warning__icon--incoming { - @include color-svg('../images/broken-link.svg', $color-gray-75); - } - - // When you're composing a new quote - .bottom-bar { - .module-quote__primary__author { - color: $color-gray-05; - } - - .module-quote__primary__type-label { - color: $color-gray-05; - } - - .module-quote__generic-file__text { - color: $color-gray-05; - } - - .module-quote__primary__text { - color: $color-gray-05; - a { - color: $color-gray-05; - } - } - } - - .module-embedded-contact__contact-name--incoming { - color: $color-gray-05; - } - - .module-embedded-contact__contact-method--incoming { - color: $color-gray-25; - } - - .module-spinner__circle--incoming { - background-color: $color-white-04; - } - .module-spinner__arc--incoming { - background-color: $color-gray-25; - } - .module-spinner__circle--small-incoming { - background-color: $color-white-04; - } - .module-spinner__arc--small-incoming { - background-color: $color-gray-25; - } - - .module-spinner__circle--outgoing { - background-color: $color-white-04; - } - .module-spinner__arc--outgoing { - background-color: $color-gray-05; - } - .module-spinner__circle--small-outgoing { - background-color: $color-white-04; - } - .module-spinner__arc--small-outgoing { - background-color: $color-gray-05; - } - } -} diff --git a/stylesheets/_session_constants.scss b/stylesheets/_session_constants.scss index 03b437fa0..2a0773970 100644 --- a/stylesheets/_session_constants.scss +++ b/stylesheets/_session_constants.scss @@ -74,8 +74,6 @@ $session-font-mono: 'SpaceMono'; // Brand $session-color-green: #00f782; $session-color-green-alt-1: #00f480; -$session-color-green-alt-2: #00fd73; -$session-color-green-alt-3: #00f782; // Shades $session-shade-1: #0c0c0c; diff --git a/stylesheets/_theme_dark.scss b/stylesheets/_theme_dark.scss index aa1d61477..fb661d9ec 100644 --- a/stylesheets/_theme_dark.scss +++ b/stylesheets/_theme_dark.scss @@ -1667,14 +1667,6 @@ body.dark-theme { color: $color-white; } - // _options - - // _progress - - // Not sure we need to change anything there - it's blue - - // _recorder - .capture-audio { .microphone { &:before { diff --git a/stylesheets/manifest.scss b/stylesheets/manifest.scss index 0a4d87bf0..900e6b993 100644 --- a/stylesheets/manifest.scss +++ b/stylesheets/manifest.scss @@ -19,7 +19,6 @@ @import 'conversation'; // Themes -@import 'ios'; @import 'theme_dark'; // /////////////////// // From 39463d2f93ea3bc3dfb2758c540e3cbbea6732e4 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 21 Aug 2020 12:54:29 +1000 Subject: [PATCH 080/274] enable back ability to switch theme from leftpane --- js/background.js | 2 +- js/views/app_view.js | 2 +- stylesheets/_session_left_pane.scss | 1 - ts/components/session/ActionsPanel.tsx | 14 +++++++++----- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/js/background.js b/js/background.js index bece78657..df56fab33 100644 --- a/js/background.js +++ b/js/background.js @@ -368,7 +368,7 @@ // These make key operations available to IPC handlers created in preload.js window.Events = { - getThemeSetting: () => 'dark', // storage.get('theme-setting', 'dark') + getThemeSetting: () => storage.get('theme-setting', 'dark'), setThemeSetting: value => { storage.put('theme-setting', value); onChangeTheme(); diff --git a/js/views/app_view.js b/js/views/app_view.js index 3bfbe282a..0e73fc33d 100644 --- a/js/views/app_view.js +++ b/js/views/app_view.js @@ -25,7 +25,7 @@ }, applyTheme() { const iOS = storage.get('userAgent') === 'OWI'; - const theme = 'dark'; // storage.get('theme-setting') || 'dark'; + const theme = storage.get('theme-setting') || 'dark'; this.$el .removeClass('light-theme') .removeClass('dark-theme') diff --git a/stylesheets/_session_left_pane.scss b/stylesheets/_session_left_pane.scss index 71fb51a5e..bf1f11383 100644 --- a/stylesheets/_session_left_pane.scss +++ b/stylesheets/_session_left_pane.scss @@ -166,7 +166,6 @@ $session-compose-margin: 20px; &:last-child { margin: auto auto 0px auto; /* Hide theme icon until light theme is ready */ - display: none; } &:first-child { diff --git a/ts/components/session/ActionsPanel.tsx b/ts/components/session/ActionsPanel.tsx index 84d653bfa..04a0b7b99 100644 --- a/ts/components/session/ActionsPanel.tsx +++ b/ts/components/session/ActionsPanel.tsx @@ -93,11 +93,15 @@ export class ActionsPanel extends React.Component { }) => { const handleClick = onSelect ? () => { - type === SectionType.Profile - ? /* tslint:disable-next-line:no-void-expression */ - this.editProfileHandle() - : /* tslint:disable-next-line:no-void-expression */ - onSelect(type); + /* tslint:disable:no-void-expression */ + if (type === SectionType.Profile) { + this.editProfileHandle() + } else if (type === SectionType.Moon) { + window.toggleTheme(); + } else { + onSelect(type); + } + /* tslint:enable:no-void-expression */ } : undefined; From 422c2610b658d476204c3c529a1d7701ffb21782 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 24 Aug 2020 12:06:03 +1000 Subject: [PATCH 081/274] add light theme for leftpane conversation list view --- stylesheets/_index.scss | 2 - stylesheets/_mentions.scss | 7 +- stylesheets/_session.scss | 30 +++- stylesheets/_session_constants.scss | 16 --- stylesheets/_session_left_pane.scss | 183 +++++++------------------ stylesheets/_session_theme.scss | 17 ++- stylesheets/manifest.scss | 1 + stylesheets/themes.scss | 108 +++++++++++++++ ts/components/session/ActionsPanel.tsx | 16 +-- 9 files changed, 207 insertions(+), 173 deletions(-) create mode 100644 stylesheets/themes.scss diff --git a/stylesheets/_index.scss b/stylesheets/_index.scss index 672319a6a..499e5d18f 100644 --- a/stylesheets/_index.scss +++ b/stylesheets/_index.scss @@ -79,8 +79,6 @@ } .gutter { - background-color: $color-dark-85; - ::-webkit-scrollbar-track { background: $color-dark-85; } diff --git a/stylesheets/_mentions.scss b/stylesheets/_mentions.scss index c32a70d55..aa3deaf77 100644 --- a/stylesheets/_mentions.scss +++ b/stylesheets/_mentions.scss @@ -1,3 +1,5 @@ +@import 'themes.scss'; + .leave-group-dialog { .content { max-width: 100% !important; @@ -188,8 +190,9 @@ } .at-symbol { - background-color: $session-color-green; - + @include themify($themes) { + background-color: themed('accent'); + } color: $color-black; text-align: center; diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index b5a16d233..e91a91b33 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -109,7 +109,9 @@ textarea { color: $session-color-white; &:not(.disabled):hover { - filter: brightness(90%); + @include themify($themes) { + background: themed('clickableHovered'); + } } &.green, @@ -125,14 +127,26 @@ textarea { } &.green { - background-color: $session-color-green; + @include themify($themes) { + background-color: themed('accent'); + } } &.white { - background-color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + } } &.primary { - background-color: $session-color-primary; + @include themify($themes) { + background-color: themed('backgroundPrimary'); + } + + .session-icon { + @include themify($themes) { + fill: themed('foregroundPrimary'); + } + } } &.secondary { background-color: $session-color-secondary; @@ -154,7 +168,9 @@ textarea { border: none; &.green { - @include transparent-background($session-color-green); + @include themify($themes) { + @include transparent-background(themed('accent')); + } } &.white { @include transparent-background($session-color-white); @@ -325,7 +341,9 @@ textarea { } .session-icon { - fill: $session-color-white; + @include themify($themes) { + fill: themed('textColor'); + } } $session-separator-element-border: 1px solid $session-shade-6; diff --git a/stylesheets/_session_constants.scss b/stylesheets/_session_constants.scss index 2a0773970..fc7d64d35 100644 --- a/stylesheets/_session_constants.scss +++ b/stylesheets/_session_constants.scss @@ -73,7 +73,6 @@ $session-font-mono: 'SpaceMono'; // Brand $session-color-green: #00f782; -$session-color-green-alt-1: #00f480; // Shades $session-shade-1: #0c0c0c; @@ -210,18 +209,3 @@ $session-fadein-duration: 0.1s; @mixin session-dark-background-hover { background-color: $session-shade-7; } -@mixin session-filter-color-green { - filter: brightness(0) saturate(100%) invert(67%) sepia(69%) saturate(2367%) - hue-rotate(101deg) brightness(107%) contrast(101%); -} - -$session-gradient-green: linear-gradient( - 270deg, - rgba($session-color-green-alt-1, 1), - rgba($session-color-green-alt-1, 0.6) -); -$session-gradient-black: linear-gradient( - 90deg, - rgba($session-shade-3, 1), - rgba($session-shade-4, 0.6) -); diff --git a/stylesheets/_session_left_pane.scss b/stylesheets/_session_left_pane.scss index bf1f11383..61733000c 100644 --- a/stylesheets/_session_left_pane.scss +++ b/stylesheets/_session_left_pane.scss @@ -1,65 +1,50 @@ $session-compose-margin: 20px; -.module-conversation-list-item { - transition: $session-transition-duration; - @at-root .light-theme #{&} { - @include session-dark-background-lighter; - &:hover { - @include session-dark-background-hover; - } - } - @at-root .dark-theme #{&} { - @include session-dark-background-lighter; - &:hover { - @include session-dark-background-hover; - } - } - - &--is-selected { - @at-root .light-theme #{&} { - @include session-dark-background-hover; - &:hover { - @include session-dark-background-hover; - } - } - @at-root .dark-theme #{&} { - @include session-dark-background-hover; - &:hover { - @include session-dark-background-hover; - } - } - .module-conversation__user__profile-number, - .module-conversation__user__profile-name, - .module-conversation-list-item__message__text { - @at-root .light-theme #{&} { - color: $session-color-black; - } - @at-root .dark-theme #{&} { - color: $session-color-white; - } - } - } -} .gutter { width: 380px !important; - background: none !important; padding-right: 5px !important; + transition: $session-transition-duration; + + @include themify($themes) { + background: themed('cellBackground'); + } } .module-conversation { &-list-item { + transition: $session-transition-duration; + + &:hover { + @include themify($themes) { + background: themed('clickableHovered'); + } + } + + &--is-selected { + @include themify($themes) { + background: themed('conversationItemSelected'); + } + + .module-conversation__user__profile-number, + .module-conversation__user__profile-name, + .module-conversation-list-item__message__text { + @include themify($themes) { + color: themed('textColor'); + } + } + } + &--has-unread { border-left: $session-element-border-green !important; + @include themify($themes) { + background: themed('conversationItemHasUnread'); + } } &__unread-count { - @at-root .light-theme #{&} { - color: $session-color-black !important; - background-color: $session-color-white !important; - } - @at-root .dark-theme #{&} { - color: $session-color-white !important; - background-color: $session-shade-10 !important; + @include themify($themes) { + color: themed('textColor'); + background-color: themed('clickableHovered'); } position: static !important; @@ -77,11 +62,8 @@ $session-compose-margin: 20px; &__message__text { color: $session-shade-17; &--has-unread { - @at-root .light-theme #{&} { - color: $session-shade-4 !important; - } - @at-root .dark-theme #{&} { - color: $session-color-white !important; + @include themify($themes) { + color: themed('textColor'); } } } @@ -100,11 +82,8 @@ $session-compose-margin: 20px; &__header__name--with-unread .module-conversation__user__profile-number, &__header__name--with-unread .module-conversation__user__profile-name { - @at-root .light-theme #{&} { - color: $session-color-black; - } - @at-root .dark-theme #{&} { - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); } } } @@ -115,38 +94,19 @@ $session-compose-margin: 20px; @include fontAccentBold(); font-size: 15px; - @at-root .light-theme #{&} { - color: $session-color-white; - } - @at-root .dark-theme #{&} { - color: $session-shade-17; + @include themify($themes) { + color: themed('textColorSubtle'); } } } } -.inbox { - @at-root .light-theme #{&} { - color: $session-color-black; - } - @at-root .dark-theme #{&} { - @include session-dark-background; - } -} - .module-left-pane { border-right: 1px solid rgba($session-color-white, 0.1) !important; width: $session-left-pane-width; position: relative; height: -webkit-fill-available; - @at-root .light-theme #{&} { - background: $session-color-white !important; - } - @at-root .dark-theme #{&} { - background: $session-shade-4 !important; - } - &-session { display: flex; height: 100vh; @@ -157,6 +117,9 @@ $session-compose-margin: 20px; width: $session-left-pane-sections-container-width; display: inline-flex; flex-direction: column; + @include themify($themes) { + border-right: themed('borderActionPanel'); + } .module-avatar, .session-icon-button { @@ -183,13 +146,6 @@ $session-compose-margin: 20px; height: $main-view-header-height; padding-right: 7px; - @at-root .light-theme #{&} { - background-color: $session-color-white; - } - @at-root .dark-theme #{&} { - background-color: $session-shade-3; - } - .session-button { margin-left: auto; @include fontAccentBold(); @@ -334,6 +290,11 @@ $session-compose-margin: 20px; display: flex; flex-direction: column; flex-grow: 1; + transition: $session-transition-duration; + + @include themify($themes) { + background: themed('conversationList'); + } .left-pane-contact-bottom-buttons .session-button { vertical-align: middle; @@ -363,15 +324,6 @@ $session-compose-margin: 20px; display: inline-flex; flex-shrink: 0; - @at-root .light-theme #{&} { - color: $session-color-black; - background: $session-color-white; - } - @at-root .dark-theme #{&} { - color: $session-color-white; - background: $session-shade-4; - } - .session-icon-button { margin: auto 10px; } @@ -384,19 +336,11 @@ $session-compose-margin: 20px; font-size: $session-font-sm; font-family: $session-font-default; text-overflow: ellipsis; + background: none; &:focus { outline: none !important; } - - @at-root .light-theme #{&} { - color: $session-color-black; - background: $session-color-white; - } - @at-root .dark-theme #{&} { - color: $session-color-white; - background: $session-shade-4; - } } } @@ -413,13 +357,7 @@ $session-compose-margin: 20px; display: flex; flex-direction: row; width: 100%; - - @at-root .light-theme #{&} { - background-color: $session-color-white; - } - @at-root .dark-theme #{&} { - background-color: $session-background; - } + background: none; .session-button.square-outline.square.green, .session-button.square-outline.square.white, @@ -487,19 +425,6 @@ $session-compose-margin: 20px; background-color: $session-shade-5; } - &--has-friend-request { - &:first-child { - border-top: none !important; - } - - border: 1px solid $session-shade-8 !important; - - .module-conversation__user__profile-number, - .module-conversation__user__profile-name { - font-size: 13px !important; - } - } - &__header__date, &__message { display: none; @@ -616,16 +541,6 @@ $session-compose-margin: 20px; } } -.friend-request-title { - font-weight: bold; - font-size: 13px; - padding: 11px; - border-right: 1px solid $session-shade-8 !important; - border-top: 1px solid $session-shade-8 !important; - border-left: 1px solid $session-shade-8 !important; - @include session-dark-background-lighter; -} - .panel-text-divider { width: 100%; text-align: center; diff --git a/stylesheets/_session_theme.scss b/stylesheets/_session_theme.scss index 260a26fd9..92219c89e 100644 --- a/stylesheets/_session_theme.scss +++ b/stylesheets/_session_theme.scss @@ -1,4 +1,5 @@ // Messages +@import 'themes.scss'; .discussion-container { @at-root .light-theme #{&} { @@ -15,12 +16,11 @@ .module-conversation-header { @at-root .light-theme #{&} { background-color: $session-color-white; - border-bottom: none; } @at-root .dark-theme #{&} { background-color: $session-shade-4; - border-bottom: none; } + border-bottom: none; } .module-message { @@ -39,6 +39,7 @@ &__container--incoming { @at-root .light-theme #{&} { @include session-color-subtle($session-color-white); + background-color: $session-shade-8; } @at-root .dark-theme #{&} { background-color: $session-shade-8; @@ -75,7 +76,9 @@ &-selected { .module-message { &__container { - background-image: $session-gradient-green; + @include themify($themes) { + background-image: themed('messageSelected'); + } box-shadow: $session-dark-shadow; } @@ -91,7 +94,9 @@ } .inbox { - background: linear-gradient(180deg, #171717 0%, $session-background 100%); + @include themify($themes) { + background: themed('inboxBackground'); + } } .conversation { @@ -113,7 +118,9 @@ h1 { margin: 0; &.active { - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + } } } diff --git a/stylesheets/manifest.scss b/stylesheets/manifest.scss index 900e6b993..19e96345a 100644 --- a/stylesheets/manifest.scss +++ b/stylesheets/manifest.scss @@ -1,4 +1,5 @@ // Global Settings, Variables, and Mixins +@import 'themes.scss'; @import 'session_constants'; @import 'variables'; @import 'mixins'; diff --git a/stylesheets/themes.scss b/stylesheets/themes.scss new file mode 100644 index 000000000..b72af57ab --- /dev/null +++ b/stylesheets/themes.scss @@ -0,0 +1,108 @@ +// copy pasted from the android Session app. Some might not be used and some might be missing +// also, some are sometimes applied with a opacity setting (most likely 0.6) +$themes: ( + light: ( + accent: #00e97b, + destructive: #ff453a, + unimportant: #d8d8d8, + unimportantButtonBackground: #0000, + border: #979797, + cellBackground: #fcfcfc, + searchBarPlaceholder: #8e8e93, + searchBarBackground: #8e8e931f, + separator: #36383c, + buttonBackground: #fcfcfc, + modalBackground: #fcfcfc, + modalBorder: #212121, + fakeChatBubbleBackground: #f5f5f5, + fakeChatBubbleText: #000, + navigationBarBackground: #fcfcfc, + newConversationButtonShadow: hsl(151, 89%, 26%), + // text + textColor: #000, + textColorSubtle: #a0a0a0, + textColorOpposite: #fff, + // inbox + inboxBackground: #fff, + // buttons + backgroundPrimary: #272726, + foregroundPrimary: #fff, + // conversation view + messageSelected: + linear-gradient(270deg, rgba(#00f480, 1), rgba(#00f480, 0.6)), + composeViewBackground: #fcfcfc, + composeViewTextFieldBackground: #ededed, + receivedMessageBackground: #f5f5f5, + sentMessageBackground: #00e97b, + // left pane + conversationList: #fff, + conversationItemHasUnread: #fcfcfc, + conversationItemSelected: #f0f0f0, + clickableHovered: #dfdfdf, + borderActionPanel: 1px solid #f1f1f1, + ), + dark: ( + accent: #00f782, + destructive: #ff453a, + unimportant: #d8d8d8, + unimportantButtonBackground: #323232, + border: #979797, + cellBackground: #1b1b1b, + searchBarPlaceholder: #8e8e93, + searchBarBackground: #8e8e931f, + separator: #36383c, + buttonBackground: #1b1b1b, + modalBackground: #101011, + modalBorder: #212121, + fakeChatBubbleBackground: #3f4146, + fakeChatBubbleText: #000, + navigationBarBackground: #161616, + newConversationButtonShadow: #077c44, + // text + textColor: #fff, + textColorSubtle: #a0a0a0, + textColorOpposite: #000, + // inbox + inboxBackground: linear-gradient(180deg, #171717 0%, #121212 100%), + // buttons + backgroundPrimary: #474646, + foregroundPrimary: #fff, + // conversation view + messageSelected: + linear-gradient(270deg, rgba(#00f480, 1), rgba(#00f480, 0.6)), + composeViewBackground: #1b1b1b, + composeViewTextFieldBackground: #141414, + receivedMessageBackground: #222325, + sentMessageBackground: #3f4146, + // left pane + conversationList: #1b1b1b, + conversationItemHasUnread: #2c2c2c, + conversationItemSelected: #404040, + clickableHovered: #414347, + borderActionPanel: none, + ), +); + +@mixin themify($themes: $themes) { + @each $theme, $map in $themes { + .#{$theme}-theme & { + $theme-map: () !global; + @each $key, $submap in $map { + $value: map-get(map-get($themes, $theme), '#{$key}'); + $theme-map: map-merge( + $theme-map, + ( + $key: $value, + ) + ) !global; + } + + @content; + $theme-map: null !global; + } + } +} + +@function themed($key) { + @return map-get($theme-map, $key); +} diff --git a/ts/components/session/ActionsPanel.tsx b/ts/components/session/ActionsPanel.tsx index 04a0b7b99..8b603dabe 100644 --- a/ts/components/session/ActionsPanel.tsx +++ b/ts/components/session/ActionsPanel.tsx @@ -94,14 +94,14 @@ export class ActionsPanel extends React.Component { const handleClick = onSelect ? () => { /* tslint:disable:no-void-expression */ - if (type === SectionType.Profile) { - this.editProfileHandle() - } else if (type === SectionType.Moon) { - window.toggleTheme(); - } else { - onSelect(type); - } - /* tslint:enable:no-void-expression */ + if (type === SectionType.Profile) { + this.editProfileHandle(); + } else if (type === SectionType.Moon) { + window.toggleTheme(); + } else { + onSelect(type); + } + /* tslint:enable:no-void-expression */ } : undefined; From 55c4963772252a8cb324a011f7541599adeaf7da Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 24 Aug 2020 14:10:06 +1000 Subject: [PATCH 082/274] remove unused updateInboxSectionUnread() --- js/views/inbox_view.js | 19 ------------------- stylesheets/_index.scss | 17 ----------------- 2 files changed, 36 deletions(-) diff --git a/js/views/inbox_view.js b/js/views/inbox_view.js index 9d702b620..331873937 100644 --- a/js/views/inbox_view.js +++ b/js/views/inbox_view.js @@ -174,7 +174,6 @@ }); // FIXME: Fix this for new react views - this.updateInboxSectionUnread(); this.setupLeftPane(); }, render_attributes: { @@ -429,24 +428,6 @@ } this.$('.conversation:first .recorder').trigger('close'); }, - updateInboxSectionUnread() { - // FIXME: Fix this for new react views - // const $section = this.$('.section-conversations-unread-counter'); - // const models = - // (this.inboxListView.collection && - // this.inboxListView.collection.models) || - // []; - // const unreadCount = models.reduce( - // (count, m) => count + Math.max(0, m.get('unreadCount')), - // 0 - // ); - // $section.text(unreadCount); - // if (unreadCount > 0) { - // $section.show(); - // } else { - // $section.hide(); - // } - }, onClick(e) { this.closeRecording(e); }, diff --git a/stylesheets/_index.scss b/stylesheets/_index.scss index 499e5d18f..55ecdb3e8 100644 --- a/stylesheets/_index.scss +++ b/stylesheets/_index.scss @@ -186,23 +186,6 @@ h4.section-toggle, h4 { flex: 1; } - - .section-conversations-unread-counter { - color: #ffffff; - background-color: #2090ea; - text-align: center; - padding-top: 1px; - padding-left: 3px; - padding-right: 3px; - font-weight: 300; - font-size: 11px; - letter-spacing: 0.25px; - height: 16px; - min-width: 16px; - line-height: 16px; - border-radius: 8px; - box-shadow: 0px 0px 0px 1px #1a1c20; - } } .network-status-container { From f3a51cf2a69eefc9080909ab902c75f3e349679e Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 24 Aug 2020 14:10:40 +1000 Subject: [PATCH 083/274] add custon light/black scrollbar style --- stylesheets/_emoji.scss | 11 --------- stylesheets/_global.scss | 30 +++++++++---------------- stylesheets/_index.scss | 8 ------- stylesheets/_session.scss | 2 +- stylesheets/_session_left_pane.scss | 12 ++++++---- stylesheets/_session_theme.scss | 12 +++++++--- stylesheets/_theme_dark.scss | 35 ----------------------------- stylesheets/themes.scss | 12 ++++++++-- 8 files changed, 39 insertions(+), 83 deletions(-) diff --git a/stylesheets/_emoji.scss b/stylesheets/_emoji.scss index 08397e020..65877d987 100644 --- a/stylesheets/_emoji.scss +++ b/stylesheets/_emoji.scss @@ -130,15 +130,4 @@ button.emoji { .ep-slide { background-color: $blue; } - .ep ::-webkit-scrollbar { - // matches what is set in _global.scss; needs !important to override emoji panel CSS - width: 9px !important; - } - .ep ::-webkit-scrollbar-thumb { - background: $color-light-35; - - &:hover { - background: $color-light-45; - } - } } diff --git a/stylesheets/_global.scss b/stylesheets/_global.scss index 89c8983bb..34b505156 100644 --- a/stylesheets/_global.scss +++ b/stylesheets/_global.scss @@ -16,26 +16,26 @@ body { color: $color-light-90; } +// scrollbars ::-webkit-scrollbar { width: 9px; height: 9px; } -::-webkit-scrollbar-track { - background: $color-white; -} - ::-webkit-scrollbar-thumb { - background: $color-light-35; - border: 2px solid $color-white; + @include themify($themes) { + background: themed('scrollBarThumb'); + border: solid 2px themed('textColorOpposite'); - &:hover { - background: $color-light-45; + &:hover { + background: $color-light-45; + } } } - -::-webkit-scrollbar-corner { - background: $color-white; +::-webkit-scrollbar-track { + @include themify($themes) { + background: themed('scrollBarTrack'); + } } audio { @@ -644,14 +644,6 @@ $loading-height: 16px; padding: 0; background: inherit; - ::-webkit-scrollbar-track { - background: $color-dark-85; - } - - ::-webkit-scrollbar-thumb { - border: 2px solid $color-dark-85; - } - .step-body { width: 80%; min-width: 100px; diff --git a/stylesheets/_index.scss b/stylesheets/_index.scss index 55ecdb3e8..b046b2ef5 100644 --- a/stylesheets/_index.scss +++ b/stylesheets/_index.scss @@ -79,14 +79,6 @@ } .gutter { - ::-webkit-scrollbar-track { - background: $color-dark-85; - } - - ::-webkit-scrollbar-thumb { - border: 2px solid $color-dark-85; - } - display: flex; flex-direction: column; float: left; diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index e91a91b33..dd886bf95 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -169,7 +169,7 @@ textarea { &.green { @include themify($themes) { - @include transparent-background(themed('accent')); + @include transparent-background(themed('buttonGreen')); } } &.white { diff --git a/stylesheets/_session_left_pane.scss b/stylesheets/_session_left_pane.scss index 61733000c..9229e3e7a 100644 --- a/stylesheets/_session_left_pane.scss +++ b/stylesheets/_session_left_pane.scss @@ -145,6 +145,7 @@ $session-compose-margin: 20px; align-items: center; height: $main-view-header-height; padding-right: 7px; + transition: $session-transition-duration; .session-button { margin-left: auto; @@ -189,8 +190,9 @@ $session-compose-margin: 20px; } &-overlay { - background: linear-gradient(180deg, #171717 0%, $session-background 100%); - box-shadow: 0 0 100px 0 rgba(0, 0, 0, 0.5); + @include themify($themes) { + background: themed('leftpaneOverlayBackground'); + } display: flex; flex-direction: column; flex-grow: 1; @@ -217,8 +219,10 @@ $session-compose-margin: 20px; .green-border { position: absolute; - color: $session-color-green; - background-color: $session-color-green; + @include themify($themes) { + color: themed('accent'); + background-color: themed('accent'); + } height: 5px; left: -10px; right: -10px; diff --git a/stylesheets/_session_theme.scss b/stylesheets/_session_theme.scss index 92219c89e..5d639fbbf 100644 --- a/stylesheets/_session_theme.scss +++ b/stylesheets/_session_theme.scss @@ -126,21 +126,27 @@ h1 { h2 { @include session-h-title; - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + } font-size: 22px; text-align: center; } h3 { @include session-h-title; - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + } font-size: 18px; padding-top: 22px; } h4 { @include session-h-title; - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + } font-size: 17px; text-align: center; } diff --git a/stylesheets/_theme_dark.scss b/stylesheets/_theme_dark.scss index fb661d9ec..83b7e4f42 100644 --- a/stylesheets/_theme_dark.scss +++ b/stylesheets/_theme_dark.scss @@ -193,35 +193,8 @@ body.dark-theme { } } - .emoji-panel-container { - .ep ::-webkit-scrollbar-thumb { - background: $color-dark-55; - - &:hover { - background: $color-dark-30; - } - } - } - // _global - ::-webkit-scrollbar-track { - background: $color-black; - } - - ::-webkit-scrollbar-thumb { - background: $color-dark-55; - border: 2px solid $color-black; - - &:hover { - background: $color-dark-30; - } - } - - ::-webkit-scrollbar-corner { - background: $color-black; - } - .dark-overlay { background-color: $color-gray-95; } @@ -427,14 +400,6 @@ body.dark-theme { .gutter { background-color: $color-dark-85; - - ::-webkit-scrollbar-track { - background: $color-dark-85; - } - - ::-webkit-scrollbar-thumb { - border: 2px solid $color-dark-85; - } } .network-status-container { .network-status { diff --git a/stylesheets/themes.scss b/stylesheets/themes.scss index b72af57ab..180dce119 100644 --- a/stylesheets/themes.scss +++ b/stylesheets/themes.scss @@ -16,7 +16,6 @@ $themes: ( modalBorder: #212121, fakeChatBubbleBackground: #f5f5f5, fakeChatBubbleText: #000, - navigationBarBackground: #fcfcfc, newConversationButtonShadow: hsl(151, 89%, 26%), // text textColor: #000, @@ -27,6 +26,7 @@ $themes: ( // buttons backgroundPrimary: #272726, foregroundPrimary: #fff, + buttonGreen: #272726, // conversation view messageSelected: linear-gradient(270deg, rgba(#00f480, 1), rgba(#00f480, 0.6)), @@ -40,6 +40,10 @@ $themes: ( conversationItemSelected: #f0f0f0, clickableHovered: #dfdfdf, borderActionPanel: 1px solid #f1f1f1, + leftpaneOverlayBackground: #fff, + // scrollbars + scrollBarTrack: #fcfcfc, + scrollBarThumb: #474646, ), dark: ( accent: #00f782, @@ -56,7 +60,6 @@ $themes: ( modalBorder: #212121, fakeChatBubbleBackground: #3f4146, fakeChatBubbleText: #000, - navigationBarBackground: #161616, newConversationButtonShadow: #077c44, // text textColor: #fff, @@ -67,6 +70,7 @@ $themes: ( // buttons backgroundPrimary: #474646, foregroundPrimary: #fff, + buttonGreen: #00f782, // conversation view messageSelected: linear-gradient(270deg, rgba(#00f480, 1), rgba(#00f480, 0.6)), @@ -80,6 +84,10 @@ $themes: ( conversationItemSelected: #404040, clickableHovered: #414347, borderActionPanel: none, + leftpaneOverlayBackground: linear-gradient(180deg, #171717 0%, #121212 100%), + // scrollbars + scrollBarTrack: #1b1b1b, + scrollBarThumb: #474646, ), ); From 5bede47608d95cdf67feee2e714deba09f8fa8ed Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 24 Aug 2020 14:26:14 +1000 Subject: [PATCH 084/274] make svg check create Closed group color dynamic --- stylesheets/_session.scss | 9 ++++++++- ts/components/session/SessionMemberListItem.tsx | 1 - 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index dd886bf95..ffedd8a70 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -1645,7 +1645,9 @@ input { } &.selected { - background-color: $session-shade-4; + @include themify($themes) { + background-color: themed('conversationItemSelected'); + } } &__checkmark { @@ -1654,6 +1656,11 @@ input { &.selected { opacity: 1; + svg { + @include themify($themes) { + fill: themed('accent') !important; + } + } } } diff --git a/ts/components/session/SessionMemberListItem.tsx b/ts/components/session/SessionMemberListItem.tsx index 8e5cb965b..1d76b1cb9 100644 --- a/ts/components/session/SessionMemberListItem.tsx +++ b/ts/components/session/SessionMemberListItem.tsx @@ -79,7 +79,6 @@ export class SessionMemberListItem extends React.Component {
From ea808bf41bf5a0c90467d8ae3f1611c333ac0fb2 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 24 Aug 2020 14:41:37 +1000 Subject: [PATCH 085/274] themify contact section on leftPane --- stylesheets/_session_left_pane.scss | 20 +++++++------------- stylesheets/_session_signin.scss | 4 +++- stylesheets/themes.scss | 6 ++++++ 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/stylesheets/_session_left_pane.scss b/stylesheets/_session_left_pane.scss index 9229e3e7a..4829a6330 100644 --- a/stylesheets/_session_left_pane.scss +++ b/stylesheets/_session_left_pane.scss @@ -423,12 +423,6 @@ $session-compose-margin: 20px; flex: 1; .module-conversation-list-item { - background-color: $session-shade-4; - - &--is-selected { - background-color: $session-shade-5; - } - &__header__date, &__message { display: none; @@ -448,10 +442,6 @@ $session-compose-margin: 20px; } } - &-content { - @include session-dark-background-lighter; - } - &-bottom-buttons { @include bottom-buttons(); @@ -552,7 +542,9 @@ $session-compose-margin: 20px; margin: 50px 0 50px; .panel-text-divider-line { - border-bottom: 1px solid $session-color-dark-grey; + @include themify($themes) { + border-bottom: 1px solid themed('pillDividerColor'); + } line-height: 0.1em; flex-grow: 1; height: 1px; @@ -562,8 +554,10 @@ $session-compose-margin: 20px; span { padding: 5px 10px; border-radius: 50px; - color: $session-color-light-grey; - border: 1px solid $session-color-dark-grey; + @include themify($themes) { + color: themed('pillDividerTextColor'); + border: 1px solid themed('pillDividerColor'); + } font-family: $session-font-default; font-size: $session-font-sm; } diff --git a/stylesheets/_session_signin.scss b/stylesheets/_session_signin.scss index 03ccccc3f..115ce2577 100644 --- a/stylesheets/_session_signin.scss +++ b/stylesheets/_session_signin.scss @@ -269,7 +269,9 @@ outline: 0; border: none; background: transparent; - color: #fff; + @include themify($themes) { + color: themed('textColor'); + } font-size: 15px; line-height: 18px; text-align: center; diff --git a/stylesheets/themes.scss b/stylesheets/themes.scss index 180dce119..41a5f4033 100644 --- a/stylesheets/themes.scss +++ b/stylesheets/themes.scss @@ -44,6 +44,9 @@ $themes: ( // scrollbars scrollBarTrack: #fcfcfc, scrollBarThumb: #474646, + // pill divider: + pillDividerColor: #0000001a, + pillDividerTextColor: #555, ), dark: ( accent: #00f782, @@ -88,6 +91,9 @@ $themes: ( // scrollbars scrollBarTrack: #1b1b1b, scrollBarThumb: #474646, + // pill divider: + pillDividerColor: #353535, + pillDividerTextColor: #a0a0a0, ), ); From 269f799d6b58a6ad70918ff325e57f86bf2fa012 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 24 Aug 2020 14:57:55 +1000 Subject: [PATCH 086/274] themify userDetailsDialog --- stylesheets/_global.scss | 3 ++- stylesheets/_index.scss | 1 + stylesheets/_session.scss | 13 ++++++++++--- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/stylesheets/_global.scss b/stylesheets/_global.scss index 34b505156..cc760b179 100644 --- a/stylesheets/_global.scss +++ b/stylesheets/_global.scss @@ -1,3 +1,5 @@ +@import 'themes.scss'; + * { box-sizing: border-box; } @@ -13,7 +15,6 @@ body { margin: 0; font-family: $roboto; font-size: 14px; - color: $color-light-90; } // scrollbars diff --git a/stylesheets/_index.scss b/stylesheets/_index.scss index b046b2ef5..eaee3cdf2 100644 --- a/stylesheets/_index.scss +++ b/stylesheets/_index.scss @@ -50,6 +50,7 @@ .avatar-center-inner { display: flex; + padding-top: 30px; } .upload-btn-background { diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index ffedd8a70..1822faa56 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -575,7 +575,10 @@ label { box-sizing: border-box; max-height: 70vh; max-width: 70vw; - background-color: $session-shade-4; + @include themify($themes) { + background-color: themed('modalBackground'); + color: themed('textColor'); + } border: 1px solid $session-shade-8; overflow: hidden; display: flex; @@ -935,7 +938,9 @@ label { padding: 0px $session-margin-lg; font-family: $session-font-default; font-weight: 100; - color: rgba($session-color-white, 0.8); + @include themify($themes) { + color: themed('textColor'); + } font-size: $session-font-md; padding: 0px $session-margin-sm; } @@ -956,7 +961,9 @@ label { border-radius: 5px; text-align: center; font-size: $session-font-md; - background-color: $session-shade-5 !important; + @include themify($themes) { + background: themed('searchBarBackground'); + } } &-uneditable { From 5cdb25ca0073a1eead190c77108076ebbff05d35 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 24 Aug 2020 19:11:26 +1000 Subject: [PATCH 087/274] themify widget selection, compose and slider --- stylesheets/_session-slider.scss | 4 +- stylesheets/_session.scss | 58 +++++++++++++------ stylesheets/_session_left_pane.scss | 14 +++-- stylesheets/themes.scss | 8 +-- .../settings/SessionSettingListItem.tsx | 2 +- 5 files changed, 59 insertions(+), 27 deletions(-) diff --git a/stylesheets/_session-slider.scss b/stylesheets/_session-slider.scss index 85aa3f3f9..74241c942 100644 --- a/stylesheets/_session-slider.scss +++ b/stylesheets/_session-slider.scss @@ -34,7 +34,9 @@ .rc-slider-rail { position: absolute; width: 100%; - background-color: $session-shade-6; + @include themify($themes) { + background: themed('inputBackground'); + } height: 8px; border-radius: 6px; margin: 0px 0px 0px -1px; diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index 1822faa56..388f095a0 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -578,8 +578,8 @@ label { @include themify($themes) { background-color: themed('modalBackground'); color: themed('textColor'); + border: 1px solid themed('modalBorder'); } - border: 1px solid $session-shade-8; overflow: hidden; display: flex; flex-direction: column; @@ -962,7 +962,7 @@ label { text-align: center; font-size: $session-font-md; @include themify($themes) { - background: themed('searchBarBackground'); + background: themed('inputBackground'); } } @@ -1100,9 +1100,10 @@ label { flex-direction: row; justify-content: center; align-items: center; - background-color: $session-shade-6; height: $main-view-header-height; - + @include themify($themes) { + background: themed('cellBackground'); + } &-title { line-height: $main-view-header-height; font-weight: bold; @@ -1119,13 +1120,14 @@ label { &-item { font-size: $session-font-md; - color: $session-color-white; - background-color: $session-shade-1; - padding: $session-margin-lg; margin-bottom: 20px; border-bottom: 1px solid $session-shade-5; + @include themify($themes) { + background: themed('cellBackground'); + color: themed('textColor'); + } &.inline { display: flex; align-items: center; @@ -1147,12 +1149,21 @@ label { font-size: $session-font-sm; font-weight: 100; max-width: 700px; - @include session-color-subtle($session-color-white); + @include themify($themes) { + @include session-color-subtle(themed('textColor')); + } } &__content { label { - @include session-color-subtle($session-color-white); + @include themify($themes) { + @include session-color-subtle(themed('textColor')); + } + } + } + &__selection { + .session-toggle { + transition: $session-transition-duration; } } } @@ -1170,7 +1181,7 @@ label { justify-content: space-between; padding: $session-margin-sm $session-margin-md; - background-color: $session-shade-5; + background: none; font-size: $session-font-xs; span { @@ -1279,7 +1290,9 @@ label { } textarea.send-message { - background-color: $session-shade-4; + @include themify($themes) { + background: themed('composeViewBackground'); + } border: none; margin: 0px; padding: 0px $session-margin-lg; @@ -1293,7 +1306,9 @@ label { .bottom-bar form { &.send { - background-color: $session-shade-4; + @include themify($themes) { + background: themed('composeViewBackground'); + } } &.active textarea { @@ -1302,7 +1317,9 @@ label { } .dark-theme .bottom-bar .send-message[disabled='disabled'] { - background: $session-shade-4 !important; + @include themify($themes) { + background: themed('composeViewBackground'); + } } .session-radio-group fieldset { @@ -1338,17 +1355,24 @@ label { vertical-align: -3px; border: 2px solid rgba($session-color-white, 0.6); padding: 0.2em; - background-color: transparent; + @include themify($themes) { + background: none; + border-color: themed('accent'); + } background-clip: content-box; + transition: $session-transition-duration; } input:hover + label:before { - border-color: $session-color-white; + @include themify($themes) { + background: themed('accent'); + } } input:checked + label:before { - background-color: $session-color-white; - border-color: $session-color-white; + @include themify($themes) { + background: themed('accent'); + } } } diff --git a/stylesheets/_session_left_pane.scss b/stylesheets/_session_left_pane.scss index 4829a6330..37d2ed0a2 100644 --- a/stylesheets/_session_left_pane.scss +++ b/stylesheets/_session_left_pane.scss @@ -341,7 +341,9 @@ $session-compose-margin: 20px; font-family: $session-font-default; text-overflow: ellipsis; background: none; - + @include themify($themes) { + color: themed('textColor'); + } &:focus { outline: none !important; } @@ -464,7 +466,7 @@ $session-compose-margin: 20px; } &-category-list-item { - @include session-dark-background; + background: none; display: flex; flex-direction: row; justify-content: space-between; @@ -481,11 +483,15 @@ $session-compose-margin: 20px; } &.active { - background-color: $session-shade-5; + @include themify($themes) { + background: themed('conversationItemSelected'); + } } &:hover { - background-color: $session-shade-6; + @include themify($themes) { + background: themed('clickableHovered'); + } } &__buttons { diff --git a/stylesheets/themes.scss b/stylesheets/themes.scss index 41a5f4033..2ea44c84d 100644 --- a/stylesheets/themes.scss +++ b/stylesheets/themes.scss @@ -8,8 +8,6 @@ $themes: ( unimportantButtonBackground: #0000, border: #979797, cellBackground: #fcfcfc, - searchBarPlaceholder: #8e8e93, - searchBarBackground: #8e8e931f, separator: #36383c, buttonBackground: #fcfcfc, modalBackground: #fcfcfc, @@ -17,6 +15,8 @@ $themes: ( fakeChatBubbleBackground: #f5f5f5, fakeChatBubbleText: #000, newConversationButtonShadow: hsl(151, 89%, 26%), + // input + inputBackground: #8e8e931f, // text textColor: #000, textColorSubtle: #a0a0a0, @@ -55,8 +55,6 @@ $themes: ( unimportantButtonBackground: #323232, border: #979797, cellBackground: #1b1b1b, - searchBarPlaceholder: #8e8e93, - searchBarBackground: #8e8e931f, separator: #36383c, buttonBackground: #1b1b1b, modalBackground: #101011, @@ -64,6 +62,8 @@ $themes: ( fakeChatBubbleBackground: #3f4146, fakeChatBubbleText: #000, newConversationButtonShadow: #077c44, + // input + inputBackground: #8e8e931f, // text textColor: #fff, textColorSubtle: #a0a0a0, diff --git a/ts/components/session/settings/SessionSettingListItem.tsx b/ts/components/session/settings/SessionSettingListItem.tsx index fd7ea27d9..13fd3179a 100644 --- a/ts/components/session/settings/SessionSettingListItem.tsx +++ b/ts/components/session/settings/SessionSettingListItem.tsx @@ -61,7 +61,7 @@ export class SessionSettingListItem extends React.Component {
{type === SessionSettingType.Toggle && ( -
+
Date: Tue, 25 Aug 2020 11:25:41 +1000 Subject: [PATCH 088/274] cleanup scss and themify message view --- stylesheets/_conversation.scss | 10 +- stylesheets/_modules.scss | 135 +-------- stylesheets/_session.scss | 22 +- stylesheets/_session_left_pane.scss | 1 - stylesheets/_session_theme.scss | 85 +++--- stylesheets/_theme_dark.scss | 286 -------------------- stylesheets/themes.scss | 18 +- ts/components/conversation/Message.tsx | 5 +- ts/components/conversation/Quote.tsx | 3 - ts/components/conversation/TypingBubble.tsx | 3 +- 10 files changed, 90 insertions(+), 478 deletions(-) diff --git a/stylesheets/_conversation.scss b/stylesheets/_conversation.scss index 1aaf0643f..f22f092e7 100644 --- a/stylesheets/_conversation.scss +++ b/stylesheets/_conversation.scss @@ -32,6 +32,11 @@ } .main.panel { + @include themify($themes) { + border-top: themed('borderActionPanel'); + border-left: themed('borderActionPanel'); + } + .discussion-container { flex-grow: 1; position: relative; @@ -373,8 +378,8 @@ .bottom-bar { box-sizing: content-box; $button-width: 36px; - - form.active { + @include themify($themes) { + border-top: themed('borderActionPanel'); } form.send { @@ -454,7 +459,6 @@ max-height: 100px; padding: 10px; border-radius: 4px; - background-color: $color-loki-light-gray; margin-top: 3px; margin-bottom: 6px; color: $color-light-90; diff --git a/stylesheets/_modules.scss b/stylesheets/_modules.scss index 98a9e62f4..b8f9c27cb 100644 --- a/stylesheets/_modules.scss +++ b/stylesheets/_modules.scss @@ -206,40 +206,6 @@ background-color: $color-conversation-grey; } -.module-message__container--incoming-red { - background-color: $color-conversation-red; -} -.module-message__container--incoming-deep_orange { - background-color: $color-conversation-deep_orange; -} -.module-message__container--incoming-brown { - background-color: $color-conversation-brown; -} -.module-message__container--incoming-pink { - background-color: $color-conversation-pink; -} -.module-message__container--incoming-purple { - background-color: $color-conversation-purple; -} -.module-message__container--incoming-indigo { - background-color: $color-conversation-indigo; -} -.module-message__container--incoming-blue { - background-color: $color-conversation-blue; -} -.module-message__container--incoming-teal { - background-color: $color-conversation-teal; -} -.module-message__container--incoming-green { - background-color: $color-conversation-green; -} -.module-message__container--incoming-light_green { - background-color: $color-conversation-light_green; -} -.module-message__container--incoming-blue_grey { - background-color: $color-conversation-blue_grey; -} - .module-message__attachment-container { // Entirely to ensure that images are centered if they aren't full width of bubble text-align: center; @@ -503,18 +469,6 @@ } } -.module-message__text--incoming { - color: $color-white; - a { - text-decoration: underline; - color: $color-white; - } -} - -.module-message__text--error { - font-style: italic; -} - .module-message__metadata { display: flex; flex-direction: row; @@ -759,88 +713,11 @@ border-left-color: $color-conversation-grey; background-color: $color-conversation-grey-tint; } -.module-quote--outgoing-red { - border-left-color: $color-conversation-red; - background-color: $color-conversation-red-tint; -} -.module-quote--outgoing-deep_orange { - border-left-color: $color-conversation-deep_orange; - background-color: $color-conversation-deep_orange-tint; -} -.module-quote--outgoing-brown { - border-left-color: $color-conversation-brown; - background-color: $color-conversation-brown-tint; -} -.module-quote--outgoing-pink { - border-left-color: $color-conversation-pink; - background-color: $color-conversation-pink-tint; -} -.module-quote--outgoing-purple { - border-left-color: $color-conversation-purple; - background-color: $color-conversation-purple-tint; -} -.module-quote--outgoing-indigo { - border-left-color: $color-conversation-indigo; - background-color: $color-conversation-indigo-tint; -} -.module-quote--outgoing-blue { - border-left-color: $color-conversation-blue; - background-color: $color-conversation-blue-tint; -} -.module-quote--outgoing-teal { - border-left-color: $color-conversation-teal; - background-color: $color-conversation-teal-tint; -} -.module-quote--outgoing-green { - border-left-color: $color-conversation-green; - background-color: $color-conversation-green-tint; -} -.module-quote--outgoing-light_green { - border-left-color: $color-conversation-light_green; - background-color: $color-conversation-light_green-tint; -} -.module-quote--outgoing-blue_grey { - border-left-color: $color-conversation-blue_grey; - background-color: $color-conversation-blue_grey-tint; -} .module-quote--incoming { border-left-color: $color-white; background-color: $color-conversation-grey-tint; } -.module-quote--incoming-red { - background-color: $color-conversation-red-tint; -} -.module-quote--incoming-deep_orange { - background-color: $color-conversation-deep_orange-tint; -} -.module-quote--incoming-brown { - background-color: $color-conversation-brown-tint; -} -.module-quote--incoming-pink { - background-color: $color-conversation-pink-tint; -} -.module-quote--incoming-purple { - background-color: $color-conversation-purple-tint; -} -.module-quote--incoming-indigo { - background-color: $color-conversation-indigo-tint; -} -.module-quote--incoming-blue { - background-color: $color-conversation-blue-tint; -} -.module-quote--incoming-teal { - background-color: $color-conversation-teal-tint; -} -.module-quote--incoming-green { - background-color: $color-conversation-green-tint; -} -.module-quote--incoming-light_green { - background-color: $color-conversation-light_green-tint; -} -.module-quote--incoming-blue_grey { - background-color: $color-conversation-blue_grey-tint; -} .module-quote__primary { flex-grow: 1; @@ -1239,7 +1116,10 @@ .module-group-notification__change, .module-timer-notification__message { - background-color: #212121; + @include themify($themes) { + background: themed('fakeChatBubbleBackground'); + color: themed('textColor'); + } width: 90%; max-width: 700px; margin: 10px auto; @@ -1447,11 +1327,6 @@ display: flex; flex-direction: row; align-items: center; - - color: $color-gray-90; - - background-color: $color-white; - border-bottom: 1px solid $color-black-02; } .module-conversation-header__back-icon { @@ -3271,8 +3146,6 @@ // Module: Left Pane .module-left-pane { - border-right: 1px solid $color-dark-90; - display: inline-flex; flex-direction: column; width: 380px; diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index 388f095a0..0bc9ee066 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -775,9 +775,10 @@ label { height: 25px; padding: $session-margin-md $session-margin-sm; - background-color: $session-shade-4; - - color: $session-color-white; + @include themify($themes) { + background: themed('contextMenuBackground'); + color: themed('textColor'); + } font-family: $session-font-accent; font-size: $session-font-sm; line-height: $session-icon-size-sm; @@ -785,7 +786,9 @@ label { &--active, &--selected { - background-color: $session-shade-7 !important; + @include themify($themes) { + background: themed('clickableHovered'); + } } &:active, &:visited, @@ -1292,6 +1295,7 @@ label { textarea.send-message { @include themify($themes) { background: themed('composeViewBackground'); + color: themed('textColor'); } border: none; margin: 0px; @@ -1299,8 +1303,6 @@ label { font-size: $session-font-md; line-height: 1.3em; align-self: center; - - @include session-color-subtle($session-color-white); } } @@ -1499,10 +1501,14 @@ input { &-item { font-family: $session-font-default; padding: $session-margin-sm $session-margin-md; - background-color: $session-shade-5; + @include themify($themes) { + background-color: themed('cellBackground'); + } &:hover:not(.member-selected) { - background-color: $session-shade-7; + @include themify($themes) { + background-color: themed('clickableHovered'); + } } } diff --git a/stylesheets/_session_left_pane.scss b/stylesheets/_session_left_pane.scss index 37d2ed0a2..535f2731f 100644 --- a/stylesheets/_session_left_pane.scss +++ b/stylesheets/_session_left_pane.scss @@ -102,7 +102,6 @@ $session-compose-margin: 20px; } .module-left-pane { - border-right: 1px solid rgba($session-color-white, 0.1) !important; width: $session-left-pane-width; position: relative; height: -webkit-fill-available; diff --git a/stylesheets/_session_theme.scss b/stylesheets/_session_theme.scss index 5d639fbbf..b1a359096 100644 --- a/stylesheets/_session_theme.scss +++ b/stylesheets/_session_theme.scss @@ -2,11 +2,8 @@ @import 'themes.scss'; .discussion-container { - @at-root .light-theme #{&} { - background-color: $session-color-white; - } - @at-root .dark-theme #{&} { - background-color: $session-shade-2; + @include themify($themes) { + background: none; } } @@ -14,50 +11,74 @@ background: none !important; } .module-conversation-header { - @at-root .light-theme #{&} { - background-color: $session-color-white; + @include themify($themes) { + background: themed('cellBackground'); } - @at-root .dark-theme #{&} { - background-color: $session-shade-4; - } - border-bottom: none; } .module-message { - &__author, - &__metadata__badge, - &__metadata__date--incoming, - &__metadata__date--outgoing { - @at-root .light-theme #{&} { - @include session-color-subtle($session-color-black); - } - @at-root .dark-theme #{&} { - @include session-color-subtle($session-color-white); - } + &__text-error { + font-style: italic; } &__container--incoming { - @at-root .light-theme #{&} { - @include session-color-subtle($session-color-white); - background-color: $session-shade-8; + @include themify($themes) { + background: themed('receivedMessageBackground'); } - @at-root .dark-theme #{&} { - background-color: $session-shade-8; + + .module-message__text { + @include themify($themes) { + color: themed('receivedMessageText'); + } + a { + text-decoration: underline; + @include themify($themes) { + color: themed('receivedMessageText'); + } + } + } + + .module-message__author, + .module-message__metadata, + .module-message__metadata__date, + .module-message__metadata__badge, + .module-message__metadata__badge--separator { + @include themify($themes) { + @include session-color-subtle(themed('receivedMessageText')); + } } } &__container--outgoing { - @at-root .light-theme #{&} { - background-color: $session-color-white; + @include themify($themes) { + background: themed('sentMessageBackground'); } - @at-root .dark-theme #{&} { - background-color: $session-shade-11; + + .module-message__text { + @include themify($themes) { + color: themed('sentMessageText'); + } + a { + text-decoration: underline; + @include themify($themes) { + color: themed('sentMessageText'); + } + } + } + + .module-message__author, + .module-message__metadata, + .module-message__metadata__date, + .module-message__metadata__badge, + .module-message__metadata__badge--separator { + @include themify($themes) { + @include session-color-subtle(themed('sentMessageText')); + } } } &__container { - transition: background-color 0.25s; - box-shadow: 0px 0px 8px 2px rgba(0, 0, 0, 0.69); + transition: background-color $session-transition-duration; } } diff --git a/stylesheets/_theme_dark.scss b/stylesheets/_theme_dark.scss index 83b7e4f42..5d3e3f012 100644 --- a/stylesheets/_theme_dark.scss +++ b/stylesheets/_theme_dark.scss @@ -555,53 +555,6 @@ body.dark-theme { @include color-svg('../images/error.svg', $color-core-red); } - .module-message__container--outgoing { - background-color: $color-dark-70; - } - - // In case the color gets messed up - .module-message__container--incoming { - background-color: $color-conversation-grey; - } - - .module-message__container--incoming-red { - background-color: $color-conversation-red; - } - .module-message__container--incoming-deep_orange { - background-color: $color-conversation-deep_orange; - } - .module-message__container--incoming-brown { - background-color: $color-conversation-brown; - } - .module-message__container--incoming-pink { - background-color: $color-conversation-pink; - } - .module-message__container--incoming-purple { - background-color: $color-conversation-purple; - } - .module-message__container--incoming-indigo { - background-color: $color-conversation-indigo; - } - .module-message__container--incoming-blue { - background-color: $color-conversation-blue; - } - .module-message__container--incoming-teal { - background-color: $color-conversation-teal; - } - .module-message__container--incoming-green { - background-color: $color-conversation-green; - } - .module-message__container--incoming-light_green { - background-color: $color-conversation-light_green; - } - .module-message__container--incoming-blue_grey { - background-color: $color-conversation-blue_grey; - } - - .module-message__attachment-container { - background-color: $color-gray-95; - } - .module-message__img-border-overlay { box-shadow: inset 0px 0px 0px 1px $color-white-015; } @@ -651,10 +604,6 @@ body.dark-theme { color: $color-white; } - .module-message__generic-attachment__icon { - // background: url('../images/file-gradient.svg') no-repeat center; - } - .module-message__generic-attachment__file-name { color: $color-dark-05; } @@ -688,31 +637,7 @@ body.dark-theme { .module-message__link-preview__location { color: $color-gray-25; } - .module-conversation__user, - .module-message__author { - color: $color-white; - } - .module-message__text { - color: $color-dark-05; - a { - color: $color-dark-05; - } - } - - .module-message__text--incoming { - color: $color-white; - a { - color: $color-white; - } - } - - .module-message__metadata__date { - color: $color-white-08; - } - .module-message__metadata__date--incoming { - color: $color-white-08; - } .module-message__metadata__date--with-image-no-caption { color: $color-white-08; } @@ -801,132 +726,20 @@ body.dark-theme { } // Module: Quoted Reply - .module-quote--outgoing { border-left-color: $color-conversation-grey; background-color: $color-conversation-grey-shade; } - .module-quote--outgoing-red { - border-left-color: $color-conversation-red; - background-color: $color-conversation-red-shade; - } - .module-quote--outgoing-deep_orange { - border-left-color: $color-conversation-deep_orange; - background-color: $color-conversation-deep_orange-shade; - } - .module-quote--outgoing-brown { - border-left-color: $color-conversation-brown; - background-color: $color-conversation-brown-shade; - } - .module-quote--outgoing-pink { - border-left-color: $color-conversation-pink; - background-color: $color-conversation-pink-shade; - } - .module-quote--outgoing-purple { - border-left-color: $color-conversation-purple; - background-color: $color-conversation-purple-shade; - } - .module-quote--outgoing-indigo { - border-left-color: $color-conversation-indigo; - background-color: $color-conversation-indigo-shade; - } - .module-quote--outgoing-blue { - border-left-color: $color-conversation-blue; - background-color: $color-conversation-blue-shade; - } - .module-quote--outgoing-teal { - border-left-color: $color-conversation-teal; - background-color: $color-conversation-teal-shade; - } - .module-quote--outgoing-green { - border-left-color: $color-conversation-green; - background-color: $color-conversation-green-shade; - } - .module-quote--outgoing-light_green { - border-left-color: $color-conversation-light_green; - background-color: $color-conversation-light_green-shade; - } - .module-quote--outgoing-blue_grey { - border-left-color: $color-conversation-blue_grey; - background-color: $color-conversation-blue_grey-shade; - } .module-quote--incoming { border-left-color: $color-black; background-color: $color-conversation-grey-shade; } - .module-quote--incoming-red { - background-color: $color-conversation-red-shade; - } - .module-quote--incoming-deep_orange { - background-color: $color-conversation-deep_orange-shade; - } - .module-quote--incoming-brown { - background-color: $color-conversation-brown-shade; - } - .module-quote--incoming-pink { - background-color: $color-conversation-pink-shade; - } - .module-quote--incoming-purple { - background-color: $color-conversation-purple-shade; - } - .module-quote--incoming-indigo { - background-color: $color-conversation-indigo-shade; - } - .module-quote--incoming-blue { - background-color: $color-conversation-blue-shade; - } - .module-quote--incoming-teal { - background-color: $color-conversation-teal-shade; - } - .module-quote--incoming-green { - background-color: $color-conversation-green-shade; - } - .module-quote--incoming-light_green { - background-color: $color-conversation-light_green-shade; - } - .module-quote--incoming-blue_grey { - background-color: $color-conversation-blue_grey-shade; - } .module-quote__primary__author { color: $color-dark-05; } - .module-quote__primary__author-red { - color: $color-dark-05; - } - .module-quote__primary__author-deep_orange { - color: $color-dark-05; - } - .module-quote__primary__author-brown { - color: $color-dark-05; - } - .module-quote__primary__author-pink { - color: $color-dark-05; - } - .module-quote__primary__author-purple { - color: $color-dark-05; - } - .module-quote__primary__author-indigo { - color: $color-dark-05; - } - .module-quote__primary__author-blue { - color: $color-dark-05; - } - .module-quote__primary__author-teal { - color: $color-dark-05; - } - .module-quote__primary__author-green { - color: $color-dark-05; - } - .module-quote__primary__author-light_green { - color: $color-dark-05; - } - .module-quote__primary__author-blue_grey { - color: $color-dark-05; - } - .module-quote__primary__text { color: $color-dark-05; @@ -1087,12 +900,6 @@ body.dark-theme { // Module: Conversation Header - .module-conversation-header { - color: $color-dark-05; - background-color: $color-gray-95; - border-bottom: 1px solid $color-light-60; - } - .module-conversation-header__back-icon { @include color-svg('../images/back.svg', $color-dark-05); } @@ -1296,49 +1103,8 @@ body.dark-theme { background-color: $color-conversation-grey-shade; } - .module-avatar--signal-blue { - background-color: $color-signal-blue; - } - .module-avatar--red { - background-color: $color-conversation-red-shade; - } - .module-avatar--deep_orange { - background-color: $color-conversation-deep_orange-shade; - } - .module-avatar--brown { - background-color: $color-conversation-brown-shade; - } - .module-avatar--pink { - background-color: $color-conversation-pink-shade; - } - .module-avatar--purple { - background-color: $color-conversation-purple-shade; - } - .module-avatar--indigo { - background-color: $color-conversation-indigo-shade; - } - .module-avatar--blue { - background-color: $color-conversation-blue-shade; - } - .module-avatar--teal { - background-color: $color-conversation-teal-shade; - } - .module-avatar--green { - background-color: $color-conversation-green-shade; - } - .module-avatar--light_green { - background-color: $color-conversation-light_green-shade; - } - .module-avatar--blue_grey { - background-color: $color-conversation-blue_grey-shade; - } - // Module: Main Header - .module-main-header { - border-bottom: 1px solid $color-gray-75; - } - .module-main-header__search__input { background-color: $color-gray-95; border-radius: 14px; @@ -1542,58 +1308,6 @@ body.dark-theme { color: $color-gray-05; } - // Module: Left Pane - - .module-left-pane { - background-color: $color-dark-85; - border-right: 1px solid $color-gray-75; - } - - .module-left-pane__archive-header { - border-bottom: 1px solid $color-gray-75; - } - - .module-left-pane__to-inbox-button { - background-color: $color-gray-25; - } - - .module-left-pane__archive-header-text { - color: $color-gray-05; - } - - .module-left-pane__archive-helper-text { - color: $color-gray-25; - background-color: $color-gray-75; - } - - .module-left-pane__archived-button { - color: $color-gray-25; - &:hover { - background-color: $color-gray-75; - } - } - - .module-left-pane__archived-button__archived-count { - color: $color-gray-25; - background-color: $color-gray-75; - } - - // Module: Start New Conversation - - .module-start-new-conversation { - &:hover { - background-color: $color-dark-70; - } - } - - .module-start-new-conversation__number { - color: $color-gray-05; - } - - .module-start-new-conversation__text { - color: $color-gray-45; - } - // Third-party module: react-contextmenu .react-contextmenu { diff --git a/stylesheets/themes.scss b/stylesheets/themes.scss index 2ea44c84d..76c5a82ab 100644 --- a/stylesheets/themes.scss +++ b/stylesheets/themes.scss @@ -1,5 +1,3 @@ -// copy pasted from the android Session app. Some might not be used and some might be missing -// also, some are sometimes applied with a opacity setting (most likely 0.6) $themes: ( light: ( accent: #00e97b, @@ -13,8 +11,6 @@ $themes: ( modalBackground: #fcfcfc, modalBorder: #212121, fakeChatBubbleBackground: #f5f5f5, - fakeChatBubbleText: #000, - newConversationButtonShadow: hsl(151, 89%, 26%), // input inputBackground: #8e8e931f, // text @@ -33,7 +29,9 @@ $themes: ( composeViewBackground: #fcfcfc, composeViewTextFieldBackground: #ededed, receivedMessageBackground: #f5f5f5, - sentMessageBackground: #00e97b, + sentMessageBackground: #272726, + receivedMessageText: #000, + sentMessageText: #fff, // left pane conversationList: #fff, conversationItemHasUnread: #fcfcfc, @@ -47,6 +45,8 @@ $themes: ( // pill divider: pillDividerColor: #0000001a, pillDividerTextColor: #555, + // context menu + contextMenuBackground: #f5f5f5, ), dark: ( accent: #00f782, @@ -59,9 +59,7 @@ $themes: ( buttonBackground: #1b1b1b, modalBackground: #101011, modalBorder: #212121, - fakeChatBubbleBackground: #3f4146, - fakeChatBubbleText: #000, - newConversationButtonShadow: #077c44, + fakeChatBubbleBackground: #212121, // input inputBackground: #8e8e931f, // text @@ -81,6 +79,8 @@ $themes: ( composeViewTextFieldBackground: #141414, receivedMessageBackground: #222325, sentMessageBackground: #3f4146, + receivedMessageText: #fff, + sentMessageText: #fff, // left pane conversationList: #1b1b1b, conversationItemHasUnread: #2c2c2c, @@ -94,6 +94,8 @@ $themes: ( // pill divider: pillDividerColor: #353535, pillDividerTextColor: #a0a0a0, + // context menu + contextMenuBackground: #212121, ), ); diff --git a/ts/components/conversation/Message.tsx b/ts/components/conversation/Message.tsx index 59f57566f..6745995d0 100644 --- a/ts/components/conversation/Message.tsx +++ b/ts/components/conversation/Message.tsx @@ -1162,10 +1162,7 @@ export class Message extends React.PureComponent {
{ className={classNames( 'module-quote', isIncoming ? 'module-quote--incoming' : 'module-quote--outgoing', - isIncoming - ? `module-quote--incoming-${authorColor}` - : `module-quote--outgoing-${authorColor}`, !onClick ? 'module-quote--no-click' : null, withContentAbove ? 'module-quote--with-content-above' : null, referencedMessageNotFound diff --git a/ts/components/conversation/TypingBubble.tsx b/ts/components/conversation/TypingBubble.tsx index 53229f985..ea5e716e1 100644 --- a/ts/components/conversation/TypingBubble.tsx +++ b/ts/components/conversation/TypingBubble.tsx @@ -59,8 +59,7 @@ export class TypingBubble extends React.Component {
From 031e19df63ef307a836c1abd6bea47a2b4b04c05 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 25 Aug 2020 12:13:43 +1000 Subject: [PATCH 089/274] themify group panel --- stylesheets/_modules.scss | 5 --- stylesheets/_session.scss | 47 +++++++++++++++++++-------- stylesheets/_session_group_panel.scss | 38 ++++++++++++++-------- 3 files changed, 58 insertions(+), 32 deletions(-) diff --git a/stylesheets/_modules.scss b/stylesheets/_modules.scss index b8f9c27cb..11508487e 100644 --- a/stylesheets/_modules.scss +++ b/stylesheets/_modules.scss @@ -1587,15 +1587,10 @@ .module-media-gallery__tab { width: 100%; - background-color: $color-light-02; padding: 20px; text-align: center; } -.module-media-gallery__tab--active { - border-bottom: 2px solid $color-signal-blue; -} - .module-media-gallery__content { display: flex; flex-grow: 1; diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index 0bc9ee066..745e4d10a 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -346,7 +346,6 @@ textarea { } } -$session-separator-element-border: 1px solid $session-shade-6; $session-element-border-green: 4px solid $session-color-green; /* CONVERSATION AND MESSAGES */ @@ -809,8 +808,17 @@ label { height: 50px; padding: 0px $session-margin-md; font-size: $session-font-sm; - color: $session-color-white; - background-color: $session-shade-1; + + @include themify($themes) { + color: themed('textColor'); + background: themed('cellBackground'); + } + + &:hover { + @include themify($themes) { + background: themed('clickableHovered'); + } + } .session-icon { opacity: 0.6; @@ -838,21 +846,29 @@ label { justify-content: center; height: 35px; padding: 0 $session-margin-md; - color: $session-color-white; - background-color: $session-shade-1; + @include themify($themes) { + background: themed('cellBackground'); + color: themed('textColor'); + } font-size: 0.8rem; width: -webkit-fill-available; transition: $session-transition-duration; &:first-child { - border-top: $session-separator-element-border; + @include themify($themes) { + border-top: themed('borderActionPanel'); + } } &:last-child { - border-bottom: $session-separator-element-border; + @include themify($themes) { + border-top: themed('borderActionPanel'); + } } &:hover { - @include session-dark-background-hover; + @include themify($themes) { + background: themed('clickableHovered'); + } } .session-icon { @@ -864,7 +880,9 @@ label { &.active, &:hover { - background-color: $session-shade-7; + @include themify($themes) { + background: themed('clickableHovered'); + } } &.danger { @@ -873,6 +891,9 @@ label { } &:hover { + @include themify($themes) { + background: themed('clickableHovered'); + } .session-icon { opacity: 1; } @@ -1409,7 +1430,9 @@ input { .dark-theme .invite-friends-dialog .member-item { height: 64px; background-color: $session-shade-4; - border: $session-separator-element-border; + @include themify($themes) { + border: themed('borderActionPanel'); + } display: flex; align-items: center; transition: $session-transition-duration; @@ -1428,10 +1451,6 @@ input { } } -.dark-theme .modal .content { - background-color: $session-shade-4; -} - .loki-dialog button { border: none; } diff --git a/stylesheets/_session_group_panel.scss b/stylesheets/_session_group_panel.scss index 1557f13bb..41fe3fb4a 100644 --- a/stylesheets/_session_group_panel.scss +++ b/stylesheets/_session_group_panel.scss @@ -10,8 +10,10 @@ height: 100vh; width: 22vw; flex-shrink: 0; - border: $session-separator-element-border; - background-color: $session-shade-4; + @include themify($themes) { + background: themed('leftpaneOverlayBackground'); + border-left: themed('borderActionPanel'); + } align-items: center; &-header { @@ -37,11 +39,13 @@ .description { margin: $session-margin-md 0; - border: $session-separator-element-border; - background-color: $session-shade-1; min-height: 4rem; width: inherit; - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + background: themed('cellBackground'); + border: themed('borderActionPanel'); + } text-align: center; display: none; } @@ -49,19 +53,23 @@ &-item { display: flex; align-items: center; - background-color: $session-shade-1; min-height: 3rem; font-size: 0.8rem; - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + background: themed('cellBackground'); + border-top: themed('borderActionPanel'); + border-bottom: themed('borderActionPanel'); + } width: -webkit-fill-available; padding: 0 $session-margin-md; - border-bottom: $session-separator-element-border; - border-top: $session-separator-element-border; transition: $session-transition-duration; cursor: pointer; &:hover { - @include session-dark-background-hover; + @include themify($themes) { + background: themed('clickableHovered'); + } } } @@ -74,11 +82,13 @@ .session-button.square-outline.danger { margin-top: auto; width: 100%; - border: none; height: 3.5rem; - background-color: black; flex-shrink: 0; align-items: center; + @include themify($themes) { + border: none; + border-top: themed('borderActionPanel'); + } } .module-empty-state { @@ -104,7 +114,9 @@ } &__tab { - color: white; + @include themify($themes) { + color: themed('textColor'); + } font-weight: bold; font-size: 0.9rem; padding: 0.6rem; From 291982c2aaa44a89ecd6ef99f4821cdcddcbb7c6 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 25 Aug 2020 15:57:37 +1000 Subject: [PATCH 090/274] cleanup css and themify missing stuff --- background.html | 20 ++--- background_test.html | 21 ++--- images/session/full-logo.svg | 64 -------------- images/session/session-text.svg | 45 ++++++++++ index.html | 5 +- password.html | 11 +-- stylesheets/_conversation.scss | 45 +--------- stylesheets/_emoji.scss | 1 + stylesheets/_global.scss | 8 +- stylesheets/_index.scss | 20 ----- stylesheets/_modules.scss | 2 +- stylesheets/_session-slider.scss | 4 +- stylesheets/_session.scss | 29 ++++-- stylesheets/_session_group_panel.scss | 2 +- stylesheets/_session_left_pane.scss | 36 ++++++-- stylesheets/_settings.scss | 123 -------------------------- stylesheets/_theme_dark.scss | 25 ------ stylesheets/_variables.scss | 4 - stylesheets/themes.scss | 6 +- test/index.html | 16 ++-- ts/components/MainViewController.tsx | 9 +- 21 files changed, 145 insertions(+), 351 deletions(-) delete mode 100644 images/session/full-logo.svg create mode 100644 images/session/session-text.svg delete mode 100644 stylesheets/_settings.scss diff --git a/background.html b/background.html index db453bb99..75e898224 100644 --- a/background.html +++ b/background.html @@ -28,16 +28,12 @@ --> - - - @@ -49,8 +44,9 @@
-
- +
@@ -516,8 +512,9 @@
-
- +
diff --git a/images/session/full-logo.svg b/images/session/full-logo.svg deleted file mode 100644 index 01fb1cd36..000000000 --- a/images/session/full-logo.svg +++ /dev/null @@ -1,64 +0,0 @@ - -image/svg+xml \ No newline at end of file diff --git a/images/session/session-text.svg b/images/session/session-text.svg new file mode 100644 index 000000000..0d47d11c0 --- /dev/null +++ b/images/session/session-text.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/index.html b/index.html index 2d781b911..305e4e8c1 100644 --- a/index.html +++ b/index.html @@ -13,8 +13,9 @@
-
- +
diff --git a/password.html b/password.html index 05478651e..a399efe5b 100644 --- a/password.html +++ b/password.html @@ -16,7 +16,7 @@ - + @@ -25,10 +25,11 @@
-
- -
+ - +
+ diff --git a/stylesheets/_conversation.scss b/stylesheets/_conversation.scss index f22f092e7..ad1e0cbab 100644 --- a/stylesheets/_conversation.scss +++ b/stylesheets/_conversation.scss @@ -265,7 +265,7 @@ box-shadow: none; user-select: none; cursor: pointer; - transition: 0.25s; + transition: $session-transition-duration; &:hover { background-color: #00d672; @@ -627,49 +627,6 @@ } } -.conversation-loading-screen { - z-index: 99; - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - display: flex; - align-items: center; - background-color: $color-white; - - .content { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - } - - .container { - position: absolute; - left: 50%; - width: 120px; - transform: translate(-50%, 0); - } - - .dot { - width: 14px; - height: 14px; - border: 3px solid $blue; - border-radius: 50%; - float: left; - margin: 0 6px; - transform: scale(0); - - animation: loading 1500ms ease infinite 0ms; - &:nth-child(2) { - animation: loading 1500ms ease infinite 333ms; - } - &:nth-child(3) { - animation: loading 1500ms ease infinite 666ms; - } - } -} .module-last-seen-indicator { padding-top: 25px; diff --git a/stylesheets/_emoji.scss b/stylesheets/_emoji.scss index 65877d987..7b8fcb439 100644 --- a/stylesheets/_emoji.scss +++ b/stylesheets/_emoji.scss @@ -90,6 +90,7 @@ button.emoji { &:before { content: ''; + margin-top: 5px; display: inline-block; width: $button-height; height: $button-height; diff --git a/stylesheets/_global.scss b/stylesheets/_global.scss index cc760b179..a3d57229c 100644 --- a/stylesheets/_global.scss +++ b/stylesheets/_global.scss @@ -595,7 +595,7 @@ $loading-height: 16px; width: 100%; height: 100%; background-color: $blue_l; - transition: width 0.25s; + transition: width $session-transition-duration; box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5); } } @@ -808,9 +808,9 @@ $loading-height: 16px; padding: 0 1em; background: $color-dark-85; pointer-events: none; - -webkit-transition: 0.25s all ease; - -o-transition: 0.25s all ease; - transition: 0.25s all ease; + -webkit-transition: $session-transition-duration all ease; + -o-transition: $session-transition-duration all ease; + transition: $session-transition-duration all ease; } } diff --git a/stylesheets/_index.scss b/stylesheets/_index.scss index eaee3cdf2..f738f5e5a 100644 --- a/stylesheets/_index.scss +++ b/stylesheets/_index.scss @@ -393,26 +393,6 @@ input.search { } } -.conversation.placeholder { - text-align: center; - user-select: none; - - .container { - position: absolute; - height: 100%; - width: 100%; - display: flex; - justify-content: center; - align-items: center; - } - .content { - display: inline-block; - } - - h3 { - font-size: large; - } -} .contact.placeholder { position: absolute; top: 50px; diff --git a/stylesheets/_modules.scss b/stylesheets/_modules.scss index 11508487e..085d32668 100644 --- a/stylesheets/_modules.scss +++ b/stylesheets/_modules.scss @@ -478,7 +478,7 @@ span { opacity: 0.5; - transition: 0.25s; + transition: $session-transition-duration; &:not(.module-message__metadata__badge--separator):hover { opacity: 1; diff --git a/stylesheets/_session-slider.scss b/stylesheets/_session-slider.scss index 74241c942..95a38c086 100644 --- a/stylesheets/_session-slider.scss +++ b/stylesheets/_session-slider.scss @@ -106,7 +106,9 @@ margin-left: -4px; width: 3px; height: 6px; - background-color: $session-shade-6; + @include themify($themes) { + background: themed('clickableHovered'); + } cursor: pointer; border-radius: 2px; vertical-align: middle; diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index 745e4d10a..a0a5bf08f 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -495,7 +495,9 @@ label { .session-toast { position: relative; padding: $session-margin-md $session-margin-md; - background-color: rgba($session-shade-6, 0.8); + @include themify($themes) { + background: rgba(themed('cellBackground'), 0.8); + } margin-bottom: $session-margin-md; display: flex; flex-direction: row; @@ -530,23 +532,31 @@ label { line-height: $session-font-sm; margin-bottom: $session-margin-sm; padding-top: 0px; - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + } padding-top: 0px; } .description { font-size: $session-font-xs; - @include session-color-subtle($session-color-white); + @include themify($themes) { + @include session-color-subtle(themed('textColor')); + } } .toast-close { - @include session-color-subtle($session-color-white); + @include themify($themes) { + @include session-color-subtle(themed('textColor')); + } position: absolute; top: $session-margin-md; right: $session-margin-md; &:hover { - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + } } } @@ -577,7 +587,7 @@ label { @include themify($themes) { background-color: themed('modalBackground'); color: themed('textColor'); - border: 1px solid themed('modalBorder'); + border: 1px solid themed('borderActionPanel'); } overflow: hidden; display: flex; @@ -746,7 +756,7 @@ label { box-shadow: 0 0 3px 1px rgba(0, 0, 0, 0.05), 0 3px 1px 0 rgba(0, 0, 0, 0.05), 0 2px 2px 0 rgba(0, 0, 0, 0.1), 0 3px 3px 0 rgba(0, 0, 0, 0.05); - transition: transform 0.25s ease, background-color 0.25s ease; + transition: transform $session-transition-duration ease, background-color $session-transition-duration ease; } &.active { @@ -770,6 +780,7 @@ label { .react-contextmenu-item { display: flex; align-items: center; + transition: $session-transition-duration; height: 25px; padding: $session-margin-md $session-margin-sm; @@ -826,7 +837,7 @@ label { } &__list-container { - z-index: 200; + z-index: 99; display: block; position: absolute; top: 50px; @@ -1146,11 +1157,11 @@ label { font-size: $session-font-md; padding: $session-margin-lg; margin-bottom: 20px; - border-bottom: 1px solid $session-shade-5; @include themify($themes) { background: themed('cellBackground'); color: themed('textColor'); + border-bottom: themed('borderActionPanel'); } &.inline { display: flex; diff --git a/stylesheets/_session_group_panel.scss b/stylesheets/_session_group_panel.scss index 41fe3fb4a..e829cbc51 100644 --- a/stylesheets/_session_group_panel.scss +++ b/stylesheets/_session_group_panel.scss @@ -82,7 +82,7 @@ .session-button.square-outline.danger { margin-top: auto; width: 100%; - height: 3.5rem; + height: 51px; flex-shrink: 0; align-items: center; @include themify($themes) { diff --git a/stylesheets/_session_left_pane.scss b/stylesheets/_session_left_pane.scss index 535f2731f..079b64e77 100644 --- a/stylesheets/_session_left_pane.scss +++ b/stylesheets/_session_left_pane.scss @@ -349,13 +349,40 @@ $session-compose-margin: 20px; } } +.conversation.placeholder .container { + display: flex; + height: 100%; +} + .session-full-logo { - width: 250px; - height: 250px; + display: flex; + flex-direction: column; + align-items: center; + margin: auto; + + .session-brand-logo { + height: 215px; + filter: brightness(0) saturate(100%) invert(75%) sepia(84%) saturate(3272%) hue-rotate(103deg) brightness(106%) contrast(103%); + } + + .session-text-logo { + margin-top: 10px; + width: 250px; + @include themify($themes) { + filter: themed('filterSessionText'); + } + transition: 0s; + } } .app-loading-screen { - @include session-dark-background; + background: #000; + + .session-text-logo { + filter:none !important; // force no filter on the text of the app loading + // as the theme is not set right on the start. + // this is to avoid a text color switch on app loading. + } } @mixin bottom-buttons() { @@ -368,8 +395,7 @@ $session-compose-margin: 20px; .session-button.square-outline.square.white, .session-button.square-outline.square.danger { flex-grow: 1; - height: 50px; - // line-height: 50px; + height: 51px; @at-root .light-theme #{&} { border: 1px solid $session-shade-15; diff --git a/stylesheets/_settings.scss b/stylesheets/_settings.scss deleted file mode 100644 index c229724a2..000000000 --- a/stylesheets/_settings.scss +++ /dev/null @@ -1,123 +0,0 @@ -.settings { - user-select: none; - - &.modal { - padding: 0; - background-color: transparent; - - .content { - margin: 0; - margin-left: auto; - margin-right: auto; - - width: 100%; - max-width: 450px; - border-radius: 0; - box-shadow: 0px 0px 0px 0px; - } - } - hr { - margin: 10px 0; - } - .device-name-settings { - text-align: center; - margin-bottom: 1em; - } - .syncSettings { - button { - float: right; - line-height: 36px; - padding: 0 20px; - margin: 0 0 20px 20px; - } - .synced_at { - font-size: $font-size-small; - color: $grey; - } - .sync_failed { - display: none; - font-size: $font-size-small; - color: red; - } - } - - .blocked-user-settings { - display: flex; - flex: 1; - flex-direction: row; - align-items: center; - } - - .blocked-user-settings { - select { - flex: 1; - cursor: pointer; - font-size: 14px; - } - button { - line-height: 28px; - padding: 0 20px; - margin: auto; - margin-left: 20px; - } - } - - .blocked-user-settings ul { - list-style-type: none; - padding: 0; - margin: 0; - } - - .wordwrap { - white-space: pre-wrap; /* CSS3 */ - white-space: -moz-pre-wrap; /* Firefox */ - white-space: -pre-wrap; /* Opera <7 */ - white-space: -o-pre-wrap; /* Opera 7 */ - word-wrap: break-word; /* IE */ - } - - .restart-needed { - margin-top: 1em; - } - - .clear-data-settings { - button { - float: right; - line-height: 36px; - padding: 0 20px; - margin: 0 0 20px 20px; - } - .destructive { - background-color: red; - color: white; - } - } - - .message-ttl-setting { - .inputs { - display: flex; - padding-top: 18px; - } - - #warning { - padding-top: 12px; - font-weight: 300; - color: red; - } - - input { - flex: 1; - } - label { - padding-left: 12px; - } - } - - .send-link-previews-setting { - margin-top: 0.75em; - } - .description { - margin-top: 0.3em; - margin-left: 1.5em; - } -} diff --git a/stylesheets/_theme_dark.scss b/stylesheets/_theme_dark.scss index 5d3e3f012..b234bf71b 100644 --- a/stylesheets/_theme_dark.scss +++ b/stylesheets/_theme_dark.scss @@ -111,9 +111,6 @@ body.dark-theme { } } - .conversation-loading-screen { - background-color: $color-gray-95; - } .module-last-seen-indicator__bar { background-color: #353535; @@ -1378,26 +1375,4 @@ body.dark-theme { color: $grey; } } - - // _settings - - hr { - border-color: $color-dark-60; - } - - .syncSettings { - .synced_at { - color: $grey; - } - .sync_failed { - color: red; - } - } - - .clear-data-settings { - .destructive { - background-color: red; - color: white; - } - } } diff --git a/stylesheets/_variables.scss b/stylesheets/_variables.scss index a3643e9ae..b97a6035f 100644 --- a/stylesheets/_variables.scss +++ b/stylesheets/_variables.scss @@ -25,10 +25,6 @@ $roboto: Roboto, 'Helvetica Neue', 'Source Sans Pro', 'Source Han Sans SC', 'Source Han Sans CN', 'Hiragino Sans GB', 'Hiragino Kaku Gothic', 'Microsoft Yahei UI', Helvetica, Arial, sans-serif; -$roboto-light: Roboto-Light, 'Helvetica Neue', 'Source Sans Pro Light', - 'Source Han Sans SC Light', 'Source Han Sans CN Light', - 'Hiragino Sans GB Light', 'Hiragino Kaku Gothic Light', - 'Microsoft Yahei UI Light', Helvetica, Arial, sans-serif; // Loki colors $color-loki-light-gray: #e9e9e9; diff --git a/stylesheets/themes.scss b/stylesheets/themes.scss index 76c5a82ab..359300ac3 100644 --- a/stylesheets/themes.scss +++ b/stylesheets/themes.scss @@ -6,10 +6,8 @@ $themes: ( unimportantButtonBackground: #0000, border: #979797, cellBackground: #fcfcfc, - separator: #36383c, buttonBackground: #fcfcfc, modalBackground: #fcfcfc, - modalBorder: #212121, fakeChatBubbleBackground: #f5f5f5, // input inputBackground: #8e8e931f, @@ -47,6 +45,7 @@ $themes: ( pillDividerTextColor: #555, // context menu contextMenuBackground: #f5f5f5, + filterSessionText: brightness(0) saturate(100%), ), dark: ( accent: #00f782, @@ -55,10 +54,8 @@ $themes: ( unimportantButtonBackground: #323232, border: #979797, cellBackground: #1b1b1b, - separator: #36383c, buttonBackground: #1b1b1b, modalBackground: #101011, - modalBorder: #212121, fakeChatBubbleBackground: #212121, // input inputBackground: #8e8e931f, @@ -96,6 +93,7 @@ $themes: ( pillDividerTextColor: #a0a0a0, // context menu contextMenuBackground: #212121, + filterSessionText: none, ), ); diff --git a/test/index.html b/test/index.html index 7e9022a49..fdebdba6d 100644 --- a/test/index.html +++ b/test/index.html @@ -18,14 +18,9 @@
- - @@ -38,8 +33,9 @@
-
- +
diff --git a/ts/components/MainViewController.tsx b/ts/components/MainViewController.tsx index 6b644637e..fa32dc9a4 100644 --- a/ts/components/MainViewController.tsx +++ b/ts/components/MainViewController.tsx @@ -24,12 +24,9 @@ export class MessageView extends React.Component {
-
- full-brand-logo +
+ full-brand-logo + full-brand-logo
From 9041a408fdac9c4480c63de35375d1d2bafeb618 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 25 Aug 2020 16:32:45 +1000 Subject: [PATCH 091/274] remove SessionResetConfirm dialog as unused --- js/background.js | 6 ---- js/views/app_view.js | 4 --- js/views/confirm_session_reset_view.js | 50 -------------------------- stylesheets/_mentions.scss | 30 ---------------- stylesheets/manifest.scss | 1 - 5 files changed, 91 deletions(-) delete mode 100644 js/views/confirm_session_reset_view.js diff --git a/js/background.js b/js/background.js index df56fab33..2a67928c9 100644 --- a/js/background.js +++ b/js/background.js @@ -1097,12 +1097,6 @@ } }); - Whisper.events.on('showSessionRestoreConfirmation', options => { - if (appView) { - appView.showSessionRestoreConfirmation(options); - } - }); - Whisper.events.on('showNicknameDialog', options => { if (appView) { appView.showNicknameDialog(options); diff --git a/js/views/app_view.js b/js/views/app_view.js index 0e73fc33d..abe01d661 100644 --- a/js/views/app_view.js +++ b/js/views/app_view.js @@ -229,10 +229,6 @@ const dialog = new Whisper.UpdateGroupMembersDialogView(groupConvo); this.el.append(dialog.el); }, - showSessionRestoreConfirmation(options) { - const dialog = new Whisper.ConfirmSessionResetView(options); - this.el.append(dialog.el); - }, showLeaveGroupDialog(groupConvo) { let title = i18n('deleteContact'); let message = i18n('deleteContactConfirmation'); diff --git a/js/views/confirm_session_reset_view.js b/js/views/confirm_session_reset_view.js deleted file mode 100644 index aa34e420f..000000000 --- a/js/views/confirm_session_reset_view.js +++ /dev/null @@ -1,50 +0,0 @@ -/* global Whisper, i18n */ - -// eslint-disable-next-line func-names -(function() { - 'use strict'; - - window.Whisper = window.Whisper || {}; - - Whisper.ConfirmSessionResetView = Whisper.View.extend({ - className: 'loki-dialog modal', - initialize({ pubkey, onOk }) { - this.title = i18n('couldNotDecryptMessage'); - - this.onOk = onOk; - this.messageText = i18n('confirmSessionRestore', pubkey); - this.okText = i18n('yes'); - this.cancelText = i18n('cancel'); - - this.close = this.close.bind(this); - this.confirm = this.confirm.bind(this); - - this.$el.focus(); - this.render(); - }, - render() { - this.dialogView = new Whisper.ReactWrapperView({ - className: 'leave-group-dialog', - Component: window.Signal.Components.ConfirmDialog, - props: { - titleText: this.title, - messageText: this.messageText, - okText: this.okText, - cancelText: this.cancelText, - onConfirm: this.confirm, - onClose: this.close, - }, - }); - - this.$el.append(this.dialogView.el); - return this; - }, - async confirm() { - this.onOk(); - this.close(); - }, - close() { - this.remove(); - }, - }); -})(); diff --git a/stylesheets/_mentions.scss b/stylesheets/_mentions.scss index aa3deaf77..9eb3dea75 100644 --- a/stylesheets/_mentions.scss +++ b/stylesheets/_mentions.scss @@ -1,35 +1,5 @@ @import 'themes.scss'; -.leave-group-dialog { - .content { - max-width: 100% !important; - } - - .titleText { - font-size: large; - text-align: center; - margin: 2px; - } - - .ok { - background-color: orangered; - min-width: 70px; - border: none; - - &:hover { - background-color: red; - } - } - - .cancel { - border: none; - min-width: 70px; - } -} - -.member-preview { - margin-left: 10px; -} /* remove scroll bars */ .loki-dialog .add-moderators-dialog .content { diff --git a/stylesheets/manifest.scss b/stylesheets/manifest.scss index 19e96345a..3401b2b16 100644 --- a/stylesheets/manifest.scss +++ b/stylesheets/manifest.scss @@ -13,7 +13,6 @@ @import 'recorder'; @import 'emoji'; @import 'mentions'; -@import 'settings'; // Build the main view @import 'index'; From 5f51573f53d1be71e3a16e7530b3650851755399 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 25 Aug 2020 16:58:24 +1000 Subject: [PATCH 092/274] remove unused templates --- background.html | 108 ---------- background_test.html | 97 --------- js/views/app_view.js | 38 ---- js/views/install_view.js | 202 ------------------ stylesheets/_conversation.scss | 5 - stylesheets/_global.scss | 20 -- stylesheets/_mentions.scss | 67 +----- stylesheets/_modal.scss | 58 +++++ stylesheets/_progress.scss | 87 -------- stylesheets/_session.scss | 24 +-- stylesheets/_session_left_pane.scss | 5 +- stylesheets/_theme_dark.scss | 10 - stylesheets/themes.scss | 4 +- test/index.html | 106 +-------- ts/components/MainViewController.tsx | 12 +- .../conversation/UpdateGroupMembersDialog.tsx | 1 - ts/util/lint/exceptions.json | 99 --------- 17 files changed, 78 insertions(+), 865 deletions(-) delete mode 100644 js/views/install_view.js diff --git a/background.html b/background.html index 75e898224..86ced40e2 100644 --- a/background.html +++ b/background.html @@ -91,9 +91,6 @@
-
-
-
-
-
-
-
-
{{/isStep2}} @@ -290,11 +282,6 @@
{{ importingHeader }}
-
-
-
-
-
{{/isStep3}} @@ -342,100 +329,6 @@ {{/isError}} - - @@ -492,7 +385,6 @@ - diff --git a/background_test.html b/background_test.html index f6387d596..a36da178e 100644 --- a/background_test.html +++ b/background_test.html @@ -90,9 +90,6 @@
-
-
-
@@ -308,9 +303,7 @@
{{ importingHeader }}
-
-
-
+
@@ -359,100 +352,6 @@ {{/isError}} - - - diff --git a/ts/components/MainViewController.tsx b/ts/components/MainViewController.tsx index fa32dc9a4..75d0ec960 100644 --- a/ts/components/MainViewController.tsx +++ b/ts/components/MainViewController.tsx @@ -25,8 +25,16 @@ export class MessageView extends React.Component {
- full-brand-logo - full-brand-logo + full-brand-logo + full-brand-logo
diff --git a/ts/components/conversation/UpdateGroupMembersDialog.tsx b/ts/components/conversation/UpdateGroupMembersDialog.tsx index 374a8564e..d82292dc8 100644 --- a/ts/components/conversation/UpdateGroupMembersDialog.tsx +++ b/ts/components/conversation/UpdateGroupMembersDialog.tsx @@ -119,7 +119,6 @@ export class UpdateGroupMembersDialog extends React.Component { {`${checkMarkedCount} members`} -
)} diff --git a/ts/util/lint/exceptions.json b/ts/util/lint/exceptions.json index 562ccbc94..4ff8f304f 100644 --- a/ts/util/lint/exceptions.json +++ b/ts/util/lint/exceptions.json @@ -641,105 +641,6 @@ "updated": "2019-03-08T23:49:08.796Z", "reasonDetail": "Protected from arbitrary input" }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.$('#qr img').remove();", - "lineNumber": 133, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.$('#qr .container').show();", - "lineNumber": 135, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " if ($('#qr').length === 0) {", - "lineNumber": 139, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.$('#qr .container').hide();", - "lineNumber": 144, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.qr = new QRCode(this.$('#qr')[0]).makeCode(url);", - "lineNumber": 145, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.$('#qr').addClass('ready');", - "lineNumber": 147, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.$(DEVICE_NAME_SELECTOR).val(deviceName || window.getHostName());", - "lineNumber": 152, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.$('#link-phone').submit();", - "lineNumber": 157, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.$('#link-phone').submit(e => {", - "lineNumber": 167, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " let name = this.$(DEVICE_NAME_SELECTOR).val();", - "lineNumber": 171, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, - { - "rule": "jQuery-$(", - "path": "js/views/install_view.js", - "line": " this.$(DEVICE_NAME_SELECTOR).focus();", - "lineNumber": 174, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, { "rule": "jQuery-$(", "path": "js/views/key_verification_view.js", From 1eb8f8e6b15f454dfd4ec5079b6a03ecfe92c58e Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 26 Aug 2020 09:51:40 +1000 Subject: [PATCH 093/274] remove ConfirmationDialogView unused --- background.html | 1 - background_test.html | 1 - js/views/confirmation_dialog_view.js | 61 ---------------------------- permissions_popup.html | 12 ------ test/index.html | 12 ------ ts/util/lint/exceptions.json | 10 +---- 6 files changed, 1 insertion(+), 96 deletions(-) delete mode 100644 js/views/confirmation_dialog_view.js diff --git a/background.html b/background.html index 86ced40e2..852ffa77d 100644 --- a/background.html +++ b/background.html @@ -378,7 +378,6 @@ - diff --git a/background_test.html b/background_test.html index a36da178e..42daa9eae 100644 --- a/background_test.html +++ b/background_test.html @@ -388,7 +388,6 @@ - diff --git a/js/views/confirmation_dialog_view.js b/js/views/confirmation_dialog_view.js deleted file mode 100644 index a62e1024c..000000000 --- a/js/views/confirmation_dialog_view.js +++ /dev/null @@ -1,61 +0,0 @@ -/* global Whisper, i18n */ - -// eslint-disable-next-line func-names -(function() { - 'use strict'; - - window.Whisper = window.Whisper || {}; - - Whisper.ConfirmationDialogView = Whisper.View.extend({ - className: 'confirmation-dialog modal', - templateName: 'confirmation-dialog', - initialize(options) { - this.message = options.message; - this.hideCancel = options.hideCancel; - - this.resolve = options.resolve; - this.okText = options.okText || i18n('ok'); - - this.reject = options.reject; - this.cancelText = options.cancelText || i18n('cancel'); - - this.title = options.title; - - this.render(); - }, - events: { - keyup: 'onKeyup', - 'click .ok': 'ok', - 'click .cancel': 'cancel', - }, - render_attributes() { - return { - message: this.message, - showCancel: !this.hideCancel, - cancel: this.cancelText, - ok: this.okText, - title: this.title, - }; - }, - ok() { - this.remove(); - if (this.resolve) { - this.resolve(); - } - }, - cancel() { - this.remove(); - if (this.reject) { - this.reject(); - } - }, - onKeyup(event) { - if (event.key === 'Escape' || event.key === 'Esc') { - this.cancel(); - } - }, - focusCancel() { - this.$('.cancel').focus(); - }, - }); -})(); diff --git a/permissions_popup.html b/permissions_popup.html index e95b75ef0..f1fe49dfa 100644 --- a/permissions_popup.html +++ b/permissions_popup.html @@ -19,20 +19,8 @@ - - diff --git a/test/index.html b/test/index.html index fba0ec92a..7d9622297 100644 --- a/test/index.html +++ b/test/index.html @@ -117,17 +117,6 @@
- - diff --git a/ts/util/lint/exceptions.json b/ts/util/lint/exceptions.json index 4ff8f304f..7f8921a4b 100644 --- a/ts/util/lint/exceptions.json +++ b/ts/util/lint/exceptions.json @@ -372,15 +372,7 @@ "updated": "2018-09-19T18:13:29.628Z", "reasonDetail": "Interacting with already-existing DOM nodes" }, - { - "rule": "jQuery-$(", - "path": "js/views/confirmation_dialog_view.js", - "line": " this.$('.cancel').focus();", - "lineNumber": 55, - "reasonCategory": "usageTrusted", - "updated": "2018-09-19T21:59:32.770Z", - "reasonDetail": "Protected from arbitrary input" - }, + { "rule": "jQuery-append(", "path": "js/views/contact_list_view.js", From a03132f0886479ef1595fd74037d2213f373b6dc Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 26 Aug 2020 10:48:23 +1000 Subject: [PATCH 094/274] remove qrDialogView unused --- background.html | 1 - background_test.html | 1 - js/background.js | 8 ---- js/modules/signal.js | 4 -- js/views/app_view.js | 6 --- js/views/qr_dialog_view.js | 36 ------------------ test/index.html | 1 - ts/components/EditProfileDialog.tsx | 2 +- ts/components/session/SessionQRModal.tsx | 48 ------------------------ ts/window.d.ts | 1 - 10 files changed, 1 insertion(+), 107 deletions(-) delete mode 100644 js/views/qr_dialog_view.js delete mode 100644 ts/components/session/SessionQRModal.tsx diff --git a/background.html b/background.html index 852ffa77d..b82d472e5 100644 --- a/background.html +++ b/background.html @@ -381,7 +381,6 @@ - diff --git a/background_test.html b/background_test.html index 42daa9eae..673b2ecdf 100644 --- a/background_test.html +++ b/background_test.html @@ -391,7 +391,6 @@ - diff --git a/js/background.js b/js/background.js index 2a67928c9..74ea083c2 100644 --- a/js/background.js +++ b/js/background.js @@ -698,7 +698,6 @@ confirmDialog.render(); }; - window.showQRDialog = window.owsDesktopApp.appView.showQRDialog; window.showSeedDialog = window.owsDesktopApp.appView.showSeedDialog; window.showPasswordDialog = window.owsDesktopApp.appView.showPasswordDialog; window.showEditProfileDialog = async callback => { @@ -1109,13 +1108,6 @@ } }); - Whisper.events.on('showQRDialog', async () => { - if (appView) { - const ourNumber = textsecure.storage.user.getNumber(); - appView.showQRDialog(ourNumber); - } - }); - Whisper.events.on('showDevicePairingDialog', async (options = {}) => { if (appView) { appView.showDevicePairingDialog(options); diff --git a/js/modules/signal.js b/js/modules/signal.js index e5c1ca6f0..a5c459f29 100644 --- a/js/modules/signal.js +++ b/js/modules/signal.js @@ -60,9 +60,6 @@ const { const { SessionToast } = require('../../ts/components/session/SessionToast'); const { SessionToggle } = require('../../ts/components/session/SessionToggle'); const { SessionModal } = require('../../ts/components/session/SessionModal'); -const { - SessionQRModal, -} = require('../../ts/components/session/SessionQRModal'); const { SessionSeedModal, } = require('../../ts/components/session/SessionSeedModal'); @@ -304,7 +301,6 @@ exports.setup = (options = {}) => { SessionToggle, SessionConfirm, SessionModal, - SessionQRModal, SessionSeedModal, SessionPasswordModal, SessionPasswordPrompt, diff --git a/js/views/app_view.js b/js/views/app_view.js index b7a349bd3..8a254c641 100644 --- a/js/views/app_view.js +++ b/js/views/app_view.js @@ -169,12 +169,6 @@ const dialog = new Whisper.SeedDialogView(); this.el.prepend(dialog.el); }, - showQRDialog(string) { - const dialog = new Whisper.QRDialogView({ - value: string, - }); - this.el.append(dialog.el); - }, showDevicePairingDialog(options) { const dialog = new Whisper.DevicePairingDialogView(options); this.el.prepend(dialog.el); diff --git a/js/views/qr_dialog_view.js b/js/views/qr_dialog_view.js deleted file mode 100644 index 6019f87c9..000000000 --- a/js/views/qr_dialog_view.js +++ /dev/null @@ -1,36 +0,0 @@ -/* global Whisper */ - -// eslint-disable-next-line func-names -(function() { - 'use strict'; - - window.Whisper = window.Whisper || {}; - - Whisper.QRDialogView = Whisper.View.extend({ - className: 'loki-dialog qr-dialog modal', - initialize(options) { - this.value = options.value || ''; - this.close = this.close.bind(this); - - this.render(); - }, - - render() { - this.dialogView = new Whisper.ReactWrapperView({ - className: 'qr-dialog-wrapper', - Component: window.Signal.Components.SessionQRModal, - props: { - value: this.value, - onClose: this.close, - }, - }); - - this.$el.append(this.dialogView.el); - return this; - }, - - close() { - this.remove(); - }, - }); -})(); diff --git a/test/index.html b/test/index.html index 7d9622297..3419dd3f9 100644 --- a/test/index.html +++ b/test/index.html @@ -423,7 +423,6 @@ - diff --git a/ts/components/EditProfileDialog.tsx b/ts/components/EditProfileDialog.tsx index 349d0db57..7eb7fa0e3 100644 --- a/ts/components/EditProfileDialog.tsx +++ b/ts/components/EditProfileDialog.tsx @@ -134,7 +134,7 @@ export class EditProfileDialog extends React.Component { )} diff --git a/ts/components/session/SessionQRModal.tsx b/ts/components/session/SessionQRModal.tsx deleted file mode 100644 index dc71ee4cd..000000000 --- a/ts/components/session/SessionQRModal.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import React from 'react'; -import { QRCode } from 'react-qr-svg'; - -import { SessionModal } from './SessionModal'; -import { SessionButton } from './SessionButton'; -import { SessionHtmlRenderer } from './SessionHTMLRenderer'; - -interface Props { - value: string; - onClose: any; -} - -export class SessionQRModal extends React.Component { - constructor(props: any) { - super(props); - } - public render() { - const { value, onClose } = this.props; - - // Foreground equivalent to .session-modal background color - const bgColor = '#FFFFFF'; - const fgColor = '#1B1B1B'; - - return ( - null} - onClose={onClose} - > -
- -
- -
-
- -
- -
- -
-
- -
- - ); - } -} diff --git a/ts/window.d.ts b/ts/window.d.ts index d6b245677..85891830e 100644 --- a/ts/window.d.ts +++ b/ts/window.d.ts @@ -79,7 +79,6 @@ declare global { shortenPubkey: any; showEditProfileDialog: any; showPasswordDialog: any; - showQRDialog: any; showSeedDialog: any; storage: any; textsecure: LibTextsecure; From b1e29cc89fcbd56ddbe9883c93bbaa6d8b5714b7 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 26 Aug 2020 10:48:35 +1000 Subject: [PATCH 095/274] refactor scss --- stylesheets/_avatar.scss | 198 ++++++++++++++++++++++ stylesheets/_conversation.scss | 197 ++------------------- stylesheets/_global.scss | 74 +------- stylesheets/_modal.scss | 219 ++++++++++++++++++++++++ stylesheets/_modules.scss | 291 +++----------------------------- stylesheets/_options.scss | 2 - stylesheets/_progress.scss | 0 stylesheets/_recorder.scss | 12 +- stylesheets/_session.scss | 130 ++------------ stylesheets/_session_theme.scss | 19 ++- stylesheets/_theme_dark.scss | 258 ++++------------------------ stylesheets/_variables.scss | 115 ------------- stylesheets/manifest.scss | 5 +- stylesheets/themes.scss | 10 +- 14 files changed, 533 insertions(+), 997 deletions(-) create mode 100644 stylesheets/_avatar.scss delete mode 100644 stylesheets/_options.scss delete mode 100644 stylesheets/_progress.scss diff --git a/stylesheets/_avatar.scss b/stylesheets/_avatar.scss new file mode 100644 index 000000000..e21c40298 --- /dev/null +++ b/stylesheets/_avatar.scss @@ -0,0 +1,198 @@ + +// Module: Avatar + +.module-avatar { + position: relative; + vertical-align: middle; + display: inline-block; + border-radius: 50%; + + img { + object-fit: cover; + border-radius: 50%; + } +} + +.module-avatar__label { + width: 100%; + text-align: center; + font-weight: 300; + text-transform: uppercase; + color: $color-white; +} + +.module-avatar__icon { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +.module-avatar__icon--crown-wrapper { + position: relative; + bottom: -38px; + right: -16px; + height: 21px; + width: 21px; + transform: translate(25%, 25%); + padding: 9%; + background-color: $color-white; + border-radius: 50%; + filter: drop-shadow(0px 0px 4px rgba(0, 0, 0, 0.3)); +} + +.module-avatar__icon--crown { + @include color-svg('../images/crown.svg', #ffb000); + height: 100%; + width: 100%; +} + +.module-avatar__icon--group { + @include color-svg('../images/profile-group.svg', $color-white); +} + +.module-avatar__icon--direct { + @include color-svg('../images/profile-individual.svg', $color-white); +} + +.module-avatar--28 { + height: 28px; + width: 28px; + + img { + height: 28px; + width: 28px; + } +} + +.module-avatar__label--28 { + font-size: 14px; + line-height: 28px; +} + +.module-avatar__icon--28 { + height: 16px; + width: 16px; +} + +.module-avatar--36 { + height: 36px; + width: 36px; + + img { + height: 36px; + width: 36px; + } +} + +.module-avatar__label--36 { + margin-top: 1px; + width: 36px; + font-size: 16px; + letter-spacing: 0.19px; + line-height: 36px; +} + +.module-avatar__icon--36 { + height: 20px; + width: 20px; +} + +.module-avatar--48 { + height: 48px; + width: 48px; + + img { + height: 48px; + width: 48px; + } +} + +.module-avatar__label--48 { + width: 48px; + font-size: 20px; + letter-spacing: 0.19px; + line-height: 48px; +} + +.module-avatar__icon--48 { + height: 26px; + width: 26px; +} + +.module-avatar--80 { + height: 80px; + width: 80px; + + img { + height: 80px; + width: 80px; + } +} + +.module-avatar__label--80 { + width: 80px; + font-size: 40px; + line-height: 82px; +} + +.module-avatar__icon--80 { + height: 42px; + width: 42px; +} + +.module-avatar--300 { + height: 300px; + width: 300px; + + img { + height: 300px; + width: 300px; + } +} + +.module-avatar__label--300 { + width: 300px; + font-size: 150px; + line-height: 302px; +} + +.module-avatar__icon--300 { + height: 158px; + width: 158px; +} + +.module-avatar__icon--note-to-self { + width: 70%; + height: 70%; + @include color-svg('../images/note-28.svg', $color-white); +} + + +// Module: Avatar + +.module-avatar__label { + color: $color-gray-05; +} + +.module-avatar__icon--group { + background-color: $color-gray-05; +} + +.module-avatar__icon--direct { + background-color: $color-gray-05; +} + +.module-avatar__icon--note-to-self { + background-color: $color-gray-05; +} + +.module-avatar__icon--crown-wrapper { + background-color: $color-gray-75; +} + +.module-avatar--no-image { + @include themify($themes) { + background-color: themed('steelColorShade'); + } +} \ No newline at end of file diff --git a/stylesheets/_conversation.scss b/stylesheets/_conversation.scss index c4b4112f0..92050084d 100644 --- a/stylesheets/_conversation.scss +++ b/stylesheets/_conversation.scss @@ -64,10 +64,6 @@ overflow-y: auto; } -.discussion-container { - background-color: $color-white; -} - .key-verification { label { display: block; @@ -464,6 +460,11 @@ resize: none; font-size: 1em; font-family: inherit; + + &[disabled='disabled'] { + cursor: not-allowed; + } + } .capture-audio { float: right; @@ -495,190 +496,28 @@ box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.12), 0 0 0 0.5px rgba(0, 0, 0, 0.08); } -.confirmation-dialog { - .content { - max-width: 350px; - margin: 100px auto; - padding: 1em; - background: white; - border-radius: $border-radius; - overflow: auto; - box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, 0.3); - - .buttons { - margin-top: 10px; - - button { - float: right; - margin-left: 10px; - background-color: $grey_l; - border-radius: $border-radius; - padding: 5px 8px; - border: 1px solid $grey_l2; - - &:hover { - background-color: $grey_l2; - border-color: $grey_l3; - } - } - } - } -} - -.loki-dialog { - display: flex; - align-items: center; - justify-content: center; - - .content { - max-width: 75%; - min-width: 60%; - padding: 1em; - background: white; - border-radius: $border-radius; - overflow: auto; - box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, 0.3); - } - - button { - float: right; - margin-left: 10px; - background-color: $color-loki-green; - border-radius: 100px; - padding: 5px 15px; - border: 1px solid $color-loki-green; - color: white; - outline: none; - user-select: none; - - &:hover, - &:disabled { - background-color: $color-loki-green-dark; - border-color: $color-loki-green-dark; - } - - &:disabled { - cursor: not-allowed; - } - } - - input { - width: 100%; - padding: 8px; - margin-bottom: 15px; - border: 0; - outline: none; - border-radius: 4px; - background-color: $color-loki-light-gray; - - &:focus { - outline: none; - } - } - - h4 { - margin-top: 8px; - margin-bottom: 16px; - } -} - -.nickname-dialog { - .message { - font-style: italic; - color: $grey; - font-size: 12px; - margin-bottom: 16px; - } -} - -.seed-dialog { - .title { - font-weight: bold; - } - - .fields { - margin-top: 20px; - } - - .seed { - padding: 20px 0; - font-style: oblique; - } -} - -.permissions-popup, -.debug-log-window { - .modal { - background-color: transparent; - padding: 0; - } - - .confirmation-dialog .content { - box-shadow: 0px 0px 0px 0px; - max-width: 1000px; - margin: 0; - margin-left: auto; - margin-right: auto; - margin-top: 15px; - } -} .module-last-seen-indicator { padding-top: 25px; padding-bottom: 35px; margin-left: 28px; margin-right: 28px; -} -.module-last-seen-indicator__bar { - background-color: $color-light-60; - width: 100%; - height: 2px; -} + &__bar { + background-color: $color-light-60; + width: 100%; + height: 2px; + } -.module-last-seen-indicator__text { - margin-top: 3px; - font-size: 11px; - line-height: 16px; - letter-spacing: 0.3px; - text-transform: uppercase; + &__text { + margin-top: 3px; + font-size: 11px; + line-height: 16px; + letter-spacing: 0.3px; + text-transform: uppercase; - text-align: center; - color: $color-light-90; -} - -.module-scroll-down { - z-index: 100; - position: absolute; - right: 20px; - bottom: 10px; -} - -.module-scroll-down__button { - height: 44px; - width: 44px; - border-radius: 22px; - text-align: center; - background-color: $color-light-35; - border: none; - box-shadow: 0px 3px 5px 0px rgba(0, 0, 0, 0.2); - outline: none; - - &:hover { - background-color: $color-light-45; + text-align: center; + color: $color-light-90; } } -.module-scroll-down__button--new-messages { - background-color: $color-signal-blue; - - &:hover { - background-color: #1472bd; - } -} - -.module-scroll-down__icon { - @include color-svg('../images/down.svg', $color-white); - height: 100%; - width: 100%; -} diff --git a/stylesheets/_global.scss b/stylesheets/_global.scss index fd7ed074f..9fb7e1653 100644 --- a/stylesheets/_global.scss +++ b/stylesheets/_global.scss @@ -13,10 +13,12 @@ body { height: 100%; width: 100%; margin: 0; - font-family: $roboto; + font-family: $session-font-default; font-size: 14px; + } + // scrollbars ::-webkit-scrollbar { width: 9px; @@ -27,10 +29,9 @@ body { @include themify($themes) { background: themed('scrollBarThumb'); border: solid 2px themed('textColorOpposite'); - - &:hover { - background: $color-light-45; - } + } + &:hover { + background: $color-light-45; } } ::-webkit-scrollbar-track { @@ -337,7 +338,7 @@ $loading-height: 16px; right: 0; top: 0; bottom: 0; - font-family: roboto-light; + font-family: $session-font-default; &.overlay { // .modal, used for the settings view, is 100 @@ -365,7 +366,7 @@ $loading-height: 16px; input { margin-bottom: 1em; font-size: 12pt; - font-family: roboto-light; + font-family: $session-font-default; border: 2px solid $blue; padding: 0.5em; text-align: center; @@ -671,18 +672,6 @@ $loading-height: 16px; margin-top: 12px; } - .standalone-mnemonic-inputs { - display: flex; - flex-direction: row; - align-items: center; - margin: 0 8px; - - input { - flex: 1; - margin: 0; - margin-right: 12px; - } - } input { border: 1px solid $color-light-60; @@ -793,39 +782,6 @@ $loading-height: 16px; transition: $session-transition-duration all ease; } } - - .password-inputs, - .standalone-mnemonic-inputs { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - - input { - margin-bottom: 0.5em; - } - - .error { - margin-bottom: 1em; - } - - .error-input { - border: 3px solid $color-vermilion; - - &:focus { - outline: none; - } - } - - .match-input { - border: 3px solid $color-loki-green; - - &:focus { - outline: none; - } - } - } - @media (min-height: 750px) and (min-width: 700px) { .input-header { font-size: 18px; @@ -849,17 +805,3 @@ $loading-height: 16px; .inbox { position: relative; } - -.qr-dialog { - .content { - width: 300px !important; - max-width: none !important; - min-width: auto !important; - } - - #qr { - display: flex; - justify-content: center; - margin-bottom: 1em; - } -} diff --git a/stylesheets/_modal.scss b/stylesheets/_modal.scss index 4754f7cf5..0fa146325 100644 --- a/stylesheets/_modal.scss +++ b/stylesheets/_modal.scss @@ -78,3 +78,222 @@ transition: all 250ms linear; } } + + + + +.loki-dialog { + display: flex; + align-items: center; + justify-content: center; + + .content { + max-width: 75%; + min-width: 60%; + padding: 1em; + background: white; + border-radius: $border-radius; + overflow: auto; + box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, 0.3); + } + + button { + float: right; + margin-left: 10px; + background-color: $color-loki-green; + border-radius: 100px; + padding: 5px 15px; + border: 1px solid $color-loki-green; + color: white; + outline: none; + user-select: none; + + &:hover, + &:disabled { + background-color: $color-loki-green-dark; + border-color: $color-loki-green-dark; + } + + &:disabled { + cursor: not-allowed; + } + } + + input { + width: 100%; + padding: 8px; + margin-bottom: 15px; + border: 0; + outline: none; + border-radius: 4px; + background-color: $color-loki-light-gray; + + &:focus { + outline: none; + } + } + + h4 { + margin-top: 8px; + margin-bottom: 16px; + } +} + +.nickname-dialog { + .message { + font-style: italic; + color: $grey; + font-size: 12px; + margin-bottom: 16px; + } +} + +.seed-dialog { + .title { + font-weight: bold; + } + + .fields { + margin-top: 20px; + } + + .seed { + padding: 20px 0; + font-style: oblique; + } +} + +.permissions-popup, +.debug-log-window { + .modal { + background-color: transparent; + padding: 0; + } +} + + +.loki-dialog { + & ~ .index.inbox { + filter: blur(2px); + transition: filter 0.1s; + } + + input { + color: $color-dark-05; + background-color: $color-dark-70; + border-color: $color-dark-55; + } +} + +.nickname-dialog { + .message { + color: $color-light-35; + } +} + + + +.edit-profile-dialog { + .session-modal__header__title { + font-size: $session-font-lg; + } + + .session-modal { + width: $session-modal-size-md; + + &__header { + height: 68.45px; + } + } + + .avatar-center-inner { + position: relative; + + .module-avatar { + box-shadow: 0 0 23px 0 rgba($session-color-black, 0.78); + } + + .qr-view-button { + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + position: absolute; + right: -3px; + height: 26px; + width: 26px; + border-radius: 50%; + padding-top: 3px; + background-color: $session-color-white; + transition: $session-transition-duration; + + &:hover { + filter: brightness(90%); + } + + .session-icon-button { + opacity: 1; + } + } + } + + .session-id-section { + display: flex; + align-items: center; + flex-direction: column; + + .panel-text-divider { + margin-top: 35px; + margin-bottom: 35px; + } + + &-display { + user-select: text; + text-align: center; + word-break: break-all; + font-size: $session-font-md; + padding: 0px $session-margin-lg; + font-family: $session-font-default; + font-weight: 100; + @include themify($themes) { + color: themed('textColor'); + } + font-size: $session-font-md; + padding: 0px $session-margin-sm; + } + + .session-button { + width: 148px; + } + } + + .profile-name { + display: flex; + justify-content: center; + margin-top: $session-margin-lg; + + &-input { + height: 38px; + width: 142px; + border-radius: 5px; + text-align: center; + font-size: $session-font-md; + @include themify($themes) { + background: themed('inputBackground'); + color: themed('textColor'); + } + } + + &-uneditable { + display: flex; + align-items: center; + justify-content: center; + margin-left: $session-margin-lg; + + p { + font-size: $session-font-md; + padding: 0px $session-margin-sm; + } + } + } +} \ No newline at end of file diff --git a/stylesheets/_modules.scss b/stylesheets/_modules.scss index 085d32668..ba6848d38 100644 --- a/stylesheets/_modules.scss +++ b/stylesheets/_modules.scss @@ -175,7 +175,7 @@ display: inline-block; position: absolute; bottom: 4px; - @include color-svg('../images/error.svg', $color-core-red); + @include color-svg('../images/error.svg', $session-color-danger); } .module-message__error--outgoing { @@ -197,15 +197,6 @@ min-width: 0px; } -.module-message__container--outgoing { - background-color: $color-light-10; -} - -// In case the color gets messed up -.module-message__container--incoming { - background-color: $color-conversation-grey; -} - .module-message__attachment-container { // Entirely to ensure that images are centered if they aren't full width of bubble text-align: center; @@ -306,7 +297,7 @@ height: 16px; width: 16px; - @include color-svg('../images/error-filled.svg', $color-core-red); + @include color-svg('../images/error-filled.svg', $session-color-danger); } .module-message__generic-attachment__icon__extension { @@ -576,7 +567,7 @@ font-weight: 300; font-size: 13px; line-height: 18px; - color: $color-signal-blue; + color: $color-loki-green; background-color: $color-light-02; border: 1px solid $color-black-012; @@ -709,15 +700,6 @@ border-bottom-right-radius: 0px; } -.module-quote--outgoing { - border-left-color: $color-conversation-grey; - background-color: $color-conversation-grey-tint; -} - -.module-quote--incoming { - border-left-color: $color-white; - background-color: $color-conversation-grey-tint; -} .module-quote__primary { flex-grow: 1; @@ -844,19 +826,19 @@ } .module-quote__icon-container__icon--file { - @include color-svg('../images/file.svg', $color-signal-blue); + @include color-svg('../images/file.svg', $color-loki-green); } .module-quote__icon-container__icon--image { - @include color-svg('../images/image.svg', $color-signal-blue); + @include color-svg('../images/image.svg', $color-loki-green); } .module-quote__icon-container__icon--microphone { - @include color-svg('../images/microphone.svg', $color-signal-blue); + @include color-svg('../images/microphone.svg', $color-loki-green); } .module-quote__icon-container__icon--play { - @include color-svg('../images/play.svg', $color-signal-blue); + @include color-svg('../images/play.svg', $color-loki-green); } .module-quote__icon-container__icon--movie { - @include color-svg('../images/movie.svg', $color-signal-blue); + @include color-svg('../images/movie.svg', $color-loki-green); } .module-quote__generic-file { @@ -1179,7 +1161,7 @@ font-weight: 300; line-height: 18px; padding: 12px; - color: $color-signal-blue; + color: $color-loki-green; background-color: $color-light-02; border-radius: 4px; } @@ -1469,7 +1451,7 @@ .module-message-detail__delete-button { @include button-reset; - background-color: $color-core-red; + background-color: $session-color-danger; color: $color-white; box-shadow: 0 0 10px -3px rgba(97, 97, 97, 0.7); border-radius: 5px; @@ -1496,7 +1478,7 @@ } .module-message-detail__contact__error { - color: $color-core-red; + color: $session-color-danger; font-weight: 300; } @@ -1533,7 +1515,7 @@ width: 18px; } .module-message-detail__contact__status-icon--error { - @include color-svg('../images/error.svg', $color-core-red); + @include color-svg('../images/error.svg', $session-color-danger); } .module-message-detail__contact__unidentified-delivery-icon { @@ -1560,7 +1542,7 @@ .module-message-detail__contact__send-anyway { @include button-reset; color: $color-white; - background-color: $color-core-red; + background-color: $session-color-danger; margin-left: 5px; margin-top: 5px; padding: 4px; @@ -1735,7 +1717,7 @@ height: 36px; width: 36px; - @include color-svg('../images/play.svg', $color-signal-blue); + @include color-svg('../images/play.svg', $color-loki-green); } .module-media-grid-item__icon-video { @@ -1778,34 +1760,9 @@ } } -.module-conversation-list-item--has-unread { - padding-left: 12px; - border-left: 4px solid $color-signal-blue; -} - -.module-conversation-list-item--has-friend-request { - padding-left: 12px; - border-left: 4px solid $color-conversation-indigo; -} - -.module-conversation-list-item--is-blocked { - padding-left: 12px; - border-left: 4px solid $color-conversation-red; -} - -.module-conversation-list-item--is-selected { - background-color: $color-dark-70; -} - -.module-conversation-list-item__avatar-container { - position: relative; - margin-top: 8px; - margin-bottom: 8px; -} - .module-conversation-list-item__unread-count { color: $color-white; - background-color: $color-signal-blue; + background-color: $color-loki-green; text-align: center; padding-top: 1px; @@ -1945,218 +1902,10 @@ width: 18px; } .module-conversation-list-item__message__status-icon--error { - @include color-svg('../images/error.svg', $color-core-red); + @include color-svg('../images/error.svg', $session-color-danger); } -// Module: Avatar -.module-avatar { - position: relative; - vertical-align: middle; - display: inline-block; - border-radius: 50%; - - img { - object-fit: cover; - border-radius: 50%; - } -} - -.module-avatar__label { - width: 100%; - text-align: center; - font-weight: 300; - text-transform: uppercase; - color: $color-white; -} - -.module-avatar__icon { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); -} - -.module-avatar__icon--crown-wrapper { - position: relative; - bottom: -38px; - right: -16px; - height: 21px; - width: 21px; - transform: translate(25%, 25%); - padding: 9%; - background-color: $color-white; - border-radius: 50%; - filter: drop-shadow(0px 0px 4px rgba(0, 0, 0, 0.3)); -} - -.module-avatar__icon--crown { - @include color-svg('../images/crown.svg', #ffb000); - height: 100%; - width: 100%; -} - -.module-avatar__icon--group { - @include color-svg('../images/profile-group.svg', $color-white); -} - -.module-avatar__icon--direct { - @include color-svg('../images/profile-individual.svg', $color-white); -} - -.module-avatar--28 { - height: 28px; - width: 28px; - - img { - height: 28px; - width: 28px; - } -} - -.module-avatar__label--28 { - font-size: 14px; - line-height: 28px; -} - -.module-avatar__icon--28 { - height: 16px; - width: 16px; -} - -.module-avatar--36 { - height: 36px; - width: 36px; - - img { - height: 36px; - width: 36px; - } -} - -.module-avatar__label--36 { - margin-top: 1px; - width: 36px; - font-size: 16px; - letter-spacing: 0.19px; - line-height: 36px; -} - -.module-avatar__icon--36 { - height: 20px; - width: 20px; -} - -.module-avatar--48 { - height: 48px; - width: 48px; - - img { - height: 48px; - width: 48px; - } -} - -.module-avatar__label--48 { - width: 48px; - font-size: 20px; - letter-spacing: 0.19px; - line-height: 48px; -} - -.module-avatar__icon--48 { - height: 26px; - width: 26px; -} - -.module-avatar--80 { - height: 80px; - width: 80px; - - img { - height: 80px; - width: 80px; - } -} - -.module-avatar__label--80 { - width: 80px; - font-size: 40px; - line-height: 82px; -} - -.module-avatar__icon--80 { - height: 42px; - width: 42px; -} - -.module-avatar--300 { - height: 300px; - width: 300px; - - img { - height: 300px; - width: 300px; - } -} - -.module-avatar__label--300 { - width: 300px; - font-size: 150px; - line-height: 302px; -} - -.module-avatar__icon--300 { - height: 158px; - width: 158px; -} - -.module-avatar__icon--note-to-self { - width: 70%; - height: 70%; - @include color-svg('../images/note-28.svg', $color-white); -} - -.module-avatar--no-image { - background-color: $color-conversation-grey; -} - -.module-avatar--signal-blue { - background-color: $color-signal-blue; -} -.module-avatar--red { - background-color: $color-conversation-red; -} -.module-avatar--deep_orange { - background-color: $color-conversation-deep_orange; -} -.module-avatar--brown { - background-color: $color-conversation-brown; -} -.module-avatar--pink { - background-color: $color-conversation-pink; -} -.module-avatar--purple { - background-color: $color-conversation-purple; -} -.module-avatar--indigo { - background-color: $color-conversation-indigo; -} -.module-avatar--blue { - background-color: $color-conversation-blue; -} -.module-avatar--teal { - background-color: $color-conversation-teal; -} -.module-avatar--green { - background-color: $color-conversation-green; -} -.module-avatar--light_green { - background-color: $color-conversation-light_green; -} -.module-avatar--blue_grey { - background-color: $color-conversation-blue_grey; -} // Module: Main Header @@ -2427,7 +2176,7 @@ height: 36px; width: 36px; - @include color-svg('../images/play.svg', $color-signal-blue); + @include color-svg('../images/play.svg', $color-loki-green); } .module-image__text-container { @@ -2672,7 +2421,7 @@ margin-top: 5px; text-align: center; - font-family: Roboto; + font-family: $session-font-default; font-size: 14px; overflow: hidden; @@ -2784,14 +2533,14 @@ color: $color-white-07; } &:focus { - border: 1px solid $color-signal-blue; + border: 1px solid $color-loki-green; outline: none; } } .module-caption-editor__save-button { position: absolute; - background-color: $color-signal-blue; + background-color: $color-loki-green; color: $color-white; cursor: pointer; diff --git a/stylesheets/_options.scss b/stylesheets/_options.scss deleted file mode 100644 index 51b78dccd..000000000 --- a/stylesheets/_options.scss +++ /dev/null @@ -1,2 +0,0 @@ -@import 'variables'; -@import 'progress'; diff --git a/stylesheets/_progress.scss b/stylesheets/_progress.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/stylesheets/_recorder.scss b/stylesheets/_recorder.scss index b76a1985e..e490cd292 100644 --- a/stylesheets/_recorder.scss +++ b/stylesheets/_recorder.scss @@ -52,20 +52,20 @@ } .finish { - background: lighten($color-core-green, 20%); - border: 1px solid $color-core-green; + background: lighten($session-color-green, 20%); + border: 1px solid $session-color-green; .icon { - @include color-svg('../images/check.svg', $color-core-green); + @include color-svg('../images/check.svg', $session-color-green); } } .close { - background: lighten($color-core-red, 20%); - border: 1px solid $color-core-red; + background: lighten($session-color-danger, 20%); + border: 1px solid $session-color-danger; .icon { - @include color-svg('../images/x.svg', $color-core-red); + @include color-svg('../images/x.svg', $session-color-danger); } } diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index d163449d9..81f16295d 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -8,11 +8,6 @@ div.spacer-lg { height: $session-margin-lg; } -// Blur for modals -.loki-dialog ~ .index.inbox { - filter: blur(2px); - transition: filter 0.1s; -} .subtle { opacity: 0.6; @@ -912,109 +907,6 @@ label { } } -.edit-profile-dialog { - .session-modal__header__title { - font-size: $session-font-lg; - } - - .session-modal { - width: $session-modal-size-md; - - &__header { - height: 68.45px; - } - } - - .avatar-center-inner { - position: relative; - - .module-avatar { - box-shadow: 0 0 23px 0 rgba($session-color-black, 0.78); - } - - .qr-view-button { - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - position: absolute; - right: -3px; - height: 26px; - width: 26px; - border-radius: 50%; - padding-top: 3px; - background-color: $session-color-white; - transition: $session-transition-duration; - - &:hover { - filter: brightness(90%); - } - - .session-icon-button { - opacity: 1; - } - } - } - - .session-id-section { - display: flex; - align-items: center; - flex-direction: column; - - .panel-text-divider { - margin-top: 35px; - margin-bottom: 35px; - } - - &-display { - user-select: text; - text-align: center; - word-break: break-all; - font-size: $session-font-md; - padding: 0px $session-margin-lg; - font-family: $session-font-default; - font-weight: 100; - @include themify($themes) { - color: themed('textColor'); - } - font-size: $session-font-md; - padding: 0px $session-margin-sm; - } - - .session-button { - width: 148px; - } - } - - .profile-name { - display: flex; - justify-content: center; - margin-top: $session-margin-lg; - - &-input { - height: 38px; - width: 142px; - border-radius: 5px; - text-align: center; - font-size: $session-font-md; - @include themify($themes) { - background: themed('inputBackground'); - } - } - - &-uneditable { - display: flex; - align-items: center; - justify-content: center; - margin-left: $session-margin-lg; - - p { - font-size: $session-font-md; - padding: 0px $session-margin-sm; - } - } - } -} .image-upload-section { display: flex; @@ -1281,14 +1173,6 @@ label { border-radius: 3px; } -.qr-dialog { - &__description { - max-width: $session-modal-size-sm; - text-align: center; - margin: 0 auto; - } -} - .seed-dialog { &__description { max-width: $session-modal-size-lg; @@ -1463,9 +1347,7 @@ input { } } -.loki-dialog button { - border: none; -} + .friend-selection-list { width: 20vw; @@ -1501,9 +1383,17 @@ input { } } + .module-scroll-down { - animation: fadein $session-fadein-duration; + +} + +.module-scroll-down { + z-index: 99; + position: absolute; + right: 20px; bottom: 15px; + animation: fadein $session-fadein-duration; .session-icon-button { display: flex; diff --git a/stylesheets/_session_theme.scss b/stylesheets/_session_theme.scss index b1a359096..7320dd4e5 100644 --- a/stylesheets/_session_theme.scss +++ b/stylesheets/_session_theme.scss @@ -1,11 +1,14 @@ // Messages @import 'themes.scss'; -.discussion-container { - @include themify($themes) { - background: none; - } -} +// body.dark-theme { +// @include themify($themes) { +// background-color: themed('cellBackground'); +// } +// color: red; + +// background-color: blue +// } .conversation { background: none !important; @@ -117,16 +120,14 @@ .inbox { @include themify($themes) { background: themed('inboxBackground'); + color: themed('textColor'); } } .conversation { - background: none !important; + background: none; } -.discussion-container { - background-color: #141414; -} @mixin session-h-title { @include fontAccentBold(); diff --git a/stylesheets/_theme_dark.scss b/stylesheets/_theme_dark.scss index bf7737459..20a60cb27 100644 --- a/stylesheets/_theme_dark.scss +++ b/stylesheets/_theme_dark.scss @@ -1,20 +1,5 @@ -// Don't forget to handle the background of the popup windows! -body.dark-theme { - background-color: $color-black; - color: $color-gray-05; -} - .dark-theme { // _conversation - - .conversation { - background-color: $color-gray-95; - } - - .discussion-container { - background-color: $color-gray-95; - } - .key-verification { .key { color: $color-dark-05; @@ -33,84 +18,6 @@ body.dark-theme { } } - .bottom-bar { - form.send { - &.video-attachment { - .outer { - .play.icon { - @include color-svg('../images/play.svg', white); - } - } - } - } - - .send-message { - outline: 0; - - &[disabled='disabled'] { - cursor: not-allowed; - } - } - } - - .toast { - background-color: $color-gray-45; - color: $color-white; - box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.12), - 0 0 0 0.5px rgba(0, 0, 0, 0.08); - } - - .confirmation-dialog { - .content { - background: $color-black; - color: $color-dark-05; - - .buttons { - button { - background-color: $color-dark-85; - border-radius: $border-radius; - border: 1px solid $color-dark-60; - color: $color-dark-05; - - &:hover { - background-color: $color-dark-70; - border-color: $color-dark-55; - } - } - } - } - } - - .loki-dialog { - .content { - background: $color-black; - color: $color-dark-05; - } - - button { - background-color: $color-dark-85; - border-radius: $border-radius; - color: $color-dark-05; - - &:hover { - background-color: $color-dark-70; - border-color: $color-dark-55; - } - } - - input { - color: $color-dark-05; - background-color: $color-dark-70; - border-color: $color-dark-55; - } - } - - .nickname-dialog { - .message { - color: $color-light-35; - } - } - .module-last-seen-indicator__bar { background-color: #353535; } @@ -119,27 +26,6 @@ body.dark-theme { color: $color-dark-30; } - .module-scroll-down__button { - background-color: $color-light-35; - box-shadow: 0px 3px 5px 0px rgba(0, 0, 0, 0.2); - - &:hover { - background-color: $color-light-45; - } - } - - .module-scroll-down__button--new-messages { - background-color: $color-signal-blue; - - &:hover { - background-color: #1472bd; - } - } - - .module-scroll-down__icon { - @include color-svg('../images/down.svg', $color-white); - } - // _debugLog .debug-log { @@ -266,6 +152,7 @@ body.dark-theme { } } + // banner shown when app version expired and must be updated .expiredAlert { background: $session-color-green; color: black; @@ -384,10 +271,6 @@ body.dark-theme { } // _index - - .gutter { - background-color: $color-dark-85; - } .network-status-container { .network-status { background: url('../images/error_red.svg') no-repeat left 10px center; @@ -539,7 +422,7 @@ body.dark-theme { } .module-message__error { - @include color-svg('../images/error.svg', $color-core-red); + @include color-svg('../images/error.svg', $session-color-danger); } .module-message__img-border-overlay { @@ -580,7 +463,7 @@ body.dark-theme { } .module-message__video-overlay__play-icon { - @include color-svg('../images/play.svg', $color-signal-blue); + @include color-svg('../images/play.svg', $color-loki-green); } .module-message__broken-video-screenshot { @@ -655,7 +538,7 @@ body.dark-theme { } .module-message__send-message-button { - color: $color-signal-blue; + color: $color-loki-green; background-color: $color-dark-70; border: 1px solid $color-dark-60; } @@ -714,13 +597,17 @@ body.dark-theme { // Module: Quoted Reply .module-quote--outgoing { - border-left-color: $color-conversation-grey; - background-color: $color-conversation-grey-shade; + @include themify($themes) { + border-left-color: themed('steelColor'); + background-color: themed('steelColorShade'); + } } .module-quote--incoming { - border-left-color: $color-black; - background-color: $color-conversation-grey-shade; + @include themify($themes) { + border-left-color: themed('steelColor'); + background-color: themed('steelColorShade'); + } } .module-quote__primary__author { @@ -752,19 +639,19 @@ body.dark-theme { } .module-quote__icon-container__icon--file { - @include color-svg('../images/file.svg', $color-signal-blue); + @include color-svg('../images/file.svg', $color-loki-green); } .module-quote__icon-container__icon--image { - @include color-svg('../images/image.svg', $color-signal-blue); + @include color-svg('../images/image.svg', $color-loki-green); } .module-quote__icon-container__icon--microphone { - @include color-svg('../images/microphone.svg', $color-signal-blue); + @include color-svg('../images/microphone.svg', $color-loki-green); } .module-quote__icon-container__icon--play { - @include color-svg('../images/play.svg', $color-signal-blue); + @include color-svg('../images/play.svg', $color-loki-green); } .module-quote__icon-container__icon--movie { - @include color-svg('../images/movie.svg', $color-signal-blue); + @include color-svg('../images/movie.svg', $color-loki-green); } .module-quote__generic-file__text { @@ -843,7 +730,7 @@ body.dark-theme { } .module-verification-notification__button { - color: $color-signal-blue; + color: $color-loki-green; background-color: $color-gray-75; } @@ -918,14 +805,14 @@ body.dark-theme { } .module-message-detail__delete-button { - background-color: $color-core-red; + background-color: $session-color-danger; color: $color-white; box-shadow: 0 0 10px -3px rgba(97, 97, 97, 0.7); border: solid 1px $color-light-35; } .module-message-detail__contact__error { - color: $color-core-red; + color: $session-color-danger; } .module-message-detail__contact__status-icon--sending { @@ -942,7 +829,7 @@ body.dark-theme { @include color-svg('../images/read.svg', $color-light-35); } .module-message-detail__contact__status-icon--error { - @include color-svg('../images/error.svg', $color-core-red); + @include color-svg('../images/error.svg', $session-color-danger); } .module-message-detail__contact__show-safety-number { @@ -951,7 +838,7 @@ body.dark-theme { } .module-message-detail__contact__send-anyway { color: $color-white; - background-color: $color-core-red; + background-color: $session-color-danger; } // Module: Media Gallery @@ -961,7 +848,7 @@ body.dark-theme { } .module-media-gallery__tab--active { - border-bottom: 2px solid $color-signal-blue; + border-bottom: 2px solid $color-loki-green; } // Module: Document List Item @@ -1000,22 +887,12 @@ body.dark-theme { // Module: Conversation List Item - .module-conversation-list-item { - &:hover { - background-color: $color-dark-70; - } - } - .module-conversation-list-item--has-unread { - border-left: 4px solid $color-signal-blue; - } - - .module-conversation-list-item--has-friend-request { - border-left: 4px solid $color-conversation-indigo; + border-left: 4px solid $color-loki-green; } .module-conversation-list-item--is-blocked { - border-left: 4px solid $color-conversation-red; + border-left: 4px solid $session-color-danger; } .module-conversation-list-item--is-selected { @@ -1024,7 +901,7 @@ body.dark-theme { .module-conversation-list-item__unread-count { color: $color-white; - background-color: $color-signal-blue; + background-color: $color-loki-green; box-shadow: 0px 0px 0px 1px $color-dark-85; } @@ -1064,32 +941,6 @@ body.dark-theme { width: 18px; } - // Module: Avatar - - .module-avatar__label { - color: $color-gray-05; - } - - .module-avatar__icon--group { - background-color: $color-gray-05; - } - - .module-avatar__icon--direct { - background-color: $color-gray-05; - } - - .module-avatar__icon--note-to-self { - background-color: $color-gray-05; - } - - .module-avatar__icon--crown-wrapper { - background-color: $color-gray-75; - } - - .module-avatar--no-image { - background-color: $color-conversation-grey-shade; - } - // Module: Main Header .module-main-header__search__input { @@ -1108,10 +959,6 @@ body.dark-theme { } } - .module-main-header__search__icon { - @include color-svg('../images/search.svg', $color-gray-25); - } - .module-main-header__search__cancel-icon { @include color-svg('../images/x-16.svg', $color-gray-25); } @@ -1130,7 +977,6 @@ body.dark-theme { background-color: $color-white-015; } - // Module: Image Grid // Module: Typing Animation @@ -1247,13 +1093,13 @@ body.dark-theme { color: $color-white-07; } &:focus { - border: 1px solid $color-signal-blue; + border: 1px solid $color-loki-green; outline: none; } } .module-caption-editor__save-button { - background-color: $color-signal-blue; + background-color: $color-loki-green; color: $color-white; } @@ -1295,43 +1141,7 @@ body.dark-theme { color: $color-gray-05; } - // Third-party module: react-contextmenu - .react-contextmenu { - background-color: $color-dark-85; - border: 1px solid $color-light-60; - } - - .react-contextmenu-item { - color: $color-dark-05; - } - - .react-contextmenu-item--checked:before { - color: $color-dark-05; - } - - .react-contextmenu-item.react-contextmenu-submenu - > .react-contextmenu-item:after { - color: $color-dark-05; - } - - .react-contextmenu-item.react-contextmenu-item--active, - .react-contextmenu-item.react-contextmenu-item--selected { - color: $color-white; - background-color: $color-light-35; - } - - .react-contextmenu-item.react-contextmenu-item--active.react-contextmenu-item--checked:before, - .react-contextmenu-item.react-contextmenu-item--selected.react-contextmenu-item--checked:before { - color: $color-white; - } - - .react-contextmenu-item.react-contextmenu-submenu - > .react-contextmenu-item.react-contextmenu-item--active:after, - .react-contextmenu-item.react-contextmenu-submenu - > .react-contextmenu-item.react-contextmenu-item--selected:after { - color: $color-white; - } .capture-audio { .microphone { @@ -1344,20 +1154,20 @@ body.dark-theme { background: $color-black; .finish { - background: lighten($color-core-green, 20%); - border: 1px solid $color-core-green; + background: lighten($session-color-green, 20%); + border: 1px solid $session-color-green; .icon { - @include color-svg('../images/check.svg', $color-core-green); + @include color-svg('../images/check.svg', $session-color-green); } } .close { - background: lighten($color-core-red, 20%); - border: 1px solid $color-core-red; + background: lighten($session-color-danger, 20%); + border: 1px solid $session-color-danger; .icon { - @include color-svg('../images/x.svg', $color-core-red); + @include color-svg('../images/x.svg', $session-color-danger); } } diff --git a/stylesheets/_variables.scss b/stylesheets/_variables.scss index b97a6035f..3fb821fda 100644 --- a/stylesheets/_variables.scss +++ b/stylesheets/_variables.scss @@ -1,31 +1,3 @@ -@font-face { - font-family: 'Roboto-Light'; - src: url('../fonts/Roboto-Light.ttf') format('truetype'); -} -@font-face { - font-family: 'Roboto'; - src: url('../fonts/Roboto-Regular.ttf') format('truetype'); -} -@font-face { - font-family: 'Roboto'; - src: url('../fonts/Roboto-Medium.ttf') format('truetype'); - font-weight: 300; -} -@font-face { - font-family: 'Roboto'; - src: url('../fonts/Roboto-Italic.ttf') format('truetype'); - font-style: italic; -} -@font-face { - font-family: 'Roboto'; - src: url('../fonts/Roboto-Bold.ttf') format('truetype'); - font-weight: bold; -} - -$roboto: Roboto, 'Helvetica Neue', 'Source Sans Pro', 'Source Han Sans SC', - 'Source Han Sans CN', 'Hiragino Sans GB', 'Hiragino Kaku Gothic', - 'Microsoft Yahei UI', Helvetica, Arial, sans-serif; - // Loki colors $color-loki-light-gray: #e9e9e9; $color-loki-dark-gray: #323232; @@ -38,15 +10,6 @@ $color-loki-green-gradient: linear-gradient( rgb(0, 133, 34) 100% ); -// New colors - -$color-signal-blue: #2090ea; -$color-core-green: #4caf50; -$color-core-red: #f44336; - -$color-signal-blue-025: rgba($color-signal-blue, 0.25); -$color-signal-blue-050: rgba($color-signal-blue, 0.5); - $color-white: #ffffff; $color-gray-02: #f8f9f9; $color-gray-05: #eeefef; @@ -60,44 +23,6 @@ $color-gray-90: #17191d; $color-gray-95: #0f1012; $color-black: #000000; -$color-crimson: #cc163d; -$color-vermilion: #c73800; -$color-burlap: #746c53; -$color-forest: #3b7845; -$color-wintergreen: #1c8260; -$color-teal: #067589; -$color-blue: #336ba3; -$color-indigo: #5951c8; -$color-violet: #862caf; -$color-plum: #a23474; -$color-taupe: #895d66; -$color-steel: #6b6b78; - -$color-crimson-tint: #eda6ae; -$color-vermilion-tint: #eba78e; -$color-burlap-tint: #c4b997; -$color-forest-tint: #8fcc9a; -$color-wintergreen-tint: #9bcfbd; -$color-teal-tint: #a5cad5; -$color-blue-tint: #adc8e1; -$color-indigo-tint: #c2c1e7; -$color-violet-tint: #cdaddc; -$color-plum-tint: #dcb2ca; -$color-taupe-tint: #cfb5bb; -$color-steel-tint: #bebec6; - -$color-crimson-shade: #8a0f29; -$color-vermilion-shade: #872600; -$color-burlap-shade: #58513c; -$color-forest-shade: #2b5934; -$color-wintergreen-shade: #36544a; -$color-teal-shade: #055968; -$color-blue-shade: #285480; -$color-indigo-shade: #4840a0; -$color-violet-shade: #6b248a; -$color-plum-shade: #881b5b; -$color-taupe-shade: #6a4e54; -$color-steel-shade: #5a5a63; $color-white-015: rgba($color-white, 0.15); $color-white-02: rgba($color-white, 0.2); @@ -135,46 +60,6 @@ $color-black-02: rgba($color-black, 0.2); $color-black-04: rgba($color-black, 0.4); $color-black-06: rgba($color-black, 0.6); -$color-signal-blue-mix: mix($color-signal-blue-025, $color-white-04); - -$color-conversation-red: $color-crimson; -$color-conversation-deep_orange: $color-vermilion; -$color-conversation-brown: $color-burlap; -$color-conversation-pink: $color-plum; -$color-conversation-purple: $color-violet; -$color-conversation-indigo: $color-indigo; -$color-conversation-blue: $color-blue; -$color-conversation-teal: $color-teal; -$color-conversation-green: $color-forest; -$color-conversation-light_green: $color-wintergreen; -$color-conversation-blue_grey: $color-taupe; -$color-conversation-grey: $color-steel; - -$color-conversation-red-tint: $color-crimson-tint; -$color-conversation-deep_orange-tint: $color-vermilion-tint; -$color-conversation-brown-tint: $color-burlap-tint; -$color-conversation-pink-tint: $color-plum-tint; -$color-conversation-purple-tint: $color-violet-tint; -$color-conversation-indigo-tint: $color-indigo-tint; -$color-conversation-blue-tint: $color-blue-tint; -$color-conversation-teal-tint: $color-teal-tint; -$color-conversation-green-tint: $color-forest-tint; -$color-conversation-light_green-tint: $color-wintergreen-tint; -$color-conversation-blue_grey-tint: $color-taupe-tint; -$color-conversation-grey-tint: $color-steel-tint; - -$color-conversation-red-shade: $color-crimson-shade; -$color-conversation-deep_orange-shade: $color-vermilion-shade; -$color-conversation-brown-shade: $color-burlap-shade; -$color-conversation-pink-shade: $color-plum-shade; -$color-conversation-purple-shade: $color-violet-shade; -$color-conversation-indigo-shade: $color-indigo-shade; -$color-conversation-blue-shade: $color-blue-shade; -$color-conversation-teal-shade: $color-teal-shade; -$color-conversation-green-shade: $color-forest-shade; -$color-conversation-light_green-shade: $color-wintergreen-shade; -$color-conversation-blue_grey-shade: $color-taupe-shade; -$color-conversation-grey-shade: $color-steel-shade; // Old colors diff --git a/stylesheets/manifest.scss b/stylesheets/manifest.scss index 3401b2b16..2719e2e55 100644 --- a/stylesheets/manifest.scss +++ b/stylesheets/manifest.scss @@ -6,13 +6,13 @@ @import 'global'; // Components -@import 'progress'; @import 'modal'; @import 'debugLog'; @import 'lightbox'; @import 'recorder'; @import 'emoji'; @import 'mentions'; +@import 'avatar'; // Build the main view @import 'index'; @@ -36,6 +36,3 @@ @import 'session_group_panel'; @import 'session-slider'; - -// Installer -@import 'options'; diff --git a/stylesheets/themes.scss b/stylesheets/themes.scss index d7ee551db..7707d0749 100644 --- a/stylesheets/themes.scss +++ b/stylesheets/themes.scss @@ -1,3 +1,5 @@ +// 13592 lines for manifest.css on date 25 august + $themes: ( light: ( accent: #00e97b, @@ -46,7 +48,10 @@ $themes: ( // context menu contextMenuBackground: #f5f5f5, filterSessionText: brightness(0) saturate(100%), - ), + + steelColor: #6b6b78, + steelColorShage: #5a5a63, + ), dark: ( accent: #00f782, destructive: #ff453a, @@ -94,6 +99,9 @@ $themes: ( // context menu contextMenuBackground: #212121, filterSessionText: none, + steelColor: #6b6b78, + steelColorShage: #5a5a63, + ), ); From 7942b9410c33f96fdf0754d70d2870c7b22cb87c Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 26 Aug 2020 11:16:51 +1000 Subject: [PATCH 096/274] update russian locale --- _locales/en/messages.json | 2 +- _locales/ru/messages.json | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 37ba354f1..246da91c6 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -984,7 +984,7 @@ "message": "Resend", "description": "Shown on the drop-down menu for an individual message, but only if it is an outgoing message that failed to send", "androidKey": "message_recipients_list_item__resend", - "wordCapitalize": true + "sentenceCase": true }, "deleteMessage": { "message": "Delete Message", diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index 46b355c1d..e02618614 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -292,7 +292,7 @@ "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Ваш код безопасности с $name$ изменился. Это означает, что либо вашу переписку пытаются перехватить, либо $name$ просто переустановил(-а) Session.", + "message": "Ваш код безопасности с $name$ изменился. Это означает, что либо вашу переписку пытаются перехватить, либо $name$ просто переустановил(а) Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -472,7 +472,7 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "Вложение превышает допустимый размер для того типа сообщения, которое вы отправляете.", + "message": "Вложение превышает допустимый размер для данного типа сообщения.", "description": "" }, "unableToLoadAttachment": { @@ -706,7 +706,7 @@ "description": "" }, "resetSession": { - "message": "Сбросить Защищённый Сеанс", + "message": "Обновить Сеанс Шифрования", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." }, "showSafetyNumber": { @@ -810,7 +810,7 @@ "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "Откл. звук уведомлений", + "message": "Отключить звук уведомлений", "description": "Label for disabling notifications" }, "nameAndMessage": { @@ -1028,7 +1028,7 @@ "description": "Displayed in the left pane when the timer is turned off" }, "disabledDisappearingMessages": { - "message": "$name$ отключил исчезающие сообщения.", + "message": "$name$ отключил(а) исчезающие сообщения.", "description": "Displayed in the conversation list when the timer is turned off", "placeholders": { "name": { @@ -1112,7 +1112,7 @@ "description": "" }, "leftTheGroup": { - "message": "$name$ покинул группу.", + "message": "$name$ покинул(a) группу.", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { @@ -1136,7 +1136,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Группа теперь называется «$name$».", + "message": "Название группы поменялось на «$name$».", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1217,7 +1217,7 @@ "message": "Больше информации" }, "resend": { - "message": "Отправить Ещё Раз" + "message": "Отправить ещё раз" }, "clearAllData": { "message": "Очистить все данные" @@ -1238,7 +1238,7 @@ "message": "Предварительный просмотр поддерживается для ссылок Imgur, Instagram, Pinterest, Reddit и YouTube." }, "readReceiptSettingTitle": { - "message": "Уведомления О Прочтении" + "message": "Уведомления о прочтении" }, "typingIndicatorsSettingTitle": { "message": "Индикаторы Ввода" @@ -1319,7 +1319,7 @@ "message": "Познакомьтесь со своим Session ID" }, "allUsersAreRandomly...": { - "message": "Ваш Session ID - это уникальный адрес, который могут использовать другие люди для связи с вами при помощи Session. Поскольку ваш Session ID никак не связан с вашей настоящей личностью, он по определению является полностью анонимным и конфиденциальным." + "message": "Ваш Session ID - это уникальный адрес, который другие пользователи могут использовать для связи с вами при помощи Session. Поскольку ваш Session ID никак не связан с вашей настоящей личностью, он по определению является полностью анонимным и конфиденциальным." }, "generateSessionID": { "message": "Создать Session ID" From fca83b65ccd3824a3141bca74cfebcfdb3aa5eec Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 26 Aug 2020 11:46:12 +1000 Subject: [PATCH 097/274] make min group member 1 on creation --- _locales/en/messages.json | 2 +- _locales/ru/messages.json | 2 +- ts/components/MainViewController.tsx | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 246da91c6..c68901aa2 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -2211,7 +2211,7 @@ "androidKey": "activity_create_closed_group_group_name_too_long_error" }, "pickClosedGroupMember": { - "message": "Please pick at least 2 group members", + "message": "Please pick at least 1 group member", "androidKey": "activity_create_closed_group_not_enough_group_members_error" }, "closedGroupMaxSize": { diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index 5d55993dc..119069859 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -1412,7 +1412,7 @@ "message": "Пожалуйста, введите более короткое имя группы" }, "pickClosedGroupMember": { - "message": "Пожалуйста, выберите как минимум 2 участников группы" + "message": "Пожалуйста, выберите как минимум еще 1 участника группы" }, "closedGroupMaxSize": { "message": "В закрытой группе не может быть больше 10 участников" diff --git a/ts/components/MainViewController.tsx b/ts/components/MainViewController.tsx index 46f34762e..d860a44bd 100644 --- a/ts/components/MainViewController.tsx +++ b/ts/components/MainViewController.tsx @@ -68,9 +68,9 @@ async function createClosedGroup( } // >= because we add ourself as a member AFTER this. so a 10 group is already invalid as it will be 11 with ourself - // the same is valid with groups count <= 1 + // the same is valid with groups count < 1 - if (groupMembers.length <= 1) { + if (groupMembers.length < 1) { ToastUtils.push({ title: window.i18n('pickClosedGroupMember'), type: 'error', From 339bc3597500f00fc68a5ec011d6e06df534f309 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 26 Aug 2020 16:11:43 +1000 Subject: [PATCH 098/274] shorten pubkey when replying to a user --- background.html | 4 ---- ts/components/conversation/Quote.tsx | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/background.html b/background.html index c4ddb734d..e1df4f9a6 100644 --- a/background.html +++ b/background.html @@ -329,10 +329,6 @@ {{/isError}} -<<<<<<< HEAD - -======= ->>>>>>> upstream/clearnet diff --git a/ts/components/conversation/Quote.tsx b/ts/components/conversation/Quote.tsx index a9bf68fae..cf9a27c9e 100644 --- a/ts/components/conversation/Quote.tsx +++ b/ts/components/conversation/Quote.tsx @@ -316,7 +316,7 @@ export class Quote extends React.Component { i18n('you') ) : ( Date: Wed, 26 Aug 2020 16:12:07 +1000 Subject: [PATCH 099/274] refactor quote styles --- stylesheets/_avatar.scss | 4 +- stylesheets/_conversation.scss | 18 +- stylesheets/_global.scss | 3 - stylesheets/_modal.scss | 8 +- stylesheets/_modules.scss | 238 --------------------- stylesheets/_quote.scss | 353 ++++++++++++++++++++++++++++++++ stylesheets/_session.scss | 6 - stylesheets/_session_theme.scss | 6 +- stylesheets/_theme_dark.scss | 86 -------- stylesheets/_variables.scss | 2 - stylesheets/manifest.scss | 1 + stylesheets/themes.scss | 14 +- 12 files changed, 376 insertions(+), 363 deletions(-) create mode 100644 stylesheets/_quote.scss diff --git a/stylesheets/_avatar.scss b/stylesheets/_avatar.scss index e21c40298..02efb2fe3 100644 --- a/stylesheets/_avatar.scss +++ b/stylesheets/_avatar.scss @@ -1,4 +1,3 @@ - // Module: Avatar .module-avatar { @@ -168,7 +167,6 @@ @include color-svg('../images/note-28.svg', $color-white); } - // Module: Avatar .module-avatar__label { @@ -195,4 +193,4 @@ @include themify($themes) { background-color: themed('steelColorShade'); } -} \ No newline at end of file +} diff --git a/stylesheets/_conversation.scss b/stylesheets/_conversation.scss index 92050084d..f4a7c0069 100644 --- a/stylesheets/_conversation.scss +++ b/stylesheets/_conversation.scss @@ -328,12 +328,6 @@ padding-bottom: 40px; } -.bottom-bar .module-quote { - margin: 0; - - border-left-style: none; -} - // We need to use the wrapper because the conversation view calculates the height of all // things in the composition area. A margin on an inner div won't be included in that // height calculation. @@ -464,7 +458,6 @@ &[disabled='disabled'] { cursor: not-allowed; } - } .capture-audio { float: right; @@ -496,7 +489,6 @@ box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.12), 0 0 0 0.5px rgba(0, 0, 0, 0.08); } - .module-last-seen-indicator { padding-top: 25px; padding-bottom: 35px; @@ -504,7 +496,9 @@ margin-right: 28px; &__bar { - background-color: $color-light-60; + @include themify($themes) { + background-color: themed('lastSeenIndicatorColor'); + } width: 100%; height: 2px; } @@ -515,9 +509,9 @@ line-height: 16px; letter-spacing: 0.3px; text-transform: uppercase; - + @include themify($themes) { + color: themed('lastSeenIndicatorTextColor'); + } text-align: center; - color: $color-light-90; } } - diff --git a/stylesheets/_global.scss b/stylesheets/_global.scss index 9fb7e1653..36684af8f 100644 --- a/stylesheets/_global.scss +++ b/stylesheets/_global.scss @@ -15,10 +15,8 @@ body { margin: 0; font-family: $session-font-default; font-size: 14px; - } - // scrollbars ::-webkit-scrollbar { width: 9px; @@ -672,7 +670,6 @@ $loading-height: 16px; margin-top: 12px; } - input { border: 1px solid $color-light-60; border-radius: 4px; diff --git a/stylesheets/_modal.scss b/stylesheets/_modal.scss index 0fa146325..945b65afa 100644 --- a/stylesheets/_modal.scss +++ b/stylesheets/_modal.scss @@ -79,9 +79,6 @@ } } - - - .loki-dialog { display: flex; align-items: center; @@ -171,7 +168,6 @@ } } - .loki-dialog { & ~ .index.inbox { filter: blur(2px); @@ -191,8 +187,6 @@ } } - - .edit-profile-dialog { .session-modal__header__title { font-size: $session-font-lg; @@ -296,4 +290,4 @@ } } } -} \ No newline at end of file +} diff --git a/stylesheets/_modules.scss b/stylesheets/_modules.scss index ba6848d38..41800ed43 100644 --- a/stylesheets/_modules.scss +++ b/stylesheets/_modules.scss @@ -657,242 +657,6 @@ background-color: $color-white; } -// Module: Quoted Reply - -.module-quote-container { - margin-left: -6px; - margin-right: -6px; - margin-top: -4px; - margin-bottom: 5px; -} - -.module-quote-container--with-content-above { - margin-top: 3px; -} - -.module-quote { - position: relative; - border-radius: 4px; - border-top-left-radius: 10px; - border-top-right-radius: 10px; - - cursor: pointer; - display: flex; - flex-direction: row; - align-items: stretch; - overflow: hidden; - - border-left-width: 4px; - border-left-style: solid; -} - -.module-quote--no-click { - cursor: auto; -} - -.module-quote--with-content-above { - border-top-left-radius: 4px; - border-top-right-radius: 4px; -} - -.module-quote--with-reference-warning { - border-bottom-left-radius: 0px; - border-bottom-right-radius: 0px; -} - - -.module-quote__primary { - flex-grow: 1; - padding-left: 8px; - padding-right: 8px; - padding-top: 7px; - padding-bottom: 7px; - - max-width: 100%; -} - -.module-quote__primary__author { - font-size: 13px; - line-height: 18px; - font-weight: 300; - color: $color-gray-90; - - overflow-x: hidden; - white-space: nowrap; - text-overflow: ellipsis; -} - -.module-quote__primary__profile-name { - font-style: italic; -} - -.module-quote__primary__text { - font-size: 14px; - line-height: 18px; - color: $color-gray-90; - text-align: start; - - a { - color: $color-gray-90; - } - - overflow-wrap: break-word; - word-wrap: break-word; - word-break: break-word; - white-space: pre-wrap; - - overflow: hidden; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - - // Note: -webkit-line-clamp doesn't work for RTL text, and it forces you to use - // ... as the truncation indicator. That's not a solution that works well for - // all languages. More resources: - // - http://hackingui.com/front-end/a-pure-css-solution-for-multiline-text-truncation/ - // - https://medium.com/mofed/css-line-clamp-the-good-the-bad-and-the-straight-up-broken-865413f16e5 -} - -.module-quote__primary__type-label { - font-style: italic; - color: $color-gray-90; - font-size: 13px; - line-height: 18px; -} - -.module-quote__primary__filename-label { - font-size: 12px; -} - -.module-quote__close-container { - position: absolute; - top: 4px; - right: 4px; - height: 16px; - width: 16px; - - background-color: rgba(255, 255, 255, 0.75); - border-radius: 50%; -} - -.module-quote__close-button { - width: 100%; - height: 100%; - cursor: pointer; - @include color-svg('../images/x.svg', $grey); -} - -.module-quote__icon-container { - flex: initial; - min-width: 54px; - width: 54px; - max-height: 54px; - position: relative; - - img { - width: 100%; - height: 100%; - object-fit: cover; - } -} - -.module-quote__icon-container__inner { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - - text-align: center; - display: flex; - align-items: center; - justify-content: center; -} - -.module-quote__icon-container__circle-background { - display: flex; - align-items: center; - justify-content: center; - - height: 32px; - width: 32px; - border-radius: 50%; - background-color: $color-white; -} - -.module-quote__icon-container__icon { - width: 24px; - height: 24px; -} - -.module-quote__icon-container__icon--file { - @include color-svg('../images/file.svg', $color-loki-green); -} -.module-quote__icon-container__icon--image { - @include color-svg('../images/image.svg', $color-loki-green); -} -.module-quote__icon-container__icon--microphone { - @include color-svg('../images/microphone.svg', $color-loki-green); -} -.module-quote__icon-container__icon--play { - @include color-svg('../images/play.svg', $color-loki-green); -} -.module-quote__icon-container__icon--movie { - @include color-svg('../images/movie.svg', $color-loki-green); -} - -.module-quote__generic-file { - display: flex; - flex-direction: row; - align-items: center; -} -.module-quote__generic-file__icon { - background: url('../images/file-gradient.svg'); - background-size: 75%; - background-repeat: no-repeat; - height: 28px; - width: 36px; - margin-left: -4px; - margin-right: -6px; - margin-bottom: 5px; -} -.module-quote__generic-file__text { - font-size: 14px; - line-height: 18px; - color: $color-gray-90; - - max-width: calc(100% - 26px); - overflow-x: hidden; - white-space: nowrap; - text-overflow: ellipsis; -} - -.module-quote__reference-warning { - height: 26px; - display: flex; - flex-direction: row; - align-items: center; - - background-color: $color-white-085; - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - padding-left: 8px; - padding-right: 8px; -} - -.module-quote__reference-warning__icon { - height: 16px; - width: 16px; - @include color-svg('../images/broken-link.svg', $color-gray-60); -} - -.module-quote__reference-warning__text { - margin-left: 6px; - color: $color-gray-90; - font-size: 13px; - line-height: 18px; -} - // Module: Embedded Contact .module-embedded-contact { @@ -1905,8 +1669,6 @@ @include color-svg('../images/error.svg', $session-color-danger); } - - // Module: Main Header .module-main-header { diff --git a/stylesheets/_quote.scss b/stylesheets/_quote.scss new file mode 100644 index 000000000..c026e4ec7 --- /dev/null +++ b/stylesheets/_quote.scss @@ -0,0 +1,353 @@ +// This is related to all quote logics +.module-quote { + position: relative; + + cursor: pointer; + display: flex; + flex-direction: row; + align-items: stretch; + overflow: hidden; + + border-left-width: 4px; + border-left-style: solid; + + @include themify($themes) { + border-color: themed('accent'); + } + + &__primary__type-label { + @include themify($themes) { + border-color: themed('textColor'); + } + } +} + +// This is related to the bottomBar quote&mention logic +.bottom-bar .module-quote { + margin: 0; + border-left-style: none; + @include themify($themes) { + background: themed('quoteBottomBarBackground'); + } + + .module-quote__primary__author { + @include themify($themes) { + color: themed('textColor'); + } + } + .module-quote__primary__text { + @include themify($themes) { + @include session-color-subtle(themed('textColor')); + } + a { + @include themify($themes) { + @include session-color-subtle(themed('textColor')); + } + } + } + + // close button when quoting a message + &__close { + &-container { + @include themify($themes) { + background: themed('backgroundPrimary'); + } + } + + &-button { + @include themify($themes) { + @include color-svg('../images/x.svg', themed('foregroundPrimary')); + } + } + } +} + +// This is related to the quote logic inside messages +.module-quote { + &--outgoing { + .module-quote__primary__author { + @include themify($themes) { + color: themed('sentMessageText'); + font-weight: bold; + } + } + .module-quote__primary__text { + @include themify($themes) { + @include session-color-subtle(themed('sentMessageText')); + } + a { + @include themify($themes) { + @include session-color-subtle(themed('sentMessageText')); + } + } + } + } + + &--incoming { + .module-quote__primary__author { + @include themify($themes) { + color: themed('receivedMessageText'); + font-weight: bold; + } + } + .module-quote__primary__text { + @include themify($themes) { + @include session-color-subtle(themed('receivedMessageText')); + } + a { + @include themify($themes) { + @include session-color-subtle(themed('receivedMessageText')); + } + } + } + } +} + +.module-quote__icon-container__icon--file { + @include color-svg('../images/file.svg', $color-loki-green); +} +.module-quote__icon-container__icon--image { + @include color-svg('../images/image.svg', $color-loki-green); +} +.module-quote__icon-container__icon--microphone { + @include color-svg('../images/microphone.svg', $color-loki-green); +} +.module-quote__icon-container__icon--play { + @include color-svg('../images/play.svg', $color-loki-green); +} +.module-quote__icon-container__icon--movie { + @include color-svg('../images/movie.svg', $color-loki-green); +} + +.module-quote__generic-file__text { + color: $color-dark-05; +} + +.module-quote__reference-warning { + background-color: $color-black-06; +} + +.module-quote__reference-warning__icon { + @include color-svg('../images/broken-link.svg', $color-dark-30); +} + +.module-quote__reference-warning__text { + color: $color-dark-05; +} + +.module-quote-container { + margin-left: -6px; + margin-right: -6px; + margin-top: -4px; + margin-bottom: 5px; +} + +.module-quote-container--with-content-above { + margin-top: 3px; +} + +.module-quote--no-click { + cursor: auto; +} + +.module-quote__primary { + flex-grow: 1; + padding-left: 8px; + padding-right: 8px; + padding-top: 7px; + padding-bottom: 7px; + + max-width: 100%; +} + +.module-quote__primary__author { + font-size: 13px; + line-height: 18px; + font-weight: 300; + color: $color-gray-90; + + overflow-x: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.module-quote__primary__profile-name { + font-style: italic; +} + +.module-quote__primary__text { + font-size: 14px; + line-height: 18px; + color: $color-gray-90; + text-align: start; + + a { + color: $color-gray-90; + } + + overflow-wrap: break-word; + word-wrap: break-word; + word-break: break-word; + white-space: pre-wrap; + + overflow: hidden; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + + // Note: -webkit-line-clamp doesn't work for RTL text, and it forces you to use + // ... as the truncation indicator. That's not a solution that works well for + // all languages. More resources: + // - http://hackingui.com/front-end/a-pure-css-solution-for-multiline-text-truncation/ + // - https://medium.com/mofed/css-line-clamp-the-good-the-bad-and-the-straight-up-broken-865413f16e5 +} + +.module-quote__primary__type-label { + font-style: italic; + color: $color-gray-90; + font-size: 13px; + line-height: 18px; +} + +.module-quote__primary__filename-label { + font-size: 12px; +} + +.module-quote__close-container { + position: absolute; + top: 4px; + right: 4px; + height: 16px; + width: 16px; + + background-color: rgba(255, 255, 255, 0.75); + border-radius: 50%; +} + +.module-quote__close-button { + width: 100%; + height: 100%; + cursor: pointer; + @include color-svg('../images/x.svg', $grey); +} + +.module-quote__icon-container { + flex: initial; + min-width: 54px; + width: 54px; + max-height: 54px; + position: relative; + + img { + width: 100%; + height: 100%; + object-fit: cover; + } + + &__inner { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + + text-align: center; + display: flex; + align-items: center; + justify-content: center; + } +} + +.module-quote__icon-container__circle-background { + display: flex; + align-items: center; + justify-content: center; + + height: 32px; + width: 32px; + border-radius: 50%; + background-color: $color-white; +} + +.module-quote__icon-container__icon { + width: 24px; + height: 24px; + + &--file { + @include color-svg('../images/file.svg', $color-loki-green); + } + &--image { + @include color-svg('../images/image.svg', $color-loki-green); + } + &--microphone { + @include color-svg('../images/microphone.svg', $color-loki-green); + } + &--play { + @include color-svg('../images/play.svg', $color-loki-green); + } + &--movie { + @include color-svg('../images/movie.svg', $color-loki-green); + } +} + +.module-quote__generic { + &-file { + display: flex; + flex-direction: row; + align-items: center; + } + &-file__icon { + background: url('../images/file-gradient.svg'); + background-size: 75%; + background-repeat: no-repeat; + height: 28px; + width: 36px; + margin-left: -4px; + margin-right: -6px; + margin-bottom: 5px; + } + &-file__text { + font-size: 14px; + line-height: 18px; + color: $color-gray-90; + + max-width: calc(100% - 26px); + overflow-x: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } +} + +.module-quote__reference { + &-warning { + height: 26px; + display: flex; + flex-direction: row; + align-items: center; + + background-color: $color-white-085; + padding-left: 8px; + padding-right: 8px; + } + + &-warning__icon { + height: 16px; + width: 16px; + @include color-svg('../images/broken-link.svg', $color-gray-60); + } + + &-warning__text { + margin-left: 6px; + color: $color-gray-90; + font-size: 13px; + line-height: 18px; + } +} + +.bottom-bar .member-item { + &:hover { + @include themify($themes) { + background: themed('clickableHovered'); + } + } +} diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index 55253f563..1acd54512 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -8,7 +8,6 @@ div.spacer-lg { height: $session-margin-lg; } - .subtle { opacity: 0.6; } @@ -907,7 +906,6 @@ label { } } - .image-upload-section { display: flex; align-items: center; @@ -1347,8 +1345,6 @@ input { } } - - .friend-selection-list { width: 20vw; } @@ -1364,9 +1360,7 @@ input { } } - .module-scroll-down { - } .module-scroll-down { diff --git a/stylesheets/_session_theme.scss b/stylesheets/_session_theme.scss index 7320dd4e5..a43518ef2 100644 --- a/stylesheets/_session_theme.scss +++ b/stylesheets/_session_theme.scss @@ -114,6 +114,11 @@ &-read-receipt-container { margin-left: 5px; + .session-icon.check { + @include themify($themes) { + fill: themed('sentMessageText'); + } + } } } @@ -128,7 +133,6 @@ background: none; } - @mixin session-h-title { @include fontAccentBold(); } diff --git a/stylesheets/_theme_dark.scss b/stylesheets/_theme_dark.scss index a07fbfda4..d8847fac1 100644 --- a/stylesheets/_theme_dark.scss +++ b/stylesheets/_theme_dark.scss @@ -18,14 +18,6 @@ } } - .module-last-seen-indicator__bar { - background-color: #353535; - } - - .module-last-seen-indicator__text { - color: $color-dark-30; - } - // _debugLog .debug-log { @@ -595,81 +587,6 @@ background-color: $color-dark-05; } - // Module: Quoted Reply - .module-quote--outgoing { - @include themify($themes) { - border-left-color: themed('steelColor'); - background-color: themed('steelColorShade'); - } - } - - .module-quote--incoming { - @include themify($themes) { - border-left-color: themed('steelColor'); - background-color: themed('steelColorShade'); - } - } - - .module-quote__primary__author { - color: $color-dark-05; - } - - .module-quote__primary__text { - color: $color-dark-05; - - a { - color: $color-dark-05; - } - } - - .module-quote__primary__type-label { - color: $color-dark-05; - } - - .module-quote__close-container { - background-color: rgba(255, 255, 255, 0.75); - } - - .module-quote__close-button { - @include color-svg('../images/x.svg', $grey); - } - - .module-quote__icon-container__circle-background { - background-color: $color-white; - } - - .module-quote__icon-container__icon--file { - @include color-svg('../images/file.svg', $color-loki-green); - } - .module-quote__icon-container__icon--image { - @include color-svg('../images/image.svg', $color-loki-green); - } - .module-quote__icon-container__icon--microphone { - @include color-svg('../images/microphone.svg', $color-loki-green); - } - .module-quote__icon-container__icon--play { - @include color-svg('../images/play.svg', $color-loki-green); - } - .module-quote__icon-container__icon--movie { - @include color-svg('../images/movie.svg', $color-loki-green); - } - - .module-quote__generic-file__text { - color: $color-dark-05; - } - - .module-quote__reference-warning { - background-color: $color-black-06; - } - - .module-quote__reference-warning__icon { - @include color-svg('../images/broken-link.svg', $color-dark-30); - } - - .module-quote__reference-warning__text { - color: $color-dark-05; - } - // Module: Embedded Contact .module-embedded-contact__contact-name { @@ -977,7 +894,6 @@ background-color: $color-white-015; } - // Module: Typing Animation .module-typing-animation__dot { @@ -1141,8 +1057,6 @@ color: $color-gray-05; } - - .capture-audio { .microphone { &:before { diff --git a/stylesheets/_variables.scss b/stylesheets/_variables.scss index 3fb821fda..a0a90bd42 100644 --- a/stylesheets/_variables.scss +++ b/stylesheets/_variables.scss @@ -23,7 +23,6 @@ $color-gray-90: #17191d; $color-gray-95: #0f1012; $color-black: #000000; - $color-white-015: rgba($color-white, 0.15); $color-white-02: rgba($color-white, 0.2); $color-white-04: rgba($color-white, 0.4); @@ -60,7 +59,6 @@ $color-black-02: rgba($color-black, 0.2); $color-black-04: rgba($color-black, 0.4); $color-black-06: rgba($color-black, 0.6); - // Old colors $blue_l: #a2d2f4; diff --git a/stylesheets/manifest.scss b/stylesheets/manifest.scss index 2719e2e55..47246ef0c 100644 --- a/stylesheets/manifest.scss +++ b/stylesheets/manifest.scss @@ -26,6 +26,7 @@ // /////////////////// // @import 'modules'; @import 'session'; +@import 'quote'; // Separate screens @import 'session_signin'; diff --git a/stylesheets/themes.scss b/stylesheets/themes.scss index 7707d0749..8dc2cf236 100644 --- a/stylesheets/themes.scss +++ b/stylesheets/themes.scss @@ -48,10 +48,12 @@ $themes: ( // context menu contextMenuBackground: #f5f5f5, filterSessionText: brightness(0) saturate(100%), - steelColor: #6b6b78, - steelColorShage: #5a5a63, - ), + steelColorShade: #5a5a63, + lastSeenIndicatorColor: #62656a, + lastSeenIndicatorTextColor: #070c14, + quoteBottomBarBackground: #f0f0f0, + ), dark: ( accent: #00f782, destructive: #ff453a, @@ -100,8 +102,10 @@ $themes: ( contextMenuBackground: #212121, filterSessionText: none, steelColor: #6b6b78, - steelColorShage: #5a5a63, - + steelColorShade: #5a5a63, + lastSeenIndicatorColor: #353535, + lastSeenIndicatorTextColor: #a8a9aa, + quoteBottomBarBackground: #404040, ), ); From 7bb1007eee9b47a22e5560f06838498c4dbb92ef Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 26 Aug 2020 16:31:54 +1000 Subject: [PATCH 100/274] remove unused clear-data template --- background.html | 29 ------------------------- background_test.html | 35 ------------------------------ stylesheets/_session_password.scss | 1 - test/index.html | 33 ---------------------------- 4 files changed, 98 deletions(-) diff --git a/background.html b/background.html index e1df4f9a6..aadb906e4 100644 --- a/background.html +++ b/background.html @@ -211,35 +211,6 @@
- - - - - - - From 864a9ee5ea62d96172a5cd5283cbc79c799aa6d9 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 27 Aug 2020 14:02:29 +1000 Subject: [PATCH 105/274] make light theme by default on registration --- js/background.js | 2 +- js/views/app_view.js | 7 --- stylesheets/_session_signin.scss | 74 ++++++++++++++++++++++++-------- 3 files changed, 56 insertions(+), 27 deletions(-) diff --git a/js/background.js b/js/background.js index d1aa1b925..b4522661c 100644 --- a/js/background.js +++ b/js/background.js @@ -368,7 +368,7 @@ // These make key operations available to IPC handlers created in preload.js window.Events = { - getThemeSetting: () => storage.get('theme-setting', 'dark'), + getThemeSetting: () => storage.get('theme-setting', 'light'), setThemeSetting: value => { storage.put('theme-setting', value); onChangeTheme(); diff --git a/js/views/app_view.js b/js/views/app_view.js index 8691f722e..f271b2149 100644 --- a/js/views/app_view.js +++ b/js/views/app_view.js @@ -22,18 +22,11 @@ openInbox: 'openInbox', }, applyTheme() { - const iOS = storage.get('userAgent') === 'OWI'; const theme = storage.get('theme-setting') || 'dark'; this.$el .removeClass('light-theme') .removeClass('dark-theme') .addClass(`${theme}-theme`); - - if (iOS) { - this.$el.addClass('ios-theme'); - } else { - this.$el.removeClass('ios-theme'); - } }, applyHideMenu() { const hideMenuBar = storage.get('hide-menu-bar', true); diff --git a/stylesheets/_session_signin.scss b/stylesheets/_session_signin.scss index 115ce2577..ddf2f7524 100644 --- a/stylesheets/_session_signin.scss +++ b/stylesheets/_session_signin.scss @@ -1,6 +1,8 @@ .session { &-fullscreen { - @include session-dark-background; + @include themify($themes) { + background: themed('inboxBackground'); + } overflow-y: auto; height: 100%; } @@ -17,7 +19,9 @@ padding-left: 20px; &-text { - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + } font-family: $session-font-accent; .title { @@ -80,7 +84,9 @@ display: flex; flex-direction: column; align-items: center; - background-color: $session-shade-6; + @include themify($themes) { + background: themed('inputBackground'); + } padding: $session-margin-sm $session-margin-lg; border-radius: 8px; margin-bottom: 0px; @@ -109,7 +115,9 @@ margin-left: auto; margin-right: auto; - color: $session-color-white; + @include themify($themes) { + background: themed('inboxBackground'); + } } &__tab { @@ -118,19 +126,25 @@ padding-bottom: 10px; background-color: transparent; text-align: center; - color: $session-color-white; - border-bottom: 2px solid $session-color-dark-grey; + @include themify($themes) { + border-bottom: themed('borderActionPanel'); + color: themed('textColor'); + } transition: border-color $session-transition-duration linear; line-height: 17px; font-size: 15px; &--active { - border-bottom: $session-element-border-green; + @include themify($themes) { + border-bottom: 4px solid themed('accent'); + } } } @mixin registration-label-mixin { - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + } font-weight: bold; padding: 12px; } @@ -163,7 +177,9 @@ &-input-with-label-container { height: 46.5px; width: 280px; - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + } padding: 2px 0 2px 0; transition: opacity $session-transition-duration; opacity: 1; @@ -172,7 +188,9 @@ label { line-height: 14px; opacity: 0; - color: #737373; + @include themify($themes) { + color: themed('textColor'); + } font-size: 10px; line-height: 11px; position: absolute; @@ -184,7 +202,9 @@ } &.error { - color: red; + @include themify($themes) { + color: themed('destructive'); + } } input { @@ -193,7 +213,9 @@ height: 14px; width: 280px; background: transparent; - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + } font-size: 12px; line-height: 14px; position: absolute; @@ -202,7 +224,9 @@ } hr { - border: 1px solid $session-color-light-grey; + @include themify($themes) { + border: themed('borderActionPanel'); + } width: 100%; position: absolute; bottom: 0px; @@ -218,7 +242,9 @@ &-terms-conditions-agreement { padding-top: $session-margin-md; - color: $session-color-light-grey; + @include themify($themes) { + @include session-color-subtle(themed('textColor')); + } text-align: center; font-size: 12px; @@ -226,15 +252,21 @@ white-space: nowrap; font-weight: bold; text-decoration: none; - color: $session-color-light-grey; + @include themify($themes) { + @include session-color-subtle(themed('textColor')); + } transition: $session-transition-duration; &:visited &:link { - color: $session-color-light-grey; + @include themify($themes) { + @include session-color-subtle(themed('textColor')); + } } &:hover { - color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + } } } } @@ -243,7 +275,9 @@ &-signin-device-pairing-header { padding-top: 10px; padding-bottom: 20px; - color: $session-color-light-grey; + @include themify($themes) { + @include session-color-subtle(themed('textColor')); + } text-align: center; font-size: 12px; line-height: 20px; @@ -288,7 +322,9 @@ [contenteditable='true']:empty::before { content: attr(placeholder); - color: $session-color-light-grey; + @include themify($themes) { + @include session-color-subtle(themed('textColor')); + } font-size: 13px; } From 39941cb0786a9f63280646b2d6c36101e83170cc Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 27 Aug 2020 14:18:24 +1000 Subject: [PATCH 106/274] make registration background a bit darker --- stylesheets/_global.scss | 2 -- stylesheets/_session_left_pane.scss | 10 +++++++--- stylesheets/_session_signin.scss | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/stylesheets/_global.scss b/stylesheets/_global.scss index 5c9c04128..a77b4992a 100644 --- a/stylesheets/_global.scss +++ b/stylesheets/_global.scss @@ -289,8 +289,6 @@ $loading-height: 16px; right: 0; top: 0; bottom: 0; - background-color: white; - color: $color-white; display: flex; align-items: center; user-select: none; diff --git a/stylesheets/_session_left_pane.scss b/stylesheets/_session_left_pane.scss index 35e19929c..5925fdf6d 100644 --- a/stylesheets/_session_left_pane.scss +++ b/stylesheets/_session_left_pane.scss @@ -378,10 +378,14 @@ $session-compose-margin: 20px; } .app-loading-screen { - background: #000; - + @include themify($themes) { + background: themed('inboxBackground'); + } .session-text-logo { - filter: none !important; // force no filter on the text of the app loading + @include themify($themes) { + filter: themed('filterSessionText') !important; + } + // filter: none ; // force no filter on the text of the app loading // as the theme is not set right on the start. // this is to avoid a text color switch on app loading. } diff --git a/stylesheets/_session_signin.scss b/stylesheets/_session_signin.scss index ddf2f7524..d2f5cb353 100644 --- a/stylesheets/_session_signin.scss +++ b/stylesheets/_session_signin.scss @@ -1,7 +1,7 @@ .session { &-fullscreen { @include themify($themes) { - background: themed('inboxBackground'); + background: themed('cellBackground'); } overflow-y: auto; height: 100%; @@ -116,7 +116,7 @@ margin-left: auto; margin-right: auto; @include themify($themes) { - background: themed('inboxBackground'); + background: themed('cellBackground'); } } From 2c0c1016fd573e235e7d01c1d0be416f4f292b84 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 27 Aug 2020 14:23:51 +1000 Subject: [PATCH 107/274] make green button (brand button) filled with black rather than white on light theme --- stylesheets/_session.scss | 2 +- stylesheets/themes.scss | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index 0d56c6c64..879cb4550 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -122,7 +122,7 @@ textarea { &.green { @include themify($themes) { - background-color: themed('accent'); + background-color: themed('accentButton'); } } diff --git a/stylesheets/themes.scss b/stylesheets/themes.scss index afa936090..f6e13c324 100644 --- a/stylesheets/themes.scss +++ b/stylesheets/themes.scss @@ -3,6 +3,7 @@ $themes: ( light: ( accent: #00e97b, + accentButton: #000, destructive: #ff453a, cellBackground: #fcfcfc, modalBackground: #fcfcfc, @@ -52,6 +53,7 @@ $themes: ( ), dark: ( accent: #00f782, + accentButton: #00f782, destructive: #ff453a, cellBackground: #1b1b1b, modalBackground: #101011, From 135cf64b5d2ad9a9644f844feb99527148b4fa14 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 27 Aug 2020 14:29:34 +1000 Subject: [PATCH 108/274] make bottom-buttons leftpane border lighter --- stylesheets/_session_left_pane.scss | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/stylesheets/_session_left_pane.scss b/stylesheets/_session_left_pane.scss index 5925fdf6d..55920d4bb 100644 --- a/stylesheets/_session_left_pane.scss +++ b/stylesheets/_session_left_pane.scss @@ -403,11 +403,8 @@ $session-compose-margin: 20px; flex-grow: 1; height: 51px; - @at-root .light-theme #{&} { - border: 1px solid $session-shade-15; - } - @at-root .dark-theme #{&} { - border: 1px solid $session-shade-6; + @include themify($themes) { + border: themed('borderActionPanel'); } } } From 94bd47fb8cb64d6e31f51cc3fff95f3403472fbf Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 28 Aug 2020 10:08:32 +1000 Subject: [PATCH 109/274] add way to add icon to SessionConfirm dialog --- js/background.js | 2 ++ js/views/session_confirm_view.js | 2 ++ stylesheets/_session.scss | 12 ++++++++---- ts/components/session/ActionsPanel.tsx | 2 -- ts/components/session/SessionConfirm.tsx | 12 ++++++++++++ 5 files changed, 24 insertions(+), 6 deletions(-) diff --git a/js/background.js b/js/background.js index b4522661c..d2f5b7e9b 100644 --- a/js/background.js +++ b/js/background.js @@ -681,6 +681,8 @@ closeTheme: params.closeTheme || undefined, cancelText: params.cancelText || undefined, hideCancel: params.hideCancel || false, + sessionIcon: params.sessionIcon || undefined, + iconSize: params.iconSize || undefined, }); confirmDialog.render(); diff --git a/js/views/session_confirm_view.js b/js/views/session_confirm_view.js index ae31cec29..a86fd3017 100644 --- a/js/views/session_confirm_view.js +++ b/js/views/session_confirm_view.js @@ -21,6 +21,8 @@ okTheme: options.okTheme, closeTheme: options.closeTheme, hideCancel: options.hideCancel, + sessionIcon: options.sessionIcon, + iconSize: options.iconSize, }; }, diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index 879cb4550..1287c75d7 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -100,7 +100,9 @@ textarea { &.default, &.square, &.brand { - color: $session-color-white; + @include themify($themes) { + color: themed('foregroundPrimary'); + } &:not(.disabled):hover { @include themify($themes) { @@ -207,8 +209,10 @@ textarea { border-radius: 500px; &:not(.disabled):hover { - color: $session-color-white; - border-color: $session-color-white; + @include themify($themes) { + color: themed('textColor'); + border-color: themed('textColor'); + } } } @@ -581,7 +585,7 @@ label { @include themify($themes) { background-color: themed('modalBackground'); color: themed('textColor'); - border: 1px solid themed('borderActionPanel'); + border: themed('borderActionPanel'); } overflow: hidden; display: flex; diff --git a/ts/components/session/ActionsPanel.tsx b/ts/components/session/ActionsPanel.tsx index 8b603dabe..661c1b345 100644 --- a/ts/components/session/ActionsPanel.tsx +++ b/ts/components/session/ActionsPanel.tsx @@ -2,8 +2,6 @@ import React from 'react'; import { SessionIconButton, SessionIconSize, SessionIconType } from './icon'; import { Avatar } from '../Avatar'; import { PropsData as ConversationListItemPropsType } from '../ConversationListItem'; -import { MultiDeviceProtocol } from '../../session/protocols'; -import { UserUtil } from '../../util'; import { createOrUpdateItem, getItemById } from '../../../js/modules/data'; export enum SectionType { diff --git a/ts/components/session/SessionConfirm.tsx b/ts/components/session/SessionConfirm.tsx index ed8914c4a..a906a5f3c 100644 --- a/ts/components/session/SessionConfirm.tsx +++ b/ts/components/session/SessionConfirm.tsx @@ -2,6 +2,7 @@ import React from 'react'; import { SessionModal } from './SessionModal'; import { SessionButton, SessionButtonColor } from './SessionButton'; import { SessionHtmlRenderer } from './SessionHTMLRenderer'; +import { SessionIcon, SessionIconSize, SessionIconType } from './icon'; interface Props { message: string; @@ -16,6 +17,8 @@ interface Props { hideCancel: boolean; okTheme: SessionButtonColor; closeTheme: SessionButtonColor; + sessionIcon?: SessionIconType; + iconSize?: SessionIconSize; } export class SessionConfirm extends React.Component { @@ -41,6 +44,8 @@ export class SessionConfirm extends React.Component { onClickOk, onClickClose, hideCancel, + sessionIcon, + iconSize, } = this.props; const okText = this.props.okText || window.i18n('ok'); @@ -62,6 +67,13 @@ export class SessionConfirm extends React.Component { {!showHeader &&
}
+ {sessionIcon && ( +
+ +
+
+ )} + Date: Fri, 28 Aug 2020 10:09:17 +1000 Subject: [PATCH 110/274] add types for window.confirmationDialog --- background.d.ts | 14 ++++++++++++++ ts/window.d.ts | 3 ++- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 background.d.ts diff --git a/background.d.ts b/background.d.ts new file mode 100644 index 000000000..78d1c6119 --- /dev/null +++ b/background.d.ts @@ -0,0 +1,14 @@ +export interface ConfirmationDialogParams { + title?: string; + message: string; + messageSub?: string; + resolve?: any; + reject?: any; + okText?: string; + okTheme?: string; + closeTheme?: string; + cancelText?: string; + hideCancel?: boolean; + sessionIcon?: SessionIconType; + iconSize?: SessionIconSize; + } diff --git a/ts/window.d.ts b/ts/window.d.ts index e4c1b34a4..52a3f7e59 100644 --- a/ts/window.d.ts +++ b/ts/window.d.ts @@ -11,6 +11,7 @@ import { SwarmPolling } from './session/snode_api/swarmPolling'; import { LibTextsecure } from '../libtextsecure'; import { ConversationType } from '../js/modules/data'; import { RecoveryPhraseUtil } from '../libloki/modules/mnemonic'; +import { ConfirmationDialogParams } from '../background'; /* We declare window stuff here instead of global.d.ts because we are importing other declarations. @@ -38,7 +39,7 @@ declare global { attemptConnection: ConversationType; clearLocalData: any; clipboard: any; - confirmationDialog: any; + confirmationDialog: (params: ConfirmationDialogParams) => any; dcodeIO: any; deleteAccount: any; displayNameRegex: any; From d4a954e53f93e3d1e6730ddbdb65a84b0b71e5a5 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 28 Aug 2020 10:10:23 +1000 Subject: [PATCH 111/274] add sun SessionIcon and a MAX size for SessionIconSize --- ts/components/session/icon/Icons.tsx | 7 +++++++ ts/components/session/icon/SessionIcon.tsx | 3 +++ 2 files changed, 10 insertions(+) diff --git a/ts/components/session/icon/Icons.tsx b/ts/components/session/icon/Icons.tsx index 0a95571db..0a55c372c 100644 --- a/ts/components/session/icon/Icons.tsx +++ b/ts/components/session/icon/Icons.tsx @@ -28,6 +28,7 @@ export enum SessionIconType { Search = 'search', Send = 'send', Star = 'star', + Sun = 'sun', QR = 'qr', Users = 'users', Upload = 'upload', @@ -39,6 +40,7 @@ export enum SessionIconSize { Medium = 'medium', Large = 'large', Huge = 'huge', + Max = 'max', } export const icons = { @@ -196,6 +198,11 @@ export const icons = { 'M9.38,2.17c-1.73,0-3.12,1.4-3.12,3.12s1.4,3.12,3.12,3.12s3.12-1.4,3.12-3.12S11.1,2.17,9.38,2.17z M16.93,0.25c2.3,0.59,3.92,2.67,3.92,5.05s-1.61,4.46-3.92,5.05c-0.56,0.14-1.12-0.19-1.27-0.75c-0.14-0.56,0.19-1.12,0.75-1.27 c1.38-0.35,2.35-1.6,2.35-3.03s-0.97-2.67-2.35-3.03c-0.56-0.14-0.9-0.71-0.75-1.27C15.8,0.44,16.37,0.11,16.93,0.25z M9.38,0.08 c2.88,0,5.21,2.33,5.21,5.21s-2.33,5.21-5.21,5.21S4.17,8.17,4.17,5.29C4.17,2.42,6.5,0.08,9.38,0.08z M21.09,12.75 c2.22,0.57,3.8,2.53,3.9,4.81L25,17.79v2.08c0,0.58-0.47,1.04-1.04,1.04c-0.54,0-0.98-0.41-1.04-0.93l-0.01-0.11v-2.08 c0-1.42-0.96-2.67-2.34-3.02c-0.56-0.14-0.89-0.71-0.75-1.27C19.97,12.94,20.54,12.61,21.09,12.75z M13.54,12.58 c2.8,0,5.09,2.21,5.2,4.99v0.22v2.08c0,0.58-0.47,1.04-1.04,1.04c-0.54,0-0.98-0.41-1.04-0.93l-0.01-0.11v-2.08 c0-1.67-1.3-3.03-2.95-3.12h-0.18H5.21c-1.67,0-3.03,1.3-3.12,2.95v0.18v2.08c0,0.58-0.47,1.04-1.04,1.04 c-0.54,0-0.98-0.41-1.04-0.93L0,19.88V17.8c0-2.8,2.21-5.09,4.99-5.2h0.22h8.33V12.58z', viewBox: '0 0 25 21', }, + [SessionIconType.Sun]: { + path: + 'M5.99997005,30 L2.00002995,30 C0.895437462,30 0,30.8955438 0,32 C0,33.1044562 0.895437462,34 2.00002995,34 L5.99997005,34 C7.10444275,34 8,33.1045759 8,32 C8,30.8954241 7.10444275,30 5.99997005,30 Z M61.9999701,30 L58.0000299,30 C56.8955573,30 56,30.8954241 56,32 C56,33.1045759 56.8954375,34 58.0000299,34 L61.9999701,34 C63.1044427,34 64,33.1045759 64,32 C64,30.8954241 63.1045625,30 61.9999701,30 Z M32,56 C30.8955438,56 30,56.8954375 30,58.0000299 L30,61.9999701 C30,63.1044427 30.8954241,64 32,64 C33.1045759,64 34,63.1045625 34,61.9999701 L34,58.0000299 C34,56.8955573 33.1044562,56 32,56 Z M32,0 C30.8955438,0 30,0.895437462 30,2.00002995 L30,5.99997005 C30,7.10444275 30.8954241,8 32,8 C33.1045759,8 34,7.10456254 34,5.99997005 L34,2.00002995 C34,0.895437462 33.1044562,0 32,0 Z M47.7317718,56.7845838 L45.7319182,53.0721056 C45.1797305,52.0469599 43.9566528,51.6955731 43.0002063,52.2875514 C42.0437597,52.8794013 41.7160405,54.1903297 42.2682282,55.2154754 L44.2680818,58.9279535 C44.8205091,59.9536127 46.0439461,60.3041008 46.9997937,59.7125077 C47.9562403,59.1206578 48.2839595,57.8097294 47.7317718,56.7845838 Z M21.7317718,8.78454964 L19.7319182,5.07209798 C19.1797305,4.0469596 17.9566528,3.69557529 17.0002063,4.28754937 C16.0437597,4.87939507 15.7160405,6.19031404 16.2682282,7.21545242 L18.2680818,10.9279041 C18.8205091,11.953556 20.0439461,12.30417 20.9997937,11.7124527 C21.9562403,11.120607 22.2839595,9.80968802 21.7317718,8.78454964 Z M58.9279441,44.2681449 L55.2154404,42.2683526 C54.1901593,41.7159423 52.8793503,42.0437712 52.2874963,43.0003082 C51.6956424,43.9567254 52.0469032,45.1797656 53.0720559,45.7319364 L56.7845596,47.7317287 C57.8091988,48.2837797 59.1203929,47.9566694 59.7125037,46.9997731 C60.3043576,46.0433559 59.9530968,44.8203157 58.9279441,44.2681449 Z M10.9279935,18.2681287 L7.21546334,16.2683276 C6.1901749,15.7159149 4.87922822,16.043865 4.28749839,17.0002864 C3.69564018,17.9567078 4.04690354,19.1797533 5.07206359,19.7319265 L8.78459372,21.7317275 C9.80924022,22.2837809 11.1204437,21.9566692 11.7125587,20.9997687 C12.3042885,20.0433474 11.9531535,18.8203018 10.9279935,18.2681287 Z M59.7125037,17.0002509 C59.1206497,16.0438126 57.8098407,15.7159764 56.7845596,16.2682791 L53.0720559,18.2681157 C52.0469032,18.8202986 51.6956424,20.0433659 52.2874963,20.9998042 C52.8796071,21.9567217 54.1909296,22.2837194 55.2154404,21.731776 L58.9279441,19.7319395 C59.9530968,19.1797565 60.3043576,17.9566893 59.7125037,17.0002509 Z M11.7124767,43.0002066 C11.1207531,42.0437597 9.80969199,41.7160405 8.78454285,42.2682283 L5.07205219,44.2680826 C4.04690304,44.8202704 3.69564342,46.0433485 4.28749534,46.9997953 C4.87960402,47.9567213 6.19092192,48.2837219 7.21542915,47.7317736 L10.9279198,45.7319194 C11.9531973,45.1797315 12.3043286,43.9566534 11.7124767,43.0002066 Z M46.9997937,4.28760336 C46.0432274,3.69550719 44.8202695,4.04701615 44.2680818,5.07214363 L42.2682282,8.78455581 C41.7160405,9.80968329 42.0437597,11.1205883 43.0002063,11.7124277 C43.9561737,12.3041388 45.1794909,11.9536568 45.7319182,10.9278875 L47.7317718,7.21547528 C48.2839595,6.19047618 47.9562403,4.87957115 46.9997937,4.28760336 Z M20.9997937,52.2876314 C20.0433472,51.6955352 18.8201497,52.0469158 18.2680818,53.0721716 L16.2682282,56.7845838 C15.7160405,57.8097113 16.0437597,59.1206163 17.0002063,59.7124557 C17.9561737,60.3041668 19.1794909,59.9535565 19.7319182,58.9279155 L21.7317718,55.2155033 C22.2839595,54.1903758 21.9562403,52.8794708 20.9997937,52.2876314 Z M31.5,12 C20.7477571,12 12,20.7477571 12,31.5 C12,42.2522429 20.7477571,51 31.5,51 C42.2522429,51 51,42.2522429 51,31.5 C51,20.7477571 42.252368,12 31.5,12 Z M31.5,47.6430057 C22.5988336,47.6430057 15.3569943,40.4012983 15.3569943,31.5 C15.3569943,22.5987017 22.5988336,15.3569943 31.5,15.3569943 C40.4011664,15.3569943 47.6430057,22.5988336 47.6430057,31.5 C47.6430057,40.4011664 40.4012983,47.6430057 31.5,47.6430057 Z', + viewBox: '0 0 64 64', + }, [SessionIconType.Upload]: { path: 'M380.032,133.472l-112-128C264.992,2.016,260.608,0,256,0c-4.608,0-8.992,2.016-12.032,5.472l-112,128 c-4.128,4.736-5.152,11.424-2.528,17.152C132.032,156.32,137.728,160,144,160h64v208c0,8.832,7.168,16,16,16h64 c8.832,0,16-7.168,16-16V160h64c6.272,0,11.968-3.648,14.56-9.376C385.152,144.896,384.192,138.176,380.032,133.472z M432,352v96H80v-96H16v128c0,17.696,14.336,32,32,32h416c17.696,0,32-14.304,32-32V352H432z', diff --git a/ts/components/session/icon/SessionIcon.tsx b/ts/components/session/icon/SessionIcon.tsx index de8e7c43c..28844ba19 100644 --- a/ts/components/session/icon/SessionIcon.tsx +++ b/ts/components/session/icon/SessionIcon.tsx @@ -49,6 +49,9 @@ export class SessionIcon extends React.PureComponent { case SessionIconSize.Huge: iconDimensions = '30'; break; + case SessionIconSize.Max: + iconDimensions = '80'; + break; default: iconDimensions = '20'; } From 22b2d8099365ccf90a3baa80ae528fdafb8bcbde Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 28 Aug 2020 10:10:45 +1000 Subject: [PATCH 112/274] make light theme default for existing users and show dialog to revert --- js/views/app_view.js | 2 +- ts/components/session/ActionsPanel.tsx | 35 ++++++++++++++++++++++ ts/components/session/RegistrationTabs.tsx | 7 +++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/js/views/app_view.js b/js/views/app_view.js index f271b2149..144cb3e2c 100644 --- a/js/views/app_view.js +++ b/js/views/app_view.js @@ -22,7 +22,7 @@ openInbox: 'openInbox', }, applyTheme() { - const theme = storage.get('theme-setting') || 'dark'; + const theme = storage.get('theme-setting') || 'light'; this.$el .removeClass('light-theme') .removeClass('dark-theme') diff --git a/ts/components/session/ActionsPanel.tsx b/ts/components/session/ActionsPanel.tsx index 661c1b345..6c4580254 100644 --- a/ts/components/session/ActionsPanel.tsx +++ b/ts/components/session/ActionsPanel.tsx @@ -57,10 +57,45 @@ export class ActionsPanel extends React.Component { }, 'refreshAvatarCallback' ); + + void this.showLightThemeDialogIfNeeded(); } ); } + public async showLightThemeDialogIfNeeded() { + const currentTheme = window.Events.getThemeSetting(); // defaults to light on new registration + if (currentTheme !== 'light') { + const message = 'Light Mode'; + const messageSub = + 'Feeling the dark side more? Just toggle the theme from the bottom-left moon icon.'; + const hasSeenLightMode = await getItemById('hasSeenLightModeDialog'); + + if (hasSeenLightMode?.value === true) { + // if hasSeen is set and true, we have nothing to do + return; + } + // force light them right now, then ask for permission + await window.Events.setThemeSetting('light'); + // FIXME add the SUN icon + window.confirmationDialog({ + message, + messageSub, + resolve: async () => { + const data = { + id: 'hasSeenLightModeDialog', + value: true, + }; + void createOrUpdateItem(data); + }, + okTheme: 'default primary', + hideCancel: true, + sessionIcon: SessionIconType.Sun, + iconSize: SessionIconSize.Max, + }); + } + } + public refreshAvatarCallback(conversation: any) { if (conversation.changed?.profileAvatar) { this.setState({ diff --git a/ts/components/session/RegistrationTabs.tsx b/ts/components/session/RegistrationTabs.tsx index 6faec374e..91c9cd3ce 100644 --- a/ts/components/session/RegistrationTabs.tsx +++ b/ts/components/session/RegistrationTabs.tsx @@ -12,6 +12,7 @@ import { SessionHtmlRenderer } from './SessionHTMLRenderer'; import { SessionIdEditable } from './SessionIdEditable'; import { SessionSpinner } from './SessionSpinner'; import { StringUtils, ToastUtils } from '../../session/utils'; +import { createOrUpdateItem } from '../../../js/modules/data'; enum SignInMode { Default, @@ -862,6 +863,12 @@ export class RegistrationTabs extends React.Component<{}, State> { language, trimName ); + // FIXME remove everything related to hasSeenLightModeDialog at some point in the future (27/08/2020) + const data = { + id: 'hasSeenLightModeDialog', + value: true, + }; + await createOrUpdateItem(data); trigger('openInbox'); } catch (e) { ToastUtils.push({ From 4ec51b55bf1dce61901b96ba66504481e8e4da2d Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 28 Aug 2020 10:42:50 +1000 Subject: [PATCH 113/274] fix delte message overlay size and add subtle function to just compute color --- stylesheets/_session.scss | 3 ++- stylesheets/_session_constants.scss | 6 +++++- stylesheets/_session_theme.scss | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index 1287c75d7..6a2dbe74b 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -463,7 +463,8 @@ label { .session-button.default.danger { display: flex; - width: 80px; + // width: 80px; + margin-right: 0px; } } .message-selection-overlay div[role='button'] { diff --git a/stylesheets/_session_constants.scss b/stylesheets/_session_constants.scss index fc7d64d35..d31cf94d8 100644 --- a/stylesheets/_session_constants.scss +++ b/stylesheets/_session_constants.scss @@ -151,7 +151,11 @@ $session-font-h4: 16px; } @mixin session-color-subtle($color) { - color: rgba($color, 0.6); + color: subtle($color); +} + +@function subtle($color) { + @return rgba($color, 0.6); } // ////////////////////////////////////////////// diff --git a/stylesheets/_session_theme.scss b/stylesheets/_session_theme.scss index a43518ef2..a3bfed84c 100644 --- a/stylesheets/_session_theme.scss +++ b/stylesheets/_session_theme.scss @@ -116,7 +116,7 @@ margin-left: 5px; .session-icon.check { @include themify($themes) { - fill: themed('sentMessageText'); + fill: subtle(themed('sentMessageText')); } } } From 3e62d90e6975cee0952b182236b8d0892bd02028 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 28 Aug 2020 11:20:18 +1000 Subject: [PATCH 114/274] add small shadow to message selected and modal --- stylesheets/_session.scss | 1 + stylesheets/_session_constants.scss | 1 - stylesheets/_session_theme.scss | 3 +-- stylesheets/themes.scss | 14 ++++++-------- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index 6a2dbe74b..7509d2444 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -587,6 +587,7 @@ label { background-color: themed('modalBackground'); color: themed('textColor'); border: themed('borderActionPanel'); + box-shadow: themed('sessionShadow'); } overflow: hidden; display: flex; diff --git a/stylesheets/_session_constants.scss b/stylesheets/_session_constants.scss index d31cf94d8..11aeab0e6 100644 --- a/stylesheets/_session_constants.scss +++ b/stylesheets/_session_constants.scss @@ -119,7 +119,6 @@ $session-color-secondary: $session-shade-6; // Opacity and Shadow $session-shadow-opacity: 0.15; $session-overlay-opacity: 0.3; -$session-dark-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.37); // ////////////////////////////////////////////// // /////////////////// Text ///////////////////// diff --git a/stylesheets/_session_theme.scss b/stylesheets/_session_theme.scss index a3bfed84c..0e5bfa384 100644 --- a/stylesheets/_session_theme.scss +++ b/stylesheets/_session_theme.scss @@ -101,9 +101,8 @@ .module-message { &__container { @include themify($themes) { - background-image: themed('messageSelected'); + box-shadow: themed('sessionShadow'); } - box-shadow: $session-dark-shadow; } &__author { diff --git a/stylesheets/themes.scss b/stylesheets/themes.scss index f6e13c324..d388f5198 100644 --- a/stylesheets/themes.scss +++ b/stylesheets/themes.scss @@ -21,14 +21,13 @@ $themes: ( foregroundPrimary: #fff, buttonGreen: #272726, // conversation view - messageSelected: - linear-gradient(270deg, rgba(#00f480, 1), rgba(#00f480, 0.6)), - composeViewBackground: #fcfcfc, + composeViewBackground: #fcfcfc, composeViewTextFieldBackground: #ededed, receivedMessageBackground: #f5f5f5, - sentMessageBackground: #272726, + sentMessageBackground: #00e97b, receivedMessageText: #000, - sentMessageText: #fff, + sentMessageText: #000, + sessionShadow: 0 0 4px 0 rgba(#000, 0.37), // left pane conversationList: #fff, conversationItemHasUnread: #fcfcfc, @@ -71,14 +70,13 @@ $themes: ( foregroundPrimary: #fff, buttonGreen: #00f782, // conversation view - messageSelected: - linear-gradient(270deg, rgba(#00f480, 1), rgba(#00f480, 0.6)), - composeViewBackground: #1b1b1b, + composeViewBackground: #1b1b1b, composeViewTextFieldBackground: #141414, receivedMessageBackground: #222325, sentMessageBackground: #3f4146, receivedMessageText: #fff, sentMessageText: #fff, + sessionShadow: 0 0 4px 0 rgba(#fff, 0.20), // left pane conversationList: #1b1b1b, conversationItemHasUnread: #2c2c2c, From 3173f01abf622c4f12c4a11c7251eaf051b0e974 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 28 Aug 2020 11:43:08 +1000 Subject: [PATCH 115/274] rename actionPanelBorder to sessionBorder --- stylesheets/_conversation.scss | 6 +++--- stylesheets/_quote.scss | 2 +- stylesheets/_session.scss | 10 +++++----- stylesheets/_session_group_panel.scss | 10 +++++----- stylesheets/_session_left_pane.scss | 4 ++-- stylesheets/_session_signin.scss | 4 ++-- stylesheets/themes.scss | 2 +- 7 files changed, 19 insertions(+), 19 deletions(-) diff --git a/stylesheets/_conversation.scss b/stylesheets/_conversation.scss index f4a7c0069..295d9328c 100644 --- a/stylesheets/_conversation.scss +++ b/stylesheets/_conversation.scss @@ -33,8 +33,8 @@ .main.panel { @include themify($themes) { - border-top: themed('borderActionPanel'); - border-left: themed('borderActionPanel'); + border-top: themed('sessionBorder'); + border-left: themed('sessionBorder'); } .discussion-container { @@ -365,7 +365,7 @@ box-sizing: content-box; $button-width: 36px; @include themify($themes) { - border-top: themed('borderActionPanel'); + border-top: themed('sessionBorder'); } form.send { diff --git a/stylesheets/_quote.scss b/stylesheets/_quote.scss index 7dd7aa323..92570e022 100644 --- a/stylesheets/_quote.scss +++ b/stylesheets/_quote.scss @@ -346,7 +346,7 @@ .bottom-bar .member-item { @include themify($themes) { - border-bottom: themed('borderActionPanel'); + border-bottom: themed('sessionBorder'); } &:hover { diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index 7509d2444..37bf94829 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -586,7 +586,7 @@ label { @include themify($themes) { background-color: themed('modalBackground'); color: themed('textColor'); - border: themed('borderActionPanel'); + border: themed('sessionBorder'); box-shadow: themed('sessionShadow'); } overflow: hidden; @@ -868,12 +868,12 @@ label { &:first-child { @include themify($themes) { - border-top: themed('borderActionPanel'); + border-top: themed('sessionBorder'); } } &:last-child { @include themify($themes) { - border-top: themed('borderActionPanel'); + border-top: themed('sessionBorder'); } } @@ -1058,7 +1058,7 @@ label { @include themify($themes) { background: themed('cellBackground'); color: themed('textColor'); - border-bottom: themed('borderActionPanel'); + border-bottom: themed('sessionBorder'); } &.inline { display: flex; @@ -1331,7 +1331,7 @@ input { height: 64px; background-color: $session-shade-4; @include themify($themes) { - border: themed('borderActionPanel'); + border: themed('sessionBorder'); } display: flex; align-items: center; diff --git a/stylesheets/_session_group_panel.scss b/stylesheets/_session_group_panel.scss index e829cbc51..fcf8d7abf 100644 --- a/stylesheets/_session_group_panel.scss +++ b/stylesheets/_session_group_panel.scss @@ -12,7 +12,7 @@ flex-shrink: 0; @include themify($themes) { background: themed('leftpaneOverlayBackground'); - border-left: themed('borderActionPanel'); + border-left: themed('sessionBorder'); } align-items: center; @@ -44,7 +44,7 @@ @include themify($themes) { color: themed('textColor'); background: themed('cellBackground'); - border: themed('borderActionPanel'); + border: themed('sessionBorder'); } text-align: center; display: none; @@ -58,8 +58,8 @@ @include themify($themes) { color: themed('textColor'); background: themed('cellBackground'); - border-top: themed('borderActionPanel'); - border-bottom: themed('borderActionPanel'); + border-top: themed('sessionBorder'); + border-bottom: themed('sessionBorder'); } width: -webkit-fill-available; padding: 0 $session-margin-md; @@ -87,7 +87,7 @@ align-items: center; @include themify($themes) { border: none; - border-top: themed('borderActionPanel'); + border-top: themed('sessionBorder'); } } diff --git a/stylesheets/_session_left_pane.scss b/stylesheets/_session_left_pane.scss index 55920d4bb..b34d4070d 100644 --- a/stylesheets/_session_left_pane.scss +++ b/stylesheets/_session_left_pane.scss @@ -117,7 +117,7 @@ $session-compose-margin: 20px; display: inline-flex; flex-direction: column; @include themify($themes) { - border-right: themed('borderActionPanel'); + border-right: themed('sessionBorder'); } .module-avatar, @@ -404,7 +404,7 @@ $session-compose-margin: 20px; height: 51px; @include themify($themes) { - border: themed('borderActionPanel'); + border: themed('sessionBorder'); } } } diff --git a/stylesheets/_session_signin.scss b/stylesheets/_session_signin.scss index d2f5cb353..e4d908a3f 100644 --- a/stylesheets/_session_signin.scss +++ b/stylesheets/_session_signin.scss @@ -127,7 +127,7 @@ background-color: transparent; text-align: center; @include themify($themes) { - border-bottom: themed('borderActionPanel'); + border-bottom: themed('sessionBorder'); color: themed('textColor'); } transition: border-color $session-transition-duration linear; @@ -225,7 +225,7 @@ hr { @include themify($themes) { - border: themed('borderActionPanel'); + border: themed('sessionBorder'); } width: 100%; position: absolute; diff --git a/stylesheets/themes.scss b/stylesheets/themes.scss index d388f5198..2828b4738 100644 --- a/stylesheets/themes.scss +++ b/stylesheets/themes.scss @@ -33,7 +33,7 @@ $themes: ( conversationItemHasUnread: #fcfcfc, conversationItemSelected: #f0f0f0, clickableHovered: #dfdfdf, - borderActionPanel: 1px solid #f1f1f1, + sessionBorder: 1px solid #f1f1f1, leftpaneOverlayBackground: #fff, // scrollbars scrollBarTrack: #fcfcfc, From 3e55545d1c9a821a7a49a7194add26a003e44bc2 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 28 Aug 2020 11:43:29 +1000 Subject: [PATCH 116/274] lint --- background.d.ts | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/background.d.ts b/background.d.ts index 78d1c6119..186854e5c 100644 --- a/background.d.ts +++ b/background.d.ts @@ -1,14 +1,14 @@ export interface ConfirmationDialogParams { - title?: string; - message: string; - messageSub?: string; - resolve?: any; - reject?: any; - okText?: string; - okTheme?: string; - closeTheme?: string; - cancelText?: string; - hideCancel?: boolean; - sessionIcon?: SessionIconType; - iconSize?: SessionIconSize; - } + title?: string; + message: string; + messageSub?: string; + resolve?: any; + reject?: any; + okText?: string; + okTheme?: string; + closeTheme?: string; + cancelText?: string; + hideCancel?: boolean; + sessionIcon?: SessionIconType; + iconSize?: SessionIconSize; +} From f305b27320bd2318b709f4c7614437c24ffbaa66 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 28 Aug 2020 11:43:38 +1000 Subject: [PATCH 117/274] add shadow light for dark theme --- stylesheets/themes.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stylesheets/themes.scss b/stylesheets/themes.scss index 2828b4738..0634b30e3 100644 --- a/stylesheets/themes.scss +++ b/stylesheets/themes.scss @@ -76,13 +76,13 @@ $themes: ( sentMessageBackground: #3f4146, receivedMessageText: #fff, sentMessageText: #fff, - sessionShadow: 0 0 4px 0 rgba(#fff, 0.20), + sessionShadow: 0 0 4px 0 rgba(#fff, 0.2), // left pane conversationList: #1b1b1b, conversationItemHasUnread: #2c2c2c, conversationItemSelected: #404040, clickableHovered: #414347, - borderActionPanel: none, + sessionBorder: 1px solid #FFFFFF0F, leftpaneOverlayBackground: linear-gradient(180deg, #171717 0%, #121212 100%), // scrollbars scrollBarTrack: #1b1b1b, From c82d4e5f015071d6c401568be24a451417f77028 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 28 Aug 2020 13:21:07 +1000 Subject: [PATCH 118/274] lint --- stylesheets/themes.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stylesheets/themes.scss b/stylesheets/themes.scss index 0634b30e3..65194d751 100644 --- a/stylesheets/themes.scss +++ b/stylesheets/themes.scss @@ -82,7 +82,7 @@ $themes: ( conversationItemHasUnread: #2c2c2c, conversationItemSelected: #404040, clickableHovered: #414347, - sessionBorder: 1px solid #FFFFFF0F, + sessionBorder: 1px solid #ffffff0f, leftpaneOverlayBackground: linear-gradient(180deg, #171717 0%, #121212 100%), // scrollbars scrollBarTrack: #1b1b1b, From 495683ec3dfaad3e091c032cb0bffc0401f4d9f4 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 28 Aug 2020 15:28:06 +1000 Subject: [PATCH 119/274] fix theme input and cleanup --- stylesheets/_modal.scss | 11 +++-- stylesheets/_session.scss | 26 ++++++++---- stylesheets/_session_left_pane.scss | 11 +---- stylesheets/themes.scss | 63 ++++++++++++++++------------- 4 files changed, 62 insertions(+), 49 deletions(-) diff --git a/stylesheets/_modal.scss b/stylesheets/_modal.scss index 945b65afa..a9814fbef 100644 --- a/stylesheets/_modal.scss +++ b/stylesheets/_modal.scss @@ -175,9 +175,11 @@ } input { - color: $color-dark-05; - background-color: $color-dark-70; - border-color: $color-dark-55; + @include themify($themes) { + background-color: themed('inputBackground'); + color: themed('textColor'); + border: themed('sessionBorder'); + } } } @@ -266,7 +268,7 @@ justify-content: center; margin-top: $session-margin-lg; - &-input { + input { height: 38px; width: 142px; border-radius: 5px; @@ -275,6 +277,7 @@ @include themify($themes) { background: themed('inputBackground'); color: themed('textColor'); + border: themed('sessionBorder'); } } diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index 37bf94829..53d5a64e5 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -1404,8 +1404,9 @@ input { width: 100%; max-height: 400px; overflow-y: auto; - box-shadow: inset 0px 14px 7px -15px $session-color-dark-grey, - inset 0px -14px 7px -15px $session-color-dark-grey; + @include themify($themes) { + border: themed('sessionBorder'); + } } &__selection { @@ -1416,6 +1417,9 @@ input { &__no-contacts { font-family: $session-font-mono; + @include themify($themes) { + background: themed('cellBackground'); + } text-align: center; padding: 20px; } @@ -1454,12 +1458,20 @@ input { display: flex; justify-content: space-between; transition: $session-transition-duration; - - &:first-child { - border-top: 1px solid rgba($session-shade-8, 0.6); + @include themify($themes) { + background: themed('cellBackground'); } - &:last-child { - border-bottom: 1px solid rgba($session-shade-8, 0.6); + + &:not(:last-child) { + @include themify($themes) { + border-bottom: themed('sessionBorder'); + } + } + + &:hover { + @include themify($themes) { + background-color: themed('clickableHovered'); + } } &.selected { diff --git a/stylesheets/_session_left_pane.scss b/stylesheets/_session_left_pane.scss index b34d4070d..c0ec2a9ad 100644 --- a/stylesheets/_session_left_pane.scss +++ b/stylesheets/_session_left_pane.scss @@ -95,7 +95,7 @@ $session-compose-margin: 20px; font-size: 15px; @include themify($themes) { - color: themed('textColorSubtle'); + color: subtle(themed('textColorSubtle')); } } } @@ -179,15 +179,6 @@ $session-compose-margin: 20px; } } - &-compose { - @at-root .light-theme #{&} { - background: $session-color-white; - } - @at-root .dark-theme #{&} { - @include session-dark-background-lighter; - } - } - &-overlay { @include themify($themes) { background: themed('leftpaneOverlayBackground'); diff --git a/stylesheets/themes.scss b/stylesheets/themes.scss index 65194d751..64017b7bc 100644 --- a/stylesheets/themes.scss +++ b/stylesheets/themes.scss @@ -1,46 +1,53 @@ // 13592 lines for manifest.css on date 25 august +$white: #ffffff; +$black: #000000; +$destructive: #ff453a; +$accentLightTheme: #00e97b; +$accentDarkTheme: #00f782; + + $themes: ( light: ( - accent: #00e97b, - accentButton: #000, - destructive: #ff453a, + accent: $accentLightTheme, + accentButton: $black, + destructive: $destructive, cellBackground: #fcfcfc, modalBackground: #fcfcfc, fakeChatBubbleBackground: #f5f5f5, // input - inputBackground: #8e8e931f, + inputBackground: rgba(#8e8e93, 0.12), // text - textColor: #000, + textColor: $black, textColorSubtle: #a0a0a0, - textColorOpposite: #fff, + textColorOpposite: $white, // inbox - inboxBackground: #fff, + inboxBackground: $white, // buttons backgroundPrimary: #272726, - foregroundPrimary: #fff, + foregroundPrimary: $white, buttonGreen: #272726, // conversation view composeViewBackground: #fcfcfc, composeViewTextFieldBackground: #ededed, receivedMessageBackground: #f5f5f5, - sentMessageBackground: #00e97b, - receivedMessageText: #000, - sentMessageText: #000, - sessionShadow: 0 0 4px 0 rgba(#000, 0.37), + sentMessageBackground: $accentLightTheme, + receivedMessageText: $black, + sentMessageText: $black, + sessionShadow: 0 0 4px 0 rgba($black, 0.37), // left pane - conversationList: #fff, + conversationList: $white, conversationItemHasUnread: #fcfcfc, conversationItemSelected: #f0f0f0, clickableHovered: #dfdfdf, sessionBorder: 1px solid #f1f1f1, - leftpaneOverlayBackground: #fff, + leftpaneOverlayBackground: $white, // scrollbars scrollBarTrack: #fcfcfc, scrollBarThumb: #474646, // pill divider: - pillDividerColor: #0000001a, - pillDividerTextColor: #555, + pillDividerColor: rgba($black, 0.10), + pillDividerTextColor: #555555, // context menu contextMenuBackground: #f5f5f5, filterSessionText: brightness(0) saturate(100%), @@ -51,38 +58,38 @@ $themes: ( quoteBottomBarBackground: #f0f0f0, ), dark: ( - accent: #00f782, - accentButton: #00f782, - destructive: #ff453a, + accent: $accentDarkTheme, + accentButton: $accentDarkTheme, + destructive: $destructive, cellBackground: #1b1b1b, modalBackground: #101011, fakeChatBubbleBackground: #212121, // input - inputBackground: #8e8e931f, + inputBackground: rgba(#8e8e93, 0.12), // text - textColor: #fff, + textColor: $white, textColorSubtle: #a0a0a0, - textColorOpposite: #000, + textColorOpposite: $black, // inbox inboxBackground: linear-gradient(180deg, #171717 0%, #121212 100%), // buttons backgroundPrimary: #474646, - foregroundPrimary: #fff, - buttonGreen: #00f782, + foregroundPrimary: $white, + buttonGreen: $accentDarkTheme, // conversation view composeViewBackground: #1b1b1b, composeViewTextFieldBackground: #141414, receivedMessageBackground: #222325, sentMessageBackground: #3f4146, - receivedMessageText: #fff, - sentMessageText: #fff, - sessionShadow: 0 0 4px 0 rgba(#fff, 0.2), + receivedMessageText: $white, + sentMessageText: $white, + sessionShadow: 0 0 4px 0 rgba($white, 0.2), // left pane conversationList: #1b1b1b, conversationItemHasUnread: #2c2c2c, conversationItemSelected: #404040, clickableHovered: #414347, - sessionBorder: 1px solid #ffffff0f, + sessionBorder: 1px solid rgba($white, 0.06), leftpaneOverlayBackground: linear-gradient(180deg, #171717 0%, #121212 100%), // scrollbars scrollBarTrack: #1b1b1b, From 055234ef5377d23cae9fba3f66a4c7806c58fe34 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 28 Aug 2020 16:00:30 +1000 Subject: [PATCH 120/274] add animation for highlighted messages --- stylesheets/_mentions.scss | 4 ---- stylesheets/_mixins.scss | 7 +++++++ stylesheets/_session_theme.scss | 9 +-------- stylesheets/_theme_dark.scss | 2 -- stylesheets/themes.scss | 2 ++ 5 files changed, 10 insertions(+), 14 deletions(-) diff --git a/stylesheets/_mentions.scss b/stylesheets/_mentions.scss index 30d237de6..8152672b2 100644 --- a/stylesheets/_mentions.scss +++ b/stylesheets/_mentions.scss @@ -85,10 +85,6 @@ color: black; } -.message-highlighted { - border-radius: $message-container-border-radius; - background-color: rgba(255, 197, 50, 0.2); -} .module-conversation-list-item--mentioned-us { border-left: 4px solid $session-color-green !important; diff --git a/stylesheets/_mixins.scss b/stylesheets/_mixins.scss index f47a758e0..594c3f14b 100644 --- a/stylesheets/_mixins.scss +++ b/stylesheets/_mixins.scss @@ -28,3 +28,10 @@ @include color-svg($svg, black); } } + +@keyframes highlightedMessageAnimation { + 25% { background-color: #00f782; } + 50% { background-color: #00000000; } + 75% { background-color: #00f782; } +} + diff --git a/stylesheets/_session_theme.scss b/stylesheets/_session_theme.scss index 0e5bfa384..293bffb47 100644 --- a/stylesheets/_session_theme.scss +++ b/stylesheets/_session_theme.scss @@ -87,14 +87,7 @@ .message { &-highlighted { - border-radius: 0; - - @at-root .light-theme #{&} { - background-color: $session-shade-5; - } - @at-root .dark-theme #{&} { - background-color: $session-color-white; - } + animation: highlightedMessageAnimation 3s ease-in-out; } &-selected { diff --git a/stylesheets/_theme_dark.scss b/stylesheets/_theme_dark.scss index 96c64ea15..9d3406dfa 100644 --- a/stylesheets/_theme_dark.scss +++ b/stylesheets/_theme_dark.scss @@ -906,8 +906,6 @@ color: $color-white; } - // Module: Highlighted Message Body - // Module: Search Results .module-search-results__conversations-header { diff --git a/stylesheets/themes.scss b/stylesheets/themes.scss index 64017b7bc..563a6f9a2 100644 --- a/stylesheets/themes.scss +++ b/stylesheets/themes.scss @@ -7,6 +7,8 @@ $accentLightTheme: #00e97b; $accentDarkTheme: #00f782; + + $themes: ( light: ( accent: $accentLightTheme, From 89acda2d2f1742732700801bac08fbf07e1b8410 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 28 Aug 2020 16:25:27 +1000 Subject: [PATCH 121/274] fix animation highlited message to match android --- stylesheets/_mentions.scss | 1 - stylesheets/_mixins.scss | 7 +++--- stylesheets/_session_left_pane.scss | 35 ++++++++++++++++------------- stylesheets/_session_theme.scss | 2 +- stylesheets/themes.scss | 7 ++---- 5 files changed, 25 insertions(+), 27 deletions(-) diff --git a/stylesheets/_mentions.scss b/stylesheets/_mentions.scss index 8152672b2..203f83c2d 100644 --- a/stylesheets/_mentions.scss +++ b/stylesheets/_mentions.scss @@ -85,7 +85,6 @@ color: black; } - .module-conversation-list-item--mentioned-us { border-left: 4px solid $session-color-green !important; } diff --git a/stylesheets/_mixins.scss b/stylesheets/_mixins.scss index 594c3f14b..9a7e9b664 100644 --- a/stylesheets/_mixins.scss +++ b/stylesheets/_mixins.scss @@ -30,8 +30,7 @@ } @keyframes highlightedMessageAnimation { - 25% { background-color: #00f782; } - 50% { background-color: #00000000; } - 75% { background-color: #00f782; } + 1% { + background-color: #00f782; + } } - diff --git a/stylesheets/_session_left_pane.scss b/stylesheets/_session_left_pane.scss index c0ec2a9ad..d8ffe4995 100644 --- a/stylesheets/_session_left_pane.scss +++ b/stylesheets/_session_left_pane.scss @@ -410,27 +410,30 @@ $session-compose-margin: 20px; padding: 8px 20px; margin: 0px $session-compose-margin; - @at-root .light-theme #{&} { - background: $session-shade-15; - color: $session-color-black; - } - @at-root .dark-theme #{&} { - background: $session-shade-4; - color: $session-color-light-grey; - } + // FIXME themify once this component is enabled back + // @at-root .light-theme #{&} { + // background: $session-shade-15; + // color: $session-color-black; + // } + // @at-root .dark-theme #{&} { + // background: $session-shade-4; + // color: $session-color-light-grey; + // } &-selected, &:hover { font-weight: bold; - @at-root .light-theme #{&} { - color: $session-color-black; - background: $session-color-white; - } - @at-root .dark-theme #{&} { - color: $session-color-white; - background: $session-shade-8; - } + // FIXME themify once this component is enabled back + + // @at-root .light-theme #{&} { + // color: $session-color-black; + // background: $session-color-white; + // } + // @at-root .dark-theme #{&} { + // color: $session-color-white; + // background: $session-shade-8; + // } } } } diff --git a/stylesheets/_session_theme.scss b/stylesheets/_session_theme.scss index 293bffb47..e377b889a 100644 --- a/stylesheets/_session_theme.scss +++ b/stylesheets/_session_theme.scss @@ -87,7 +87,7 @@ .message { &-highlighted { - animation: highlightedMessageAnimation 3s ease-in-out; + animation: highlightedMessageAnimation 1s ease-in-out; } &-selected { diff --git a/stylesheets/themes.scss b/stylesheets/themes.scss index 563a6f9a2..ca7c5ebae 100644 --- a/stylesheets/themes.scss +++ b/stylesheets/themes.scss @@ -6,9 +6,6 @@ $destructive: #ff453a; $accentLightTheme: #00e97b; $accentDarkTheme: #00f782; - - - $themes: ( light: ( accent: $accentLightTheme, @@ -48,7 +45,7 @@ $themes: ( scrollBarTrack: #fcfcfc, scrollBarThumb: #474646, // pill divider: - pillDividerColor: rgba($black, 0.10), + pillDividerColor: rgba($black, 0.1), pillDividerTextColor: #555555, // context menu contextMenuBackground: #f5f5f5, @@ -67,7 +64,7 @@ $themes: ( modalBackground: #101011, fakeChatBubbleBackground: #212121, // input - inputBackground: rgba(#8e8e93, 0.12), + inputBackground: rgba(#8e8e93, 0.12), // text textColor: $white, textColorSubtle: #a0a0a0, From 5909b7c807457c90467daafa3856f5d9d679f753 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 31 Aug 2020 09:46:03 +1000 Subject: [PATCH 122/274] cleanup scss --- stylesheets/_modules.scss | 1 - stylesheets/_session_left_pane.scss | 34 ++++++++++++----------------- 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/stylesheets/_modules.scss b/stylesheets/_modules.scss index 41800ed43..b2dea00f9 100644 --- a/stylesheets/_modules.scss +++ b/stylesheets/_modules.scss @@ -428,7 +428,6 @@ } .module-conversation__user, .module-message__author { - color: $color-white; font-size: 13px; font-weight: 300; line-height: 18px; diff --git a/stylesheets/_session_left_pane.scss b/stylesheets/_session_left_pane.scss index d8ffe4995..1a42ef838 100644 --- a/stylesheets/_session_left_pane.scss +++ b/stylesheets/_session_left_pane.scss @@ -11,6 +11,19 @@ $session-compose-margin: 20px; } .module-conversation { + // default conversation list item text color + &__user__profile { + &-number, + &-name { + @include fontAccentBold(); + font-size: 15px; + + @include themify($themes) { + color: themed('textColorSubtle'); + } + } + } + &-list-item { transition: $session-transition-duration; @@ -44,7 +57,7 @@ $session-compose-margin: 20px; &__unread-count { @include themify($themes) { color: themed('textColor'); - background-color: themed('clickableHovered'); + background: themed('clickableHovered'); } position: static !important; @@ -71,13 +84,6 @@ $session-compose-margin: 20px; &__header__name { flex-grow: 0 !important; padding-right: 5px !important; - - @at-root .light-theme #{&} { - color: $session-color-black; - } - @at-root .dark-theme #{&} { - color: $session-shade-17; - } } &__header__name--with-unread .module-conversation__user__profile-number, @@ -87,18 +93,6 @@ $session-compose-margin: 20px; } } } - - &__user__profile { - &-number, - &-name { - @include fontAccentBold(); - font-size: 15px; - - @include themify($themes) { - color: subtle(themed('textColorSubtle')); - } - } - } } .module-left-pane { From 0d908665c4822dcd17de8a6e384c71d64e58f204 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 31 Aug 2020 10:49:11 +1000 Subject: [PATCH 123/274] remove unused key in english locale --- _locales/en/messages.json | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index c68901aa2..74285b4fa 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -808,10 +808,6 @@ "message": "OK", "androidKey": "activity_settings_seed_dialog_ok_button_title" }, - "yes": { - "message": "Yes", - "androidKey": "ConversationActivity_yes" - }, "cancel": { "message": "Cancel", "androidKey": "view_qr_code_cancel_button_title" @@ -1794,15 +1790,6 @@ "description": "Prompt on recovery phrase modal requesting user to save their recovery phrase. Line one", "androidKey": "activity_seed_explanation" }, - "QRCodeTitle": { - "message": "View My QR Code", - "description": "Title given to QR Code modal", - "androidKey": "activity_qr_code_view_my_qr_code_tab_title" - }, - "QRCodeDescription": { - "message": "This is your unique public QR Code.
Other users may scan this in order to begin a conversation with you.", - "description": "Description given to QRCode modal" - }, "invalidOpenGroupUrl": { "message": "Invalid URL", "description": "Error message when no server url entered", @@ -1983,18 +1970,6 @@ "noModeratorsToRemove": { "message": "no moderators to remove" }, - "couldNotDecryptMessage": { - "message": "Couldn't decrypt a message" - }, - "confirmSessionRestore": { - "message": "Would you like to start a new session with $pubkey$? Only do so if you know this pubkey.", - "placeholders": { - "pubkey": { - "content": "$1", - "example": "" - } - } - }, "createAccount": { "message": "Create Account" }, From 7efbb60b560a16ee637ca260819dd0b3fead27e3 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 31 Aug 2020 11:01:48 +1000 Subject: [PATCH 124/274] remove unused keys from all other locales --- _locales/de/messages.json | 6 ------ _locales/es/messages.json | 6 ------ _locales/fr/messages.json | 8 +------- _locales/it/messages.json | 6 ------ _locales/pt_BR/messages.json | 6 ------ _locales/ru/messages.json | 22 ---------------------- 6 files changed, 1 insertion(+), 53 deletions(-) diff --git a/_locales/de/messages.json b/_locales/de/messages.json index b3f384732..74fe09f6e 100644 --- a/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -1312,9 +1312,6 @@ "about": { "message": "Über" }, - "yes": { - "message": "Ja" - }, "devicePairingRequestReceivedLimitTitle": { "message": "Gerätelimit erreicht" }, @@ -1387,9 +1384,6 @@ "recoveryPhraseSavePromptMain": { "message": "Ihr Wiederherstellungssatz ist der Hauptschlüssel für Ihre Session ID. Mit diesem Satz können Sie Ihre Session ID wiederherstellen, wenn Sie den Zugriff auf Ihr Gerät verlieren. Bewahren Sie Ihren Wiederherstellungssatz an einem sicheren Ort auf und geben Sie ihn an niemandem weiter." }, - "QRCodeTitle": { - "message": "Meinen QR-Code anzeigen" - }, "copiedToClipboard": { "message": "In die Zwischenablage kopiert." }, diff --git a/_locales/es/messages.json b/_locales/es/messages.json index bfc220320..7590a058e 100644 --- a/_locales/es/messages.json +++ b/_locales/es/messages.json @@ -1183,9 +1183,6 @@ "settingsHeader": { "message": "Ajustes" }, - "yes": { - "message": "Sí" - }, "continue": { "message": "Continuar" }, @@ -1285,9 +1282,6 @@ "recoveryPhraseSavePromptMain": { "message": "Tu frase de recuperación es la llave maestra de tu ID de Session, puedes usarla para recuperar tu ID de Session en caso de pérdida de acceso a tu dispositivo. Guarda tu frase de recuperación en un lugar seguro y no se la digas a nadie." }, - "QRCodeTitle": { - "message": "Ver mi código QR" - }, "copiedToClipboard": { "message": "Copiado en el portapapeles" }, diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index d10f21e35..12761b97d 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -1183,9 +1183,6 @@ "settingsHeader": { "message": "Paramètres" }, - "yes": { - "message": "Oui" - }, "continue": { "message": "Continuer" }, @@ -1285,9 +1282,6 @@ "recoveryPhraseSavePromptMain": { "message": "Votre phrase de récupération est la clé principale de votre Session ID - vous pouvez l'utiliser pour restaurer votre Session ID si vous perdez l'accès à votre appareil. Conservez la dans un endroit sûr et ne la donnez à personne." }, - "QRCodeTitle": { - "message": "Afficher mon code QR" - }, "copiedToClipboard": { "message": "Copié dans le presse-papier" }, @@ -1417,4 +1411,4 @@ "closedGroupMaxSize": { "message": "Un groupe privé ne peut pas avoir plus de 10 membres" } -} +} \ No newline at end of file diff --git a/_locales/it/messages.json b/_locales/it/messages.json index 281610a76..6a28ad557 100644 --- a/_locales/it/messages.json +++ b/_locales/it/messages.json @@ -1183,9 +1183,6 @@ "settingsHeader": { "message": "Impostazioni" }, - "yes": { - "message": "Sì" - }, "continue": { "message": "Continua" }, @@ -1285,9 +1282,6 @@ "recoveryPhraseSavePromptMain": { "message": "La frase di recupero è la chiave principale per la Sessione ID: puoi usarla per ripristinare la Sessione ID se perdi l'accesso al dispositivo. Conserva la frase di recupero in un luogo sicuro e non rivelarla a nessuno." }, - "QRCodeTitle": { - "message": "Visualizza il mio codice QR" - }, "copiedToClipboard": { "message": "Copiato negli appunti" }, diff --git a/_locales/pt_BR/messages.json b/_locales/pt_BR/messages.json index d8e8a7568..0552ee23f 100644 --- a/_locales/pt_BR/messages.json +++ b/_locales/pt_BR/messages.json @@ -1183,9 +1183,6 @@ "settingsHeader": { "message": "Configurações" }, - "yes": { - "message": "Sim" - }, "continue": { "message": "Continuar" }, @@ -1285,9 +1282,6 @@ "recoveryPhraseSavePromptMain": { "message": "Sua frase de recuperação é a chave mestra do seu ID Session - você pode usá-la para restaurar seu ID Session se perder o acesso ao seu dispositivo. Armazene sua frase de recuperação em um local seguro e não a entregue a ninguém." }, - "QRCodeTitle": { - "message": "Ver meu código QR" - }, "copiedToClipboard": { "message": "Copiado para a área de transferência" }, diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index c6b757cfc..a39d96884 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -1183,9 +1183,6 @@ "settingsHeader": { "message": "Настройки" }, - "yes": { - "message": "Да" - }, "continue": { "message": "Продолжить" }, @@ -1285,9 +1282,6 @@ "recoveryPhraseSavePromptMain": { "message": "Ваша секретная фраза является главным ключом к вашему Session ID. Вы можете использовать ее для восстановления Session ID, если потеряете доступ к своему устройству. Сохраните свою секретную фразу в безопасном месте, и никому её не передавайте." }, - "QRCodeTitle": { - "message": "Посмотреть мой QR-код" - }, "copiedToClipboard": { "message": "Скопировано в буфер обмена" }, @@ -1643,10 +1637,6 @@ "message": "Please enter your password", "description": "Request for user to enter password to show recovery phrase." }, - "QRCodeDescription": { - "message": "This is your unique public QR Code.
Other users may scan this in order to begin a conversation with you.", - "description": "Description given to QRCode modal" - }, "passwordViewTitle": { "message": "Type In Your Password", "description": "The title shown when user needs to type in a password to unlock the messenger" @@ -1779,18 +1769,6 @@ "noModeratorsToRemove": { "message": "no moderators to remove" }, - "couldNotDecryptMessage": { - "message": "Couldn't decrypt a message" - }, - "confirmSessionRestore": { - "message": "Would you like to start a new session with $pubkey$? Only do so if you know this pubkey.", - "placeholders": { - "pubkey": { - "content": "$1", - "example": "" - } - } - }, "createAccount": { "message": "Создать Аккаунт" }, From 8fe4f579eb8075ea839662932df141faaabd4226 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 31 Aug 2020 11:02:59 +1000 Subject: [PATCH 125/274] add README for locales tools scripts --- tools/README.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 tools/README.md diff --git a/tools/README.md b/tools/README.md new file mode 100644 index 000000000..63a0c1e3d --- /dev/null +++ b/tools/README.md @@ -0,0 +1,36 @@ +**Those tools can be used to keep in sync our locale in the app between different language and with android translations** + + + +## Step 1: Find unused key locales in EN + +`tools/unusedLocalizedString.py` is iterating over all root keys in _locales/en/message.json and try to find them on the code with a regex. If it does not find it, it will print a line with False. +Some key exceptions are hardcoded to not report false negative + + +So just run: +`tools/unusedLocalizedString.py |grep False` +and double check by searching in the app if you can effectively remove those keys. + + +## Step 2: Sync keys between each locales on desktop + +This step removes every key in all locales not found in the locale EN. +So if for example, you have a key in `it` which is not present in `en`, it will be removed and the `it` file will be written without it. + +A summary for each language file is printed on the screen to let you know if anything was changed during the process + +`python3 tools/compareLocalizedStrings.py` + + +## Step 3: Map translations from android to desktop + +This step matches translations from android to desktop. It needs to be run for each locale you want to update. + + +`python3 tools/mapAndroidTranslationsToDesktop.py fr ` + +Under the hood, it uses a item from the EN desktop locale called `androidKey` to find the matching translation for each locale. + +Note that if a desktop key does not have an `androidKey` set, it will just be skipped +The goal is to have an androidKey for each item, if possible. But for now apps are too different for that to make sense. \ No newline at end of file From 00994bcb4a346c48b061fe792715e38fa48cc580 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 31 Aug 2020 14:51:59 +1000 Subject: [PATCH 126/274] make most of the app rtl compatible (text based only) --- js/views/conversation_view.js | 4 +- libtextsecure/test/blanket_mocha.js | 142 +++++++-------- stylesheets/_conversation.scss | 32 ++-- stylesheets/_global.scss | 10 +- stylesheets/_index.scss | 22 +-- stylesheets/_mentions.scss | 14 +- stylesheets/_modal.scss | 6 +- stylesheets/_modules.scss | 237 +++++++++++++------------- stylesheets/_quote.scss | 18 +- stylesheets/_recorder.scss | 4 +- stylesheets/_rtl.scss | 23 +++ stylesheets/_session-slider.scss | 2 +- stylesheets/_session.scss | 44 ++--- stylesheets/_session_group_panel.scss | 2 +- stylesheets/_session_left_pane.scss | 19 ++- stylesheets/_session_password.scss | 2 +- stylesheets/_session_signin.scss | 14 +- stylesheets/_session_theme.scss | 2 +- stylesheets/manifest.scss | 1 + test/blanket_mocha.js | 30 ++-- 20 files changed, 327 insertions(+), 301 deletions(-) create mode 100644 stylesheets/_rtl.scss diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index 1adc7446b..dee2d56c5 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -346,12 +346,12 @@ this.hideConversationRight = () => { this.$('.conversation-content-right').css({ - 'margin-right': '-22vw', + 'margin-inline-end': '-22vw', }); }; this.showConversationRight = () => { this.$('.conversation-content-right').css({ - 'margin-right': '0vw', + 'margin-inline-end': '0vw', }); }; diff --git a/libtextsecure/test/blanket_mocha.js b/libtextsecure/test/blanket_mocha.js index ccab29937..b7040f09d 100644 --- a/libtextsecure/test/blanket_mocha.js +++ b/libtextsecure/test/blanket_mocha.js @@ -4472,7 +4472,7 @@ _blanket.extend({ })(blanket); blanket.defaultReporter = function(coverage){ - var cssSytle = "#blanket-main {margin:2px;background:#EEE;color:#333;clear:both;font-family:'Helvetica Neue Light', 'HelveticaNeue-Light', 'Helvetica Neue', Calibri, Helvetica, Arial, sans-serif; font-size:17px;} #blanket-main a {color:#333;text-decoration:none;} #blanket-main a:hover {text-decoration:underline;} .blanket {margin:0;padding:5px;clear:both;border-bottom: 1px solid #FFFFFF;} .bl-error {color:red;}.bl-success {color:#5E7D00;} .bl-file{width:auto;} .bl-cl{float:left;} .blanket div.rs {margin-left:50px; width:150px; float:right} .bl-nb {padding-right:10px;} #blanket-main a.bl-logo {color: #EB1764;cursor: pointer;font-weight: bold;text-decoration: none} .bl-source{ overflow-x:scroll; background-color: #FFFFFF; border: 1px solid #CBCBCB; color: #363636; margin: 25px 20px; width: 80%;} .bl-source div{white-space: pre;font-family: monospace;} .bl-source > div > span:first-child{background-color: #EAEAEA;color: #949494;display: inline-block;padding: 0 10px;text-align: center;width: 30px;} .bl-source .miss{background-color:#e6c3c7} .bl-source span.branchWarning{color:#000;background-color:yellow;} .bl-source span.branchOkay{color:#000;background-color:transparent;}", + var cssSytle = "#blanket-main {margin:2px;background:#EEE;color:#333;clear:both;font-family:'Helvetica Neue Light', 'HelveticaNeue-Light', 'Helvetica Neue', Calibri, Helvetica, Arial, sans-serif; font-size:17px;} #blanket-main a {color:#333;text-decoration:none;} #blanket-main a:hover {text-decoration:underline;} .blanket {margin:0;padding:5px;clear:both;border-bottom: 1px solid #FFFFFF;} .bl-error {color:red;}.bl-success {color:#5E7D00;} .bl-file{width:auto;} .bl-cl{float:left;} .blanket div.rs {margin-inline-start:50px; width:150px; float:right} .bl-nb {padding-inline-end:10px;} #blanket-main a.bl-logo {color: #EB1764;cursor: pointer;font-weight: bold;text-decoration: none} .bl-source{ overflow-x:scroll; background-color: #FFFFFF; border: 1px solid #CBCBCB; color: #363636; margin: 25px 20px; width: 80%;} .bl-source div{white-space: pre;font-family: monospace;} .bl-source > div > span:first-child{background-color: #EAEAEA;color: #949494;display: inline-block;padding: 0 10px;text-align: center;width: 30px;} .bl-source .miss{background-color:#e6c3c7} .bl-source span.branchWarning{color:#000;background-color:yellow;} .bl-source span.branchOkay{color:#000;background-color:transparent;}", successRate = 60, head = document.head, fileNumber = 0, @@ -5237,73 +5237,73 @@ _blanket.extend({ })(blanket); -(function() { - - if(!mocha) { - throw new Exception("mocha library does not exist in global namespace!"); - } - - - /* - * Mocha Events: - * - * - `start` execution started - * - `end` execution complete - * - `suite` (suite) test suite execution started - * - `suite end` (suite) all tests (and sub-suites) have finished - * - `test` (test) test execution started - * - `test end` (test) test completed - * - `hook` (hook) hook execution started - * - `hook end` (hook) hook complete - * - `pass` (test) test passed - * - `fail` (test, err) test failed - * - */ - - var OriginalReporter = mocha._reporter; - - var BlanketReporter = function(runner) { - runner.on('start', function() { - blanket.setupCoverage(); - }); - - runner.on('end', function() { - blanket.onTestsDone(); - }); - - runner.on('suite', function() { - blanket.onModuleStart(); - }); - - runner.on('test', function() { - blanket.onTestStart(); - }); - - runner.on('test end', function(test) { - blanket.onTestDone(test.parent.tests.length, test.state === 'passed'); - }); - - // NOTE: this is an instance of BlanketReporter - new OriginalReporter(runner); - }; - - BlanketReporter.prototype = OriginalReporter.prototype; - - mocha.reporter(BlanketReporter); - - var oldRun = mocha.run, - oldCallback = null; - - mocha.run = function (finishCallback) { - oldCallback = finishCallback; - console.log("waiting for blanket..."); - }; - blanket.beforeStartTestRunner({ - callback: function(){ - if (!blanket.options("existingRequireJS")){ - oldRun(oldCallback); - } - mocha.run = oldRun; - } - }); -})(); +(function() { + + if(!mocha) { + throw new Exception("mocha library does not exist in global namespace!"); + } + + + /* + * Mocha Events: + * + * - `start` execution started + * - `end` execution complete + * - `suite` (suite) test suite execution started + * - `suite end` (suite) all tests (and sub-suites) have finished + * - `test` (test) test execution started + * - `test end` (test) test completed + * - `hook` (hook) hook execution started + * - `hook end` (hook) hook complete + * - `pass` (test) test passed + * - `fail` (test, err) test failed + * + */ + + var OriginalReporter = mocha._reporter; + + var BlanketReporter = function(runner) { + runner.on('start', function() { + blanket.setupCoverage(); + }); + + runner.on('end', function() { + blanket.onTestsDone(); + }); + + runner.on('suite', function() { + blanket.onModuleStart(); + }); + + runner.on('test', function() { + blanket.onTestStart(); + }); + + runner.on('test end', function(test) { + blanket.onTestDone(test.parent.tests.length, test.state === 'passed'); + }); + + // NOTE: this is an instance of BlanketReporter + new OriginalReporter(runner); + }; + + BlanketReporter.prototype = OriginalReporter.prototype; + + mocha.reporter(BlanketReporter); + + var oldRun = mocha.run, + oldCallback = null; + + mocha.run = function (finishCallback) { + oldCallback = finishCallback; + console.log("waiting for blanket..."); + }; + blanket.beforeStartTestRunner({ + callback: function(){ + if (!blanket.options("existingRequireJS")){ + oldRun(oldCallback); + } + mocha.run = oldRun; + } + }); +})(); diff --git a/stylesheets/_conversation.scss b/stylesheets/_conversation.scss index 295d9328c..92a613e45 100644 --- a/stylesheets/_conversation.scss +++ b/stylesheets/_conversation.scss @@ -120,7 +120,7 @@ } .summary { - margin: 30px 0 10px; + margin: 30px 0 10px 0; text-align: center; } @@ -180,13 +180,13 @@ } .loki-message-wrapper { - padding-left: 16px; - padding-right: 16px; + padding-inline-start: 16px; + padding-inline-end: 16px; } .public-chat-message-wrapper { - padding-left: 10px; - padding-right: 10px; + padding-inline-start: 10px; + padding-inline-end: 10px; } .loki-message-wrapper { @@ -252,7 +252,7 @@ background-color: #00f782; color: white; padding: 6px 10px; - margin-left: 6px; + margin-inline-start: 6px; border-radius: 2px; box-shadow: none; user-select: none; @@ -297,14 +297,14 @@ padding: 18px; // This makes sure the message counter is right in the center width: 80px; - margin-right: -80px; + margin-inline-end: -80px; user-select: none; } .cancel-button { padding: 18px; width: 80px; - margin-left: -80px; + margin-inline-start: -80px; user-select: none; } @@ -313,8 +313,8 @@ display: flex; align-items: center; user-select: none; - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; } } @@ -332,8 +332,8 @@ // things in the composition area. A margin on an inner div won't be included in that // height calculation. .bottom-bar .quote-wrapper { - margin-left: 37px; - margin-right: 73px; + margin-inline-start: 37px; + margin-inline-end: 73px; margin-top: 3px; margin-bottom: -5px; } @@ -356,8 +356,8 @@ .bottom-bar .preview-wrapper { margin-top: 3px; - margin-left: 37px; - margin-right: 73px; + margin-inline-start: 37px; + margin-inline-end: 73px; margin-bottom: 2px; } @@ -492,8 +492,8 @@ .module-last-seen-indicator { padding-top: 25px; padding-bottom: 35px; - margin-left: 28px; - margin-right: 28px; + margin-inline-start: 28px; + margin-inline-end: 28px; &__bar { @include themify($themes) { diff --git a/stylesheets/_global.scss b/stylesheets/_global.scss index a77b4992a..9d742c87f 100644 --- a/stylesheets/_global.scss +++ b/stylesheets/_global.scss @@ -264,7 +264,7 @@ $loading-height: 16px; line-height: 36px; padding: 0 20px; background: $blue; - margin-left: 20px; + margin-inline-start: 20px; } .message { @@ -294,13 +294,13 @@ $loading-height: 16px; user-select: none; .content { - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; text-align: center; } .container { - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; width: 78px; height: 22px; } diff --git a/stylesheets/_index.scss b/stylesheets/_index.scss index f738f5e5a..08dd2d873 100644 --- a/stylesheets/_index.scss +++ b/stylesheets/_index.scss @@ -56,7 +56,7 @@ .upload-btn-background { background-color: #ffffff70; align-self: center; - margin-left: -24px; + margin-inline-start: -24px; margin-top: 40px; z-index: 1; border-radius: 8px; @@ -173,7 +173,7 @@ h4.section-toggle, .section-conversations-container { display: flex; flex-direction: row; - margin-right: 3em; + margin-inline-end: 3em; align-items: center; h4 { @@ -187,7 +187,7 @@ h4.section-toggle, background-size: 25px 25px; background-color: #fcd156; padding: 10px; - padding-left: 2 * $button-height; + padding-inline-start: 2 * $button-height; display: none; .network-status-message { @@ -258,14 +258,14 @@ h4.section-toggle, } $search-x-size: 16px; -$search-padding-right: 12px; -$search-padding-left: 30px; +$search-padding-inline-end: 12px; +$search-padding-inline-start: 30px; input.search { border: 1px solid $color-black-02; - padding: 0 $search-padding-right 0 $search-padding-left; - margin-left: 8px; - margin-right: 8px; + padding: 0 $search-padding-inline-end 0 $search-padding-inline-start; + margin-inline-start: 8px; + margin-inline-end: 8px; outline: 0; height: 32px; width: calc(100% - 16px); @@ -287,11 +287,11 @@ input.search { background-size: $search-x-size; &.ltr { - background-position: right $search-padding-right center; + background-position: right $search-padding-inline-end center; } &.rtl { - background-position: left $search-padding-left center; + background-position: left $search-padding-inline-start center; } } @@ -321,7 +321,7 @@ input.search { .contact-details .number { display: block; font-style: italic; - padding-right: 8px; + padding-inline-end: 8px; } &.valid { diff --git a/stylesheets/_mentions.scss b/stylesheets/_mentions.scss index 203f83c2d..04e6d0377 100644 --- a/stylesheets/_mentions.scss +++ b/stylesheets/_mentions.scss @@ -1,5 +1,5 @@ // used for the list after adding a `@` in the compose text input -.friend-selection-list { +.contact-selection-list { max-height: 240px; overflow-y: auto; margin: 4px; @@ -26,7 +26,7 @@ } .dark-theme { - .friend-selection-list { + .contact-selection-list { .check-mark { color: rgb(230, 230, 230); } @@ -60,11 +60,11 @@ .name-part { font-weight: 300; - margin-left: 12px; + margin-inline-start: 12px; } .pubkey-part { - margin-left: 10px; + margin-inline-start: 10px; opacity: 0.6; } } @@ -97,12 +97,12 @@ text-align: center; padding-top: 1px; - padding-left: 3px; - padding-right: 3px; + padding-inline-start: 3px; + padding-inline-end: 3px; position: absolute; left: 50%; - margin-left: 30px; + margin-inline-start: 30px; top: 2px; font-weight: 300; diff --git a/stylesheets/_modal.scss b/stylesheets/_modal.scss index a9814fbef..a0c314bb4 100644 --- a/stylesheets/_modal.scss +++ b/stylesheets/_modal.scss @@ -47,7 +47,7 @@ text-align: center; } - .no-friends { + .no-contacts { text-align: center; } @@ -96,7 +96,7 @@ button { float: right; - margin-left: 10px; + margin-inline-start: 10px; background-color: $color-loki-green; border-radius: 100px; padding: 5px 15px; @@ -285,7 +285,7 @@ display: flex; align-items: center; justify-content: center; - margin-left: $session-margin-lg; + margin-inline-start: $session-margin-lg; p { font-size: $session-font-md; diff --git a/stylesheets/_modules.scss b/stylesheets/_modules.scss index b2dea00f9..d23297cd8 100644 --- a/stylesheets/_modules.scss +++ b/stylesheets/_modules.scss @@ -67,13 +67,13 @@ // Spec: container < 438px .module-message--incoming { - margin-left: 0; - margin-right: 32px; + margin-inline-start: 0; + margin-inline-end: 32px; } .module-message--outgoing { float: right; - margin-right: 0; - margin-left: 32px; + margin-inline-end: 0; + margin-inline-start: 32px; } .module-message__buttons { @@ -121,10 +121,10 @@ } .module-message__buttons__download--incoming { - margin-left: 12px; + margin-inline-start: 12px; } .module-message__buttons__download--outgoing { - margin-right: 12px; + margin-inline-end: 12px; } .module-message__buttons__reply { @@ -139,10 +139,10 @@ } .module-message__buttons__reply--incoming { - margin-left: 12px; + margin-inline-start: 12px; } .module-message__buttons__reply--outgoing { - margin-right: 12px; + margin-inline-end: 12px; } .module-message__buttons__menu { @@ -157,11 +157,11 @@ } .module-message__buttons__menu--incoming { - margin-left: 12px; + margin-inline-start: 12px; } .module_message__buttons__menu--outgoing { - margin-right: 12px; + margin-inline-end: 12px; } .module-message__error-container { @@ -190,8 +190,8 @@ position: relative; display: inline-block; border-radius: $message-container-border-radius; - padding-right: 12px; - padding-left: 12px; + padding-inline-end: 12px; + padding-inline-start: 12px; padding-top: 10px; padding-bottom: 10px; min-width: 0px; @@ -202,8 +202,8 @@ text-align: center; position: relative; - margin-left: -12px; - margin-right: -12px; + margin-inline-start: -12px; + margin-inline-end: -12px; margin-top: -10px; margin-bottom: -10px; @@ -262,16 +262,16 @@ position: relative; } .module-message__generic-attachment__spinner-container { - padding-left: 4px; - padding-right: 4px; + padding-inline-start: 4px; + padding-inline-end: 4px; } .module-message__generic-attachment__icon { background: url('../images/file-gradient.svg') no-repeat center; height: 44px; width: 56px; - margin-left: -13px; - margin-right: -14px; + margin-inline-start: -13px; + margin-inline-end: -14px; margin-bottom: -4px; // So we can center the extension text inside this icon @@ -309,8 +309,8 @@ // Along with flow layout in parent item, centers text text-align: center; width: 25px; - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; // We don't have much room for text here, cut it off without ellipse overflow-x: hidden; @@ -322,7 +322,7 @@ .module-message__generic-attachment__text { flex-grow: 1; - margin-left: 8px; + margin-inline-start: 8px; // The width of the icon plus our 8px margin max-width: calc(100% - 37px); } @@ -362,8 +362,8 @@ .module-message__link-preview { cursor: pointer; - margin-left: -12px; - margin-right: -12px; + margin-inline-start: -12px; + margin-inline-end: -12px; margin-top: -10px; margin-bottom: 5px; border-top-left-radius: 16px; @@ -396,7 +396,7 @@ .module-message__link-preview__icon_container { margin: -2px; - margin-right: 8px; + margin-inline-end: 8px; display: inline-block; } @@ -488,7 +488,7 @@ width: 100%; // Because this is absolutely positioned, we 100% is too big, take it down by parent // padding sizes. - padding-right: 24px; + padding-inline-end: 24px; } .module-message__metadata__date, @@ -522,9 +522,9 @@ width: 12px; height: 12px; display: inline-block; - margin-left: 6px; + margin-inline-start: 6px; margin-bottom: 2px; - margin-left: 5px; + margin-inline-start: 5px; } .module-message__metadata__status-icon--sending { @@ -572,8 +572,8 @@ margin-top: 8px; margin-bottom: -10px; - margin-left: -12px; - margin-right: -12px; + margin-inline-start: -12px; + margin-inline-end: -12px; text-align: center; padding: 10px; @@ -585,7 +585,7 @@ .module-message__author-avatar { flex-direction: column-reverse; display: inline-flex; - padding-right: 4px; + padding-inline-end: 4px; } .module-message__typing-container { @@ -599,7 +599,7 @@ // Module: Expire Timer .module-expire-timer-margin { - margin-left: 6px; + margin-inline-start: 6px; } .module-expire-timer { @@ -675,13 +675,13 @@ } .module-embedded-contact__spinner-container { - padding-left: 5px; - padding-right: 5px; + padding-inline-start: 5px; + padding-inline-end: 5px; } .module-embedded-contact__text-container { flex-grow: 1; - margin-left: 8px; + margin-inline-start: 8px; max-width: calc(100% - 58px); } @@ -785,8 +785,8 @@ .module-contact-detail { text-align: center; max-width: 300px; - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; } .module-contact-detail__avatar { @@ -831,7 +831,7 @@ height: 17px; width: 18px; display: inline-block; - margin-right: 5px; + margin-inline-end: 5px; @include color-svg('../images/chat-bubble.svg', white); } @@ -899,8 +899,8 @@ .module-safety-number-notification__icon { height: 24px; width: 24px; - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; margin-bottom: 7px; @include color-svg('../images/shield.svg', $color-gray-60); } @@ -947,8 +947,8 @@ .module-verification-notification__icon--mark-verified { height: 24px; width: 24px; - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; margin-bottom: 4px; @include color-svg('../images/verified-check.svg', $color-gray-60); } @@ -956,8 +956,8 @@ .module-verification-notification__icon--mark-not-verified { height: 24px; width: 24px; - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; margin-bottom: 7px; @include color-svg('../images/shield.svg', $color-gray-60); } @@ -974,8 +974,8 @@ } .module-timer-notification__icon-container { - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; display: inline-flex; flex-direction: row; align-items: center; @@ -997,7 +997,7 @@ font-size: 11px; line-height: 16px; letter-spacing: 0.3px; - margin-left: 6px; + margin-inline-start: 6px; text-transform: uppercase; // Didn't seem centered otherwise @@ -1017,8 +1017,8 @@ .module-notification__icon { height: 24px; width: 24px; - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; } // Module: Contact List Item @@ -1038,7 +1038,7 @@ } .module-contact-list-item__text { - margin-left: 8px; + margin-inline-start: 8px; } .module-contact-list-item__text__name { @@ -1077,8 +1077,8 @@ .module-conversation-header__back-icon { @include color-svg('../images/back.svg', $color-gray-90); display: inline-block; - margin-left: -10px; - margin-right: -2px; + margin-inline-start: -10px; + margin-inline-end: -2px; width: 35px; height: 35px; min-width: 35px; @@ -1099,8 +1099,8 @@ } .module-conversation-header__title-flex { - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; display: inline-flex; flex-direction: row; align-items: center; @@ -1115,7 +1115,7 @@ } .module-conversation-header__title { - margin-left: 6px; + margin-inline-start: 6px; min-width: 0; font-size: 16px; @@ -1151,8 +1151,8 @@ display: flex; flex-direction: row; align-items: center; - padding-left: 8px; - padding-right: 8px; + padding-inline-start: 8px; + padding-inline-end: 8px; } .module-conversation-header__expiration__clock-icon { @@ -1163,7 +1163,7 @@ } .module-conversation-header__expiration__setting { - margin-left: 5px; + margin-inline-start: 5px; text-align: center; } @@ -1171,7 +1171,7 @@ @include color-svg('../images/gear.svg', $color-gray-60); height: 20px; width: 20px; - margin-left: 4px; + margin-inline-start: 4px; cursor: pointer; } @@ -1179,8 +1179,8 @@ .module-message-detail { max-width: 650px; - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; padding: 20px; } @@ -1199,7 +1199,7 @@ .module-message-detail__label { font-weight: 300; - padding-right: 5px; + padding-inline-end: 5px; } .module-message-detail__unix-timestamp { @@ -1236,7 +1236,7 @@ } .module-message-detail__contact__text { - margin-left: 10px; + margin-inline-start: 10px; flex-grow: 1; } @@ -1250,7 +1250,7 @@ height: 12px; display: inline-block; margin-bottom: 2px; - margin-left: 5px; + margin-inline-start: 5px; } .module-message-detail__contact__status-icon--sending { @@ -1282,8 +1282,8 @@ } .module-message-detail__contact__unidentified-delivery-icon { - margin-left: 6px; - margin-right: 10px; + margin-inline-start: 6px; + margin-inline-end: 10px; width: 20px; height: 20px; @@ -1306,7 +1306,7 @@ @include button-reset; color: $color-white; background-color: $session-color-danger; - margin-left: 5px; + margin-inline-start: 5px; margin-top: 5px; padding: 4px; border-radius: 4px; @@ -1372,7 +1372,7 @@ // Module: Document List Item .module-document-list-item { - padding-right: 10px; + padding-inline-end: 10px; width: 100%; height: 72px; } @@ -1403,8 +1403,8 @@ flex-direction: column; flex-grow: 1; flex-shrink: 0; - margin-left: 8px; - margin-right: 8px; + margin-inline-start: 8px; + margin-inline-end: 8px; } .module-document-list-item__file-name { @@ -1429,7 +1429,7 @@ width: 94px; cursor: pointer; background-color: $color-light-10; - margin-right: 4px; + margin-inline-end: 4px; margin-bottom: 4px; position: relative; } @@ -1508,8 +1508,8 @@ max-width: 300px; display: flex; flex-direction: row; - padding-right: 16px; - padding-left: 16px; + padding-inline-end: 16px; + padding-inline-start: 16px; align-items: center; cursor: pointer; @@ -1529,8 +1529,8 @@ text-align: center; padding-top: 1px; - padding-left: 3px; - padding-right: 3px; + padding-inline-start: 3px; + padding-inline-end: 3px; position: absolute; right: -6px; @@ -1550,7 +1550,7 @@ .module-conversation-list-item__content { flex-grow: 1; - margin-left: 12px; + margin-inline-start: 12px; display: flex; flex-direction: column; align-items: stretch; @@ -1583,7 +1583,7 @@ .module-conversation-list-item__header__timestamp { flex-shrink: 0; - margin-left: 6px; + margin-inline-start: 6px; font-size: 11px; line-height: 16px; @@ -1637,7 +1637,7 @@ width: 12px; height: 13px; display: inline-block; - margin-left: 6px; + margin-inline-start: 6px; } .module-conversation-list-item__message__status-icon--sending { @@ -1679,7 +1679,7 @@ .module-main-header__title { height: 55px; - padding-left: 16px; + padding-inline-start: 16px; flex: 1; flex-direction: row; display: flex; @@ -1743,7 +1743,7 @@ .module-main-header__contact-name { font-weight: 300; - margin-left: 12px; + margin-inline-start: 12px; color: $color-dark-05; overflow-x: auto; flex: 1; @@ -1763,8 +1763,8 @@ background-color: $color-gray-95; border: 1px solid $color-light-60; padding: 0 26px 0 30px; - margin-left: 8px; - margin-right: 8px; + margin-inline-start: 8px; + margin-inline-end: 8px; outline: 0; height: 32px; width: calc(100% - 16px); @@ -2004,8 +2004,8 @@ height: 8px; width: 38px; - padding-left: 1px; - padding-right: 1px; + padding-inline-start: 1px; + padding-inline-end: 1px; } .module-typing-animation__dot { @@ -2107,8 +2107,8 @@ .module-attachments__rail { margin-top: 12px; - margin-left: 16px; - padding-right: 16px; + margin-inline-start: 16px; + padding-inline-end: 16px; overflow-x: scroll; max-height: 142px; white-space: nowrap; @@ -2147,8 +2147,8 @@ background: url('../images/file-gradient.svg') no-repeat center; height: 44px; width: 56px; - margin-left: 32px; - margin-right: 32px; + margin-inline-start: 32px; + margin-inline-end: 32px; margin-bottom: -4px; // So we can center the extension text inside this icon @@ -2166,8 +2166,8 @@ // Along with flow layout in parent item, centers text text-align: center; width: 25px; - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; // We don't have much room for text here, cut it off without ellipse overflow-x: hidden; @@ -2268,8 +2268,8 @@ flex-direction: row; align-items: middle; - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; } .module-caption-editor__input-container { @@ -2287,8 +2287,8 @@ border-radius: 18px; background-color: $color-black; padding: 9px; - padding-left: 12px; - padding-right: 65px; + padding-inline-start: 12px; + padding-inline-end: 65px; &::placeholder { color: $color-white-07; @@ -2309,8 +2309,8 @@ border-radius: 15px; padding: 5px; - padding-left: 12px; - padding-right: 12px; + padding-inline-start: 12px; + padding-inline-end: 12px; right: 4px; top: 4px; @@ -2370,10 +2370,10 @@ } .module-staged-link-preview__icon-container { - margin-right: 8px; + margin-inline-end: 8px; } .module-staged-link-preview__content { - margin-right: 20px; + margin-inline-end: 20px; } .module-staged-link-preview__title { color: $color-gray-90; @@ -2409,8 +2409,8 @@ // Module: Spinner .module-spinner__container { - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; position: relative; height: 56px; width: 56px; @@ -2513,7 +2513,7 @@ height: 36px; line-height: 36px; - margin-left: 16px; + margin-inline-start: 16px; font-size: 14px; font-weight: 300; @@ -2530,7 +2530,7 @@ height: 36px; line-height: 36px; - margin-left: 16px; + margin-inline-start: 16px; font-size: 14px; font-weight: 300; @@ -2541,7 +2541,7 @@ height: 36px; line-height: 36px; - margin-left: 16px; + margin-inline-start: 16px; font-size: 14px; font-weight: 300; @@ -2552,8 +2552,8 @@ .module-message-search-result { padding: 8px; - padding-left: 16px; - padding-right: 16px; + padding-inline-start: 16px; + padding-inline-end: 16px; min-height: 64px; max-width: 300px; @@ -2573,7 +2573,7 @@ .module-message-search-result__text { flex-grow: 1; - margin-left: 12px; + margin-inline-start: 12px; // parent - 48px (for avatar) - 16px (our right margin) max-width: calc(100% - 64px); @@ -2603,7 +2603,7 @@ .module-message-search-result__header__timestamp { flex-shrink: 0; - margin-left: 6px; + margin-inline-start: 6px; font-size: 11px; line-height: 16px; @@ -2696,7 +2696,7 @@ } .module-left-pane__to-inbox-button { - margin-left: 2px; + margin-inline-start: 2px; width: 35px; height: 35px; @@ -2790,7 +2790,7 @@ .module-start-new-conversation__content { overflow: hidden; - margin-left: 12px; + margin-inline-start: 12px; flex: 1; } @@ -2837,10 +2837,10 @@ line-height: 18px; white-space: nowrap; - padding-left: 16px; + padding-inline-start: 16px; padding-top: 3px; padding-bottom: 2px; - padding-right: 16px; + padding-inline-end: 16px; } .react-contextmenu-item--checked:before { @@ -2857,6 +2857,7 @@ .react-contextmenu-item.react-contextmenu-submenu > .react-contextmenu-item { padding-right: 36px; + // We will probably need to make this padding-inline-end once the whole app is working on rtl } .react-contextmenu-item.react-contextmenu-submenu @@ -2917,12 +2918,12 @@ // Spec: container < 438px .module-message--incoming { - margin-left: 0; - margin-right: auto; + margin-inline-start: 0; + margin-inline-end: auto; } .module-message--outgoing { - margin-right: 0; - margin-left: auto; + margin-inline-end: 0; + margin-inline-start: auto; } // To hide in small breakpoints @@ -2956,12 +2957,12 @@ } .module-message--incoming { - margin-left: 0; - margin-right: auto; + margin-inline-start: 0; + margin-inline-end: auto; } .module-message--outgoing { - margin-right: 0; - margin-left: auto; + margin-inline-end: 0; + margin-inline-start: auto; } // To hide in small breakpoints diff --git a/stylesheets/_quote.scss b/stylesheets/_quote.scss index 92570e022..e94deb026 100644 --- a/stylesheets/_quote.scss +++ b/stylesheets/_quote.scss @@ -136,8 +136,8 @@ } .module-quote-container { - margin-left: -6px; - margin-right: -6px; + margin-inline-start: -6px; + margin-inline-end: -6px; margin-top: -4px; margin-bottom: 5px; } @@ -152,8 +152,8 @@ .module-quote__primary { flex-grow: 1; - padding-left: 8px; - padding-right: 8px; + padding-inline-start: 8px; + padding-inline-end: 8px; padding-top: 7px; padding-bottom: 7px; @@ -302,8 +302,8 @@ background-repeat: no-repeat; height: 28px; width: 36px; - margin-left: -4px; - margin-right: -6px; + margin-inline-start: -4px; + margin-inline-end: -6px; margin-bottom: 5px; } &-file__text { @@ -326,8 +326,8 @@ align-items: center; background-color: $color-white-085; - padding-left: 8px; - padding-right: 8px; + padding-inline-start: 8px; + padding-inline-end: 8px; } &-warning__icon { @@ -337,7 +337,7 @@ } &-warning__text { - margin-left: 6px; + margin-inline-start: 6px; color: $color-gray-90; font-size: 13px; line-height: 18px; diff --git a/stylesheets/_recorder.scss b/stylesheets/_recorder.scss index e490cd292..040fbb9f5 100644 --- a/stylesheets/_recorder.scss +++ b/stylesheets/_recorder.scss @@ -33,7 +33,7 @@ width: 36px; height: 36px; border-radius: 36px; - margin-left: 5px; + margin-inline-start: 5px; opacity: 0.5; text-align: center; padding: 0; @@ -94,7 +94,7 @@ width: 10px; height: 10px; background: #f00; - margin-right: 10px; + margin-inline-end: 10px; opacity: 0; animation: pulse 2s infinite; } diff --git a/stylesheets/_rtl.scss b/stylesheets/_rtl.scss new file mode 100644 index 000000000..9b7cf7187 --- /dev/null +++ b/stylesheets/_rtl.scss @@ -0,0 +1,23 @@ +body.rtl { + input, + textarea, + .module-left-pane, + .module-conversation-list-item, + .group-settings-item, + .contact-selection-list, + .group-member-list__selection, + .react-contextmenu-item, + .session-settings-list { + direction: rtl; + } + + // text inside rtl textarea must be manually right-sided + textarea { + text-align: right; + } + // no matter what, keep left-pane-settings on tlr + // because it breaks the UI (arrow and more), and we don't care for now + .left-pane-setting-content { + direction: ltr; + } +} diff --git a/stylesheets/_session-slider.scss b/stylesheets/_session-slider.scss index 95a38c086..bac8d767c 100644 --- a/stylesheets/_session-slider.scss +++ b/stylesheets/_session-slider.scss @@ -7,7 +7,7 @@ &-info { display: block; - margin-left: 20px; + margin-inline-start: 20px; text-align: center; p { diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index 53d5a64e5..2a186d566 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -68,8 +68,8 @@ textarea { .button-group > div { display: inline-flex; - margin-left: 5px; - margin-right: 5px; + margin-inline-start: 5px; + margin-inline-end: 5px; } .session-button { @@ -324,7 +324,7 @@ textarea { position: absolute; font-size: 1.3em; top: -0.5em; - margin-left: -0.125em; + margin-inline-start: -0.125em; } } @@ -399,7 +399,7 @@ $session-element-border-green: 4px solid $session-color-green; .module-message__author-avatar { display: inline-flex; - margin-right: 20px; + margin-inline-end: 20px; padding-top: 5px; } @@ -425,7 +425,7 @@ label { } .search-icon { - margin-right: 10px; + margin-inline-end: 10px; } .session-icon-button { @@ -464,7 +464,7 @@ label { .session-button.default.danger { display: flex; // width: 80px; - margin-right: 0px; + margin-inline-end: 0px; } } .message-selection-overlay div[role='button'] { @@ -510,10 +510,10 @@ label { } .toast-icon { - padding-right: $session-icon-size-md; + padding-inline-end: $session-icon-size-md; } .toast-info { - margin-right: $session-icon-size-sm + $session-icon-size-sm; + margin-inline-end: $session-icon-size-sm + $session-icon-size-sm; width: 350px; &-container { @@ -616,8 +616,8 @@ label { .session-modal__header__icons > div { float: left; - padding-left: 0px; - padding-right: 10px; + padding-inline-start: 0px; + padding-inline-end: 10px; } } @@ -633,7 +633,7 @@ label { } &__icons > div { float: right; - padding-left: 10px; + padding-inline-start: 10px; } } @@ -708,7 +708,7 @@ label { display: flex; flex-direction: column; - .friend-selection-list { + .contact-selection-list { width: unset; } @@ -884,10 +884,10 @@ label { } .session-icon { - margin-left: 6px; + margin-inline-start: 6px; } .item-content { - margin-left: 6px; + margin-inline-start: 6px; } &.active, @@ -1046,7 +1046,7 @@ label { .session-button, .session-icon-button { - margin-right: $session-margin-lg; + margin-inline-end: $session-margin-lg; } } @@ -1067,7 +1067,7 @@ label { } &__info { - padding-right: $session-margin-lg; + padding-inline-end: $session-margin-lg; } &__title { @@ -1247,7 +1247,7 @@ label { .session-radio-group fieldset { border: none; - margin-left: $session-margin-sm; + margin-inline-start: $session-margin-sm; margin-top: $session-margin-sm; .session-radio { @@ -1265,7 +1265,7 @@ label { } label { - margin-right: 1em; + margin-inline-end: 1em; } label:before { @@ -1273,7 +1273,7 @@ label { display: inline-block; width: 0.5em; height: 0.5em; - margin-right: 0.8em; + margin-inline-end: 0.8em; border-radius: 100%; vertical-align: -3px; border: 2px solid rgba($session-color-white, 0.6); @@ -1351,7 +1351,7 @@ input { } } -.friend-selection-list { +.contact-selection-list { width: 20vw; } @@ -1502,10 +1502,10 @@ input { &__name { font-weight: bold; - margin-left: $session-margin-md; + margin-inline-start: $session-margin-md; } &__pubkey { - margin-left: 5px; + margin-inline-start: 5px; opacity: 0.8; } diff --git a/stylesheets/_session_group_panel.scss b/stylesheets/_session_group_panel.scss index fcf8d7abf..5cee99926 100644 --- a/stylesheets/_session_group_panel.scss +++ b/stylesheets/_session_group_panel.scss @@ -1,7 +1,7 @@ .conversation-content-right { transition: $session-transition-duration; width: 22vw; - margin-right: -22vw; + margin-inline-end: -22vw; } .group-settings { diff --git a/stylesheets/_session_left_pane.scss b/stylesheets/_session_left_pane.scss index 1a42ef838..790b473f6 100644 --- a/stylesheets/_session_left_pane.scss +++ b/stylesheets/_session_left_pane.scss @@ -2,7 +2,7 @@ $session-compose-margin: 20px; .gutter { width: 380px !important; - padding-right: 5px !important; + padding-inline-end: 5px !important; transition: $session-transition-duration; @include themify($themes) { @@ -82,8 +82,8 @@ $session-compose-margin: 20px; } &__header__name { - flex-grow: 0 !important; - padding-right: 5px !important; + flex-grow: 0; + padding-inline-end: 5px; } &__header__name--with-unread .module-conversation__user__profile-number, @@ -137,11 +137,11 @@ $session-compose-margin: 20px; justify-content: space-between; align-items: center; height: $main-view-header-height; - padding-right: 7px; + padding-inline-end: 7px; transition: $session-transition-duration; .session-button { - margin-left: auto; + margin-inline-start: auto; @include fontAccentBold(); } @@ -158,9 +158,10 @@ $session-compose-margin: 20px; &__title { cursor: pointer; - padding-right: $session-margin-sm; - padding-left: $session-margin-sm; + padding-inline-end: $session-margin-sm; + padding-inline-start: $session-margin-sm; transition: $session-transition-duration; + flex-grow: 1; } &__list { @@ -227,7 +228,7 @@ $session-compose-margin: 20px; .exit { margin-top: 10px; - margin-left: 13px; + margin-inline-start: 13px; align-self: flex-start; } @@ -308,7 +309,7 @@ $session-compose-margin: 20px; .session-search-input { height: $session-search-input-height; width: 100%; - margin-right: 1px; + margin-inline-end: 1px; margin-bottom: 10px; display: inline-flex; flex-shrink: 0; diff --git a/stylesheets/_session_password.scss b/stylesheets/_session_password.scss index 1b1bec800..838ae8ac9 100644 --- a/stylesheets/_session_password.scss +++ b/stylesheets/_session_password.scss @@ -56,7 +56,7 @@ color: $session-color-white; } svg { - margin-right: $session-margin-lg; + margin-inline-end: $session-margin-lg; } } diff --git a/stylesheets/_session_signin.scss b/stylesheets/_session_signin.scss index e4d908a3f..b07c9ddaa 100644 --- a/stylesheets/_session_signin.scss +++ b/stylesheets/_session_signin.scss @@ -16,7 +16,7 @@ &-accent { flex-grow: 1; - padding-left: 20px; + padding-inline-start: 20px; &-text { @include themify($themes) { @@ -33,7 +33,7 @@ } &-registration { - padding-right: 128px; + padding-inline-end: 128px; } &-header { @@ -113,8 +113,8 @@ left: 0; right: 0; - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; @include themify($themes) { background: themed('cellBackground'); } @@ -171,7 +171,7 @@ } &-input-floating-label-show-hide { - padding-right: 30px; + padding-inline-end: 30px; } &-input-with-label-container { @@ -283,7 +283,7 @@ line-height: 20px; ol { - margin-left: 20px; + margin-inline-start: 20px; padding: 0px; text-align: justify; } @@ -295,7 +295,7 @@ justify-content: center; padding: 20px; border-radius: 8px; - border: 2px solid #353535; + border: 1px solid subtle(#353535); margin-bottom: 20px; textarea { diff --git a/stylesheets/_session_theme.scss b/stylesheets/_session_theme.scss index e377b889a..680451a33 100644 --- a/stylesheets/_session_theme.scss +++ b/stylesheets/_session_theme.scss @@ -105,7 +105,7 @@ } &-read-receipt-container { - margin-left: 5px; + margin-inline-start: 5px; .session-icon.check { @include themify($themes) { fill: subtle(themed('sentMessageText')); diff --git a/stylesheets/manifest.scss b/stylesheets/manifest.scss index 47246ef0c..d957fb58f 100644 --- a/stylesheets/manifest.scss +++ b/stylesheets/manifest.scss @@ -27,6 +27,7 @@ @import 'modules'; @import 'session'; @import 'quote'; +@import 'rtl'; // Separate screens @import 'session_signin'; diff --git a/test/blanket_mocha.js b/test/blanket_mocha.js index f6b2b0ed1..c10e5eb0c 100644 --- a/test/blanket_mocha.js +++ b/test/blanket_mocha.js @@ -5039,7 +5039,7 @@ var parseAndModify = inBrowser ? window.falafel : require('falafel'); blanket.defaultReporter = function(coverage) { var cssSytle = - "#blanket-main {margin:2px;background:#EEE;color:#333;clear:both;font-family:'Helvetica Neue Light', 'HelveticaNeue-Light', 'Helvetica Neue', Calibri, Helvetica, Arial, sans-serif; font-size:17px;} #blanket-main a {color:#333;text-decoration:none;} #blanket-main a:hover {text-decoration:underline;} .blanket {margin:0;padding:5px;clear:both;border-bottom: 1px solid #FFFFFF;} .bl-error {color:red;}.bl-success {color:#5E7D00;} .bl-file{width:auto;} .bl-cl{float:left;} .blanket div.rs {margin-left:50px; width:150px; float:right} .bl-nb {padding-right:10px;} #blanket-main a.bl-logo {color: #EB1764;cursor: pointer;font-weight: bold;text-decoration: none} .bl-source{ overflow-x:scroll; background-color: #FFFFFF; border: 1px solid #CBCBCB; color: #363636; margin: 25px 20px; width: 80%;} .bl-source div{white-space: pre;font-family: monospace;} .bl-source > div > span:first-child{background-color: #EAEAEA;color: #949494;display: inline-block;padding: 0 10px;text-align: center;width: 30px;} .bl-source .miss{background-color:#e6c3c7} .bl-source span.branchWarning{color:#000;background-color:yellow;} .bl-source span.branchOkay{color:#000;background-color:transparent;}", + "#blanket-main {margin:2px;background:#EEE;color:#333;clear:both;font-family:'Helvetica Neue Light', 'HelveticaNeue-Light', 'Helvetica Neue', Calibri, Helvetica, Arial, sans-serif; font-size:17px;} #blanket-main a {color:#333;text-decoration:none;} #blanket-main a:hover {text-decoration:underline;} .blanket {margin:0;padding:5px;clear:both;border-bottom: 1px solid #FFFFFF;} .bl-error {color:red;}.bl-success {color:#5E7D00;} .bl-file{width:auto;} .bl-cl{float:left;} .blanket div.rs {margin-inline-start:50px; width:150px; float:right} .bl-nb {padding-inline-end:10px;} #blanket-main a.bl-logo {color: #EB1764;cursor: pointer;font-weight: bold;text-decoration: none} .bl-source{ overflow-x:scroll; background-color: #FFFFFF; border: 1px solid #CBCBCB; color: #363636; margin: 25px 20px; width: 80%;} .bl-source div{white-space: pre;font-family: monospace;} .bl-source > div > span:first-child{background-color: #EAEAEA;color: #949494;display: inline-block;padding: 0 10px;text-align: center;width: 30px;} .bl-source .miss{background-color:#e6c3c7} .bl-source span.branchWarning{color:#000;background-color:yellow;} .bl-source span.branchOkay{color:#000;background-color:transparent;}", successRate = 60, head = document.head, fileNumber = 0, @@ -5990,20 +5990,20 @@ blanket.defaultReporter = function(coverage) { throw new Exception('mocha library does not exist in global namespace!'); } - /* - * Mocha Events: - * - * - `start` execution started - * - `end` execution complete - * - `suite` (suite) test suite execution started - * - `suite end` (suite) all tests (and sub-suites) have finished - * - `test` (test) test execution started - * - `test end` (test) test completed - * - `hook` (hook) hook execution started - * - `hook end` (hook) hook complete - * - `pass` (test) test passed - * - `fail` (test, err) test failed - * + /* + * Mocha Events: + * + * - `start` execution started + * - `end` execution complete + * - `suite` (suite) test suite execution started + * - `suite end` (suite) all tests (and sub-suites) have finished + * - `test` (test) test execution started + * - `test end` (test) test completed + * - `hook` (hook) hook execution started + * - `hook end` (hook) hook complete + * - `pass` (test) test passed + * - `fail` (test, err) test failed + * */ var OriginalReporter = mocha._reporter; From c47d0e5707fa47479583ee11df32306a46456e9e Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 31 Aug 2020 14:52:26 +1000 Subject: [PATCH 127/274] rename friend-.. css to contact- --- ts/components/conversation/CreateGroupDialog.tsx | 2 +- ts/components/conversation/InviteContactsDialog.tsx | 4 ++-- ts/components/conversation/ModeratorsAddDialog.tsx | 2 +- ts/components/conversation/ModeratorsRemoveDialog.tsx | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ts/components/conversation/CreateGroupDialog.tsx b/ts/components/conversation/CreateGroupDialog.tsx index 4fe4f72a1..3ae0fa1b0 100644 --- a/ts/components/conversation/CreateGroupDialog.tsx +++ b/ts/components/conversation/CreateGroupDialog.tsx @@ -115,7 +115,7 @@ export class CreateGroupDialog extends React.Component { autoFocus={true} aria-required={true} /> -
+
{ >
-
{this.renderMemberList()}
+
{this.renderMemberList()}
{hasContacts ? null : ( <>
-

{window.i18n('noContactsToAdd')}

+

{window.i18n('noContactsToAdd')}

)} diff --git a/ts/components/conversation/ModeratorsAddDialog.tsx b/ts/components/conversation/ModeratorsAddDialog.tsx index 6a9e19129..71ad9cd38 100644 --- a/ts/components/conversation/ModeratorsAddDialog.tsx +++ b/ts/components/conversation/ModeratorsAddDialog.tsx @@ -148,7 +148,7 @@ export class AddModeratorsDialog extends React.Component {

From friends:

-
+
{

Existing moderators:

-
+
Date: Mon, 31 Aug 2020 14:52:54 +1000 Subject: [PATCH 128/274] add auto switch to RTL body if locale in rtlLocales --- js/views/app_view.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/js/views/app_view.js b/js/views/app_view.js index 144cb3e2c..0b21359fe 100644 --- a/js/views/app_view.js +++ b/js/views/app_view.js @@ -22,11 +22,18 @@ openInbox: 'openInbox', }, applyTheme() { + const rtlLocales = ['fa'] const theme = storage.get('theme-setting') || 'light'; this.$el .removeClass('light-theme') .removeClass('dark-theme') + .removeClass('rtl') .addClass(`${theme}-theme`); + + const loc = window.i18n.getLocale() + if (rtlLocales.includes(loc)) { + this.$el.addClass('rtl'); + } }, applyHideMenu() { const hideMenuBar = storage.get('hide-menu-bar', true); From 73e2250ca88c7a84fae99ee2ee978a3550ed5d6e Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 31 Aug 2020 14:53:17 +1000 Subject: [PATCH 129/274] add submenu rtl support (disabled for now) --- ts/session/utils/Menu.tsx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ts/session/utils/Menu.tsx b/ts/session/utils/Menu.tsx index b0564bac4..1834daf48 100644 --- a/ts/session/utils/Menu.tsx +++ b/ts/session/utils/Menu.tsx @@ -234,8 +234,13 @@ export function getDisappearingMenuItem( Boolean(isBlocked) ) ) { + const isRtlMode = isRtlBody(); return ( - + // Remove the && false to make context menu work with RTL support + {(timerOptions || []).map(item => ( Date: Mon, 31 Aug 2020 15:04:33 +1000 Subject: [PATCH 130/274] lint --- js/views/app_view.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/views/app_view.js b/js/views/app_view.js index 0b21359fe..bab2f8343 100644 --- a/js/views/app_view.js +++ b/js/views/app_view.js @@ -22,7 +22,7 @@ openInbox: 'openInbox', }, applyTheme() { - const rtlLocales = ['fa'] + const rtlLocales = ['fa']; const theme = storage.get('theme-setting') || 'light'; this.$el .removeClass('light-theme') @@ -30,7 +30,7 @@ .removeClass('rtl') .addClass(`${theme}-theme`); - const loc = window.i18n.getLocale() + const loc = window.i18n.getLocale(); if (rtlLocales.includes(loc)) { this.$el.addClass('rtl'); } From eabc2b30dc39fe3c53f504a6bae483d40930f366 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 31 Aug 2020 15:32:24 +1000 Subject: [PATCH 131/274] apply rtl on app initialize --- js/views/app_view.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/js/views/app_view.js b/js/views/app_view.js index bab2f8343..15312133d 100644 --- a/js/views/app_view.js +++ b/js/views/app_view.js @@ -13,6 +13,7 @@ this.inboxView = null; this.applyTheme(); + this.applyRtl(); this.applyHideMenu(); this.showSeedDialog = this.showSeedDialog.bind(this); @@ -21,20 +22,21 @@ events: { openInbox: 'openInbox', }, - applyTheme() { + applyRtl() { const rtlLocales = ['fa']; - const theme = storage.get('theme-setting') || 'light'; - this.$el - .removeClass('light-theme') - .removeClass('dark-theme') - .removeClass('rtl') - .addClass(`${theme}-theme`); const loc = window.i18n.getLocale(); if (rtlLocales.includes(loc)) { this.$el.addClass('rtl'); } }, + applyTheme() { + const theme = storage.get('theme-setting') || 'light'; + this.$el + .removeClass('light-theme') + .removeClass('dark-theme') + .addClass(`${theme}-theme`); + }, applyHideMenu() { const hideMenuBar = storage.get('hide-menu-bar', true); window.setAutoHideMenuBar(hideMenuBar); From 68c1f1f781db6b4eb6137d9495a518a8ddf5f6f7 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 1 Sep 2020 10:08:00 +1000 Subject: [PATCH 132/274] use sentence case for android to desktop translation morphing --- _locales/en/messages.json | 22 +++++++++++++--------- _locales/fr/messages.json | 6 +++--- tools/mapAndroidTranslationsToDesktop.py | 9 +++++---- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 74285b4fa..79b1e3646 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -32,7 +32,7 @@ "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.", "androidKey": "message_recipients_list_item__view", "addStart": "&", - "wordCapitalize": true + "sentenceCase": true }, "mainMenuWindow": { "message": "&Window", @@ -64,7 +64,7 @@ "message": "Undo", "description": "Edit menu command to remove recently-typed text", "androidKey": "ConversationListFragment_undo", - "wordCapitalize": true + "sentenceCase": true }, "editMenuRedo": { "message": "Redo", @@ -93,10 +93,10 @@ "androidKey": "delete" }, "editMenuSelectAll": { - "message": "Select All", + "message": "Select all", "description": "Edit menu comand to select all of the text in selected text box", "androidKey": "conversation_list_batch__menu_select_all", - "wordCapitalize": true + "sentenceCase": true }, "editMenuStartSpeaking": { "message": "Start speaking", @@ -233,7 +233,7 @@ "message": "View", "description": "Used as a label on a button allowing user to see more information", "androidKey": "message_recipients_list_item__view", - "wordCapitalize": true + "sentenceCase": true }, "youLeftTheGroup": { "message": "You have left the group.", @@ -520,16 +520,19 @@ "androidKey": "BucketedThreadMedia_Yesterday" }, "thisWeek": { - "message": "This Week", + "message": "This week", "description": "Section header in the media gallery", "androidKey": "BucketedThreadMedia_This_week", - "wordCapitalize": true + "ignoreCase": true, + "sentenceCase": true }, "thisMonth": { "message": "This Month", "description": "Section header in the media gallery", "androidKey": "BucketedThreadMedia_This_month", - "wordCapitalize": true + "ignoreCase": true, + "sentenceCase": true + }, "voiceMessage": { "message": "Voice Message", @@ -871,7 +874,8 @@ "unpairDevice": { "message": "Unlink Device", "androidKey": "fragment_device_list_unlink_device_title", - "wordCapitalize": true + "ignoreCase": true, + "sentenceCase": true }, "unpairDeviceWarning": { "message": "Are you sure you want to unlink this device?", diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index 12761b97d..0d2630a30 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -72,7 +72,7 @@ "description": "Edit menu command to remove the selected text" }, "editMenuSelectAll": { - "message": "Tout Sélectionner", + "message": "Tout sélectionner", "description": "Edit menu comand to select all of the text in selected text box" }, "editMenuStartSpeaking": { @@ -414,11 +414,11 @@ "description": "Section header in the media gallery" }, "thisWeek": { - "message": "Cette Semaine", + "message": "Cette semaine", "description": "Section header in the media gallery" }, "thisMonth": { - "message": "Ce Mois", + "message": "Ce mois", "description": "Section header in the media gallery" }, "voiceMessage": { diff --git a/tools/mapAndroidTranslationsToDesktop.py b/tools/mapAndroidTranslationsToDesktop.py index 496631316..5ec77f933 100755 --- a/tools/mapAndroidTranslationsToDesktop.py +++ b/tools/mapAndroidTranslationsToDesktop.py @@ -7,11 +7,12 @@ import traceback # androidKey # "androidKeyCount": "one" or "other" used to find matching key with quantity -# "wordCapitalize": true capitalize each words (must be called before addStart) +# "sentenceCase": true capitalize first word (must be called before addStart) +# "ignoreCase": true ignore case difference between android EN and desktop EN values (some stuff are put in maj on android but not on desktop) # "addStart": "&" char to add as start char # "androidReplace": replace all occurences of key value pair -ALLOWED_ITEM_KEYS = ['message', 'description', 'comment', 'placeholders', 'androidKey', 'wordCapitalize', 'androidKeyCount', 'androidReplace', 'addStart', 'ignoreCase'] +ALLOWED_ITEM_KEYS = ['message', 'description', 'comment', 'placeholders', 'androidKey', 'androidKeyCount', 'androidReplace', 'addStart', 'ignoreCase', 'sentenceCase'] SPECIFIC_LOCALES_MAPPING = { 'zh_CN': 'zh-rCN', @@ -106,8 +107,8 @@ def validateKeysPresent(items): def morphToDesktopSyntax(androidString, desktopItem): replaced = androidString.replace(r"\'", "'") - if('wordCapitalize' in desktopItem.keys() and desktopItem['wordCapitalize']): - replaced = replaced.title() + if('sentenceCase' in desktopItem.keys() and desktopItem['sentenceCase']): + replaced = replaced.capitalize() if ('androidReplace' in desktopItem.keys()): for key, value in desktopItem['androidReplace'].items(): From 5f9348d21e6b733e5a429fc42642aad5a650aa78 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 1 Sep 2020 10:09:50 +1000 Subject: [PATCH 133/274] replace whole word Signal to Session on all translations --- _locales/ar/messages.json | 16 ++++++++-------- _locales/bg/messages.json | 14 +++++++------- _locales/ca/messages.json | 32 ++++++++++++++++---------------- _locales/cs/messages.json | 28 ++++++++++++++-------------- _locales/da/messages.json | 32 ++++++++++++++++---------------- _locales/de/messages.json | 24 ++++++++++++------------ _locales/el/messages.json | 32 ++++++++++++++++---------------- _locales/en/messages.json | 4 ++-- _locales/eo/messages.json | 32 ++++++++++++++++---------------- _locales/es/messages.json | 26 +++++++++++++------------- _locales/es_419/messages.json | 26 +++++++++++++------------- _locales/et/messages.json | 14 +++++++------- _locales/fa/messages.json | 32 ++++++++++++++++---------------- _locales/fi/messages.json | 18 +++++++++--------- _locales/fr/messages.json | 24 ++++++++++++------------ _locales/he/messages.json | 30 +++++++++++++++--------------- _locales/hi/messages.json | 28 ++++++++++++++-------------- _locales/hr/messages.json | 30 +++++++++++++++--------------- _locales/hu/messages.json | 30 +++++++++++++++--------------- _locales/id/messages.json | 32 ++++++++++++++++---------------- _locales/it/messages.json | 24 ++++++++++++------------ _locales/ja/messages.json | 8 ++++---- _locales/km/messages.json | 26 +++++++++++++------------- _locales/kn/messages.json | 28 ++++++++++++++-------------- _locales/ko/messages.json | 30 +++++++++++++++--------------- _locales/lt/messages.json | 32 ++++++++++++++++---------------- _locales/mk/messages.json | 30 +++++++++++++++--------------- _locales/nb/messages.json | 32 ++++++++++++++++---------------- _locales/nl/messages.json | 32 ++++++++++++++++---------------- _locales/nn/messages.json | 32 ++++++++++++++++---------------- _locales/no/messages.json | 32 ++++++++++++++++---------------- _locales/pl/messages.json | 30 +++++++++++++++--------------- _locales/pt_BR/messages.json | 24 ++++++++++++------------ _locales/pt_PT/messages.json | 32 ++++++++++++++++---------------- _locales/ro/messages.json | 32 ++++++++++++++++---------------- _locales/ru/messages.json | 26 +++++++++++++------------- _locales/sk/messages.json | 32 ++++++++++++++++---------------- _locales/sl/messages.json | 30 +++++++++++++++--------------- _locales/sq/messages.json | 32 ++++++++++++++++---------------- _locales/sr/messages.json | 30 +++++++++++++++--------------- _locales/sv/messages.json | 32 ++++++++++++++++---------------- _locales/th/messages.json | 32 ++++++++++++++++---------------- _locales/tr/messages.json | 32 ++++++++++++++++---------------- _locales/uk/messages.json | 28 ++++++++++++++-------------- _locales/vi/messages.json | 30 +++++++++++++++--------------- _locales/zh_CN/messages.json | 28 ++++++++++++++-------------- _locales/zh_TW/messages.json | 30 +++++++++++++++--------------- 47 files changed, 645 insertions(+), 645 deletions(-) diff --git a/_locales/ar/messages.json b/_locales/ar/messages.json index 0601de725..050c86004 100644 --- a/_locales/ar/messages.json +++ b/_locales/ar/messages.json @@ -154,7 +154,7 @@ "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.", + "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 Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "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.", + "message": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session 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": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start using Signal Desktop", + "message": "Start using Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "مرحبا الى سيجنال Signal", + "message": "مرحبا الى سيجنال Session", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "To send audio messages, allow Signal Desktop to access your microphone.", + "message": "To send audio messages, allow Session Desktop to access your microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Link New Device", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissions", diff --git a/_locales/bg/messages.json b/_locales/bg/messages.json index 2b6a490d1..5236ce189 100644 --- a/_locales/bg/messages.json +++ b/_locales/bg/messages.json @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Току-що сте преминали процеса на експортиране и вашите контакти и съобщения чакат търпеливо на вашия компютър. Изберете папката, която съдържа запаметените ви данни на Signal.", + "message": "Току-що сте преминали процеса на експортиране и вашите контакти и съобщения чакат търпеливо на вашия компютър. Изберете папката, която съдържа запаметените ви данни на Session.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "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.", + "message": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session 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": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Започнете да използвате Signal Desktop", + "message": "Започнете да използвате Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "To send audio messages, allow Signal Desktop to access your microphone.", + "message": "To send audio messages, allow Session Desktop to access your microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Свържи Ново Устройство", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissions", diff --git a/_locales/ca/messages.json b/_locales/ca/messages.json index bcf788a19..0cf8e2670 100644 --- a/_locales/ca/messages.json +++ b/_locales/ca/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Surt del Signal", + "message": "Surt del Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Acabeu de passar pel procés d'exportació i els vostres contactes i missatges esperen pacientment a l'ordinador. Seleccioneu la carpeta que conté les dades de Signal desades.", + "message": "Acabeu de passar pel procés d'exportació i els vostres contactes i missatges esperen pacientment a l'ordinador. Seleccioneu la carpeta que conté les dades de Session desades.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Assegureu-vos que heu triat el directori correcte que conté les dades de Signal desades. El seu nom hauria de començar amb \"Signal Export\". També podeu desar una còpia nova de les dades des de l'aplicació Chrome.", + "message": "Assegureu-vos que heu triat el directori correcte que conté les dades de Session desades. El seu nom hauria de començar amb \"Session Export\". També podeu desar una còpia nova de les dades des de l'aplicació Chrome.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Comenceu a usar el Signal Desktop", + "message": "Comenceu a usar el Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Els números de seguretat amb múltiples membres de grup han canviat des que els vau verificar l'últim cop. Això podria voler dir que algú està provant d'interceptar les vostres comunicacions o que simplement ha reinstal·lat el Signal.", + "message": "Els números de seguretat amb múltiples membres de grup han canviat des que els vau verificar l'últim cop. Això podria voler dir que algú està provant d'interceptar les vostres comunicacions o que simplement ha reinstal·lat el Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "El número de seguretat amb $name$ ha canviat des que el vau verificar l'últim cop. Això podria voler dir que algú està provant d'interceptar les vostres comunicacions o que $name$ simplement ha reinstal·lat el Signal.", + "message": "El número de seguretat amb $name$ ha canviat des que el vau verificar l'últim cop. Això podria voler dir que algú està provant d'interceptar les vostres comunicacions o que $name$ simplement ha reinstal·lat el Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "El número de seguretat que intenteu verificar ha canviat. Si us plau, reviseu el número de seguretat nou amb $name$. Recordeu que aquest canvi podria voler dir que algú està provant d'interceptar les vostres comunicacions o que $name$ simplement ha reinstal·lat el Signal.", + "message": "El número de seguretat que intenteu verificar ha canviat. Si us plau, reviseu el número de seguretat nou amb $name$. Recordeu que aquest canvi podria voler dir que algú està provant d'interceptar les vostres comunicacions o que $name$ simplement ha reinstal·lat el Session.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Els números de seguretat amb múltiples membres de grup han canviat recentment. Això podria voler dir que algú està provant d'interceptar les vostres comunicacions o que simplement ha reinstal·lat el Signal.", + "message": "Els números de seguretat amb múltiples membres de grup han canviat recentment. Això podria voler dir que algú està provant d'interceptar les vostres comunicacions o que simplement ha reinstal·lat el Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "El número de seguretat amb $name$ ha canviat recentment. Això podria voler dir que algú està provant d'interceptar les vostres comunicacions o que $name$ simplement ha reinstal·lat el Signal.", + "message": "El número de seguretat amb $name$ ha canviat recentment. Això podria voler dir que algú està provant d'interceptar les vostres comunicacions o que $name$ simplement ha reinstal·lat el Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "El número de seguretat amb $name$ ha canviat. Això podria voler dir que algú està provant d'interceptar les vostres comunicacions o que $name$ simplement ha reinstal·lat el Signal. Potser hauríeu de verificar el número de seguretat amb aquest contacte.", + "message": "El número de seguretat amb $name$ ha canviat. Això podria voler dir que algú està provant d'interceptar les vostres comunicacions o que $name$ simplement ha reinstal·lat el Session. Potser hauríeu de verificar el número de seguretat amb aquest contacte.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Previsualització de l'esborrany de la vista en miniatura de l'enllaç $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Previsualització de la vista en miniatura de l'enllaç $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Benvingut al Signal", + "message": "Benvingut al Session", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "Per enviar missatges d'àudio, permeteu que el Signal Desktop tingui accés al micròfon.", + "message": "Per enviar missatges d'àudio, permeteu que el Session Desktop tingui accés al micròfon.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Enllaça un aparell nou", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permisos", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Aquesta versió del Signal Desktop ha expirat. Actualitzeu a l'última versió per a poder seguir enviant i rebent missatges.", + "message": "Aquesta versió del Session Desktop ha expirat. Actualitzeu a l'última versió per a poder seguir enviant i rebent missatges.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/cs/messages.json b/_locales/cs/messages.json index 6fcec4070..1f60359ed 100644 --- a/_locales/cs/messages.json +++ b/_locales/cs/messages.json @@ -154,7 +154,7 @@ "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.", + "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 Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "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.", + "message": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session 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": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Začít používat Signal Desktop", + "message": "Začít používat Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Your safety numbers with multiple group members have changed since you last verified. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Signal.", + "message": "Your safety numbers with multiple group members have changed since you last verified. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Bezpečnostní číslo s $name$ se změnilo. Může to znamenat buď to, že se někdo snaží vaši komunikaci odposlouchávat, nebo si $name$ prostě znovu nainstaloval Signal.", + "message": "Bezpečnostní číslo s $name$ se změnilo. Může to znamenat buď to, že se někdo snaží vaši komunikaci odposlouchávat, nebo si $name$ prostě znovu nainstaloval Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Bezpečnostní číslo, které se pokoušíte ověřit se změnilo. Prosím zkontrolujte s $name$ své nové bezpečnostní číslo . Pamatujte, tato změna může znamenat, že se někdo snaží vaši komunikaci odposlouchávat, nebo si $name$ prostě znovu nainstaloval Signal.", + "message": "Bezpečnostní číslo, které se pokoušíte ověřit se změnilo. Prosím zkontrolujte s $name$ své nové bezpečnostní číslo . Pamatujte, tato změna může znamenat, že se někdo snaží vaši komunikaci odposlouchávat, nebo si $name$ prostě znovu nainstaloval Session.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Your safety numbers with multiple group members have changed recently. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Signal.", + "message": "Your safety numbers with multiple group members have changed recently. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Bezpečnostní číslo s $name$ se změnilo. Může to znamenat buď to, že se někdo snaží vaši komunikaci odposlouchávat, nebo si $name$ prostě znovu nainstaloval Signal.", + "message": "Bezpečnostní číslo s $name$ se změnilo. Může to znamenat buď to, že se někdo snaží vaši komunikaci odposlouchávat, nebo si $name$ prostě znovu nainstaloval Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Bezpečnostní číslo s $name$ se vám změnilo. Může to znamenat buď to, že se někdo snaží vaši komunikaci odposlouchávat, nebo si $name$ prostě znovu nainstaloval Signal. Možná si budete chtít bezpečnostní číslo níže ověřit.", + "message": "Bezpečnostní číslo s $name$ se vám změnilo. Může to znamenat buď to, že se někdo snaží vaši komunikaci odposlouchávat, nebo si $name$ prostě znovu nainstaloval Session. Možná si budete chtít bezpečnostní číslo níže ověřit.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "Pro posílání audio zpráv potřebuje Signal Desktop přístup k mikrofonu.", + "message": "Pro posílání audio zpráv potřebuje Session Desktop přístup k mikrofonu.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Propojit nové zařízení", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Oprávnění", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Tato verze aplikace Signal Desktop je zastaralá. Abyste mohli dále komunikovat, aktualizujte ji prosím na nejnovější verzi.", + "message": "Tato verze aplikace Session Desktop je zastaralá. Abyste mohli dále komunikovat, aktualizujte ji prosím na nejnovější verzi.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/da/messages.json b/_locales/da/messages.json index 330a84376..1f291d88e 100644 --- a/_locales/da/messages.json +++ b/_locales/da/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Luk Signal", + "message": "Luk Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Du har lige gået gennem eksportprocessen, og dine kontakter og meddelelser venter tålmodigt på din computer. Vælg den mappe, der indeholder dine gemte Signal-data.", + "message": "Du har lige gået gennem eksportprocessen, og dine kontakter og meddelelser venter tålmodigt på din computer. Vælg den mappe, der indeholder dine gemte Session-data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Sørg for at du har valgt den rigtige mappe, der indeholder dine gemte Signal-data. Dets navn skal begynde med 'Signal Export'. Du kan også gemme en ny kopi af dine data fra Chrome Appen.", + "message": "Sørg for at du har valgt den rigtige mappe, der indeholder dine gemte Session-data. Dets navn skal begynde med 'Session Export'. Du kan også gemme en ny kopi af dine data fra Chrome Appen.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Tag Signal Desktop i brug", + "message": "Tag Session Desktop i brug", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Dine sikkerhedsnumre med flere gruppemedlemmer har ændret sig siden du sidst verificerede. Dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller bare at de har geninstalleret Signal.", + "message": "Dine sikkerhedsnumre med flere gruppemedlemmer har ændret sig siden du sidst verificerede. Dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller bare at de har geninstalleret Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Dit sikkerhedsnummer med $name$ har ændret sig siden du sidst verificerede. Dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller at $name$ bare har geninstalleret Signal.", + "message": "Dit sikkerhedsnummer med $name$ har ændret sig siden du sidst verificerede. Dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller at $name$ bare har geninstalleret Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Det sikkerhedsnummer du prøver at verificere har ændret sig. Venligst verificer det nye sikkerhedsnummer med $name$. Husk, dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller at $name$ bare har geninstalleret Signal.", + "message": "Det sikkerhedsnummer du prøver at verificere har ændret sig. Venligst verificer det nye sikkerhedsnummer med $name$. Husk, dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller at $name$ bare har geninstalleret Session.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Dine sikkerhedsnumre med flere gruppemedlemmer har ændret sig for nylig. Dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller bare at de har geninstalleret Signal.", + "message": "Dine sikkerhedsnumre med flere gruppemedlemmer har ændret sig for nylig. Dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller bare at de har geninstalleret Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Dit sikkerhedsnummer med $name$ har ændret sig for nylig. Dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller at $name$ bare har geninstalleret Signal.", + "message": "Dit sikkerhedsnummer med $name$ har ændret sig for nylig. Dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller at $name$ bare har geninstalleret Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Dit sikkerhedsnummer med $name$ har ændret sig. Dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller at $name$ bare har geninstalleret Signal. Du bør overveje at verificere dit sikkerhedsnummer med denne kontakt.", + "message": "Dit sikkerhedsnummer med $name$ har ændret sig. Dette kan betyde at nogen forsøger at opsnappe jeres kommunikation eller at $name$ bare har geninstalleret Session. Du bør overveje at verificere dit sikkerhedsnummer med denne kontakt.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Udkast miniaturebillede til eksempelvisning for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Miniaturebillede til eksempelvisning for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Velkommen til Signal", + "message": "Velkommen til Session", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "For at sende talebeskeder skal du lade Signal Desktop få adgang til din mikrofon.", + "message": "For at sende talebeskeder skal du lade Session Desktop få adgang til din mikrofon.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Forbind ny enhed", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Tilladelser", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Denne version af Signal er forældet. Venligst opgrader til den seneste version.", + "message": "Denne version af Session er forældet. Venligst opgrader til den seneste version.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/de/messages.json b/_locales/de/messages.json index 74fe09f6e..195f0a389 100644 --- a/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Signal beenden", + "message": "Session beenden", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -167,7 +167,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Du hast gerade den Exportierungsprozess durchlaufen, und deine Kontakte und Nachrichten warten geduldig auf deinem Computer. Wähle nun den Ordner aus, der deine gespeicherten Signal-Daten enthält.", + "message": "Du hast gerade den Exportierungsprozess durchlaufen, und deine Kontakte und Nachrichten warten geduldig auf deinem Computer. Wähle nun den Ordner aus, der deine gespeicherten Session-Daten enthält.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -183,7 +183,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Achte darauf, dass du das korrekte Verzeichnis gewählt hast, das deine gespeicherten Signal-Daten enthält. Dessen Name sollte mit »Signal Export« beginnen. Auch kannst du eine neue Kopie deiner Daten aus der Chrome-App heraus speichern.", + "message": "Achte darauf, dass du das korrekte Verzeichnis gewählt hast, das deine gespeicherten Session-Daten enthält. Dessen Name sollte mit »Session Export« beginnen. Auch kannst du eine neue Kopie deiner Daten aus der Chrome-App heraus speichern.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -199,7 +199,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Signal Desktop verwenden", + "message": "Session Desktop verwenden", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -277,7 +277,7 @@ "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": "Deine Sicherheitsnummern mit mehreren Gruppenmitgliedern haben sich seit eurer letzten Verifikation geändert. Dies könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören, oder aber die entsprechenden Mitglieder haben Signal einfach erneut installiert.", + "message": "Deine Sicherheitsnummern mit mehreren Gruppenmitgliedern haben sich seit eurer letzten Verifikation geändert. Dies könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören, oder aber die entsprechenden Mitglieder haben Session einfach erneut installiert.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { @@ -291,7 +291,7 @@ } }, "changedRightAfterVerify": { - "message": "Die zu verifizierende Sicherheitsnummer hat sich geändert. Bitte überprüfe deine neue Sicherheitsnummer mit $name$. Diese Veränderung könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören, oder aber $name$ hat Signal einfach erneut installiert.", + "message": "Die zu verifizierende Sicherheitsnummer hat sich geändert. Bitte überprüfe deine neue Sicherheitsnummer mit $name$. Diese Veränderung könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören, oder aber $name$ hat Session einfach erneut installiert.", "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": { @@ -301,7 +301,7 @@ } }, "changedRecentlyMultiple": { - "message": "Deine Sicherheitsnummern mit mehreren Gruppenmitgliedern haben sich kürzlich geändert. Dies könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören, oder aber die entsprechenden Mitglieder haben Signal einfach erneut installiert.", + "message": "Deine Sicherheitsnummern mit mehreren Gruppenmitgliedern haben sich kürzlich geändert. Dies könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören, oder aber die entsprechenden Mitglieder haben Session einfach erneut installiert.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { @@ -315,7 +315,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Deine Sicherheitsnummer mit $name$ hat sich geändert. Dies könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören, oder aber $name$ hat Signal einfach erneut installiert. Vielleicht möchtest du die neue Sicherheitsnummer mit diesem Kontakt verifizieren.", + "message": "Deine Sicherheitsnummer mit $name$ hat sich geändert. Dies könnte bedeuten, dass jemand versucht, eure Kommunikation abzuhören, oder aber $name$ hat Session einfach erneut installiert. Vielleicht möchtest du die neue Sicherheitsnummer mit diesem Kontakt verifizieren.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -444,7 +444,7 @@ }, "stagedPreviewThumbnail": { "message": "Miniaturbild des Link-Vorschauentwurfs für $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -454,7 +454,7 @@ }, "previewThumbnail": { "message": "Miniaturbild der Link-Vorschau für $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -861,7 +861,7 @@ }, "linkNewDevice": { "message": "Neues Gerät Koppeln", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Berechtigungen", @@ -952,7 +952,7 @@ "description": "Description shown for the Link Preview option " }, "expiredWarning": { - "message": "Diese Version von Signal Desktop ist veraltet. Bitte führe eine Aktualisierung auf die aktuellste Version durch, um weiterhin Nachrichten austauschen zu können.", + "message": "Diese Version von Session Desktop ist veraltet. Bitte führe eine Aktualisierung auf die aktuellste Version durch, um weiterhin Nachrichten austauschen zu können.", "description": "Warning notification that this version of the app has expired" }, "readReceiptSettingDescription": { diff --git a/_locales/el/messages.json b/_locales/el/messages.json index 4368514fb..26b3f003b 100644 --- a/_locales/el/messages.json +++ b/_locales/el/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Αποσύνδεση από το Signal", + "message": "Αποσύνδεση από το Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Μόλις περάσατε τη διαδικασία εξαγωγής και οι επαφές και τα μηνύματά σας περιμένουν υπομονετικά τον υπολογιστή σας. Επιλέξτε τον φάκελο που περιέχει τα αποθηκευμένα δεδομένα του Signal σας.", + "message": "Μόλις περάσατε τη διαδικασία εξαγωγής και οι επαφές και τα μηνύματά σας περιμένουν υπομονετικά τον υπολογιστή σας. Επιλέξτε τον φάκελο που περιέχει τα αποθηκευμένα δεδομένα του Session σας.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Βεβαιωθείτε ότι έχετε επιλέξει τον σωστό φάκελο που περιέχει τα αποθηκευμένα δεδομένα του Signal. Το όνομά του θα πρέπει να ξεκινά με το 'Signal Export.' Μπορείτε επίσης να αποθηκεύσετε ένα νέο αντίγραφο των δεδομένων σας από την εφαρμογή Chrome.", + "message": "Βεβαιωθείτε ότι έχετε επιλέξει τον σωστό φάκελο που περιέχει τα αποθηκευμένα δεδομένα του Session. Το όνομά του θα πρέπει να ξεκινά με το 'Session Export.' Μπορείτε επίσης να αποθηκεύσετε ένα νέο αντίγραφο των δεδομένων σας από την εφαρμογή Chrome.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Ξεκινήστε τη χρήση του Signal Desktop", + "message": "Ξεκινήστε τη χρήση του Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Οι αριθμοί ασφαλείας σας με πολλαπλά μέλη αυτής της ομάδας άλλαξαν από την τελευταία φορά που επιβεβαιώθηκαν. Αυτό μπορεί να σημαίνει πως κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας ή ότι απλώς επανεγκατέστησαν το Signal.", + "message": "Οι αριθμοί ασφαλείας σας με πολλαπλά μέλη αυτής της ομάδας άλλαξαν από την τελευταία φορά που επιβεβαιώθηκαν. Αυτό μπορεί να σημαίνει πως κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας ή ότι απλώς επανεγκατέστησαν το Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Ο αριθμός ασφαλείας σας με τον/την $name$ άλλαξε από την τελευταία φορά που επιβεβαιώθηκε. Αυτό μπορεί να σημαίνει πως κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας ή ότι απλώς ο/η $name$ επανεγκατέστησε το Signal.", + "message": "Ο αριθμός ασφαλείας σας με τον/την $name$ άλλαξε από την τελευταία φορά που επιβεβαιώθηκε. Αυτό μπορεί να σημαίνει πως κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας ή ότι απλώς ο/η $name$ επανεγκατέστησε το Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Ο αριθμός ασφαλείας που προσπαθείτε να επιβεβαιώσετε έχει αλλάξει. Παρακαλώ επιβεβαιώστε τον νέο αριθμό ασφαλείας με τον/την $name$. Θυμηθείτε, αυτή η αλλαγή μπορεί να σημαίνει πως κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας ή ότι απλώς ο/η $name$ επανεγκατέστησε το Signal.", + "message": "Ο αριθμός ασφαλείας που προσπαθείτε να επιβεβαιώσετε έχει αλλάξει. Παρακαλώ επιβεβαιώστε τον νέο αριθμό ασφαλείας με τον/την $name$. Θυμηθείτε, αυτή η αλλαγή μπορεί να σημαίνει πως κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας ή ότι απλώς ο/η $name$ επανεγκατέστησε το Session.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Οι αριθμοί ασφαλείας σας με πολλαπλά μέλη της ομάδας άλλαξαν πρόσφατα. Αυτό μπορεί να σημαίνει πως κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας ή ότι απλώς επανεγκατέστησαν το Signal.", + "message": "Οι αριθμοί ασφαλείας σας με πολλαπλά μέλη της ομάδας άλλαξαν πρόσφατα. Αυτό μπορεί να σημαίνει πως κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας ή ότι απλώς επανεγκατέστησαν το Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Ο αριθμός ασφαλείας σας με τον/την $name$ άλλαξε πρόσφατα. Αυτό μπορεί να σημαίνει πως κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας ή ότι απλώς ο/η $name$ επανεγκατέστησε το Signal.", + "message": "Ο αριθμός ασφαλείας σας με τον/την $name$ άλλαξε πρόσφατα. Αυτό μπορεί να σημαίνει πως κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας ή ότι απλώς ο/η $name$ επανεγκατέστησε το Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Ο αριθμός ασφαλείας σας με τον/την $name$ έχει αλλάξει. Αυτό θα μπορούσε είτε να σημαίνει ότι κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας είτε ότι απλώς ο/η $name$ επανεγκατέστησε το Signal. Ίσως επιθυμείτε να επαληθεύσετε τον αριθμό ασφαλείας σας με αυτή την επαφή.", + "message": "Ο αριθμός ασφαλείας σας με τον/την $name$ έχει αλλάξει. Αυτό θα μπορούσε είτε να σημαίνει ότι κάποιος προσπαθεί να υποκλέψει την επικοινωνία σας είτε ότι απλώς ο/η $name$ επανεγκατέστησε το Session. Ίσως επιθυμείτε να επαληθεύσετε τον αριθμό ασφαλείας σας με αυτή την επαφή.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Πρόχειρη μικρή προεσκόπιση συνδέσμου για $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Μικρή προεσκόπιση συνδέσμου για $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Καλώς ορίσατε στο Signal", + "message": "Καλώς ορίσατε στο Session", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "Για να στείλετε μηνύματα ήχου, επιτρέψτε στο Signal Desktop να έχει πρόσβαση στο μικρόφωνό σας.", + "message": "Για να στείλετε μηνύματα ήχου, επιτρέψτε στο Session Desktop να έχει πρόσβαση στο μικρόφωνό σας.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Σύνδεση νέας συσκεύης", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Άδειες", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Αυτή η έκδοση του Signal Desktop έχει λήξει. Κάντε αναβάθμιση στην πιο πρόσφατη έκδοση για να συνεχίσετε την ανταλλαγή μηνυμάτων.", + "message": "Αυτή η έκδοση του Session Desktop έχει λήξει. Κάντε αναβάθμιση στην πιο πρόσφατη έκδοση για να συνεχίσετε την ανταλλαγή μηνυμάτων.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 79b1e3646..193105278 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1090,7 +1090,7 @@ }, "linkNewDevice": { "message": "Link New Device", - "description": "The menu option shown in Signal iOS to add a new linked device", + "description": "The menu option shown in Session iOS to add a new linked device", "androidKey": "device_list_fragment__link_new_device", "ignoreCase": true }, @@ -1133,7 +1133,7 @@ }, "spellCheckDirty": { "message": "You must restart Session to apply your new settings", - "description": "Shown when the user changes their spellcheck setting to indicate that they must restart Signal." + "description": "Shown when the user changes their spellcheck setting to indicate that they must restart Session." }, "notifications": { "message": "Notifications", diff --git a/_locales/eo/messages.json b/_locales/eo/messages.json index d21fe1bef..01f5ea24a 100644 --- a/_locales/eo/messages.json +++ b/_locales/eo/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Fini Signal-on", + "message": "Fini Session-on", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Vi ĵus plenumis la eksportan procezon, kaj viaj kontaktoj kaj mesaĝoj atendas pacience ĉe via komputilo. Elektu la dosierujon, kiu enhavas viajn konservitajn Signal-datumojn.", + "message": "Vi ĵus plenumis la eksportan procezon, kaj viaj kontaktoj kaj mesaĝoj atendas pacience ĉe via komputilo. Elektu la dosierujon, kiu enhavas viajn konservitajn Session-datumojn.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Certigu, ke vi elektis la ĝustan dosierujon, kiu enhavas viajn konservitajn Signal-datumojn. Ties nomo komencu per „Signal Export“. Vi ankaŭ povas konservi novan kopion el viaj datumoj per la aplikaĵo Chrome.", + "message": "Certigu, ke vi elektis la ĝustan dosierujon, kiu enhavas viajn konservitajn Session-datumojn. Ties nomo komencu per „Session Export“. Vi ankaŭ povas konservi novan kopion el viaj datumoj per la aplikaĵo Chrome.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Ekuzi Signal Desktop", + "message": "Ekuzi Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Viaj sekurigaj numeroj kun pluraj grupanoj ŝanĝiĝis de post via lasta kontrolo. Tio povas aŭ signifi, ke iu provas interkapti viajn komunikojn, aŭ ke ili simple reinstalis Signal-on.", + "message": "Viaj sekurigaj numeroj kun pluraj grupanoj ŝanĝiĝis de post via lasta kontrolo. Tio povas aŭ signifi, ke iu provas interkapti viajn komunikojn, aŭ ke ili simple reinstalis Session-on.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "La sekuriga numero de $name$ ŝanĝiĝis post kiam vi laste kontrolis ĝin. Tio eble signifas, ke oni klopodas forkapti viajn komunikaĵojn, aŭ ke $name$ nur denove instalis Signal-on.", + "message": "La sekuriga numero de $name$ ŝanĝiĝis post kiam vi laste kontrolis ĝin. Tio eble signifas, ke oni klopodas forkapti viajn komunikaĵojn, aŭ ke $name$ nur denove instalis Session-on.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "La sekuriga numero, kiun vi kontrolas, ŝanĝiĝis. Bv. kontroli vian sekurigan numeron kun $name$. Atentu, ke tiu ŝanĝo eble signifas, ke iu klopodas forkapti viajn komunikojn, aŭ ke $name$ simple re-instalis Signal-on.", + "message": "La sekuriga numero, kiun vi kontrolas, ŝanĝiĝis. Bv. kontroli vian sekurigan numeron kun $name$. Atentu, ke tiu ŝanĝo eble signifas, ke iu klopodas forkapti viajn komunikojn, aŭ ke $name$ simple re-instalis Session-on.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Viaj sekurigaj numeroj kun pluraj grupanoj ŝanĝiĝis antaŭnelonge. Tio povas aŭ signifi, ke iu provas interkapti viajn komunikojn, aŭ ke ili simple reinstalis Signal-on.", + "message": "Viaj sekurigaj numeroj kun pluraj grupanoj ŝanĝiĝis antaŭnelonge. Tio povas aŭ signifi, ke iu provas interkapti viajn komunikojn, aŭ ke ili simple reinstalis Session-on.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Via sekuriga numero kun $name$ ŝanĝiĝis. Tio povas aŭ signifi, ke iu provas interkapti viajn komunikojn, aŭ ke $name$ simple reinstalis Signal-on.", + "message": "Via sekuriga numero kun $name$ ŝanĝiĝis. Tio povas aŭ signifi, ke iu provas interkapti viajn komunikojn, aŭ ke $name$ simple reinstalis Session-on.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Via sekuriga numero kun $name$ ŝanĝiĝis. Tio povas aŭ signifi, ke iu provas interkapti viajn komunikojn, aŭ ke $name$ simple reinstalis Signal-on. Vi certe volos kontroli la sekurigan numeron kun tiu ĉi kontakto.", + "message": "Via sekuriga numero kun $name$ ŝanĝiĝis. Tio povas aŭ signifi, ke iu provas interkapti viajn komunikojn, aŭ ke $name$ simple reinstalis Session-on. Vi certe volos kontroli la sekurigan numeron kun tiu ĉi kontakto.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Preparante miniaturan antaŭrigardon de ligilo pri $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Miniatura antaŭrigardo de ligilo pri $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Bonvenon al Signal", + "message": "Bonvenon al Session", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "Por sendi aŭdajn mesaĝojn, donu al Signal Desktop permeson uzi vian mikrofonon.", + "message": "Por sendi aŭdajn mesaĝojn, donu al Session Desktop permeson uzi vian mikrofonon.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Ligi novan aparaton", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permesoj", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Tiu ĉi versio de Signal Desktop jam nevalidas. Bonvolu ĝisdatigi al la nuna versio por daŭrigi sendi mesaĝojn.", + "message": "Tiu ĉi versio de Session Desktop jam nevalidas. Bonvolu ĝisdatigi al la nuna versio por daŭrigi sendi mesaĝojn.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/es/messages.json b/_locales/es/messages.json index 7590a058e..df84afe81 100644 --- a/_locales/es/messages.json +++ b/_locales/es/messages.json @@ -1,6 +1,6 @@ { "copyErrorAndQuit": { - "message": "Copiar fallo y cerrar Signal", + "message": "Copiar fallo y cerrar Session", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, "databaseError": { @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Cerrar Signal", + "message": "Cerrar Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Si ya has exportado tus datos desde la antigua aplicación de Signal, tus contactos y mensajes están a salvo en tu ordenador. Selecciona la carpeta donde has guardado los datos de Signal.", + "message": "Si ya has exportado tus datos desde la antigua aplicación de Session, tus contactos y mensajes están a salvo en tu ordenador. Selecciona la carpeta donde has guardado los datos de Session.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Asegúrate de haber seleccionado la carpeta correcta que contiene tus datos de Signal. El nombre suele comenzar por 'Signal Export'. También puedes guardar una copia nueva de tus datos desde la aplicación de Chrome.", + "message": "Asegúrate de haber seleccionado la carpeta correcta que contiene tus datos de Session. El nombre suele comenzar por 'Session Export'. También puedes guardar una copia nueva de tus datos desde la aplicación de Chrome.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Comienza a usar Signal Desktop", + "message": "Comienza a usar Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,7 +264,7 @@ "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": "Las cifras de seguridad con varios miembros de este grupo han cambiado desde la última vez que las verificaste, lo que significaría que alguien ha tratado de interceptar la comunicación o que simplemente han reinstalado Signal.", + "message": "Las cifras de seguridad con varios miembros de este grupo han cambiado desde la última vez que las verificaste, lo que significaría que alguien ha tratado de interceptar la comunicación o que simplemente han reinstalado Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Las cifras de seguridad que estás intentando verificar han cambiado. Revisa las nuevas cifras de seguridad con $name$. Recuerda que este cambio podría significar que alguien ha tratado de interceptar la comunicación o que $name$ simplemente ha reinstalado Signal.", + "message": "Las cifras de seguridad que estás intentando verificar han cambiado. Revisa las nuevas cifras de seguridad con $name$. Recuerda que este cambio podría significar que alguien ha tratado de interceptar la comunicación o que $name$ simplemente ha reinstalado Session.", "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": { @@ -288,7 +288,7 @@ } }, "changedRecentlyMultiple": { - "message": "Las cifras de seguridad con varios miembros del grupo han cambiado recientemente, lo que significaría que alguien ha tratado de interceptar la comunicación o que simplemente han reinstalado Signal.", + "message": "Las cifras de seguridad con varios miembros del grupo han cambiado recientemente, lo que significaría que alguien ha tratado de interceptar la comunicación o que simplemente han reinstalado Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Las cifras de seguridad con $name$ han cambiado, lo que significaría que alguien ha tratado de interceptar la comunicación o que $name$ simplemente ha reinstalado Signal. Tal vez desees verificar las cifras de seguridad con este contacto.", + "message": "Las cifras de seguridad con $name$ han cambiado, lo que significaría que alguien ha tratado de interceptar la comunicación o que $name$ simplemente ha reinstalado Session. Tal vez desees verificar las cifras 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": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Preparando miniatura de visualización de enlace para $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Miniatura de previsualización para $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Enlazar Nuevo Dispositivo", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permisos", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Esta versión de Signal Desktop ha caducado. Por favor, actualiza a la última versión para seguir enviando mensajes.", + "message": "Esta versión de Session Desktop ha caducado. Por favor, actualiza a la última versión para seguir enviando mensajes.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/es_419/messages.json b/_locales/es_419/messages.json index f94be3257..617750ddf 100644 --- a/_locales/es_419/messages.json +++ b/_locales/es_419/messages.json @@ -146,7 +146,7 @@ "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.", + "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 Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -162,7 +162,7 @@ "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.", + "message": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session 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": { @@ -178,7 +178,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start using Signal Desktop", + "message": "Start using Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -256,11 +256,11 @@ "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.", + "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 Session.", "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.", + "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 Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -270,7 +270,7 @@ } }, "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.", + "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 Session.", "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": { @@ -280,11 +280,11 @@ } }, "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.", + "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 Session.", "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.", + "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 Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -294,7 +294,7 @@ } }, "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.", + "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 Session. 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": { @@ -472,7 +472,7 @@ "description": "Command under Window menu, to show the window" }, "welcomeToSession": { - "message": "Bienvenido a Signal", + "message": "Bienvenido a Session", "description": "" }, "contactAvatarAlt": { @@ -538,7 +538,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "To send audio messages, allow Signal Desktop to access your microphone.", + "message": "To send audio messages, allow Session Desktop to access your microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -671,7 +671,7 @@ }, "linkNewDevice": { "message": "Link New Device", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissions", @@ -738,7 +738,7 @@ "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.", + "message": "Esta versión de Session 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" }, "upgrade": { diff --git a/_locales/et/messages.json b/_locales/et/messages.json index 0705b2786..67e1cb454 100644 --- a/_locales/et/messages.json +++ b/_locales/et/messages.json @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Ole kindel, et oled valinud õige kataloogi, mis sisaldab sinu salvestatud Signali andmeid. Selle nimi peaks algama fraasiga \"Signal Export\". Sul on võimalik salvestada andmetest ka uus koopia rakendusest Chrome App.", + "message": "Ole kindel, et oled valinud õige kataloogi, mis sisaldab sinu salvestatud Signali andmeid. Selle nimi peaks algama fraasiga \"Session Export\". Sul on võimalik salvestada andmetest ka uus koopia rakendusest Chrome App.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Alusta Signal Desktopi kasutamist", + "message": "Alusta Session Desktopi kasutamist", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Lingi eelvaate pisipildi mustand: $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Lingi eelvaate pisipilt: $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "Audiosõnumite saatmiseks luba Signal Desktopil mikrofoni kasutada.", + "message": "Audiosõnumite saatmiseks luba Session Desktopil mikrofoni kasutada.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Ühenda uus seade", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Õigused", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "See Signal Desktopi versioon on aegunud. Palun uuenda uusimale versioonile sõnumite saatmiseks jätkamiseks.", + "message": "See Session Desktopi versioon on aegunud. Palun uuenda uusimale versioonile sõnumite saatmiseks jätkamiseks.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/fa/messages.json b/_locales/fa/messages.json index 291685eaa..d97f7dd91 100644 --- a/_locales/fa/messages.json +++ b/_locales/fa/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "خروج از Signal", + "message": "خروج از Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "شما پروسه اکسپورت را انجام دادید، مخاطبین ، پیام های شما روی کامپیوتر شما آماده هستند. پوشه ای که شامل داده های ذخیره شده Signal شما می باشد را انتخاب کنید.", + "message": "شما پروسه اکسپورت را انجام دادید، مخاطبین ، پیام های شما روی کامپیوتر شما آماده هستند. پوشه ای که شامل داده های ذخیره شده Session شما می باشد را انتخاب کنید.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "مطمئن شوید که دایرکتوری صحیح را که شامل داده های ذخیره شده Signal شما می باشد را انتخاب کرده اید. نام آن باید با 'Signal Export' آغاز شده باشد. شما همچنین میتوانید یک کپی جدید از داده های خود را از برنامه کروم ذخیره کنید.", + "message": "مطمئن شوید که دایرکتوری صحیح را که شامل داده های ذخیره شده Session شما می باشد را انتخاب کرده اید. نام آن باید با 'Session Export' آغاز شده باشد. شما همچنین میتوانید یک کپی جدید از داده های خود را از برنامه کروم ذخیره کنید.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "شروع به استفاده از Signal Desktop", + "message": "شروع به استفاده از Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "کد امنیتی چند نفر از اعضای گروه از زمان آخریت تائید، تغییر کرده‌است. ممکن است معنایش این باشد که کسی دارد برای شنود ارتباطات شما تلاش می‌کند. امکان دیگر است که این اعضای گروه صرفاً Signal را دوباره نصب کرده‌اند.", + "message": "کد امنیتی چند نفر از اعضای گروه از زمان آخریت تائید، تغییر کرده‌است. ممکن است معنایش این باشد که کسی دارد برای شنود ارتباطات شما تلاش می‌کند. امکان دیگر است که این اعضای گروه صرفاً Session را دوباره نصب کرده‌اند.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "شماره امن شما با $name$ بعد از آخرین تایید شما تغییر یافته است. این بدین معناست که شخصی در تلاش برای رهگیری ارتباط شماست و یا اینکه $name$به تازگی Signal را مجددا نصب کرده است.", + "message": "شماره امن شما با $name$ بعد از آخرین تایید شما تغییر یافته است. این بدین معناست که شخصی در تلاش برای رهگیری ارتباط شماست و یا اینکه $name$به تازگی Session را مجددا نصب کرده است.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "شماره امنی که شما در تلاش برای تایید آن هستید تغییر کرده است. لطفا شماره امن جدید خود را با$name$بازبینی کنید. به یاد داشته باشید، این تغییر بدین معناست که شخصی در تلاش برای رهگیری ارتباط شماست و یا $name$مجددا Signal را نصب کرده است.", + "message": "شماره امنی که شما در تلاش برای تایید آن هستید تغییر کرده است. لطفا شماره امن جدید خود را با$name$بازبینی کنید. به یاد داشته باشید، این تغییر بدین معناست که شخصی در تلاش برای رهگیری ارتباط شماست و یا $name$مجددا Session را نصب کرده است.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "کد امنیتی چند نفر از اعضای گروه اخیرآً تغییر کرده‌است. ممکن است معنایش این باشد که کسی دارد برای شنود ارتباطات شما تلاش می‌کند. امکان دیگر است که این اعضای گروه صرفاً Signal را دوباره نصب کرده‌اند.", + "message": "کد امنیتی چند نفر از اعضای گروه اخیرآً تغییر کرده‌است. ممکن است معنایش این باشد که کسی دارد برای شنود ارتباطات شما تلاش می‌کند. امکان دیگر است که این اعضای گروه صرفاً Session را دوباره نصب کرده‌اند.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "شماره امن شما با $name$به تازگی تغییر یافته است.این امر بدین معناست که شخصی در تلاش برای رهگیری ارتباط شماست یا اینکه $name$بار دیگر Signal را نصب کرده است.", + "message": "شماره امن شما با $name$به تازگی تغییر یافته است.این امر بدین معناست که شخصی در تلاش برای رهگیری ارتباط شماست یا اینکه $name$بار دیگر Session را نصب کرده است.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "شماره امن شما با $name$ تغییر کرده است. این به این معناست که شخصی در تلاش برای رهگیری ارتباط شماست یا اینکه $name$مجددا Signal را نصب کرده است. بهتر است شماره امن خود با این مخاطب را تایید کنید.", + "message": "شماره امن شما با $name$ تغییر کرده است. این به این معناست که شخصی در تلاش برای رهگیری ارتباط شماست یا اینکه $name$مجددا Session را نصب کرده است. بهتر است شماره امن خود با این مخاطب را تایید کنید.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "به Signal خوش‌آمدید", + "message": "به Session خوش‌آمدید", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "برای فرستادن پیام های صوتی، به Signal Desktop اجازه دسترسی به میکروفون خود را بدهید.", + "message": "برای فرستادن پیام های صوتی، به Session Desktop اجازه دسترسی به میکروفون خود را بدهید.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "لینک کردن دستگاه جدید", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "دسترسی ها", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "این نسخه‌ی Signal قدیمی است. برای ارسال پیام لطفا آن را به آخرین نسخه ارتقاء دهید.", + "message": "این نسخه‌ی Session قدیمی است. برای ارسال پیام لطفا آن را به آخرین نسخه ارتقاء دهید.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/fi/messages.json b/_locales/fi/messages.json index 2df7e3f8e..7e894b2c7 100644 --- a/_locales/fi/messages.json +++ b/_locales/fi/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Lopeta Signal", + "message": "Lopeta Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Olet juuri suorittanut vientiprosessin, ja yhteystietosi ja viesisi odottavat nyt kärsivällisesti tietokoneellasi. Valitse kansio, joka sisältää tallennetut Signal tietosi.", + "message": "Olet juuri suorittanut vientiprosessin, ja yhteystietosi ja viesisi odottavat nyt kärsivällisesti tietokoneellasi. Valitse kansio, joka sisältää tallennetut Session tietosi.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Varmista, että ole valinnut oikean hakemiston, joka sisältää Signalin tiedot. Hakemiston nimen tulisi alkaa sanoilla \"Signal Export\". Voit myös tallentaa uuden kopion tiedoistasi Signalin Chrome-sovelluksen kautta.", + "message": "Varmista, että ole valinnut oikean hakemiston, joka sisältää Signalin tiedot. Hakemiston nimen tulisi alkaa sanoilla \"Session Export\". Voit myös tallentaa uuden kopion tiedoistasi Signalin Chrome-sovelluksen kautta.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Aloita Signal Desktopin käyttö", + "message": "Aloita Session Desktopin käyttö", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Linkin $domain$esikatselukuvan luonnos", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Linkin $domain$ esikatselukuva", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "Lähettääksesi ääniviestejä myönnä Signal Desktopille mikrofonin käyttöoikeus.", + "message": "Lähettääksesi ääniviestejä myönnä Session Desktopille mikrofonin käyttöoikeus.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Yhdistä uusi laite", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Käyttöoikeudet", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Käyttämäsi versio Signal Desktopista on vanhentunut. Viestien lähettäminen ja vastaanottaminen eivät enää toimi, ennen kuin olet päiväittänyt uusimpaan versioon.", + "message": "Käyttämäsi versio Session Desktopista on vanhentunut. Viestien lähettäminen ja vastaanottaminen eivät enää toimi, ennen kuin olet päiväittänyt uusimpaan versioon.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index 0d2630a30..0f809c58d 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Quitter Signal", + "message": "Quitter Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Vous venez de passer par le processus d’exportation, et vos contacts et messages attendent patiemment sur votre ordinateur. Sélectionnez le dossier contenant vos données relatives à Signal enregistrées.", + "message": "Vous venez de passer par le processus d’exportation, et vos contacts et messages attendent patiemment sur votre ordinateur. Sélectionnez le dossier contenant vos données relatives à Session enregistrées.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Assurez-vous d’avoir sélectionné le bon répertoire contenant vos données relatives à Signal enregistrées. Son nom devrait commencer par « Signal Export ». Vous pouvez également enregistrer une nouvelle copie de vos données à partir de l’application Chrome.", + "message": "Assurez-vous d’avoir sélectionné le bon répertoire contenant vos données relatives à Session enregistrées. Son nom devrait commencer par « Signal Export ». Vous pouvez également enregistrer une nouvelle copie de vos données à partir de l’application Chrome.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Commencez à utiliser Signal Desktop pour ordinateur", + "message": "Commencez à utiliser Session Desktop pour ordinateur", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,7 +264,7 @@ "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": "Vos numéros de sécurité avec plusieurs membres du groupe ont changé depuis votre dernière vérification. Cela pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit qu’ils ont simplement réinstallé Signal.", + "message": "Vos numéros de sécurité avec plusieurs membres du groupe ont changé depuis votre dernière vérification. Cela pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit qu’ils ont simplement réinstallé Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Le numéro de sécurité que vous essayez de vérifier a changé. Veuillez réviser votre nouveau numéro de sécurité avec $name$. Rappelez-vous que ce changement pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit que $name$ a simplement réinstallé Signal.", + "message": "Le numéro de sécurité que vous essayez de vérifier a changé. Veuillez réviser votre nouveau numéro de sécurité avec $name$. Rappelez-vous que ce changement pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit que $name$ a simplement réinstallé Session.", "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": { @@ -288,7 +288,7 @@ } }, "changedRecentlyMultiple": { - "message": "Vos numéros de sécurité avec plusieurs membres du groupe ont changé récemment. Cela pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit qu’ils ont simplement réinstallé Signal.", + "message": "Vos numéros de sécurité avec plusieurs membres du groupe ont changé récemment. Cela pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit qu’ils ont simplement réinstallé Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Votre numéro de sécurité avec $name$ a changé. Cela pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit que $name$ a simplement réinstallé Signal. Vous devriez peut-être vérifier votre numéro de sécurité avec ce contact.", + "message": "Votre numéro de sécurité avec $name$ a changé. Cela pourrait signifier soit que quelqu’un tente d’intercepter votre communication, soit que $name$ a simplement réinstallé Session. Vous devriez peut-être vérifier votre numéro de sécurité avec ce contact.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Brouillon d’imagette d’aperçu de lien pour $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Imagette d’aperçu de lien pour $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Relier un nouvel appareil", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Autorisations", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Cette version de Signal Desktop pour ordinateur est expirée. Veuillez la mettre à niveau vers la version la plus récente afin de continuer à échanger.", + "message": "Cette version de Session Desktop pour ordinateur est expirée. Veuillez la mettre à niveau vers la version la plus récente afin de continuer à échanger.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/he/messages.json b/_locales/he/messages.json index dd85c5239..13c7b4d3f 100644 --- a/_locales/he/messages.json +++ b/_locales/he/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "צא מ־Signal", + "message": "צא מ־Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "הרגע עברת את תהליך היצוא, ואנשי הקשר וההודעות שלך ממתינים בסבלנות על המחשב שלך. בחר את התיקייה המכילה את נתוני Signal השמורים שלך.", + "message": "הרגע עברת את תהליך היצוא, ואנשי הקשר וההודעות שלך ממתינים בסבלנות על המחשב שלך. בחר את התיקייה המכילה את נתוני Session השמורים שלך.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "וודא שבחרת את התיקייה הנכונה המכילה את נתוני Signal השמורים שלך. שמה אמור להתחיל ב'יבוא Signal'. אתה יכול גם לשמור עותק חדש של הנתונים שלך מתוך יישום Chrome.", + "message": "וודא שבחרת את התיקייה הנכונה המכילה את נתוני Session השמורים שלך. שמה אמור להתחיל ב'יבוא Session'. אתה יכול גם לשמור עותק חדש של הנתונים שלך מתוך יישום Chrome.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "התחל להשתמש ב־Signal Desktop עבודה", + "message": "התחל להשתמש ב־Session Desktop עבודה", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "מספרי הבטיחות שלך עם חברי קבוצה אלו השתנו מאז שוידאת בפעם האחרונה. זה יכול להעיד שמישהו מנסה ליירט את התקשורת שלך או שהוא פשוט התקין מחדש את Signal.", + "message": "מספרי הבטיחות שלך עם חברי קבוצה אלו השתנו מאז שוידאת בפעם האחרונה. זה יכול להעיד שמישהו מנסה ליירט את התקשורת שלך או שהוא פשוט התקין מחדש את Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "מספר הבטיחות שלך עם $name$ השתנה מאז הפעם שוידאת בפעם האחרונה. זה יכול להעיד שמישהו מנסה ליירט את התקשורת שלך או $name$ פשוט התקין מחדש את Signal.", + "message": "מספר הבטיחות שלך עם $name$ השתנה מאז הפעם שוידאת בפעם האחרונה. זה יכול להעיד שמישהו מנסה ליירט את התקשורת שלך או $name$ פשוט התקין מחדש את Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "מספר הבטיחות שאתה מנסה לוודא השתנה. אנא סקור את מספר הבטיחות החדש שלך עם $name$. זכור, שינוי זה יכול להעיד שמישהו מנסה ליירט את התקשורת שלך או $name$ פשוט התקין מחדש את Signal.", + "message": "מספר הבטיחות שאתה מנסה לוודא השתנה. אנא סקור את מספר הבטיחות החדש שלך עם $name$. זכור, שינוי זה יכול להעיד שמישהו מנסה ליירט את התקשורת שלך או $name$ פשוט התקין מחדש את Session.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "מספרי הבטיחות שלך עם חברי קבוצה רבים השתנו לאחרונה. זה יכול להעיד שמישהו מנסה ליירט את התקשורת שלך או שהוא פשוט התקין מחדש את Signal.", + "message": "מספרי הבטיחות שלך עם חברי קבוצה רבים השתנו לאחרונה. זה יכול להעיד שמישהו מנסה ליירט את התקשורת שלך או שהוא פשוט התקין מחדש את Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "מספר הבטיחות שלך עם $name$ השתנה לאחרונה. זה יכול להעיד שמישהו מנסה ליירט את התקשורת שלך או $name$פשוט התקין מחדש את Signal.", + "message": "מספר הבטיחות שלך עם $name$ השתנה לאחרונה. זה יכול להעיד שמישהו מנסה ליירט את התקשורת שלך או $name$פשוט התקין מחדש את Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "מספר הבטיחות שלך עם $name$ השתנה. זה יכול להעיד שמישהו מנסה ליירט את התקשורת שלך או $name$פשוט התקין מחדש את Signal. ייתכן שתרצה לוודא את מספר הבטיחות שלך עם איש קשה זה.", + "message": "מספר הבטיחות שלך עם $name$ השתנה. זה יכול להעיד שמישהו מנסה ליירט את התקשורת שלך או $name$פשוט התקין מחדש את Session. ייתכן שתרצה לוודא את מספר הבטיחות שלך עם איש קשה זה.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "טיוטה של קדם־תצוגה של קישור עבור $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "קדם־תצוגה של קישור עבור $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "כדי לשלוח הודעות קוליות, התר אל Signal Desktop עבודה לקבל גישה אל המיקרופון שלך.", + "message": "כדי לשלוח הודעות קוליות, התר אל Session Desktop עבודה לקבל גישה אל המיקרופון שלך.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "קשר מכשיר חדש", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "הרשאות", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "גרסה זו של Signal Desktop עבודה פגה. אנא שדרג אל הגרסה האחרונה כדי להמשיך בשליחת הודעות.", + "message": "גרסה זו של Session Desktop עבודה פגה. אנא שדרג אל הגרסה האחרונה כדי להמשיך בשליחת הודעות.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/hi/messages.json b/_locales/hi/messages.json index e1a97c8eb..29e3c80f9 100644 --- a/_locales/hi/messages.json +++ b/_locales/hi/messages.json @@ -154,7 +154,7 @@ "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.", + "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 Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "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.", + "message": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session 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": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start using Signal Desktop", + "message": "Start using Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "आपके द्वारा अंतिम सत्यापित होने के बाद से कई समूह सदस्यों के साथ आपकी सुरक्षा संख्या बदल गई हैं। इसका मतलब यह हो सकता है कि कोई आपके संचार को अवरुद्ध करने का प्रयास कर रहा है या उन्होंने Signal को बस पुनः स्थापित किया है", + "message": "आपके द्वारा अंतिम सत्यापित होने के बाद से कई समूह सदस्यों के साथ आपकी सुरक्षा संख्या बदल गई हैं। इसका मतलब यह हो सकता है कि कोई आपके संचार को अवरुद्ध करने का प्रयास कर रहा है या उन्होंने Session को बस पुनः स्थापित किया है", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "आपकी सुरक्षा संख्या के साथ$name$आपके अंतिम सत्यापन के बाद से बदल गया है। इसका मतलब यह हो सकता है कि कोई आपके संचार को रोकना चाहता है या$name$बस Signal को पुनः स्थापित किया है", + "message": "आपकी सुरक्षा संख्या के साथ$name$आपके अंतिम सत्यापन के बाद से बदल गया है। इसका मतलब यह हो सकता है कि कोई आपके संचार को रोकना चाहता है या$name$बस Session को पुनः स्थापित किया है", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "आपके द्वारा सत्यापित करने की कोशिश कर रहे सुरक्षा नंबर बदल गया है कृपया अपने नए सुरक्षा नंबर के साथ की समीक्षा करें$name$|याद रखें, इस परिवर्तन का मतलब यह हो सकता है कि कोई आपकी संचार को रोकना चाहता है या$name$बस Signal को पुनः स्थापित किया है", + "message": "आपके द्वारा सत्यापित करने की कोशिश कर रहे सुरक्षा नंबर बदल गया है कृपया अपने नए सुरक्षा नंबर के साथ की समीक्षा करें$name$|याद रखें, इस परिवर्तन का मतलब यह हो सकता है कि कोई आपकी संचार को रोकना चाहता है या$name$बस Session को पुनः स्थापित किया है", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "कई समूह सदस्यों के साथ आपकी सुरक्षा संख्या हाल ही में बदल गई हैं इसका मतलब यह हो सकता है कि कोई आपके संचार को अवरुद्ध करने का प्रयास कर रहा है या उन्होंने Signal को बस पुनः स्थापित किया है", + "message": "कई समूह सदस्यों के साथ आपकी सुरक्षा संख्या हाल ही में बदल गई हैं इसका मतलब यह हो सकता है कि कोई आपके संचार को अवरुद्ध करने का प्रयास कर रहा है या उन्होंने Session को बस पुनः स्थापित किया है", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "आपकी सुरक्षा संख्या के साथ$name$हाल ही में बदल गया है|इसका मतलब यह हो सकता है कि कोई आपके संचार को रोकना चाहता है या$name$बस Signal को पुनः स्थापित किया है", + "message": "आपकी सुरक्षा संख्या के साथ$name$हाल ही में बदल गया है|इसका मतलब यह हो सकता है कि कोई आपके संचार को रोकना चाहता है या$name$बस Session को पुनः स्थापित किया है", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "आपकी सुरक्षा संख्या के साथ$name$बदल गया है।इसका मतलब यह हो सकता है कि कोई आपके संचार को रोकना चाहता है या $name$बस Signal को पुनः स्थापित किया है आप इस संपर्क के साथ अपना सुरक्षा नंबर सत्यापित करना चाह सकते हैं।", + "message": "आपकी सुरक्षा संख्या के साथ$name$बदल गया है।इसका मतलब यह हो सकता है कि कोई आपके संचार को रोकना चाहता है या $name$बस Session को पुनः स्थापित किया है आप इस संपर्क के साथ अपना सुरक्षा नंबर सत्यापित करना चाह सकते हैं।", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "To send audio messages, allow Signal Desktop to access your microphone.", + "message": "To send audio messages, allow Session Desktop to access your microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Link New Device", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissions", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Signal डेस्कटॉप का यह संस्करण समाप्त हो गया है। संदेश जारी रखने के लिए कृपया नवीनतम संस्करण में नवीनीकृत करें।", + "message": "Session डेस्कटॉप का यह संस्करण समाप्त हो गया है। संदेश जारी रखने के लिए कृपया नवीनतम संस्करण में नवीनीकृत करें।", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/hr/messages.json b/_locales/hr/messages.json index dd3180d12..0f14bf506 100644 --- a/_locales/hr/messages.json +++ b/_locales/hr/messages.json @@ -154,7 +154,7 @@ "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.", + "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 Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "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.", + "message": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session 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": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start using Signal Desktop", + "message": "Start using Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Sigurnosni su se brojevi s više članova ove grupe promijenili od zadnje potvrde. Moguće je da netko pokušava presresti vašu komunikaciju ili su neki članovi grupe reinstalirali Signal.", + "message": "Sigurnosni su se brojevi s više članova ove grupe promijenili od zadnje potvrde. Moguće je da netko pokušava presresti vašu komunikaciju ili su neki članovi grupe reinstalirali Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Sigurnosni se broj s kontaktom $name$ promijenio od zadnje potvrde. Moguće je da netko pokušava presresti vašu komunikaciju ili da je kontakt $name$ reinstalirao Signal.", + "message": "Sigurnosni se broj s kontaktom $name$ promijenio od zadnje potvrde. Moguće je da netko pokušava presresti vašu komunikaciju ili da je kontakt $name$ reinstalirao Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Sigurnosni broj koji potvrđujete se promijenio. Molimo vas da provjerite novi sigurnosni broj s kontaktom $name$. Moguće je da netko pokušava presresti vašu komunikaciju ili da je kontakt $name$ reinstalirao Signal.", + "message": "Sigurnosni broj koji potvrđujete se promijenio. Molimo vas da provjerite novi sigurnosni broj s kontaktom $name$. Moguće je da netko pokušava presresti vašu komunikaciju ili da je kontakt $name$ reinstalirao Session.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Sigurnosni su se brojevi s više članova ove grupe nedavno promijenili. Moguće je da netko pokušava presresti vašu komunikaciju ili su neki članovi grupe reinstalirali Signal.", + "message": "Sigurnosni su se brojevi s više članova ove grupe nedavno promijenili. Moguće je da netko pokušava presresti vašu komunikaciju ili su neki članovi grupe reinstalirali Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Your safety number with $name$ has changed recently. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Signal.", + "message": "Your safety number with $name$ has changed recently. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Sigurnosni broj s kontaktom $name$ se promijenio. Moguće je da netko pokušava presresti vašu komunikaciju ili da je kontakt $name$ reinstalirao signal. Možda biste htjeli potvrditi novi sigurnosni broj s ovim kontaktom.", + "message": "Sigurnosni broj s kontaktom $name$ se promijenio. Moguće je da netko pokušava presresti vašu komunikaciju ili da je kontakt $name$ reinstalirao Session. Možda biste htjeli potvrditi novi sigurnosni broj s ovim kontaktom.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Dobrodošli u Signal", + "message": "Dobrodošli u Session", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "To send audio messages, allow Signal Desktop to access your microphone.", + "message": "To send audio messages, allow Session Desktop to access your microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Link New Device", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissions", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Ova inačica Signal Desktopa je istekla. Molimo vas da za nastavak dopisivanja nadogradite na najnoviju verziju.", + "message": "Ova inačica Session Desktopa je istekla. Molimo vas da za nastavak dopisivanja nadogradite na najnoviju verziju.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/hu/messages.json b/_locales/hu/messages.json index c3948c7ae..1dbbeac27 100644 --- a/_locales/hu/messages.json +++ b/_locales/hu/messages.json @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Sikeresen befejezted az exportálást, és most kontaktjaid, valamint üzeneteid türelmesen várnak számítógépeden. Válaszd ki a lementett Signal adataidat tartalmazó könyvtárat!", + "message": "Sikeresen befejezted az exportálást, és most kontaktjaid, valamint üzeneteid türelmesen várnak számítógépeden. Válaszd ki a lementett Session adataidat tartalmazó könyvtárat!", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Bizonyosodj meg róla, hogy a megfelelő, Signal adataidat tartalmazó könyvtárat választottad ki! A nevének 'Signal Export'-tal kell kezdődnie. Emellett készíthetsz egy új másolatot a Chrome alkalmazás adataiból is.", + "message": "Bizonyosodj meg róla, hogy a megfelelő, Session adataidat tartalmazó könyvtárat választottad ki! A nevének 'Session Export'-tal kell kezdődnie. Emellett készíthetsz egy új másolatot a Chrome alkalmazás adataiból is.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "A Signal Desktop használatának megkezdése", + "message": "A Session Desktop használatának megkezdése", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Biztonsági számod a csoport több tagjával is megváltozott az utolsó hitelesítés óta. Ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetéseteket, vagy valaki egyszerűen csak újratelepítette a Signal-t.", + "message": "Biztonsági számod a csoport több tagjával is megváltozott az utolsó hitelesítés óta. Ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetéseteket, vagy valaki egyszerűen csak újratelepítette a Session-t.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Biztonsági számod $name$ nevű partnereddel megváltozott az utolsó hitelesítés óta. Ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetéseteket, vagy $name$ egyszerűen csak újratelepítette a Signal-t.", + "message": "Biztonsági számod $name$ nevű partnereddel megváltozott az utolsó hitelesítés óta. Ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetéseteket, vagy $name$ egyszerűen csak újratelepítette a Session-t.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "A hitelesítés alatt álló biztonsági szám megváltozott. Kérlek ellenőrizd új biztonsági számodat $name$ nevű partnereddel. Ne felejtsd, ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetéseteket, de azt is jelentheti, hogy $name$ egyszerűen csak újratelepítette a Signal-t.", + "message": "A hitelesítés alatt álló biztonsági szám megváltozott. Kérlek ellenőrizd új biztonsági számodat $name$ nevű partnereddel. Ne felejtsd, ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetéseteket, de azt is jelentheti, hogy $name$ egyszerűen csak újratelepítette a Session-t.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Biztonsági számod a csoport több tagjával is megváltozott az utóbbi időben. Ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetéseteket, vagy valaki egyszerűen csak újratelepítette a Signal-t.", + "message": "Biztonsági számod a csoport több tagjával is megváltozott az utóbbi időben. Ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetéseteket, vagy valaki egyszerűen csak újratelepítette a Session-t.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Biztonsági számod $name$ nevű partnereddel nemrég megváltozott. Ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetéseteket, vagy $name$ egyszerűen csak újratelepítette a Signal-t.", + "message": "Biztonsági számod $name$ nevű partnereddel nemrég megváltozott. Ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetéseteket, vagy $name$ egyszerűen csak újratelepítette a Session-t.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Biztonsági számod $name$ nevű partnereddel megváltozott. Ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetéseteket, de azt is jelentheti, hogy $name$ egyszerűen csak újratelepítette a Signal-t. Javasolt újraellenőrizni a partnereddel közös biztonsági számotokat.", + "message": "Biztonsági számod $name$ nevű partnereddel megváltozott. Ez arra utalhat, hogy valaki megpróbálja lehallgatni a beszélgetéseteket, de azt is jelentheti, hogy $name$ egyszerűen csak újratelepítette a Session-t. Javasolt újraellenőrizni a partnereddel közös biztonsági számotokat.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "A $domain$ hivatkozás előnézeti képének vázlata", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "A $domain$ hivatkozás előnézeti képe", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Üdvözöl a Signal!", + "message": "Üdvözöl a Session!", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "Hangüzenetek küldéséhez engedélyezd, hogy a Signal Desktop hozzáférjen mikrofonodhoz", + "message": "Hangüzenetek küldéséhez engedélyezd, hogy a Session Desktop hozzáférjen mikrofonodhoz", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Új eszköz párosítása", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Jogosultságok", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "A Signal Desktop ezen verziója elavult. Kérlek frissíts a legújabb verzióra, hogy folytatni tudd a beszélgetést!", + "message": "A Session Desktop ezen verziója elavult. Kérlek frissíts a legújabb verzióra, hogy folytatni tudd a beszélgetést!", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/id/messages.json b/_locales/id/messages.json index d34373711..dcf92c046 100644 --- a/_locales/id/messages.json +++ b/_locales/id/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Keluar dari Signal", + "message": "Keluar dari Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Anda telah melewati proses ekspor. Kontak dan pesan Anda sedang menanti dengan sabar di komputer. Pilih map berisikan data Signal Anda.", + "message": "Anda telah melewati proses ekspor. Kontak dan pesan Anda sedang menanti dengan sabar di komputer. Pilih map berisikan data Session Anda.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Pastikan Anda memilih direktori tepat, yang berisi data Signal yang telah tersimpan. Nama direktori itu seharusnya 'Expor Signal'. Anda bisa juga membuat data salinan baru dari Chrome App.", + "message": "Pastikan Anda memilih direktori tepat, yang berisi data Session yang telah tersimpan. Nama direktori itu seharusnya 'Expor Session'. Anda bisa juga membuat data salinan baru dari Chrome App.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Mulai menggunakan Signal Desktop", + "message": "Mulai menggunakan Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Nomor keamanan Anda dengan beberapa anggota grup telah berubah sejak terakhir Anda diverifikasi. Ini bisa berarti seseorang mencoba mencegat komunikasi Anda atau bahwa mereka hanya memasang ulang Signal.", + "message": "Nomor keamanan Anda dengan beberapa anggota grup telah berubah sejak terakhir Anda diverifikasi. Ini bisa berarti seseorang mencoba mencegat komunikasi Anda atau bahwa mereka hanya memasang ulang Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Nomor keamanan Anda dengan $name$ telah berubah sejak Anda terakhir diverifikasi. Ini bisa berarti seseorang mencoba mencegat komunikasi Anda atau bahwa $name$ hanya memasang ulang Signal.", + "message": "Nomor keamanan Anda dengan $name$ telah berubah sejak Anda terakhir diverifikasi. Ini bisa berarti seseorang mencoba mencegat komunikasi Anda atau bahwa $name$ hanya memasang ulang Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Nomor keamanan yang ingin Anda verifikasi telah berubah. Harap tinjau nomor keamanan baru Anda dengan $name$. Ingat, perubahan ini bisa berarti seseorang mencoba mencegat komunikasi Anda atau bahwa $name$ hanya memasang ulang Signal.", + "message": "Nomor keamanan yang ingin Anda verifikasi telah berubah. Harap tinjau nomor keamanan baru Anda dengan $name$. Ingat, perubahan ini bisa berarti seseorang mencoba mencegat komunikasi Anda atau bahwa $name$ hanya memasang ulang Session.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Nomor keamanan Anda dengan beberapa anggota grup telah berubah baru-baru ini. Ini bisa berarti seseorang mencoba mencegat komunikasi Anda atau bahwa mereka hanya memasang ulang Signal.", + "message": "Nomor keamanan Anda dengan beberapa anggota grup telah berubah baru-baru ini. Ini bisa berarti seseorang mencoba mencegat komunikasi Anda atau bahwa mereka hanya memasang ulang Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Nomor keamanan Anda dengan $name$ telah berubah baru-baru ini. Ini bisa berarti seseorang mencoba mencegat komunikasi Anda atau bahwa $name$ hanya memasang ulang Signal.", + "message": "Nomor keamanan Anda dengan $name$ telah berubah baru-baru ini. Ini bisa berarti seseorang mencoba mencegat komunikasi Anda atau bahwa $name$ hanya memasang ulang Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Nomor keamanan Anda dengan $name$ telah berubah. Ini bisa berarti seseorang mencoba mencegat komunikasi Anda atau bahwa $name$ hanya memasang ulang Signal. Anda mungkin ingin memverifikasi nomor keamanan Anda dengan kontak ini.", + "message": "Nomor keamanan Anda dengan $name$ telah berubah. Ini bisa berarti seseorang mencoba mencegat komunikasi Anda atau bahwa $name$ hanya memasang ulang Session. Anda mungkin ingin memverifikasi nomor keamanan Anda dengan kontak ini.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Selamat datang di Signal", + "message": "Selamat datang di Session", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "Untuk mengirimkan pesan suara, izinkan Signal Desktop untuk mengakses mikrofon anda.", + "message": "Untuk mengirimkan pesan suara, izinkan Session Desktop untuk mengakses mikrofon anda.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Sambungkan Perangkat Baru", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Perizinan", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Versi Signal Desktop ini telah kedaluwarsa. Mohom memutakhirkan ke versi terbaru untuk melanjutkan pengiriman pesan.", + "message": "Versi Session Desktop ini telah kedaluwarsa. Mohom memutakhirkan ke versi terbaru untuk melanjutkan pengiriman pesan.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/it/messages.json b/_locales/it/messages.json index 6a28ad557..8dcad0ac6 100644 --- a/_locales/it/messages.json +++ b/_locales/it/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Termina Signal", + "message": "Termina Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Hai appena completato il processo di esportazione e i tuoi contatti e i tuoi messaggi sono in attesa sul tuo computer. Seleziona la cartella che contiene i dati di Signal salvati.", + "message": "Hai appena completato il processo di esportazione e i tuoi contatti e i tuoi messaggi sono in attesa sul tuo computer. Seleziona la cartella che contiene i dati di Session salvati.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Controlla di aver scelto la cartella corretta che contiene i tuoi dati di Signal. Il suo nome dovrebbe iniziare con \"Signal Export\". Puoi anche salvare una nuova copia dei tuoi dati dall'applicazione Chrome.", + "message": "Controlla di aver scelto la cartella corretta che contiene i tuoi dati di Session. Il suo nome dovrebbe iniziare con \"Session Export\". Puoi anche salvare una nuova copia dei tuoi dati dall'applicazione Chrome.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Inizia ad usare Signal Desktop", + "message": "Inizia ad usare Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,7 +264,7 @@ "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": "Il codice di sicurezza con più membri del gruppo è cambiato. Questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che hanno semplicemente reinstallato Signal.", + "message": "Il codice di sicurezza con più membri del gruppo è cambiato. Questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che hanno semplicemente reinstallato Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Il codice di sicurezza che stai cercando di verificare è cambiato. Si prega di ri-verificarlo con $name$. Ricorda che questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che $name$ ha semplicemente reinstallato Signal.", + "message": "Il codice di sicurezza che stai cercando di verificare è cambiato. Si prega di ri-verificarlo con $name$. Ricorda che questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che $name$ ha semplicemente reinstallato Session.", "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": { @@ -288,7 +288,7 @@ } }, "changedRecentlyMultiple": { - "message": "Di recente il codice di sicurezza con più membri del gruppo è cambiato. Questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che hanno semplicemente reinstallato Signal.", + "message": "Di recente il codice di sicurezza con più membri del gruppo è cambiato. Questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che hanno semplicemente reinstallato Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Il codice di sicurezza con $name$ è cambiato. Questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che il $name$ ha semplicemente reinstallato Signal.", + "message": "Il codice di sicurezza con $name$ è cambiato. Questo può voler dire che qualcuno sta cercando d'intercettare la tua comunicazione, oppure che il $name$ ha semplicemente reinstallato Session.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Miniatura temporanea anteprima link per $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Miniatura anteprima link per $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Collega Nuovo Dispositivo", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permessi", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Questa versione di Signal Desktop è scaduta. Per continuare a chattare aggiornala all'ultima versione.", + "message": "Questa versione di Session Desktop è scaduta. Per continuare a chattare aggiornala all'ultima versione.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/ja/messages.json b/_locales/ja/messages.json index 36cd03d12..220030576 100644 --- a/_locales/ja/messages.json +++ b/_locales/ja/messages.json @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Signal Desktopを使い始める", + "message": "Session Desktopを使い始める", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "新規の端末をリンクする", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "アクセス許可", diff --git a/_locales/km/messages.json b/_locales/km/messages.json index fd55b3687..b662abcc4 100644 --- a/_locales/km/messages.json +++ b/_locales/km/messages.json @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "សូមប្រាកដថា អ្នកបានជ្រើសរើស កន្លែងត្រឹមត្រូវដែលផ្ទុកទិន្នន័យSignalរបស់អ្នក ដែលបានរក្សាទុក។ ឈ្មោះវា គួរតែចាប់ផ្តើមដោយ 'នាំចេញ Signal។' អ្នកអាចរក្សាទុកការចម្លងថ្មីមួយនៃទិន្នន័យរបស់អ្នក ពីកម្មវិធី Chrome ។", + "message": "សូមប្រាកដថា អ្នកបានជ្រើសរើស កន្លែងត្រឹមត្រូវដែលផ្ទុកទិន្នន័យSignalរបស់អ្នក ដែលបានរក្សាទុក។ ឈ្មោះវា គួរតែចាប់ផ្តើមដោយ 'នាំចេញ Session។' អ្នកអាចរក្សាទុកការចម្លងថ្មីមួយនៃទិន្នន័យរបស់អ្នក ពីកម្មវិធី Chrome ។", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "ចាប់ផ្តើមប្រើប្រាស់ Signal Desktop", + "message": "ចាប់ផ្តើមប្រើប្រាស់ Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "លេខសុវត្ថិភាពរបស់អ្នក ជាមួយសមាជិកក្រុមច្រើន បានផ្លាស់ប្តូរ តាំងពីអ្នកបានផ្ទៀងផ្ទាត់លើកចុងក្រោយ។ នេះអាចមានន័យថា មាននរណាម្នាក់កំពុងព្យាយាមជ្រាតចូលការទំនាក់ទំនងរបស់អ្នក ឬគេបានតំឡើង Signal ឡើងវិញ។", + "message": "លេខសុវត្ថិភាពរបស់អ្នក ជាមួយសមាជិកក្រុមច្រើន បានផ្លាស់ប្តូរ តាំងពីអ្នកបានផ្ទៀងផ្ទាត់លើកចុងក្រោយ។ នេះអាចមានន័យថា មាននរណាម្នាក់កំពុងព្យាយាមជ្រាតចូលការទំនាក់ទំនងរបស់អ្នក ឬគេបានតំឡើង Session ឡើងវិញ។", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "លេខសុវត្ថិភាពរបស់អ្នក ជាមួយ $name$ បានផ្លាស់ប្តូរ តាំងពីអ្នកបានផ្ទៀងផ្ទាត់លើកចុងក្រោយ។ នេះអាចមានន័យថា មានគេកំពុងព្យាយាមជ្រៀតចូលការទំនាក់ទំនង ឬ $name$ បានដំឡើង Signal ឡើងវិញ។", + "message": "លេខសុវត្ថិភាពរបស់អ្នក ជាមួយ $name$ បានផ្លាស់ប្តូរ តាំងពីអ្នកបានផ្ទៀងផ្ទាត់លើកចុងក្រោយ។ នេះអាចមានន័យថា មានគេកំពុងព្យាយាមជ្រៀតចូលការទំនាក់ទំនង ឬ $name$ បានដំឡើង Session ឡើងវិញ។", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "លេខសុវត្ថិភាព ដែលអ្នកកំពុងព្យាយាមផ្ទៀងផ្ទាត់បានផ្លាស់ប្តូរ។ សូមពិនិត្យមើលលេខសុវត្ថិភាពថ្មីជាមួយ $name$។ ចងចាំថា ការផ្លាស់ប្តូរនេះអាចមានន័យថា​ មាននរណាម្នាក់កំពុងព្យាយាមជ្រាតចូលការទំនាក់ទំនងរបស់អ្នក ឬ $name$បានតំឡើង Signal ឡើងវិញ។ ", + "message": "លេខសុវត្ថិភាព ដែលអ្នកកំពុងព្យាយាមផ្ទៀងផ្ទាត់បានផ្លាស់ប្តូរ។ សូមពិនិត្យមើលលេខសុវត្ថិភាពថ្មីជាមួយ $name$។ ចងចាំថា ការផ្លាស់ប្តូរនេះអាចមានន័យថា​ មាននរណាម្នាក់កំពុងព្យាយាមជ្រាតចូលការទំនាក់ទំនងរបស់អ្នក ឬ $name$បានតំឡើង Session ឡើងវិញ។ ", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "លេខសុវត្ថិភាពរបស់អ្នក ជាមួយសមាជិកក្រុមច្រើន បានផ្លាស់ប្តូរ ថ្មីៗនេះ។ នេះអាចមានន័យថា មាននរណាម្នាក់កំពុងព្យាយាមជ្រាតចូលការទំនាក់ទំនងរបស់អ្នក ឬគេបានតំឡើង Signal ឡើងវិញ។ ", + "message": "លេខសុវត្ថិភាពរបស់អ្នក ជាមួយសមាជិកក្រុមច្រើន បានផ្លាស់ប្តូរ ថ្មីៗនេះ។ នេះអាចមានន័យថា មាននរណាម្នាក់កំពុងព្យាយាមជ្រាតចូលការទំនាក់ទំនងរបស់អ្នក ឬគេបានតំឡើង Session ឡើងវិញ។ ", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "លេខសុវត្ថិភាពរបស់អ្នក ជាមួយ $name$ បានផ្លាស់ប្តូរ ថ្មីៗនេះ។ នេះអាចមានន័យថា មានគេកំពុងព្យាយាមជ្រាតចូលការទំនាក់ទំនងរបស់អ្នក ឬ $name$ បានដំឡើង Signal ឡើងវិញ។", + "message": "លេខសុវត្ថិភាពរបស់អ្នក ជាមួយ $name$ បានផ្លាស់ប្តូរ ថ្មីៗនេះ។ នេះអាចមានន័យថា មានគេកំពុងព្យាយាមជ្រាតចូលការទំនាក់ទំនងរបស់អ្នក ឬ $name$ បានដំឡើង Session ឡើងវិញ។", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "លេខសុវត្ថិភាពរបស់អ្នក ជាមួយ $name$ បានផ្លាស់ប្តូរ។ នេះអាចមានន័យថា មាននរណាម្នាក់កំពុងព្យាយាមជ្រាតចូលការទំនាក់ទំនងរបស់អ្នក ឬ $name$ បានតំឡើង Signal ឡើងវិញ។ អ្នកអាចត្រូវផ្ទៀងផ្ទាត់លេខសុវត្ថិភាពរបស់អ្នក ជាមួយលេខទំនាក់ទំនងនេះ។", + "message": "លេខសុវត្ថិភាពរបស់អ្នក ជាមួយ $name$ បានផ្លាស់ប្តូរ។ នេះអាចមានន័យថា មាននរណាម្នាក់កំពុងព្យាយាមជ្រាតចូលការទំនាក់ទំនងរបស់អ្នក ឬ $name$ បានតំឡើង Session ឡើងវិញ។ អ្នកអាចត្រូវផ្ទៀងផ្ទាត់លេខសុវត្ថិភាពរបស់អ្នក ជាមួយលេខទំនាក់ទំនងនេះ។", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "ការមើលតំណជារូបភាពតូចៗព្រាងសម្រាប់ $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "ការមើលតំណជារូបភាពតូចៗសម្រាប់$domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "ស្វាគមន៍មកកាន់ Signal", + "message": "ស្វាគមន៍មកកាន់ Session", "description": "" }, "typingAlt": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "តភ្ជាប់ឧបករណ៍ថ្មី", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "ការអនុញ្ញាត", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "ជំនាន់ Signal Desktop នេះ បានហួសសុពលភាព។ សូមដំឡើងទីកាន់ជំនាន់ចុងក្រោយ ដើម្បីបន្តការផ្ញើសារ។", + "message": "ជំនាន់ Session Desktop នេះ បានហួសសុពលភាព។ សូមដំឡើងទីកាន់ជំនាន់ចុងក្រោយ ដើម្បីបន្តការផ្ញើសារ។", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/kn/messages.json b/_locales/kn/messages.json index 28db866f4..ba44ef8cd 100644 --- a/_locales/kn/messages.json +++ b/_locales/kn/messages.json @@ -154,7 +154,7 @@ "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.", + "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 Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "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.", + "message": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session 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": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start using Signal Desktop", + "message": "Start using Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Your safety numbers with multiple group members have changed since you last verified. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Signal.", + "message": "Your safety numbers with multiple group members have changed since you last verified. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "ನೀವು ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲಿಸಿದ ನಂತರ $name$ ನಿಮ್ಮ ಸುರಕ್ಷತೆ ಸಂಖ್ಯೆ ಬದಲಾಗಿದೆ. ನಿಮ್ಮ ಸಂವಹನವನ್ನು ಯಾರಾದರೂ ತಡೆಗಟ್ಟಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದಾರೆ ಅಥವಾ $name$ Signal ಅನ್ನು ಪುನಃ ಸ್ಥಾಪಿಸಿದ್ದಾರೆ", + "message": "ನೀವು ಕೊನೆಯದಾಗಿ ಪರಿಶೀಲಿಸಿದ ನಂತರ $name$ ನಿಮ್ಮ ಸುರಕ್ಷತೆ ಸಂಖ್ಯೆ ಬದಲಾಗಿದೆ. ನಿಮ್ಮ ಸಂವಹನವನ್ನು ಯಾರಾದರೂ ತಡೆಗಟ್ಟಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದಾರೆ ಅಥವಾ $name$ Session ಅನ್ನು ಪುನಃ ಸ್ಥಾಪಿಸಿದ್ದಾರೆ", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "The safety number you are trying to verify has changed. Please review your new safety number with $name$. Remember, this change could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Signal.", + "message": "The safety number you are trying to verify has changed. Please review your new safety number with $name$. Remember, this change could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Your safety numbers with multiple group members have changed recently. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Signal.", + "message": "Your safety numbers with multiple group members have changed recently. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Your safety number with $name$ has changed recently. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Signal.", + "message": "Your safety number with $name$ has changed recently. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Your safety number with $name$ has changed. This could either mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Signal. You may wish to verify your saftey number with this contact.", + "message": "Your safety number with $name$ has changed. This could either mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session. You may wish to verify your saftey number with this contact.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "To send audio messages, allow Signal Desktop to access your microphone.", + "message": "To send audio messages, allow Session Desktop to access your microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Link New Device", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissions", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Signal ಡೆಸ್ಕ್ಟಾಪ್ ಈ ಆವೃತ್ತಿಯ ಅವಧಿ ಮುಗಿದಿದೆ. ಸಂದೇಶ ಮುಂದುವರೆಸಲು ಹೊಸ ಆವೃತ್ತಿಗೆ ಅಪ್ಗ್ರೇಡ್ ಮಾಡಿ.", + "message": "Session ಡೆಸ್ಕ್ಟಾಪ್ ಈ ಆವೃತ್ತಿಯ ಅವಧಿ ಮುಗಿದಿದೆ. ಸಂದೇಶ ಮುಂದುವರೆಸಲು ಹೊಸ ಆವೃತ್ತಿಗೆ ಅಪ್ಗ್ರೇಡ್ ಮಾಡಿ.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/ko/messages.json b/_locales/ko/messages.json index 4b44ab906..cc2680dca 100644 --- a/_locales/ko/messages.json +++ b/_locales/ko/messages.json @@ -154,7 +154,7 @@ "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.", + "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 Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "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.", + "message": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session 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": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start using Signal Desktop", + "message": "Start using Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Your safety numbers with multiple group members have changed since you last verified. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Signal.", + "message": "Your safety numbers with multiple group members have changed since you last verified. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Your safety number with $name$ has changed since you last verified. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Signal.", + "message": "Your safety number with $name$ has changed since you last verified. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "The safety number you are trying to verify has changed. Please review your new safety number with $name$. Remember, this change could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Signal.", + "message": "The safety number you are trying to verify has changed. Please review your new safety number with $name$. Remember, this change could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Your safety numbers with multiple group members have changed recently. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Signal.", + "message": "Your safety numbers with multiple group members have changed recently. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Your safety number with $name$ has changed recently. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Signal.", + "message": "Your safety number with $name$ has changed recently. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Your safety number with $name$ has changed. This could either mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Signal. You may wish to verify your saftey number with this contact.", + "message": "Your safety number with $name$ has changed. This could either mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session. You may wish to verify your saftey number with this contact.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Welcome to Signal", + "message": "Welcome to Session", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "To send audio messages, allow Signal Desktop to access your microphone.", + "message": "To send audio messages, allow Session Desktop to access your microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Link New Device", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissions", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "This version of Signal Desktop has expired. Please upgrade to the latest version to continue messaging.", + "message": "This version of Session Desktop has expired. Please upgrade to the latest version to continue messaging.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/lt/messages.json b/_locales/lt/messages.json index 97c30d146..14fa337b6 100644 --- a/_locales/lt/messages.json +++ b/_locales/lt/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Išeiti iš Signal", + "message": "Išeiti iš Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Jūs ką tik perėjote per eksportavimo procesą ir jūsų kontaktai bei žinutės kantriai laukia jūsų kompiuteryje. Pasirinkite aplanką, kuriame yra jūsų įrašyti Signal duomenys.", + "message": "Jūs ką tik perėjote per eksportavimo procesą ir jūsų kontaktai bei žinutės kantriai laukia jūsų kompiuteryje. Pasirinkite aplanką, kuriame yra jūsų įrašyti Session duomenys.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Įsitikinkite, kad pasirinkote teisingą katalogą, kuriame yra jūsų įrašyti Signal duomenys. Jo pavadinimas turėtų prasidėti \"Signal Export.\" Taip pat galite įrašyti naują savo duomenų kopiją iš Chrome programėlės.", + "message": "Įsitikinkite, kad pasirinkote teisingą katalogą, kuriame yra jūsų įrašyti Session duomenys. Jo pavadinimas turėtų prasidėti \"Session Export.\" Taip pat galite įrašyti naują savo duomenų kopiją iš Chrome programėlės.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Pradėti naudoti Signal Desktop", + "message": "Pradėti naudoti Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Jūsų saugumo numeriai su keliais grupės dalyviais nuo paskutinio patvirtinimo pasikeitė. Tai gali reikšti, kad kažkas bando perimti jūsų susirašinėjimą arba, kad šie asmenys, tiesiog, iš naujo įdiegė Signal.", + "message": "Jūsų saugumo numeriai su keliais grupės dalyviais nuo paskutinio patvirtinimo pasikeitė. Tai gali reikšti, kad kažkas bando perimti jūsų susirašinėjimą arba, kad šie asmenys, tiesiog, iš naujo įdiegė Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Jūsų saugumo numeris su $name$ nuo paskutinio patvirtinimo pasikeitė. Tai gali reikšti, kad kažkas bando perimti jūsų susirašinėjimą arba, kad $name$, tiesiog, iš naujo įdiegė Signal.", + "message": "Jūsų saugumo numeris su $name$ nuo paskutinio patvirtinimo pasikeitė. Tai gali reikšti, kad kažkas bando perimti jūsų susirašinėjimą arba, kad $name$, tiesiog, iš naujo įdiegė Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Saugumo numeris, kurį bandote patvirtinti, pasikeitė. Prašome peržiūrėti savo saugumo numerį su $name$. Atminkite, šis pokytis gali reikšti, kad kažkas bando perimti jūsų susirašinėjimą arba, kad $name$, tiesiog, iš naujo įdiegė Signal.", + "message": "Saugumo numeris, kurį bandote patvirtinti, pasikeitė. Prašome peržiūrėti savo saugumo numerį su $name$. Atminkite, šis pokytis gali reikšti, kad kažkas bando perimti jūsų susirašinėjimą arba, kad $name$, tiesiog, iš naujo įdiegė Session.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Jūsų saugumo numeriai su keliais grupės dalyviais neseniai pasikeitė. Tai gali reikšti, kad kažkas bando perimti jūsų susirašinėjimą arba, kad šie asmenys, tiesiog, iš naujo įdiegė Signal. ", + "message": "Jūsų saugumo numeriai su keliais grupės dalyviais neseniai pasikeitė. Tai gali reikšti, kad kažkas bando perimti jūsų susirašinėjimą arba, kad šie asmenys, tiesiog, iš naujo įdiegė Session. ", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Jūsų saugumo numeris su $name$ neseniai pasikeitė. Tai gali reikšti, kad kažkas bando perimti jūsų susirašinėjimą arba, kad $name$, tiesiog, iš naujo įdiegė Signal.", + "message": "Jūsų saugumo numeris su $name$ neseniai pasikeitė. Tai gali reikšti, kad kažkas bando perimti jūsų susirašinėjimą arba, kad $name$, tiesiog, iš naujo įdiegė Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Jūsų saugumo numeris su $name$ pasikeitė. Tai gali reikšti, kad kažkas bando perimti jūsų susirašinėjimą arba, kad $name$, tiesiog, iš naujo įdiegė Signal. Jūs, tikriausiai, norėtumėte patvirtinti saugumo numerį su šiuo kontaktu.", + "message": "Jūsų saugumo numeris su $name$ pasikeitė. Tai gali reikšti, kad kažkas bando perimti jūsų susirašinėjimą arba, kad $name$, tiesiog, iš naujo įdiegė Session. Jūs, tikriausiai, norėtumėte patvirtinti saugumo numerį su šiuo kontaktu.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Juodraštinė miniatiūrinė nuorodos peržiūra, skirta $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Miniatiūrinė nuorodos peržiūra, skirta $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Sveiki atvykę į Signal", + "message": "Sveiki atvykę į Session", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "Norėdami siųsti garso žinutes, suteikite Signal Desktop prieigą prie savo mikrofono.", + "message": "Norėdami siųsti garso žinutes, suteikite Session Desktop prieigą prie savo mikrofono.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Susieti naują įrenginį", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Leidimai", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Pasibaigė šios Signal Desktop skirtos versijos galiojimas. Norint tęsti susirašinėjimą, prašome atsinaujinti iki naujausios versijos.", + "message": "Pasibaigė šios Session Desktop skirtos versijos galiojimas. Norint tęsti susirašinėjimą, prašome atsinaujinti iki naujausios versijos.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/mk/messages.json b/_locales/mk/messages.json index c5da4e062..1e1e22a66 100644 --- a/_locales/mk/messages.json +++ b/_locales/mk/messages.json @@ -154,7 +154,7 @@ "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.", + "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 Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "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.", + "message": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session 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": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start using Signal Desktop", + "message": "Start using Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Your safety numbers with multiple group members have changed since you last verified. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Signal.", + "message": "Your safety numbers with multiple group members have changed since you last verified. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Your safety number with $name$ has changed since you last verified. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Signal.", + "message": "Your safety number with $name$ has changed since you last verified. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "The safety number you are trying to verify has changed. Please review your new safety number with $name$. Remember, this change could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Signal.", + "message": "The safety number you are trying to verify has changed. Please review your new safety number with $name$. Remember, this change could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Your safety numbers with multiple group members have changed recently. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Signal.", + "message": "Your safety numbers with multiple group members have changed recently. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Your safety number with $name$ has changed recently. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Signal.", + "message": "Your safety number with $name$ has changed recently. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Your safety number with $name$ has changed. This could either mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Signal. You may wish to verify your saftey number with this contact.", + "message": "Your safety number with $name$ has changed. This could either mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session. You may wish to verify your saftey number with this contact.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Добредојдовте во Signal", + "message": "Добредојдовте во Session", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "To send audio messages, allow Signal Desktop to access your microphone.", + "message": "To send audio messages, allow Session Desktop to access your microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Link New Device", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissions", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "This version of Signal Desktop has expired. Please upgrade to the latest version to continue messaging.", + "message": "This version of Session Desktop has expired. Please upgrade to the latest version to continue messaging.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/nb/messages.json b/_locales/nb/messages.json index 5b0e35220..7cc8df710 100644 --- a/_locales/nb/messages.json +++ b/_locales/nb/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Avslutt Signal", + "message": "Avslutt Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Du har akkurat gått igjennom eksportprosessen og dine kontaker og meldinger venter tålmodig på din datamaskin. Velg mappen som inneholder dine lagrede Signal data.", + "message": "Du har akkurat gått igjennom eksportprosessen og dine kontaker og meldinger venter tålmodig på din datamaskin. Velg mappen som inneholder dine lagrede Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Vær sikker på at du har valgt mappen som inneholder dine lagrede Signal-data. Navnet skal begynne med «Signal Export». Du kan også lagre en ny kopi av dine data fra den gamle Chrome-appen.", + "message": "Vær sikker på at du har valgt mappen som inneholder dine lagrede Session-data. Navnet skal begynne med «Session Export». Du kan også lagre en ny kopi av dine data fra den gamle Chrome-appen.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start å bruke Signal Desktop", + "message": "Start å bruke Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Ditt sikkerhetsnummer med flere gruppemedlemmer er endret siden forrige gang du godkjente. Dette kan bety at noen prøver å avlytte kommunikasjonen, eller at de bare har reinstallert Signal.", + "message": "Ditt sikkerhetsnummer med flere gruppemedlemmer er endret siden forrige gang du godkjente. Dette kan bety at noen prøver å avlytte kommunikasjonen, eller at de bare har reinstallert Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Ditt sikkerhetsnummer sammen med $name$ har endret seg siden sist dere verifiserte. Dette kan bety at noen forsøker å overvåke kommunikasjonen eller at $name$ helt enkelt har installert Signal på nytt.", + "message": "Ditt sikkerhetsnummer sammen med $name$ har endret seg siden sist dere verifiserte. Dette kan bety at noen forsøker å overvåke kommunikasjonen eller at $name$ helt enkelt har installert Session på nytt.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Sikkerhetsnummeret du prøver å godkjenne har endret seg. Du må bekrefte det nye sikkerhetsnummeret til $name$. Husk at dette kan bety at noen prøver å avlytte kommunikasjonen, eller at $name$ bare har reinstallert Signal.", + "message": "Sikkerhetsnummeret du prøver å godkjenne har endret seg. Du må bekrefte det nye sikkerhetsnummeret til $name$. Husk at dette kan bety at noen prøver å avlytte kommunikasjonen, eller at $name$ bare har reinstallert Session.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Dine sikkerhetsnumre for flere gruppemedlemmer er endret i det siste. Dette kan bety at noen prøver å avlytte kommunikasjonen, eller at de bare har reinstallert Signal.", + "message": "Dine sikkerhetsnumre for flere gruppemedlemmer er endret i det siste. Dette kan bety at noen prøver å avlytte kommunikasjonen, eller at de bare har reinstallert Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Ditt sikkerhetsnummer med $name$ er endret i det siste. Dette kan bety at noen prøver å avlytte kommunikasjonen, eller at $name$ bare har reinstallert Signal.", + "message": "Ditt sikkerhetsnummer med $name$ er endret i det siste. Dette kan bety at noen prøver å avlytte kommunikasjonen, eller at $name$ bare har reinstallert Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Ditt sikkerhetsnummer med $name$ er endret. Dette kan enten bety at noen avlytter kommunikasjonen deres, eller at $name$ bare har reinstallert Signal. Du kan ha lyst til å bekrefte ditt sikkerhetsnummer med denne kontakten.", + "message": "Ditt sikkerhetsnummer med $name$ er endret. Dette kan enten bety at noen avlytter kommunikasjonen deres, eller at $name$ bare har reinstallert Session. Du kan ha lyst til å bekrefte ditt sikkerhetsnummer med denne kontakten.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Utkast miniatyrbilde til linkforhåndsvisning for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Miniatyrbilde til linkforhåndsvisning for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Velkommen til Signal!", + "message": "Velkommen til Session!", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "For å sende lydmeldinger, gi Signal Desktop tilgang til mikrofonen din.", + "message": "For å sende lydmeldinger, gi Session Desktop tilgang til mikrofonen din.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Koble Til En Ny Enhet", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Tillatelser", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Denne versjonen av Signal Desktop er foreldet. Oppgrader til siste versjon for å fortsette.", + "message": "Denne versjonen av Session Desktop er foreldet. Oppgrader til siste versjon for å fortsette.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/nl/messages.json b/_locales/nl/messages.json index ef0c3f72f..0544ff37a 100644 --- a/_locales/nl/messages.json +++ b/_locales/nl/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Signal afsluiten", + "message": "Session afsluiten", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Je hebt net de exportprodedure doorlopen, en je contacten en berichten wachten geduldig op je computer. Kies de map die je opgeslagen Signal-gegevens bevat.", + "message": "Je hebt net de exportprodedure doorlopen, en je contacten en berichten wachten geduldig op je computer. Kies de map die je opgeslagen Session-gegevens bevat.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Zorg dat je de juiste map met je opgeslagen Signal-gegevens kiest. De naam begint normaal gezien met ‘Signal Export’. Je kunt ook een nieuwe kopie van je gegevens uit de Chrome-app opslaan.", + "message": "Zorg dat je de juiste map met je opgeslagen Session-gegevens kiest. De naam begint normaal gezien met ‘Session Export’. Je kunt ook een nieuwe kopie van je gegevens uit de Chrome-app opslaan.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Begin Signal Desktop te gebruiken", + "message": "Begin Session Desktop te gebruiken", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Je veiligheidsnummers met meerdere groepsleden zijn veranderd sinds de laatste verificatie. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat sommige groepsleden Signal opnieuw hebben geïnstalleerd.", + "message": "Je veiligheidsnummers met meerdere groepsleden zijn veranderd sinds de laatste verificatie. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat sommige groepsleden Session opnieuw hebben geïnstalleerd.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Je veiligheidsnummer met $name$ is veranderd sinds de laatste verificatie. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat $name$ Signal opnieuw heeft geïnstalleerd.", + "message": "Je veiligheidsnummer met $name$ is veranderd sinds de laatste verificatie. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat $name$ Session opnieuw heeft geïnstalleerd.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Het veiligheidsnummer dat je wilt verifiëren is veranderd. Controleer je nieuwe veiligheidsnummer met $name$. Let op: dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat $name$ Signal opnieuw heeft geïnstalleerd.", + "message": "Het veiligheidsnummer dat je wilt verifiëren is veranderd. Controleer je nieuwe veiligheidsnummer met $name$. Let op: dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat $name$ Session opnieuw heeft geïnstalleerd.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Je veiligheidsnummers met meerdere groepsleden zijn recentelijk veranderd. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat sommige groepsleden Signal opnieuw hebben geïnstalleerd.", + "message": "Je veiligheidsnummers met meerdere groepsleden zijn recentelijk veranderd. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat sommige groepsleden Session opnieuw hebben geïnstalleerd.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Je veiligheidsnummer met $name$ is onlangs veranderd. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat $name$ Signal opnieuw heeft geïnstalleerd.", + "message": "Je veiligheidsnummer met $name$ is onlangs veranderd. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat $name$ Session opnieuw heeft geïnstalleerd.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Je veiligheidsnummer met $name$ is veranderd. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat $name$ Signal opnieuw heeft geïnstalleerd. Het wordt aanbevolen je nieuwe veiligheidsnummer met dit contactpersoon te verifiëren.", + "message": "Je veiligheidsnummer met $name$ is veranderd. Dit kan betekenen dat iemand je gesprekken probeert te onderscheppen, of gewoonweg dat $name$ Session opnieuw heeft geïnstalleerd. Het wordt aanbevolen je nieuwe veiligheidsnummer met dit contactpersoon te verifiëren.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Conceptvoorbeeldweergave voor $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Voorbeeldweergave voor $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Welkom bij Signal", + "message": "Welkom bij Session", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "Om een audiobericht te versturen moet je Signal Desktop toegang tot de microfoon geven.", + "message": "Om een audiobericht te versturen moet je Session Desktop toegang tot de microfoon geven.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Nieuw apparaat koppelen", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Toestemmingen", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Deze versie van Signal Desktop is verouderd. Opwaardeer naar de laatste versie om verder te chatten.", + "message": "Deze versie van Session Desktop is verouderd. Opwaardeer naar de laatste versie om verder te chatten.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/nn/messages.json b/_locales/nn/messages.json index 3a0f5a8ba..40716a327 100644 --- a/_locales/nn/messages.json +++ b/_locales/nn/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Avslutt Signal", + "message": "Avslutt Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Du har akkurat gått gjennom eksportprosessen; kontaktane og meldingane dine ventar tålmodig på datamaskina di. Vel mappa som inneheld den lagra Signal-eksporten.", + "message": "Du har akkurat gått gjennom eksportprosessen; kontaktane og meldingane dine ventar tålmodig på datamaskina di. Vel mappa som inneheld den lagra Session-eksporten.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Stadfest at du har valt mappa som inneheld den lagra Signal-eksporten din. Namnet skal byrja med «Signal Export». Du kan òg lagra ein ny kopi av eksporten frå den gamle Chrome-appen.", + "message": "Stadfest at du har valt mappa som inneheld den lagra Session-eksporten din. Namnet skal byrja med «Session Export». Du kan òg lagra ein ny kopi av eksporten frå den gamle Chrome-appen.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start å bruka Signal Desktop", + "message": "Start å bruka Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Tryggingsnummeret ditt med fleire gruppemedlemmer er endra sidan førre gong du godkjente. Dette kan bety at nokon prøver å avlytta kommunikasjonen, eller at dei berre har installert Signal på nytt.", + "message": "Tryggingsnummeret ditt med fleire gruppemedlemmer er endra sidan førre gong du godkjente. Dette kan bety at nokon prøver å avlytta kommunikasjonen, eller at dei berre har installert Session på nytt.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Tryggingsnummeret ditt saman med $name$ har endra seg sidan sist dykk godkjende. Dette kan bety at nokon prøver å overvaka kommunikasjonen eller at $name$ heilt enkelt har installert Signal på nytt.", + "message": "Tryggingsnummeret ditt saman med $name$ har endra seg sidan sist dykk godkjende. Dette kan bety at nokon prøver å overvaka kommunikasjonen eller at $name$ heilt enkelt har installert Session på nytt.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Tryggingsnummeret du prøver å godkjenna har endra seg. Du må godkjenna det nye tryggingsnummeret til $name$. Hugs at dette kan bety at nokon prøver å avlytta kommunikasjonen, eller at $name$ berre har reinstallert Signal.", + "message": "Tryggingsnummeret du prøver å godkjenna har endra seg. Du må godkjenna det nye tryggingsnummeret til $name$. Hugs at dette kan bety at nokon prøver å avlytta kommunikasjonen, eller at $name$ berre har reinstallert Session.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Tryggingsnummera dine for fleire gruppemedlemmer er endra i det siste. Dette kan bety at nokon prøver å avlytta kommunikasjonen, eller at dei berre har reinstallert Signal.", + "message": "Tryggingsnummera dine for fleire gruppemedlemmer er endra i det siste. Dette kan bety at nokon prøver å avlytta kommunikasjonen, eller at dei berre har reinstallert Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Tryggingsnummeret ditt med $name$ er endra i det siste. Dette kan bety at nokon prøver å avlytta kommunikasjonen, eller at $name$ berre har reinstallert Signal.", + "message": "Tryggingsnummeret ditt med $name$ er endra i det siste. Dette kan bety at nokon prøver å avlytta kommunikasjonen, eller at $name$ berre har reinstallert Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Tryggingsnummeret ditt med $name$ er endra. Dette kan enten bety at nokon avlyttar kommunikasjonen deira, eller at $name$ berre har reinstallert Signal. Du vil kanskje stadfesta tryggingsnummeret ditt med denne kontakten.", + "message": "Tryggingsnummeret ditt med $name$ er endra. Dette kan enten bety at nokon avlyttar kommunikasjonen deira, eller at $name$ berre har reinstallert Session. Du vil kanskje stadfesta tryggingsnummeret ditt med denne kontakten.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Førehandsvisning (kladd) av lenkje til $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Førehandsvisning av lenkje til $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Velkommen til Signal!", + "message": "Velkommen til Session!", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "Gi Signal Desktop tilgang til mikrofonen din for å senda lydmeldingar.", + "message": "Gi Session Desktop tilgang til mikrofonen din for å senda lydmeldingar.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Kopla til ei ny eining", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Tillatingar", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Denne utgåva av Signal Desktop er forelda. Oppgrader til siste utgåve for å fortsetja.", + "message": "Denne utgåva av Session Desktop er forelda. Oppgrader til siste utgåve for å fortsetja.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/no/messages.json b/_locales/no/messages.json index a093b0083..cbec2e123 100644 --- a/_locales/no/messages.json +++ b/_locales/no/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Avslutt Signal", + "message": "Avslutt Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Du har akkurat gått igjennom eksportprosessen og dine kontaker og meldinger venter tålmodig på din datamaskin. Velg mappen som inneholder dine lagrede Signal data.", + "message": "Du har akkurat gått igjennom eksportprosessen og dine kontaker og meldinger venter tålmodig på din datamaskin. Velg mappen som inneholder dine lagrede Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Vær sikker på at du har valgt mappen som inneholder dine lagrede Signal-data. Navnet skal begynne med «Signal Export». Du kan også lagre en ny kopi av dine data fra den gamle Chrome-appen.", + "message": "Vær sikker på at du har valgt mappen som inneholder dine lagrede Session-data. Navnet skal begynne med «Session Export». Du kan også lagre en ny kopi av dine data fra den gamle Chrome-appen.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start å bruke Signal Desktop", + "message": "Start å bruke Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Ditt sikkerhetsnummer med flere gruppemedlemmer er endret siden forrige gang du godkjente. Dette kan bety at noen prøver å avlytte kommunikasjonen, eller at de bare har reinstallert Signal.", + "message": "Ditt sikkerhetsnummer med flere gruppemedlemmer er endret siden forrige gang du godkjente. Dette kan bety at noen prøver å avlytte kommunikasjonen, eller at de bare har reinstallert Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Ditt sikkerhetsnummer sammen med $name$ har endret seg siden sist dere verifiserte. Dette kan bety at noen forsøker å overvåke kommunikasjonen eller at $name$ helt enkelt har installert Signal på nytt.", + "message": "Ditt sikkerhetsnummer sammen med $name$ har endret seg siden sist dere verifiserte. Dette kan bety at noen forsøker å overvåke kommunikasjonen eller at $name$ helt enkelt har installert Session på nytt.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Sikkerhetsnummeret du prøver å godkjenne har endret seg. Du må bekrefte det nye sikkerhetsnummeret til $name$. Husk at dette kan bety at noen prøver å avlytte kommunikasjonen, eller at $name$ bare har reinstallert Signal.", + "message": "Sikkerhetsnummeret du prøver å godkjenne har endret seg. Du må bekrefte det nye sikkerhetsnummeret til $name$. Husk at dette kan bety at noen prøver å avlytte kommunikasjonen, eller at $name$ bare har reinstallert Session.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Dine sikkerhetsnumre for flere gruppemedlemmer er endret i det siste. Dette kan bety at noen prøver å avlytte kommunikasjonen, eller at de bare har reinstallert Signal.", + "message": "Dine sikkerhetsnumre for flere gruppemedlemmer er endret i det siste. Dette kan bety at noen prøver å avlytte kommunikasjonen, eller at de bare har reinstallert Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Ditt sikkerhetsnummer med $name$ er endret i det siste. Dette kan bety at noen prøver å avlytte kommunikasjonen, eller at $name$ bare har reinstallert Signal.", + "message": "Ditt sikkerhetsnummer med $name$ er endret i det siste. Dette kan bety at noen prøver å avlytte kommunikasjonen, eller at $name$ bare har reinstallert Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Ditt sikkerhetsnummer med $name$ er endret. Dette kan enten bety at noen avlytter kommunikasjonen deres, eller at $name$ bare har reinstallert Signal. Du kan ha lyst til å bekrefte ditt sikkerhetsnummer med denne kontakten.", + "message": "Ditt sikkerhetsnummer med $name$ er endret. Dette kan enten bety at noen avlytter kommunikasjonen deres, eller at $name$ bare har reinstallert Session. Du kan ha lyst til å bekrefte ditt sikkerhetsnummer med denne kontakten.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Velkommen til Signal!", + "message": "Velkommen til Session!", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "For å sende lydmeldinger, gi Signal Desktop tilgang til mikrofonen din.", + "message": "For å sende lydmeldinger, gi Session Desktop tilgang til mikrofonen din.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Koble Til En Ny Enhet", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Tillatelser", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Denne versjonen av Signal Desktop er foreldet. Oppgrader til siste versjon for å fortsette.", + "message": "Denne versjonen av Session Desktop er foreldet. Oppgrader til siste versjon for å fortsette.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/pl/messages.json b/_locales/pl/messages.json index c68d7505d..47b80199a 100644 --- a/_locales/pl/messages.json +++ b/_locales/pl/messages.json @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Właśnie przeszedłeś proces eksportu, twoje kontakty i wiadomości czekają cierpliwie na twoim komputerze. Wybierz folder zawierający zapisane dane Signal.", + "message": "Właśnie przeszedłeś proces eksportu, twoje kontakty i wiadomości czekają cierpliwie na twoim komputerze. Wybierz folder zawierający zapisane dane Session.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Upewnij się, że wybrałeś właściwy folder zawierający dane Signal. Jego nazwa powinna zaczynać się na \"Signal Export\". Możesz też zapisać nową kopię danych z aplikacji Chrome.", + "message": "Upewnij się, że wybrałeś właściwy folder zawierający dane Session. Jego nazwa powinna zaczynać się na \"Session Export\". Możesz też zapisać nową kopię danych z aplikacji Chrome.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Rozpocznij korzystanie z Signal Desktop", + "message": "Rozpocznij korzystanie z Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Twoje numery bezpieczeństwa z tymi członkami grupy zmieniły się od ostatniego czasu gdy je weryfikowałeś(aś). To może oznaczać, że ktoś próbuje przechwycić Twoją komunikację, albo że członkowie grupy po prostu przeinstalowali aplikację Signal.", + "message": "Twoje numery bezpieczeństwa z tymi członkami grupy zmieniły się od ostatniego czasu gdy je weryfikowałeś(aś). To może oznaczać, że ktoś próbuje przechwycić Twoją komunikację, albo że członkowie grupy po prostu przeinstalowali aplikację Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Twój numer bezpieczeństwa z $name$ zmienił się od ostatniego czasu gdy go zweryfikowałeś. To może oznaczać, że ktoś próbuje przechwycić Twoją komunikację, albo że $name$ po prostu przeinstalował(a) aplikację Signal. ", + "message": "Twój numer bezpieczeństwa z $name$ zmienił się od ostatniego czasu gdy go zweryfikowałeś. To może oznaczać, że ktoś próbuje przechwycić Twoją komunikację, albo że $name$ po prostu przeinstalował(a) aplikację Session. ", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Numer bezpieczeństwa, który próbujesz zweryfikować zmienił się. Proszę sprawdź go z $name$. Pamiętaj, że to może oznaczać, że ktoś próbuje przechwycić Twoją komunikację lub po prostu $name$ przeinstalował(a) aplikację Signal. ", + "message": "Numer bezpieczeństwa, który próbujesz zweryfikować zmienił się. Proszę sprawdź go z $name$. Pamiętaj, że to może oznaczać, że ktoś próbuje przechwycić Twoją komunikację lub po prostu $name$ przeinstalował(a) aplikację Session. ", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Twoje numbery bezpieczeństwa z wieloma członkami grupy ostatnio się zmieniły. To może znaczyć, że ktoś próbuje przechwycić Twoją komunikację, albo że członkowie grupy po prostu przeinstalowali aplikację Signal.", + "message": "Twoje numbery bezpieczeństwa z wieloma członkami grupy ostatnio się zmieniły. To może znaczyć, że ktoś próbuje przechwycić Twoją komunikację, albo że członkowie grupy po prostu przeinstalowali aplikację Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Numer bezpieczeństwa $name$ zmienił się. To może oznaczać, że ktoś próbuje przechwycić Twoją komunikację lub że po prostu $name$ przeinstalował(a) aplikację Signal. ", + "message": "Numer bezpieczeństwa $name$ zmienił się. To może oznaczać, że ktoś próbuje przechwycić Twoją komunikację lub że po prostu $name$ przeinstalował(a) aplikację Session. ", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Numer bezpieczeństwa z $name$ zmienił się. To może oznaczać, że ktoś próbuje przechwycić Twoją komunikację lub, że po prostu $name$ przeinstalował(a) aplikację Signal. Możesz zweryfikować nowy numer bezpieczeństwa poniżej.", + "message": "Numer bezpieczeństwa z $name$ zmienił się. To może oznaczać, że ktoś próbuje przechwycić Twoją komunikację lub, że po prostu $name$ przeinstalował(a) aplikację Session. Możesz zweryfikować nowy numer bezpieczeństwa poniżej.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Projekt miniaturki podglądu linku do $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Podgląd miniaturki linku dla $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Witamy w Signal", + "message": "Witamy w Session", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "Aby wysyłać wiadomości audio, zezwól aplikacji Signal Desktop na dostęp do mikrofonu.", + "message": "Aby wysyłać wiadomości audio, zezwól aplikacji Session Desktop na dostęp do mikrofonu.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Połącz nowe urządzenie", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Uprawnienia", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Ta wersja Signal Desktop jest przestarzała. Aby nadal wysyłać wiadomości, wykonaj aktualizację.", + "message": "Ta wersja Session Desktop jest przestarzała. Aby nadal wysyłać wiadomości, wykonaj aktualizację.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/pt_BR/messages.json b/_locales/pt_BR/messages.json index 0552ee23f..e6e1df9b3 100644 --- a/_locales/pt_BR/messages.json +++ b/_locales/pt_BR/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Sair do Signal", + "message": "Sair do Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Você acabou de terminar o processo de exportação, e os seus contatos e mensagens esperam por você. Selecione a pasta que contém os seus dados do Signal salvos.", + "message": "Você acabou de terminar o processo de exportação, e os seus contatos e mensagens esperam por você. Selecione a pasta que contém os seus dados do Session salvos.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Confira se escolheu o diretório certo, que contém seus dados exportados do Signal. O nome da pasta deve começar com 'Signal Export'. Você também pode baixar seus dados novamente usando o Chrome App.", + "message": "Confira se escolheu o diretório certo, que contém seus dados exportados do Session. O nome da pasta deve começar com 'Session Export'. Você também pode baixar seus dados novamente usando o Chrome App.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Comece a usar o Signal Desktop", + "message": "Comece a usar o Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,7 +264,7 @@ "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": "Os seus números de segurança com vários membros de grupos mudaram desde a última vez que você os verificou. Isso pode significar uma tentativa de interceptação das suas comunicações ou somente que esses contatos reinstalaram Signal.", + "message": "Os seus números de segurança com vários membros de grupos mudaram desde a última vez que você os verificou. Isso pode significar uma tentativa de interceptação das suas comunicações ou somente que esses contatos reinstalaram Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "O número de segurança que você está tentando verificar mudou. Por favor, confira o seu número de segurança com $name$. Lembre-se que isso pode significar uma tentativa de interceptação das suas comunicações ou somente que $name$ reinstalou Signal.", + "message": "O número de segurança que você está tentando verificar mudou. Por favor, confira o seu número de segurança com $name$. Lembre-se que isso pode significar uma tentativa de interceptação das suas comunicações ou somente que $name$ reinstalou Session.", "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": { @@ -288,7 +288,7 @@ } }, "changedRecentlyMultiple": { - "message": "Os seus números de segurança com vários membros mudaram recentemente. Isso pode significar uma tentativa de interceptação das suas comunicações ou somente que esses contatos reinstalaram Signal.", + "message": "Os seus números de segurança com vários membros mudaram recentemente. Isso pode significar uma tentativa de interceptação das suas comunicações ou somente que esses contatos reinstalaram Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "O seu número de segurança com $name$mudou. Isso pode significar uma tentativa de interceptação das suas comunicações ou somente que $name$ reinstalou Signal. Recomendamos que você verifique o seu número de segurança com essa pessoa.", + "message": "O seu número de segurança com $name$mudou. Isso pode significar uma tentativa de interceptação das suas comunicações ou somente que $name$ reinstalou Session. Recomendamos que você verifique o seu número de segurança com essa pessoa.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Pré-visualização em miniatura do link $domain$ (rascunho)", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Pré-visualização em miniatura do link $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Vincular Novo Dispositivo", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissões", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Esta versão do Signal Desktop expirou. Por favor, atualize-o para a versão mais recente para continuar enviando mensagens.", + "message": "Esta versão do Session Desktop expirou. Por favor, atualize-o para a versão mais recente para continuar enviando mensagens.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/pt_PT/messages.json b/_locales/pt_PT/messages.json index 398fb12f8..25cf867f4 100644 --- a/_locales/pt_PT/messages.json +++ b/_locales/pt_PT/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Sair do Signal", + "message": "Sair do Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Acabou de passar pelo processo de exportação, e os seus contactos e mensagens estão a aguardar pacientemente no seu computados. Selecione a pasta que contém os seus dados Signal guardados.", + "message": "Acabou de passar pelo processo de exportação, e os seus contactos e mensagens estão a aguardar pacientemente no seu computados. Selecione a pasta que contém os seus dados Session guardados.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Assegure-se que escolheu a diretoria correta onde se encontram os seus dados do Signal. O nome da diretoria deverá começar por 'Signal Export'. Também poderá copiar os seus dados a partir da aplicação Chrome. ", + "message": "Assegure-se que escolheu a diretoria correta onde se encontram os seus dados do Session. O nome da diretoria deverá começar por 'Session Export'. Também poderá copiar os seus dados a partir da aplicação Chrome. ", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Começar a utilizar o Signal Desktop", + "message": "Começar a utilizar o Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Os números de segurança com vários membros do grupo mudaram desde a última vez que os verificou. Isto poderá querer dizer que alguém está a tentar intercetar as suas comunicações ou simplesmente que esses membros reinstalaram o Signal.", + "message": "Os números de segurança com vários membros do grupo mudaram desde a última vez que os verificou. Isto poderá querer dizer que alguém está a tentar intercetar as suas comunicações ou simplesmente que esses membros reinstalaram o Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "O seu número de segurança com $name$ mudou desde a última verificação. Isto poderá querer dizer que alguém está a tentar intercetar as suas comunicações ou simplesmente que $name$ reinstalou o Signal.", + "message": "O seu número de segurança com $name$ mudou desde a última verificação. Isto poderá querer dizer que alguém está a tentar intercetar as suas comunicações ou simplesmente que $name$ reinstalou o Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "O número de segurança que está a tentar verificar mudou. Por favor, reveja o seu novo número de segurança com $name$. Lembre-se, esta alteração poderá significar que alguém está a tentar intercetar as suas comunicações ou simplesmente que $name$ reinstalou o Signal.", + "message": "O número de segurança que está a tentar verificar mudou. Por favor, reveja o seu novo número de segurança com $name$. Lembre-se, esta alteração poderá significar que alguém está a tentar intercetar as suas comunicações ou simplesmente que $name$ reinstalou o Session.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Os números de segurança com vários membros do grupo mudaram recentemente. Isto pode significar que alguém está a tentar intercetar as suas comunicações ou simplesmente que os membros do grupo reinstalaram o Signal.", + "message": "Os números de segurança com vários membros do grupo mudaram recentemente. Isto pode significar que alguém está a tentar intercetar as suas comunicações ou simplesmente que os membros do grupo reinstalaram o Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "O número de segurança com $name$ mudou recentemente. Isto poderá querer dizer que alguém está a tentar intercetar as suas comunicações ou simplesmente que $name$ reinstalou o Signal.", + "message": "O número de segurança com $name$ mudou recentemente. Isto poderá querer dizer que alguém está a tentar intercetar as suas comunicações ou simplesmente que $name$ reinstalou o Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "O número de segurança com $name$ mudou. Isto poderá querer dizer que alguém está a tentar intercetar as suas comunicações ou simplesmente que $name$ reinstalou o Signal. Poderá querer verificar os seus números de segurança com o seu contacto.", + "message": "O número de segurança com $name$ mudou. Isto poderá querer dizer que alguém está a tentar intercetar as suas comunicações ou simplesmente que $name$ reinstalou o Session. Poderá querer verificar os seus números de segurança com o seu contacto.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Pré-visualização da hiperligação da miniatura do esboço $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Pré-visualização da hiperligação da miniatura $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Bem-vindo(a) ao Signal", + "message": "Bem-vindo(a) ao Session", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "Para enviar mensagens de áudio, permita que o Signal aceda ao seu microfone.", + "message": "Para enviar mensagens de áudio, permita que o Session aceda ao seu microfone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Associar um novo dispositivo", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissões", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Esta versão do Signal Desktop expirou. Para poder continuar a enviar mensagens, actualize para a última versão .", + "message": "Esta versão do Session Desktop expirou. Para poder continuar a enviar mensagens, actualize para a última versão .", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/ro/messages.json b/_locales/ro/messages.json index a7771f6a7..2acd34d8d 100644 --- a/_locales/ro/messages.json +++ b/_locales/ro/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Închide Signal", + "message": "Închide Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Tocmai ai trecut prin procesul de exportare și contactele și mesajele tale așteaptă răbdător în calculatorul tău. Alege directorul care conține datele tale Signal salvate.", + "message": "Tocmai ai trecut prin procesul de exportare și contactele și mesajele tale așteaptă răbdător în calculatorul tău. Alege directorul care conține datele tale Session salvate.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "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.", + "message": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session 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": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Începe să utlizezi Signal Desktop", + "message": "Începe să utlizezi Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Numerele tale de siguranță cu mai mulți membri din grup s-au modificat de la ultima verificare. Asta poate însemna că cineva încearcă să vă intercepteze comunicarea sau doar că ei au reinstalat Signal.", + "message": "Numerele tale de siguranță cu mai mulți membri din grup s-au modificat de la ultima verificare. Asta poate însemna că cineva încearcă să vă intercepteze comunicarea sau doar că ei au reinstalat Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Numărul tău de siguranță cu $name$ s-a modificat de când ai verificat ultima oară. Asta ar putea însemna că cineva încearcă să vă intercepteze comunicarea sau că $name$ a reinstalat Signal.", + "message": "Numărul tău de siguranță cu $name$ s-a modificat de când ai verificat ultima oară. Asta ar putea însemna că cineva încearcă să vă intercepteze comunicarea sau că $name$ a reinstalat Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Numărul de siguranță pe care il verifici s-a modificat. Te rog să revizuiești numărul de siguranță cu $name$. Reține, această schimbare poate însemna că cineva încearcă sa va intercepteze comunicarea sau că $name$ pur și simplu a reinstalat Signal.", + "message": "Numărul de siguranță pe care il verifici s-a modificat. Te rog să revizuiești numărul de siguranță cu $name$. Reține, această schimbare poate însemna că cineva încearcă sa va intercepteze comunicarea sau că $name$ pur și simplu a reinstalat Session.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Numerele tale de siguranță pentru mai mulți membrii din grup s-au schimbat recent. Asta poate însemna că cineva încearcă să intercepteze comunicarea, sau contactele și-au reinstalat Signal.", + "message": "Numerele tale de siguranță pentru mai mulți membrii din grup s-au schimbat recent. Asta poate însemna că cineva încearcă să intercepteze comunicarea, sau contactele și-au reinstalat Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Numărul tău de siguranță cu $name$ s-a modificat recent. Asta ar putea însemna că cineva încearcă să vă intercepteze comunicarea sau că $name$ a reinstalat Signal.", + "message": "Numărul tău de siguranță cu $name$ s-a modificat recent. Asta ar putea însemna că cineva încearcă să vă intercepteze comunicarea sau că $name$ a reinstalat Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Numărul tău de siguranță cu $name$ s-a modificat. Asta ar putea să însemne fie că cineva încearcă să intercepteze comunicarea voastră fie că $name$ pur și simplu a reinstalat Signal. Ar trebui să verifici numărul tău de siguranță cu acest contact.", + "message": "Numărul tău de siguranță cu $name$ s-a modificat. Asta ar putea să însemne fie că cineva încearcă să intercepteze comunicarea voastră fie că $name$ pur și simplu a reinstalat Session. Ar trebui să verifici numărul tău de siguranță cu acest contact.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Bun venit la Signal", + "message": "Bun venit la Session", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "Pentru a trimite mesaje audio, permite aplicației Signal Desktop accesul la microfonul tău.", + "message": "Pentru a trimite mesaje audio, permite aplicației Session Desktop accesul la microfonul tău.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Asociază dispozitiv nou", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permisiuni", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Această versiune de Signal Desktop a expirat. Te rog actualizează aplicația la ultima versiune pentru a putea trimite mesaje în continuare.", + "message": "Această versiune de Session Desktop a expirat. Te rog actualizează aplicația la ultima versiune pentru a putea trimite mesaje în continuare.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index a39d96884..2177a6624 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Выйти из Signal", + "message": "Выйти из Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Вы только что прошли процесс экспорта, и ваши контакты и сообщения терпеливо ждут вас на вашем компьютере. Выберите папку, содержащую сохраненные данные Signal.", + "message": "Вы только что прошли процесс экспорта, и ваши контакты и сообщения терпеливо ждут вас на вашем компьютере. Выберите папку, содержащую сохраненные данные Session.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Убедитесь, что выбран правильный каталог, содержащий сохраненные вами данные Signal. Его название должно начинаться с 'Signal Export'. Также вы можете сохранить новую копию своих данных из приложения Chrome.", + "message": "Убедитесь, что выбран правильный каталог, содержащий сохраненные вами данные Session. Его название должно начинаться с 'Session Export'. Также вы можете сохранить новую копию своих данных из приложения Chrome.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Начните использовать Signal Desktop", + "message": "Начните использовать Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,7 +264,7 @@ "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": "Коды безопасности с несколькими участниками группы изменились со времени последнего подтверждения. Это может означать, что кто-то пытается перехватить ваши сообщения, или попросту кто-то из участников группы переустановил Signal.", + "message": "Коды безопасности с несколькими участниками группы изменились со времени последнего подтверждения. Это может означать, что кто-то пытается перехватить ваши сообщения, или попросту кто-то из участников группы переустановил Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Код безопасности который вы пытаетесь подтвердить уже изменился. Пожалуйста, перепроверьте код безопасности с $name$. Помните, что подобные изменения могут означать попытку перехвата ваших сообщений, либо $name$ попросту переустановил Signal.", + "message": "Код безопасности который вы пытаетесь подтвердить уже изменился. Пожалуйста, перепроверьте код безопасности с $name$. Помните, что подобные изменения могут означать попытку перехвата ваших сообщений, либо $name$ попросту переустановил Session.", "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": { @@ -288,7 +288,7 @@ } }, "changedRecentlyMultiple": { - "message": "Коды безопасности с несколькими участниками группы изменились со времени последнего подтверждения. Это может означать, что кто-то пытается перехватить ваши сообщения, или попросту кто-то из участников переустановил Signal. ", + "message": "Коды безопасности с несколькими участниками группы изменились со времени последнего подтверждения. Это может означать, что кто-то пытается перехватить ваши сообщения, или попросту кто-то из участников переустановил Session. ", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Код безопасности с $name$ изменился. Это может означать, что кто-то пытается перехватить ваши сообщения, либо $name$ попросту переустановил Signal. Вы можете подтвердить свой код безопасности с данным контактом.", + "message": "Код безопасности с $name$ изменился. Это может означать, что кто-то пытается перехватить ваши сообщения, либо $name$ попросту переустановил Session. Вы можете подтвердить свой код безопасности с данным контактом.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Черновик миниатюры предварительного просмотра ссылки для $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Миниатюра предварительного просмотра ссылки для $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Привязать Новое Устройство", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Разрешения", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Эта версия Signal Desktop устарела. Выполните обновление до последней версии, чтобы продолжить обмен сообщениями.", + "message": "Эта версия Session Desktop устарела. Выполните обновление до последней версии, чтобы продолжить обмен сообщениями.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { @@ -1507,7 +1507,7 @@ }, "spellCheckDirty": { "message": "You must restart Session to apply your new settings", - "description": "Shown when the user changes their spellcheck setting to indicate that they must restart Signal." + "description": "Shown when the user changes their spellcheck setting to indicate that they must restart Session." }, "readReceiptSettingDescription": { "message": "Получать и отсылать уведомления о прочтении сообщений (для всех контактов).", diff --git a/_locales/sk/messages.json b/_locales/sk/messages.json index cb0b50357..72f9f0de1 100644 --- a/_locales/sk/messages.json +++ b/_locales/sk/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Ukončiť Signal", + "message": "Ukončiť Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Práve ste dokončili proces exportu. Vaše kontakty a správy trpezlivo čakajú na vašom počítači. Zvoľte priečinok ktorý obsahuje vaše uložené Signal dáta.", + "message": "Práve ste dokončili proces exportu. Vaše kontakty a správy trpezlivo čakajú na vašom počítači. Zvoľte priečinok ktorý obsahuje vaše uložené Session dáta.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Uistite sa, že ste zvolili správny priečinok, ktorý obsahuje Vaše Signal dáta. Meno priečinka by mal začínať \"Signal Export\". Prípadne môžete vytvoriť novú kópiu Vašich dát v Chrome aplikácii.", + "message": "Uistite sa, že ste zvolili správny priečinok, ktorý obsahuje Vaše Session dáta. Meno priečinka by mal začínať \"Session Export\". Prípadne môžete vytvoriť novú kópiu Vašich dát v Chrome aplikácii.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Začnite používať Signal Desktop", + "message": "Začnite používať Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Vaše bezpečnostné čísla sa s viacerými členmi skupiny od posledného overenia zmenili. Môže to znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len znovu nainštalovali Signal. ", + "message": "Vaše bezpečnostné čísla sa s viacerými členmi skupiny od posledného overenia zmenili. Môže to znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len znovu nainštalovali Session. ", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Vaše bezpečnostné číslo s $name$ sa od posledného overenia zmenilo. Môže to znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len $name$ znovu nainštaloval/a Signal.", + "message": "Vaše bezpečnostné číslo s $name$ sa od posledného overenia zmenilo. Môže to znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len $name$ znovu nainštaloval/a Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Bezpečnostné číslo ktoré sa chystáte overiť sa zmenilo. Prosím, skontrolujte vaše nové bezpečnostné číslo s $name$. Táto zmena môže znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len $name$ znovu nainštaloval/a Signal.", + "message": "Bezpečnostné číslo ktoré sa chystáte overiť sa zmenilo. Prosím, skontrolujte vaše nové bezpečnostné číslo s $name$. Táto zmena môže znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len $name$ znovu nainštaloval/a Session.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Vaše bezpečnostné čísla sa s viacerými členmi skupiny nedávno zmenili. Môže to znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len znovu nainštalovali Signal.", + "message": "Vaše bezpečnostné čísla sa s viacerými členmi skupiny nedávno zmenili. Môže to znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len znovu nainštalovali Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Vaše bezpečnostné číslo s $name$ sa nedávno zmenilo. Môže to znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len $name$ znovu nainštaloval/a Signal. ", + "message": "Vaše bezpečnostné číslo s $name$ sa nedávno zmenilo. Môže to znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len $name$ znovu nainštaloval/a Session. ", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Vaše bezpečnostné číslo s $name$ sa od posledného overenia zmenilo. Môže to znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len $name$ znovu nainštaloval/a Signal. Odporúčame opätovné overenie bezpečnostného čísla s týmto kontaktom.", + "message": "Vaše bezpečnostné číslo s $name$ sa od posledného overenia zmenilo. Môže to znamenať, že sa niekto snaží odpočúvať vašu komunikáciu, alebo si len $name$ znovu nainštaloval/a Session. Odporúčame opätovné overenie bezpečnostného čísla s týmto kontaktom.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Vitajte v aplikácii Signal", + "message": "Vitajte v aplikácii Session", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "Pre posielanie zvukových správ, povoľte aplikácii Signal Desktop prístup k mikrofónu.", + "message": "Pre posielanie zvukových správ, povoľte aplikácii Session Desktop prístup k mikrofónu.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Pripojiť Nové Zariadenie", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Povolenia", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Táto verzia aplikácie Signal Desktop je zastaralá. Pre pokračovanie ju prosím aktualizujte na najnovšiu verziu.", + "message": "Táto verzia aplikácie Session Desktop je zastaralá. Pre pokračovanie ju prosím aktualizujte na najnovšiu verziu.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/sl/messages.json b/_locales/sl/messages.json index aa5f29241..3bdd63fc4 100644 --- a/_locales/sl/messages.json +++ b/_locales/sl/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Zapusti Signal", + "message": "Zapusti Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Preverite, če ste izbrali pravo mapo s shranjenimi podatki. Ime mape bi moralo biti \"Signal Export\". Lahko tudi ponovno izvozite podatke iz aplikacije v brskalniku Chrome.", + "message": "Preverite, če ste izbrali pravo mapo s shranjenimi podatki. Ime mape bi moralo biti \"Session Export\". Lahko tudi ponovno izvozite podatke iz aplikacije v brskalniku Chrome.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Začni z uporabo aplikacije Signal Desktop", + "message": "Začni z uporabo aplikacije Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Varnostna števila z večimi člani skupine so bila nedavno spremenjena. To lahko pomeni, da skuša nekdo prestrezati vašo komunikacijo ali pa, da so te osebe zgolj ponovno namestile aplikacijo Signal.", + "message": "Varnostna števila z večimi člani skupine so bila nedavno spremenjena. To lahko pomeni, da skuša nekdo prestrezati vašo komunikacijo ali pa, da so te osebe zgolj ponovno namestile aplikacijo Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Vaše varnostno število z uporabnikom $name$ je bilo od zadnjega preverjanja spremenjeno. To lahko pomeni, da skuša nekdo prestrezati vajino komunikacijo ali pa, da je uporabnik $name$ zgolj ponovno namestil aplikacijo Signal.", + "message": "Vaše varnostno število z uporabnikom $name$ je bilo od zadnjega preverjanja spremenjeno. To lahko pomeni, da skuša nekdo prestrezati vajino komunikacijo ali pa, da je uporabnik $name$ zgolj ponovno namestil aplikacijo Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Varnostno število, ki ga potrjujete, je bilo spremenjeno. Prosimo, še enkrat preverite svoje novo varnostno število z uporabnikom $name$. Pozor, ta sprememba lahko pomeni, da skuša nekdo prestrezati vajino komunikacijo ali pa, da je uporabnik $name$ zgolj ponovno namestil aplikacijo Signal.", + "message": "Varnostno število, ki ga potrjujete, je bilo spremenjeno. Prosimo, še enkrat preverite svoje novo varnostno število z uporabnikom $name$. Pozor, ta sprememba lahko pomeni, da skuša nekdo prestrezati vajino komunikacijo ali pa, da je uporabnik $name$ zgolj ponovno namestil aplikacijo Session.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Varnostna števila z večimi člani skupine so bila nedavno spremenjena. To lahko pomeni, da skuša nekdo prestrezati vašo komunikacijo ali pa, da so te osebe zgolj ponovno namestile aplikacijo Signal.", + "message": "Varnostna števila z večimi člani skupine so bila nedavno spremenjena. To lahko pomeni, da skuša nekdo prestrezati vašo komunikacijo ali pa, da so te osebe zgolj ponovno namestile aplikacijo Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Vaše varnostno število z uporabnikom $name$ je bilo nedavno spremenjeno. To lahko pomeni, da skuša nekdo prestrezati vajino komunikacijo ali pa je uporabnik $name$ zgolj ponovno namestil aplikacijo Signal.", + "message": "Vaše varnostno število z uporabnikom $name$ je bilo nedavno spremenjeno. To lahko pomeni, da skuša nekdo prestrezati vajino komunikacijo ali pa je uporabnik $name$ zgolj ponovno namestil aplikacijo Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Vaše varnostno število z uporabnikom $name$ je bilo spremenjeno. To lahko pomeni, da skuša nekdo prestrezati vajino komunikacijo ali pa, da je uporabnik $name$ zgolj ponovno namestil aplikacijo Signal. Morebiti bi želeli preveriti svoje varnostno število z njim.", + "message": "Vaše varnostno število z uporabnikom $name$ je bilo spremenjeno. To lahko pomeni, da skuša nekdo prestrezati vajino komunikacijo ali pa, da je uporabnik $name$ zgolj ponovno namestil aplikacijo Session. Morebiti bi želeli preveriti svoje varnostno število z njim.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Osnutek predogledne sličice povezave na: $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Predogledna sličica povezave na: $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Dobrodošli v aplikaciji Signal", + "message": "Dobrodošli v aplikaciji Session", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "Za pošiljanje glasovnih sporočil potrebuje aplikacija Signal Desktop dostop do vašega mikrofona.", + "message": "Za pošiljanje glasovnih sporočil potrebuje aplikacija Session Desktop dostop do vašega mikrofona.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Poveži novo napravo", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Dovoljenja", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Pričujoča različica programa Signal Desktop je potekla. Za ponovno delovanje morate program posodobiti na zadnjo različico.", + "message": "Pričujoča različica programa Session Desktop je potekla. Za ponovno delovanje morate program posodobiti na zadnjo različico.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/sq/messages.json b/_locales/sq/messages.json index 518927a42..a2b32f9df 100644 --- a/_locales/sq/messages.json +++ b/_locales/sq/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Mbylle Signal-in", + "message": "Mbylle Session-in", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Sapo kaluat nëpër procesin e eksportimit, dhe kontaktet dhe mesazhet tuaj po presin me qetësi në kompjuterin tuaj. Përzgjidhni dosjen që përmban të dhëna tuajat Signal të ruajtura.", + "message": "Sapo kaluat nëpër procesin e eksportimit, dhe kontaktet dhe mesazhet tuaj po presin me qetësi në kompjuterin tuaj. Përzgjidhni dosjen që përmban të dhëna tuajat Session të ruajtura.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Sigurohuni se keni zgjedhur drejtorinë e duhur që përmban të dhënat tuaja Signal të ruajtura. Emri i saj duhet të fillojë me 'Signal Export.' Mundeni edhe të ruani një kopje të re të të dhënave tuaja që nga Aplikacioni Chrome.", + "message": "Sigurohuni se keni zgjedhur drejtorinë e duhur që përmban të dhënat tuaja Session të ruajtura. Emri i saj duhet të fillojë me 'Session Export.' Mundeni edhe të ruani një kopje të re të të dhënave tuaja që nga Aplikacioni Chrome.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Filloni të përdorni Signal-in për Desktop", + "message": "Filloni të përdorni Session-in për Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Numrat tuaj të sigurisë me një numër anëtarësh të grupit kanë ndryshuar që nga hera e fundit që i verifikuat. Kjo mund të ishte shenjë se dikush po rreket të përgjojë komunikimin tuaj ose se ata thjesht kanë riinstaluar Signal-in.", + "message": "Numrat tuaj të sigurisë me një numër anëtarësh të grupit kanë ndryshuar që nga hera e fundit që i verifikuat. Kjo mund të ishte shenjë se dikush po rreket të përgjojë komunikimin tuaj ose se ata thjesht kanë riinstaluar Session-in.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Numri juaj i sigurisë me $name$ ka ndryshuar që nga hera e fundit që e verifikuat. Kjo mund të ishte shenjë se dikush po rreket të përgjojë komunikimin tuaj ose se $name$ thjesht ka riinstaluar Signal-in.", + "message": "Numri juaj i sigurisë me $name$ ka ndryshuar që nga hera e fundit që e verifikuat. Kjo mund të ishte shenjë se dikush po rreket të përgjojë komunikimin tuaj ose se $name$ thjesht ka riinstaluar Session-in.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Numri i sigurisë që po provoni të verifikoni ka ndryshuar. Ju lutemi, shqyrtoni numrin tuaj të ri të sigurisë me $name$. Mos harroni, ky ndryshim mund të ishte shenjë se dikush po rreket të përgjojë komunikimin tuaj ose se $name$ thjesht ka riinstaluar Signal-in.", + "message": "Numri i sigurisë që po provoni të verifikoni ka ndryshuar. Ju lutemi, shqyrtoni numrin tuaj të ri të sigurisë me $name$. Mos harroni, ky ndryshim mund të ishte shenjë se dikush po rreket të përgjojë komunikimin tuaj ose se $name$ thjesht ka riinstaluar Session-in.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Numrat tuaj të sigurisë me shumë anëtarë të grupit kanë ndryshuar tani së fundi. Kjo mund të ishte shenjë se dikush po rreket të përgjojë komunikimin tuaj ose se thjesht ata kanë riinstaluar Signal-in.", + "message": "Numrat tuaj të sigurisë me shumë anëtarë të grupit kanë ndryshuar tani së fundi. Kjo mund të ishte shenjë se dikush po rreket të përgjojë komunikimin tuaj ose se thjesht ata kanë riinstaluar Session-in.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Numri juaj i sigurisë me $name$ ka ndryshuar tani së fundi. Kjo mund të jetë shenjë se dikush po rreket të përgjojë komunikimin tuaj ose se $name$ thjesht ka riinstaluar Signal-in.", + "message": "Numri juaj i sigurisë me $name$ ka ndryshuar tani së fundi. Kjo mund të jetë shenjë se dikush po rreket të përgjojë komunikimin tuaj ose se $name$ thjesht ka riinstaluar Session-in.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Numri juaj i sigurisë për me $name$ ka ndryshuar. Kjo mund të ishte shenjë se dikush po rreket të përgjojë komunikimin tuaj ose se $name$ thjesht ka riinstaluar Signal-in. Mund të donit të verifikonit numrin tuaj të sigurisë me këtë kontakt.", + "message": "Numri juaj i sigurisë për me $name$ ka ndryshuar. Kjo mund të ishte shenjë se dikush po rreket të përgjojë komunikimin tuaj ose se $name$ thjesht ka riinstaluar Session-in. Mund të donit të verifikonit numrin tuaj të sigurisë me këtë kontakt.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Paraparje lidhjeje miniature skice për $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Paraparje lidhjeje miniature për $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Mirë se vini te Signal-i", + "message": "Mirë se vini te Session-i", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "Për të dërguar mesazhe audio, lejojeni Signal-in për Desktop të përdorë mikrofonin tuaj.", + "message": "Për të dërguar mesazhe audio, lejojeni Session-in për Desktop të përdorë mikrofonin tuaj.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Lidhini Pajisje të Re", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Leje", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Ky version i Signal-it për Desktop ka skaduar. Ju lutemi, që të vazhdoni të shkëmbeni mesazhe, përmirësojeni me versionin më të ri.", + "message": "Ky version i Session-it për Desktop ka skaduar. Ju lutemi, që të vazhdoni të shkëmbeni mesazhe, përmirësojeni me versionin më të ri.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/sr/messages.json b/_locales/sr/messages.json index b66f1723c..3a627d302 100644 --- a/_locales/sr/messages.json +++ b/_locales/sr/messages.json @@ -154,7 +154,7 @@ "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.", + "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 Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "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.", + "message": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session 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": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start using Signal Desktop", + "message": "Start using Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Ваше шифре преписки за више чланова ове групе су промењене од како сте последњи пут проверавали. Ово значи или да неко пресреће вашу преписку, или су једноставно извршили поновну инсталацију Signal-а.", + "message": "Ваше шифре преписки за више чланова ове групе су промењене од како сте последњи пут проверавали. Ово значи или да неко пресреће вашу преписку, или су једноставно извршили поновну инсталацију Session-а.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Шифра преписке са $name$ је промењена од како сте последњи пут проверавли. Ово значи или да неко пресреће вашу преписку, или је $name$ једноставно извршио поновну инсталацију Signal-а. ", + "message": "Шифра преписке са $name$ је промењена од како сте последњи пут проверавли. Ово значи или да неко пресреће вашу преписку, или је $name$ једноставно извршио поновну инсталацију Session-а. ", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Шифра преписке коју покушавате да проверите је промењена. Молимо да проверите вашу нову шифру преписке са $name$. Имајте у виду да ово може значити да неко покушава да пресретне вашу преписку или то да је $name$ једноставно извршио поновну инсталацију Signal-а.", + "message": "Шифра преписке коју покушавате да проверите је промењена. Молимо да проверите вашу нову шифру преписке са $name$. Имајте у виду да ово може значити да неко покушава да пресретне вашу преписку или то да је $name$ једноставно извршио поновну инсталацију Session-а.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Ваше шифре преписки за више чланова ове групе су недавно промењене. Ово значи или да неко покушава да пресретне вашу преписку, или су једноставно извршили поновну инсталацију Signal-а.", + "message": "Ваше шифре преписки за више чланова ове групе су недавно промењене. Ово значи или да неко покушава да пресретне вашу преписку, или су једноставно извршили поновну инсталацију Session-а.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Шифра преписке са $name$ је промењена. Ово значи или да неко пресреће вашу преписку, или је $name$ једноставно извршио поновну инсталацију Signal-а. ", + "message": "Шифра преписке са $name$ је промењена. Ово значи или да неко пресреће вашу преписку, или је $name$ једноставно извршио поновну инсталацију Session-а. ", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Шифра преписке са $name$ је промењена. Ово значи или да неко пресреће вашу преписку, или је $name$ једноставно извршио поновну инсталацију Signal-а. Можда би требало да пoтврдите шифру преписке са овим контактом.", + "message": "Шифра преписке са $name$ је промењена. Ово значи или да неко пресреће вашу преписку, или је $name$ једноставно извршио поновну инсталацију Session-а. Можда би требало да пoтврдите шифру преписке са овим контактом.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Добродошли у Signal", + "message": "Добродошли у Session", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "To send audio messages, allow Signal Desktop to access your microphone.", + "message": "To send audio messages, allow Session Desktop to access your microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Link New Device", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissions", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Ваша верзија Signal-а за десктоп је застарела. Да би сте наставили дописивање, молимо вас да ажурирате програм.", + "message": "Ваша верзија Session-а за десктоп је застарела. Да би сте наставили дописивање, молимо вас да ажурирате програм.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/sv/messages.json b/_locales/sv/messages.json index 1b2a93295..cd6d21e01 100644 --- a/_locales/sv/messages.json +++ b/_locales/sv/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Stäng Signal", + "message": "Stäng Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Du har just gått igenom exporteringsprocessen och dina kontakter och meddelanden ligger nu på din dator. Vänligen välj mappen som innehåller din sparade data för Signal.", + "message": "Du har just gått igenom exporteringsprocessen och dina kontakter och meddelanden ligger nu på din dator. Vänligen välj mappen som innehåller din sparade data för Session.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Kontrollera att du valt rätt mapp som innehåller dina sparade Signal-data. Dess namn borde börja med 'Signal Export.' Du kan också spara en ny kopia av din data från Chrome-appen.", + "message": "Kontrollera att du valt rätt mapp som innehåller dina sparade Session-data. Dess namn borde börja med 'Session Export.' Du kan också spara en ny kopia av din data från Chrome-appen.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Börja använd Signal Desktop", + "message": "Börja använd Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Dina säkerhetsnummer med flera gruppmedlemmar har ändrats sen du sist verifierade dem. Detta kan betyda att någon försöker lyssna av din kommunikation eller att de bara installerat om Signal.", + "message": "Dina säkerhetsnummer med flera gruppmedlemmar har ändrats sen du sist verifierade dem. Detta kan betyda att någon försöker lyssna av din kommunikation eller att de bara installerat om Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Ditt säkerhetsnummer med $name$ har ändrats sen du senast verifierade. Detta kan betyda att någon försöker avlyssna din konversation eller att $name$ har ominstallerat Signal.", + "message": "Ditt säkerhetsnummer med $name$ har ändrats sen du senast verifierade. Detta kan betyda att någon försöker avlyssna din konversation eller att $name$ har ominstallerat Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Säkerhetsnyckeln som du försöker verifiera har ändrats. Dubbelkolla ditt nya säkerhetsnummer med $name$. Kom ihåg, detta kan betyda att någon försöker komma åt din konversation eller att $name$ har ominstallerat Signal.", + "message": "Säkerhetsnyckeln som du försöker verifiera har ändrats. Dubbelkolla ditt nya säkerhetsnummer med $name$. Kom ihåg, detta kan betyda att någon försöker komma åt din konversation eller att $name$ har ominstallerat Session.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Dina säkerhetsnummer med flera gruppmedlemmar har nyligen ändrats. Det kan innebära att någon försöker lyssna av din kommunikation eller att de bara installerat om Signal.", + "message": "Dina säkerhetsnummer med flera gruppmedlemmar har nyligen ändrats. Det kan innebära att någon försöker lyssna av din kommunikation eller att de bara installerat om Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Ditt säkerhetsnummer med $name$ har nyligen ändrats. Detta kan betyda att någon försöker avlyssna konversationen eller att $name$ har ominstallerat Signal.", + "message": "Ditt säkerhetsnummer med $name$ har nyligen ändrats. Detta kan betyda att någon försöker avlyssna konversationen eller att $name$ har ominstallerat Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Ditt säkerhetsnummer med $name$ har ändrats. Detta kan antingen betyda att någon försöker avlyssna din konversation eller att $name$ har ominstallerat Signal. Du kanske vill verifiera det nya säkerhetsnumret med denna kontakt.", + "message": "Ditt säkerhetsnummer med $name$ har ändrats. Detta kan antingen betyda att någon försöker avlyssna din konversation eller att $name$ har ominstallerat Session. Du kanske vill verifiera det nya säkerhetsnumret med denna kontakt.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Utkast av länkförhandsvisning i miniatyrbild för $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Länkförhandsvisning i miniatyrbild för $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Välkommen till Signal", + "message": "Välkommen till Session", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "Om du vill skicka röstmeddelanden måste Signal Desktop ha tillgång till din mikrofon.", + "message": "Om du vill skicka röstmeddelanden måste Session Desktop ha tillgång till din mikrofon.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Länka ny enhet", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Behörigheter", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Den här versionen av Signal Desktop har utgått. Vänligen uppgradera till den senaste versionen för att fortsätta chatta.", + "message": "Den här versionen av Session Desktop har utgått. Vänligen uppgradera till den senaste versionen för att fortsätta chatta.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/th/messages.json b/_locales/th/messages.json index df75cf20b..19b88bc73 100644 --- a/_locales/th/messages.json +++ b/_locales/th/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "ออกจาก Signal", + "message": "ออกจาก Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "คุณพึ่งจะผ่านพ้นขั้นตอนการส่งออกและข้อมูลผู้ติดต่อและข้อความของคุณยังคงรออยู่ในเครื่องคอมพิวเตอร์ของคุณ เลือกโฟลเดอร์ที่จัดเก็บข้อมูล Signal ที่บันทึกไว้ของคุณ", + "message": "คุณพึ่งจะผ่านพ้นขั้นตอนการส่งออกและข้อมูลผู้ติดต่อและข้อความของคุณยังคงรออยู่ในเครื่องคอมพิวเตอร์ของคุณ เลือกโฟลเดอร์ที่จัดเก็บข้อมูล Session ที่บันทึกไว้ของคุณ", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "โปรดแน่ใจว่าคุณได้เลือกโฟลเดอร์ที่จัดเก็บข้อมูล Signal ที่บันทึกไว้ของคุณอย่างถูกต้อง โดยชื่อของโฟลเดอร์ควรจะเริ่มต้นด้วยคำว่า 'Signal Export' คุณยังสามารถทำการบันทึกข้อมูลของคุณใหม่ผ่านทางแอปใน Chrome", + "message": "โปรดแน่ใจว่าคุณได้เลือกโฟลเดอร์ที่จัดเก็บข้อมูล Session ที่บันทึกไว้ของคุณอย่างถูกต้อง โดยชื่อของโฟลเดอร์ควรจะเริ่มต้นด้วยคำว่า 'Session Export' คุณยังสามารถทำการบันทึกข้อมูลของคุณใหม่ผ่านทางแอปใน Chrome", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "เริ่มต้นใช้งาน Signal Desktop", + "message": "เริ่มต้นใช้งาน Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "มีการเปลี่ยนแปลงในรหัสความปลอดภัยของคุณกับสมาชิกในหลายกลุ่มนับตั้งแต่การยืนยันครั้งล่าสุดของคุณ นี่อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่พวกเขาเหล่านั้นได้ติดตั้งแอป Signal ใหม่", + "message": "มีการเปลี่ยนแปลงในรหัสความปลอดภัยของคุณกับสมาชิกในหลายกลุ่มนับตั้งแต่การยืนยันครั้งล่าสุดของคุณ นี่อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่พวกเขาเหล่านั้นได้ติดตั้งแอป Session ใหม่", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "มีการเปลี่ยนแปลงในรหัสความปลอดภัยของคุณกับ $name$ นับตั้งแต่การยืนยันครั้งล่าสุดของคุณ นี่อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่ $name$ ได้ติดตั้งแอป Signal ใหม่", + "message": "มีการเปลี่ยนแปลงในรหัสความปลอดภัยของคุณกับ $name$ นับตั้งแต่การยืนยันครั้งล่าสุดของคุณ นี่อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่ $name$ ได้ติดตั้งแอป Session ใหม่", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "มีการเปลี่ยนแปลงในรหัสความปลอดภัยที่คุณกำลังจะทำการยืนยัน โปรดตรวจสอบรหัสความปลอดภัยของคุณกับ $name$ โปรดจำไว้ว่า การเปลี่ยนแปลงนี้อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่ $name$ ได้ติดตั้งแอป Signal ใหม่", + "message": "มีการเปลี่ยนแปลงในรหัสความปลอดภัยที่คุณกำลังจะทำการยืนยัน โปรดตรวจสอบรหัสความปลอดภัยของคุณกับ $name$ โปรดจำไว้ว่า การเปลี่ยนแปลงนี้อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่ $name$ ได้ติดตั้งแอป Session ใหม่", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "มีการเปลี่ยนแปลงรหัสความปลอดภัยของคุณกับสมาชิกในหลายกลุ่มเมื่อเร็วๆ นี้ นี่อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่พวกเขาเหล่านั้นได้ติดตั้งแอป Signal ใหม่", + "message": "มีการเปลี่ยนแปลงรหัสความปลอดภัยของคุณกับสมาชิกในหลายกลุ่มเมื่อเร็วๆ นี้ นี่อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่พวกเขาเหล่านั้นได้ติดตั้งแอป Session ใหม่", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "มีการเปลี่ยนแปลงในรหัสความปลอดภัยของคุณกับ $name$ เมื่อเร็วๆ นี้ นี่อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่ $name$ ได้ติดตั้งแอป Signal ใหม่", + "message": "มีการเปลี่ยนแปลงในรหัสความปลอดภัยของคุณกับ $name$ เมื่อเร็วๆ นี้ นี่อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่ $name$ ได้ติดตั้งแอป Session ใหม่", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "มีการเปลี่ยนแปลงในรหัสความปลอดภัยของคุณกับ $name$ นี่อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่ $name$ ได้ติดตั้งแอป Signal ใหม่ คุณอาจจะต้องยืนยันรหัสความปลอดภัยกับผู้ติดต่อนี้", + "message": "มีการเปลี่ยนแปลงในรหัสความปลอดภัยของคุณกับ $name$ นี่อาจหมายความว่ามีใครพยายามดักการสื่อสารของคุณ หรือไม่ก็แค่ $name$ ได้ติดตั้งแอป Session ใหม่ คุณอาจจะต้องยืนยันรหัสความปลอดภัยกับผู้ติดต่อนี้", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "ยินดีต้อนรับสู่ Signal", + "message": "ยินดีต้อนรับสู่ Session", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "เพื่อจะส่งข้อความเสียง ต้องอนุญาตให้ Signal Desktop ใช้งานไมโครโฟนของคุณ", + "message": "เพื่อจะส่งข้อความเสียง ต้องอนุญาตให้ Session Desktop ใช้งานไมโครโฟนของคุณ", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "เชื่อมโยงอุปกรณ์ใหม่", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "สิทธิ์", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Signal Desktop เวอร์ชันนี้หมดอายุแล้ว โปรดอัพเกรดไปเป็นเวอร์ชันล่าสุดเพื่อดำเนินการส่งข้อความต่อ", + "message": "Session Desktop เวอร์ชันนี้หมดอายุแล้ว โปรดอัพเกรดไปเป็นเวอร์ชันล่าสุดเพื่อดำเนินการส่งข้อความต่อ", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/tr/messages.json b/_locales/tr/messages.json index 697313396..6d3b9d8bf 100644 --- a/_locales/tr/messages.json +++ b/_locales/tr/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Signal'den Çık", + "message": "Session'den Çık", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "Dışa aktarma işlemini tamamladınız ve kişileriniz ile iletileriniz sabırla bilgisayarınızda bekliyor. Kaydettiğiniz Signal verilerinizi içeren klasörü seçin.", + "message": "Dışa aktarma işlemini tamamladınız ve kişileriniz ile iletileriniz sabırla bilgisayarınızda bekliyor. Kaydettiğiniz Session verilerinizi içeren klasörü seçin.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "Kaydedilmiş Signal verilerinizi içeren doğru dizini seçtiğinizden emin olun. Dizinin ismi 'Signal Export' ile başlamalı. Verinizin yeni bir kopyasını Chrome Uygulamasından kaydededebilirsiniz.", + "message": "Kaydedilmiş Session verilerinizi içeren doğru dizini seçtiğinizden emin olun. Dizinin ismi 'Session Export' ile başlamalı. Verinizin yeni bir kopyasını Chrome Uygulamasından kaydededebilirsiniz.", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Signal Desktop'ı kullanmaya başlayın", + "message": "Session Desktop'ı kullanmaya başlayın", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Birden fazla grup üyesiyle olan güvenlik numaralarınız son doğrulamanızdan bu yana. Bu, birisinin iletişiminizi kesmeye çalıştığı ya da kişilerin Signal'i yeniden yüklemiş olduğu anlamına gelebilir.", + "message": "Birden fazla grup üyesiyle olan güvenlik numaralarınız son doğrulamanızdan bu yana. Bu, birisinin iletişiminizi kesmeye çalıştığı ya da kişilerin Session'i yeniden yüklemiş olduğu anlamına gelebilir.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "$name$ ile olan güvenlik numaranız son doğrulamanızdan bu yana değişti. Bu, birisinin iletişiminizi kesmeye çalıştığı ya da $name$ Signal'i yeniden yüklemiş olduğu anlamına gelebilir.", + "message": "$name$ ile olan güvenlik numaranız son doğrulamanızdan bu yana değişti. Bu, birisinin iletişiminizi kesmeye çalıştığı ya da $name$ Session'i yeniden yüklemiş olduğu anlamına gelebilir.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Doğrulamaya çalıştığınız güvenlik numarası değişti. Lütfen $name$ ile olan yeni güvenlik numaranızı gözden geçirin. Unutmayın, bu değişiklik birisinin iletişiminizi kesmeye çalıştığı ya da $name$ Signal'i yeniden yüklemiş olduğu anlamına gelebilir.", + "message": "Doğrulamaya çalıştığınız güvenlik numarası değişti. Lütfen $name$ ile olan yeni güvenlik numaranızı gözden geçirin. Unutmayın, bu değişiklik birisinin iletişiminizi kesmeye çalıştığı ya da $name$ Session'i yeniden yüklemiş olduğu anlamına gelebilir.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Birden fazla grup üyesiyle olan güvenlik numaralarınız yakın zamanda değişti. Bu, birisinin iletişiminizi kesmeye çalıştığı ya da kişilerin Signal'i yeniden yüklemiş olduğu anlamına gelebilir.", + "message": "Birden fazla grup üyesiyle olan güvenlik numaralarınız yakın zamanda değişti. Bu, birisinin iletişiminizi kesmeye çalıştığı ya da kişilerin Session'i yeniden yüklemiş olduğu anlamına gelebilir.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "$name$ ile olan güvenlik numaranız yakın zamanda değişti. Bu, birisinin iletişiminizi kesmeye çalıştığı ya da $name$ Signal'i yeniden yüklemiş olduğu anlamına gelebilir.", + "message": "$name$ ile olan güvenlik numaranız yakın zamanda değişti. Bu, birisinin iletişiminizi kesmeye çalıştığı ya da $name$ Session'i yeniden yüklemiş olduğu anlamına gelebilir.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "$name$ ile olan güvenlik numaranız değişti. Bu, birisinin iletişiminizi kesmeye çalıştığı ya da $name$ Signal'i yeniden yüklemiş olduğu anlamına gelebilir. Bu kişi ile güvenlik numaranızı doğrulamak isteyebilirsiniz.", + "message": "$name$ ile olan güvenlik numaranız değişti. Bu, birisinin iletişiminizi kesmeye çalıştığı ya da $name$ Session'i yeniden yüklemiş olduğu anlamına gelebilir. Bu kişi ile güvenlik numaranızı doğrulamak isteyebilirsiniz.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "$domain$ için bağlantı ön izlemesi küçük resim taslağı", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "$domain$ için bağlantı ön izlemesi küçük resmi", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Signal'e Hoşgeldin", + "message": "Session'e Hoşgeldin", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "Sesli iletiler göndermek için, Signal Desktop'ın mikrofonunuza erişimine izin verin.", + "message": "Sesli iletiler göndermek için, Session Desktop'ın mikrofonunuza erişimine izin verin.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Yeni Cihaz Bağla", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "İzinler", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Signal Desktop'ın bu sürümünün süresi doldu. İletişime devam etmek için lütfen en son sürüme geçin.", + "message": "Session Desktop'ın bu sürümünün süresi doldu. İletişime devam etmek için lütfen en son sürüme geçin.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/uk/messages.json b/_locales/uk/messages.json index abd0ea151..132aff657 100644 --- a/_locales/uk/messages.json +++ b/_locales/uk/messages.json @@ -154,7 +154,7 @@ "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.", + "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 Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "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.", + "message": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session 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": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start using Signal Desktop", + "message": "Start using Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "З того часу, як ви востаннє підтверджували коди безпеки, у декількох учасників групи вони змінилися. Це означає, що хтось намагався перехопити ваші повідомлення, або ваші співрозмовники просто перевстановили Signal.", + "message": "З того часу, як ви востаннє підтверджували коди безпеки, у декількох учасників групи вони змінилися. Це означає, що хтось намагався перехопити ваші повідомлення, або ваші співрозмовники просто перевстановили Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Віднедавна $name$ та ви використовуєте новий код безпеки. Це значить, що хтось намагався перехопити ваші повідомлення або $name$ тепер просто має перевстановлений Signal.", + "message": "Віднедавна $name$ та ви використовуєте новий код безпеки. Це значить, що хтось намагався перехопити ваші повідомлення або $name$ тепер просто має перевстановлений Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "Код безпеки, який ви намагаєтеся підтвердити, змінився. Перевірте новий код безпеки, який $name$ використовує для зв’язку з вами. Пам’ятайте: зміна коду означає, що хтось намагався перехопити ваші повідомлення або додаток чи програма Signal, яку використовує $name$, просто була перевстановлена.", + "message": "Код безпеки, який ви намагаєтеся підтвердити, змінився. Перевірте новий код безпеки, який $name$ використовує для зв’язку з вами. Пам’ятайте: зміна коду означає, що хтось намагався перехопити ваші повідомлення або додаток чи програма Session, яку використовує $name$, просто була перевстановлена.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Нещодавно змінилися ваші коди безпеки з декількома учасниками групи. Це означає, що хтось намагався перехопити ваші повідомлення, або ваші співрозмовники просто перевстановили Signal.", + "message": "Нещодавно змінилися ваші коди безпеки з декількома учасниками групи. Це означає, що хтось намагався перехопити ваші повідомлення, або ваші співрозмовники просто перевстановили Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Віднедавна $name$ та ви використовуєте новий код безпеки. Це значить, що хтось намагався перехопити ваші повідомлення або $name$ тепер просто має перевстановлений Signal.", + "message": "Віднедавна $name$ та ви використовуєте новий код безпеки. Це значить, що хтось намагався перехопити ваші повідомлення або $name$ тепер просто має перевстановлений Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Змінився код безпеки, який $name$ використовує для зв’язку з вами. Це означає, що хтось намався перехопити ваші повідомлення, або додаток чи програма Signal, яку використовує $name$, була перевстановлена. Можливо, ви забажаєте підтвердити новий код безпеки.", + "message": "Змінився код безпеки, який $name$ використовує для зв’язку з вами. Це означає, що хтось намався перехопити ваші повідомлення, або додаток чи програма Session, яку використовує $name$, була перевстановлена. Можливо, ви забажаєте підтвердити новий код безпеки.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Ласкаво просимо до Signal", + "message": "Ласкаво просимо до Session", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "To send audio messages, allow Signal Desktop to access your microphone.", + "message": "To send audio messages, allow Session Desktop to access your microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Під’єднати новий пристрій", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissions", diff --git a/_locales/vi/messages.json b/_locales/vi/messages.json index cbc17ee1d..5fdc8a190 100644 --- a/_locales/vi/messages.json +++ b/_locales/vi/messages.json @@ -154,7 +154,7 @@ "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.", + "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 Session data.", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "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.", + "message": "Make sure you have chosen the correct directory that contains your saved Session data. Its name should begin with 'Session 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": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "Start using Signal Desktop", + "message": "Start using Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "Your safety numbers with multiple group members have changed since you last verified. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Signal.", + "message": "Your safety numbers with multiple group members have changed since you last verified. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Your safety number with $name$ has changed since you last verified. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Signal.", + "message": "Your safety number with $name$ has changed since you last verified. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "The safety number you are trying to verify has changed. Please review your new safety number with $name$. Remember, this change could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Signal.", + "message": "The safety number you are trying to verify has changed. Please review your new safety number with $name$. Remember, this change could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session.", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "Your safety numbers with multiple group members have changed recently. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Signal.", + "message": "Your safety numbers with multiple group members have changed recently. This could mean that someone is trying to intercept your communication or that they have simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Your safety number with $name$ has changed recently. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Signal.", + "message": "Your safety number with $name$ has changed recently. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "Your safety number with $name$ has changed. This could either mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Signal. You may wish to verify your saftey number with this contact.", + "message": "Your safety number with $name$ has changed. This could either mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session. You may wish to verify your saftey number with this contact.", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "Draft thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "Thumbnail link preview for $domain$", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Chào mừng đến với Signal", + "message": "Chào mừng đến với Session", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "To send audio messages, allow Signal Desktop to access your microphone.", + "message": "To send audio messages, allow Session Desktop to access your microphone.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "Link New Device", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "Permissions", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Phiên bản này của Signal Desktop đã hết hạn. Vui lòng nâng cấp lên phiên bản mới nhất để tiếp tục nhắn tin.", + "message": "Phiên bản này của Session Desktop đã hết hạn. Vui lòng nâng cấp lên phiên bản mới nhất để tiếp tục nhắn tin.", "description": "Warning notification that this version of the app has expired" }, "upgrade": { diff --git a/_locales/zh_CN/messages.json b/_locales/zh_CN/messages.json index c09778737..916c500e0 100644 --- a/_locales/zh_CN/messages.json +++ b/_locales/zh_CN/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "退出 Signal", + "message": "退出 Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "您已完成了导出步骤,被导出的联系人和消息在等着您给它们一个新家。请选择包含您 Signal 数据的文件夹。", + "message": "您已完成了导出步骤,被导出的联系人和消息在等着您给它们一个新家。请选择包含您 Session 数据的文件夹。", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": "请确认您选对了包含已保存 Signal 数据 的文件夹,其名字一般以“Signal Export”开头。您还可以在 Chrome App 上保存一份新的数据。", + "message": "请确认您选对了包含已保存 Session 数据 的文件夹,其名字一般以“Session Export”开头。您还可以在 Chrome App 上保存一份新的数据。", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "开始使用 Signal Desktop", + "message": "开始使用 Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "自上次验证以来,您与多位群组成员的安全码已发生改变。这可能意味着有人试图截取您的对话,或者只是联系人重新安装了 Signal。", + "message": "自上次验证以来,您与多位群组成员的安全码已发生改变。这可能意味着有人试图截取您的对话,或者只是联系人重新安装了 Session。", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "您与$name$的安全码自上次确认后已改变。这可能意味着有人正在尝试拦截您的通讯,或者$name$只是重装了 Signal。", + "message": "您与$name$的安全码自上次确认后已改变。这可能意味着有人正在尝试拦截您的通讯,或者$name$只是重装了 Session。", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "您想验证的安全码已改变。请检查您与$name$的新安全码。切记,验证码改变意味着可能有人试图截取您的通讯,也可能只是$name$重新安装了 Signal。", + "message": "您想验证的安全码已改变。请检查您与$name$的新安全码。切记,验证码改变意味着可能有人试图截取您的通讯,也可能只是$name$重新安装了 Session。", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "您与多位群组成员的安全码已发生改变。这可能表示有人试图偷听您的对话,或者只是联系人他们重新安装了 Signal。", + "message": "您与多位群组成员的安全码已发生改变。这可能表示有人试图偷听您的对话,或者只是联系人他们重新安装了 Session。", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "您与$name$的安全码最近发生了变化。这可能意味着有人正在尝试拦截您的通讯,或者$name$只是重装了 Signal。", + "message": "您与$name$的安全码最近发生了变化。这可能意味着有人正在尝试拦截您的通讯,或者$name$只是重装了 Session。", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "您与$name$的安全码已改变。这表示可能有人试图偷听您的对话,也可能只是$name$重新安装了 Signal。您可能要重新验证与联系人的安全码。", + "message": "您与$name$的安全码已改变。这表示可能有人试图偷听您的对话,也可能只是$name$重新安装了 Session。您可能要重新验证与联系人的安全码。", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "待发送的$domain$链接预览", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "$domain$的链接预览缩略图", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "发送音频消息前,请先允许 Signal Desktop访问您的麦克风。", + "message": "发送音频消息前,请先允许 Session Desktop访问您的麦克风。", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "关联新设备", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "权限", diff --git a/_locales/zh_TW/messages.json b/_locales/zh_TW/messages.json index 20c5780f2..44656abfe 100644 --- a/_locales/zh_TW/messages.json +++ b/_locales/zh_TW/messages.json @@ -40,7 +40,7 @@ "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "關閉 Signal", + "message": "關閉 Session", "description": "Application menu command to close the application" }, "editMenuUndo": { @@ -154,7 +154,7 @@ "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { - "message": "您剛完成匯出流程,您的聯絡人與訊息正在電腦上耐心等待。選擇包含您儲存的 Signal 資料的資料夾。", + "message": "您剛完成匯出流程,您的聯絡人與訊息正在電腦上耐心等待。選擇包含您儲存的 Session 資料的資料夾。", "description": "Introduction to the process of importing messages and contacts from disk" }, "importChooserTitle": { @@ -170,7 +170,7 @@ "description": "Header of screen shown as data is import" }, "importErrorFirst": { - "message": " 確認您選取了存放 Signal 資料的正確目錄夾,它的名稱應是以 'Signal Export.' 為前綴。您也可以自 Chrome App 取得自己的資料複本。", + "message": " 確認您選取了存放 Session 資料的正確目錄夾,它的名稱應是以 'Session Export.' 為前綴。您也可以自 Chrome App 取得自己的資料複本。", "description": "Message shown if the import went wrong; first paragraph" }, "importErrorSecond": { @@ -186,7 +186,7 @@ "description": "Header shown on the screen at the end of a successful import process" }, "importCompleteStartButton": { - "message": "開始使用 Signal Desktop", + "message": "開始使用 Session Desktop", "description": "Button shown at end of successful import process, nothing left but a restart" }, "importCompleteLinkButton": { @@ -264,11 +264,11 @@ "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": "你與這個多個群組成員的安全碼產生變動。這有可能是有不明人士試圖攔截你的通訊,或是,只因為他們重新安裝 Signal。", + "message": "你與這個多個群組成員的安全碼產生變動。這有可能是有不明人士試圖攔截你的通訊,或是,只因為他們重新安裝 Session。", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "自上次驗證後,你與 $name$ 的安全碼已經產生變動。這有可能是有不明人士試圖攔截您的通訊,或是,只因為 $name$ 重新安裝 Signal。", + "message": "自上次驗證後,你與 $name$ 的安全碼已經產生變動。這有可能是有不明人士試圖攔截您的通訊,或是,只因為 $name$ 重新安裝 Session。", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -278,7 +278,7 @@ } }, "changedRightAfterVerify": { - "message": "你試著驗證的安全已經改變,請檢視你與 $name$ 的新安全碼。記得,這個變動可能是有不明人士試圖攔截你的通訊,或是,只因為 $name$ 重新安裝 Signal。", + "message": "你試著驗證的安全已經改變,請檢視你與 $name$ 的新安全碼。記得,這個變動可能是有不明人士試圖攔截你的通訊,或是,只因為 $name$ 重新安裝 Session。", "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": { @@ -288,11 +288,11 @@ } }, "changedRecentlyMultiple": { - "message": "你與多個群組成員的安全碼在最近已經有了變動。這有可能是有不明人士試圖攔截你的通訊,或是,只因為他們重新安裝 Signal。", + "message": "你與多個群組成員的安全碼在最近已經有了變動。這有可能是有不明人士試圖攔截你的通訊,或是,只因為他們重新安裝 Session。", "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "你與 $name$ 的安全碼在最近已經有了變動。這有可能是有不明人士試圖攔截你的通訊,或是,只因為$name$ 重新安裝 Signal。", + "message": "你與 $name$ 的安全碼在最近已經有了變動。這有可能是有不明人士試圖攔截你的通訊,或是,只因為$name$ 重新安裝 Session。", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -302,7 +302,7 @@ } }, "identityKeyErrorOnSend": { - "message": "你與這 $name$ 的安全碼產生變動。這有可能是有不明人士試圖攔截你的通訊,或是,只因為 $name$ 重新安裝 Signal。你也許希望驗證你與聯絡人的安全碼。", + "message": "你與這 $name$ 的安全碼產生變動。這有可能是有不明人士試圖攔截你的通訊,或是,只因為 $name$ 重新安裝 Session。你也許希望驗證你與聯絡人的安全碼。", "description": "Shown when user clicks on a failed recipient in the message detail view after an identity key change", "placeholders": { "name": { @@ -431,7 +431,7 @@ }, "stagedPreviewThumbnail": { "message": "$domain$ 的草稿縮圖連結預覽", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -441,7 +441,7 @@ }, "previewThumbnail": { "message": "$domain$ 的縮圖連結預覽", - "description": "Shown while Signal Desktop is fetching metadata for a url in composition area", + "description": "Shown while Session Desktop is fetching metadata for a url in composition area", "placeholders": { "path": { "content": "$1", @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "歡迎來到 Signal", + "message": "歡迎來到 Session", "description": "" }, "typingAlt": { @@ -783,7 +783,7 @@ }, "linkNewDevice": { "message": "連結新裝置", - "description": "The menu option shown in Signal iOS to add a new linked device" + "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { "message": "許可", @@ -854,7 +854,7 @@ "description": "Text that links to a support article on verifying safety numbers" }, "expiredWarning": { - "message": "Signal Desktop版的版本已經過期。請更新到最新版來傳送訊息。", + "message": "Session Desktop版的版本已經過期。請更新到最新版來傳送訊息。", "description": "Warning notification that this version of the app has expired" }, "upgrade": { From 63ac6fb0032c0b0206383e2af811fed90ee65c7e Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 1 Sep 2020 10:13:25 +1000 Subject: [PATCH 134/274] addd placeholder for dekstop fr missing translations --- _locales/fr/messages.json | 431 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 431 insertions(+) diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index 0f809c58d..449927476 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -1410,5 +1410,436 @@ }, "closedGroupMaxSize": { "message": "Un groupe privé ne peut pas avoir plus de 10 membres" + }, + "contextMenuNoSuggestions": { + "message": "No Suggestions", + "description": "Shown in the context menu for a misspelled word to indicate that there are no suggestions to replace the misspelled word" + }, + "done": { + "message": "Done", + "description": "Button when a specific action is to be done." + }, + "cannotUpdateDetail": { + "message": "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.", + "description": "Shown if a general error happened while trying to install update package" + }, + "close": { + "message": "Close" + }, + "devicePairingRequestReceivedNoListenerDescription": { + "message": "Device linking request received but you are not on the device linking screen. \nGo to Settings > Device > Link New Device." + }, + "deviceIsSecondaryNoPairing": { + "message": "This device is a secondary device and so cannot be linked." + }, + "pairingOngoing": { + "message": "A pairing request is already ongoing. Restart the app if it takes too long." + }, + "allowPairingWithDevice": { + "message": "Allow linking with this device?" + }, + "provideDeviceAlias": { + "message": "Please provide an alias for this linked device" + }, + "showPairingWordsTitle": { + "message": "Linking Secret Words" + }, + "confirmUnpairingTitle": { + "message": "Please confirm you want to unlink the following device:" + }, + "unpairDeviceWarning": { + "message": "Are you sure you want to unlink this device?", + "description": "Warning for device unlinking in settings view" + }, + "unpairDeviceWarningSub": { + "message": "Unlinking this device will delete all history, including all messages, sessions, and contacts from this device.", + "description": "Warning description for device unlinking in settings view" + }, + "deletePublicWarning": { + "message": "Are you sure? This will permanently remove this message for everyone in this open group." + }, + "deleteMultiplePublicWarning": { + "message": "Are you sure? This will permanently remove these messages for everyone in this open group." + }, + "deleteMultipleWarning": { + "message": "Are you sure? Clicking 'delete' will permanently remove these messages from this device only." + }, + "messageDeletionForbidden": { + "message": "You don’t have permission to delete others’ messages", + "description": "Toast message explaining that the user doens't have the rights to delete other people's messages." + }, + "sendMessageBlockedUser": { + "message": "You have blocked this contact" + }, + "deleteMessageForEveryone": { + "message": "Delete Message For Everyone", + "description": "Menu item for deleting messages, title case." + }, + "deleteMessagesForEveryone": { + "message": "Delete Messages For Everyone", + "description": "Menu item for deleting messages, title case." + }, + "deleteForEveryone": { + "message": "Delete For Everyone", + "description": "Menu item for deleting messages, title case." + }, + "deletePublicConversationConfirmation": { + "message": "Permanently delete the messages locally from this open group?", + "description": "Confirmation dialog text that asks the user if they really wish to delete the open group messages locally. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone." + }, + "sessionResetFailed": { + "message": "Secure session reset failed", + "description": "your secure session could not been transmitted to the other participant." + }, + "sessionResetOngoing": { + "message": "Secure session reset in progress", + "description": "your secure session is currently being reset, waiting for the reset acknowledgment." + }, + "linkPreviewsConfirmMessage": { + "message": "You will not have full metadata protection when sending or receiving link previews." + }, + "mediaPermissionsTitle": { + "message": "Microphone and Camera" + }, + "spellCheckTitle": { + "message": "Spell Check", + "description": "Description of the media permission description" + }, + "spellCheckDirty": { + "message": "You must restart Session to apply your new settings", + "description": "Shown when the user changes their spellcheck setting to indicate that they must restart Session." + }, + "readReceiptSettingDescription": { + "message": "See and share when messages have been read (enables read receipts in all sessions).", + "description": "Description of the read receipts setting" + }, + "typingIndicatorsSettingDescription": { + "message": "See and share when messages are being typed (applies to all sessions).", + "description": "Description of the typing indicators setting" + }, + "messageTTL": { + "message": "Message TTL", + "description": "Title of the Message TTL setting" + }, + "messageTTLSettingDescription": { + "message": "Time to live (how long the recipient will have to collect their messages)", + "description": "Description of the time to live setting" + }, + "zoomFactorSettingTitle": { + "message": "Zoom Factor", + "description": "Title of the Zoom Factor setting" + }, + "clockOutOfSync": { + "message": "Your clock is out of sync. Please update your clock and try again.", + "description": "Notifcation that user's clock is out of sync with Loki's servers." + }, + "messageBodyTooLong": { + "message": "Message body is too long.", + "description": "Shown if the user tries to send more than 64kb of text" + }, + "changeNickname": { + "message": "Change Nickname", + "description": "Conversation menu option to change user nickname" + }, + "clearNickname": { + "message": "Clear nickname", + "description": "Conversation menu option to clear user nickname" + }, + "themeToggleDescription": { + "message": "Choose the theme best suited to you" + }, + "hideMenuBarTitle": { + "message": "Hide Menu Bar", + "description": "Label text for menu bar visibility setting" + }, + "hideMenuBarDescription": { + "message": "Toggle system menu bar visibility", + "description": "Label text for menu bar visibility setting" + }, + "autoUpdateSettingTitle": { + "message": "Auto Update" + }, + "autoUpdateSettingDescription": { + "message": "Automatically check for updates on launch" + }, + "autoUpdateDownloadedMessage": { + "message": "The new update has been downloaded." + }, + "autoUpdateDownloadInstructions": { + "message": "Would you like to download the update?" + }, + "unblocked": { + "message": "Unblocked" + }, + "banUser": { + "message": "Ban User", + "description": "Ban user from open group by public key." + }, + "banUserConfirm": { + "message": "Are you sure you want to ban user?", + "description": "Message shown when confirming user ban." + }, + "userBanned": { + "message": "User banned successfully", + "description": "Toast on succesful user ban." + }, + "userBanFailed": { + "message": "Ban failed!", + "description": "Toast on unsuccesful user ban." + }, + "copyMessage": { + "message": "Copy message text", + "description": "Button action that the user can click to copy their public keys" + }, + "selectMessage": { + "message": "Select message", + "description": "Button action that the user can click to select the message" + }, + "editGroupName": { + "message": "Edit group name", + "description": "Button action that the user can click to edit a group name (closed)" + }, + "setAccountPasswordTitle": { + "message": "Set Account Password", + "description": "Prompt for user to set account password in settings view" + }, + "setAccountPasswordDescription": { + "message": "Require password to unlock Session’s screen. You can still receive message notifications while Screen Lock is enabled. Session’s notification settings allow you to customize information that is displayed", + "description": "Description for set account password setting view" + }, + "changeAccountPasswordTitle": { + "message": "Change Account Password", + "description": "Prompt for user to change account password in settings view" + }, + "changeAccountPasswordDescription": { + "message": "Change your password", + "description": "Description for change account password setting view" + }, + "removeAccountPasswordTitle": { + "message": "Remove Account Password", + "description": "Prompt for user to remove account password in settings view" + }, + "removeAccountPasswordDescription": { + "message": "Remove the password associated with your account", + "description": "Description for remove account password setting view" + }, + "enterPassword": { + "message": "Please enter your password" + }, + "confirmPassword": { + "message": "Confirm password" + }, + "pasteLongPasswordToastTitle": { + "message": "The clipboard content exceeds the maximum password length of $max_pwd_len$ characters.", + "description": "Shown when user pastes a password which is longer than MAX_PASSWORD_LEN" + }, + "showRecoveryPhrasePasswordRequest": { + "message": "Please enter your password", + "description": "Request for user to enter password to show recovery phrase." + }, + "passwordViewTitle": { + "message": "Type In Your Password", + "description": "The title shown when user needs to type in a password to unlock the messenger" + }, + "password": { + "message": "Password", + "description": "Placeholder for password input" + }, + "setPassword": { + "message": "Set Password", + "description": "Button action that the user can click to set a password" + }, + "changePassword": { + "message": "Change Password", + "description": "Button action that the user can click to change a password" + }, + "removePassword": { + "message": "Remove Password", + "description": "Button action that the user can click to remove a password" + }, + "maxPasswordAttempts": { + "message": "Invalid Password. Would you like to reset the database?" + }, + "typeInOldPassword": { + "message": "Please type in your old password" + }, + "invalidOldPassword": { + "message": "Old password is invalid" + }, + "invalidPassword": { + "message": "Invalid password" + }, + "noGivenPassword": { + "message": "Please enter your password" + }, + "passwordsDoNotMatch": { + "message": "Passwords do not match" + }, + "setPasswordInvalid": { + "message": "Passwords do not match" + }, + "changePasswordInvalid": { + "message": "The old password you entered is incorrect" + }, + "removePasswordInvalid": { + "message": "Incorrect password" + }, + "setPasswordTitle": { + "message": "Set Password" + }, + "changePasswordTitle": { + "message": "Changed Password" + }, + "removePasswordTitle": { + "message": "Removed Password" + }, + "setPasswordToastDescription": { + "message": "Your password has been set. Please keep it safe." + }, + "changePasswordToastDescription": { + "message": "Your password has been changed. Please keep it safe." + }, + "removePasswordToastDescription": { + "message": "You have removed your password." + }, + "publicChatExists": { + "message": "You are already connected to this open group" + }, + "connectToServerSuccess": { + "message": "Successfully connected to open group" + }, + "setPasswordFail": { + "message": "Failed to set password" + }, + "passwordLengthError": { + "message": "Password must be between 6 and 50 characters long", + "description": "Error string shown to the user when password doesn't meet length criteria" + }, + "passwordTypeError": { + "message": "Password must be a string", + "description": "Error string shown to the user when password is not a string" + }, + "passwordCharacterError": { + "message": "Password must only contain letters, numbers and symbols", + "description": "Error string shown to the user when password contains an invalid character" + }, + "change": { + "message": "Change" + }, + "set": { + "message": "Set" + }, + "invalidPubkeyFormat": { + "message": "Invalid Pubkey Format", + "description": "Error string shown when user types an invalid pubkey format" + }, + "lnsMappingNotFound": { + "message": "There is no LNS mapping associated with this name", + "description": "Shown in toast if user enters an unknown LNS name" + }, + "lnsLookupTimeout": { + "message": "LNS lookup timed out", + "description": "Shown in toast if user enters an unknown LNS name" + }, + "lnsTooFewNodes": { + "message": "Not enough nodes currently active for LNS lookup" + }, + "editProfileModalTitle": { + "message": "Profile", + "description": "Title for the Edit Profile modal" + }, + "addModerators": { + "message": "Add Moderators" + }, + "removeModerators": { + "message": "Remove Moderators" + }, + "groupInvitation": { + "message": "Group Invitation" + }, + "addingContacts": { + "message": "Adding contacts to" + }, + "noContactsToAdd": { + "message": "No contacts to add" + }, + "noMembersInThisGroup": { + "message": "No other members in this group" + }, + "noModeratorsToRemove": { + "message": "no moderators to remove" + }, + "createAccount": { + "message": "Create Account" + }, + "signIn": { + "message": "Sign In" + }, + "getStarted": { + "message": "Get started" + }, + "anonymous": { + "message": "Anonymous", + "description": "The name of currently unidentified users" + }, + "optionalPassword": { + "message": "Verify Password" + }, + "enterOptionalPassword": { + "message": "Enter password (optional)" + }, + "verifyPassword": { + "message": "Verify Password" + }, + "devicePairingHeaderReassure": { + "message": "Linking may take up to one minute to register on your primary device. Please be patient." + }, + "devicePairingHeader_Step1": { + "message": "Open Session on your other device." + }, + "devicePairingHeader_Step2": { + "message": "Navigate to the Devices section in your user account screen." + }, + "devicePairingHeader_Step3": { + "message": "Select Link New Device to prepare your other device for pairing." + }, + "devicePairingHeader_Step4": { + "message": "Enter your Session ID below to link this device to your Session ID." + }, + "linkDeviceToExistingAccount": { + "message": "Link Device to Existing Session ID" + }, + "or": { + "message": "or" + }, + "ByUsingThisService...": { + "message": "By using this service, you agree to our Terms of Service and Privacy Policy" + }, + "beginYourSession": { + "message": "Begin
your
Session." + }, + "welcomeToYourSession": { + "message": "Welcome to your Session" + }, + "message": { + "message": "Message" + }, + "addContact": { + "message": "Add Contact" + }, + "permissionSettingsTitle": { + "message": "Permissions" + }, + "members": { + "message": "$count$ members", + "placeholders": { + "count": { + "content": "$1", + "example": "26" + } + } + }, + "description": { + "message": "Description" } } \ No newline at end of file From 0e75510e5bca68fd1ef16c6db2edcc72943885e7 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 1 Sep 2020 11:14:59 +1000 Subject: [PATCH 135/274] remove ttl unused settings and all translated key --- _locales/en/messages.json | 8 ----- _locales/fr/messages.json | 8 ----- _locales/ru/messages.json | 8 ----- .../session/settings/SessionSettings.tsx | 31 +------------------ ts/session/utils/Number.ts | 29 ----------------- 5 files changed, 1 insertion(+), 83 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 193105278..f0b0a54fd 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1160,14 +1160,6 @@ "androidKey": "preferences__typing_indicators", "ignoreCase": true }, - "messageTTL": { - "message": "Message TTL", - "description": "Title of the Message TTL setting" - }, - "messageTTLSettingDescription": { - "message": "Time to live (how long the recipient will have to collect their messages)", - "description": "Description of the time to live setting" - }, "zoomFactorSettingTitle": { "message": "Zoom Factor", "description": "Title of the Zoom Factor setting" diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index 449927476..d77090bc0 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -1517,14 +1517,6 @@ "message": "See and share when messages are being typed (applies to all sessions).", "description": "Description of the typing indicators setting" }, - "messageTTL": { - "message": "Message TTL", - "description": "Title of the Message TTL setting" - }, - "messageTTLSettingDescription": { - "message": "Time to live (how long the recipient will have to collect their messages)", - "description": "Description of the time to live setting" - }, "zoomFactorSettingTitle": { "message": "Zoom Factor", "description": "Title of the Zoom Factor setting" diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index 2177a6624..1f9ba2393 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -1517,14 +1517,6 @@ "message": "Получать и отсылать уведомления когда вы и ваш собедник набирает сообщение (для всех контактов).", "description": "Description of the typing indicators setting" }, - "messageTTL": { - "message": "Message TTL", - "description": "Title of the Message TTL setting" - }, - "messageTTLSettingDescription": { - "message": "Time to live (how long the recipient will have to collect their messages)", - "description": "Description of the time to live setting" - }, "zoomFactorSettingTitle": { "message": "Масштабирование Приложения", "description": "Title of the Zoom Factor setting" diff --git a/ts/components/session/settings/SessionSettings.tsx b/ts/components/session/settings/SessionSettings.tsx index 8538bcfee..e6562a8db 100644 --- a/ts/components/session/settings/SessionSettings.tsx +++ b/ts/components/session/settings/SessionSettings.tsx @@ -10,7 +10,7 @@ import { import { BlockedNumberController, UserUtil } from '../../../util'; import { MultiDeviceProtocol } from '../../../session/protocols'; import { PubKey } from '../../../session/types'; -import { NumberUtils, ToastUtils } from '../../../session/utils'; +import { ToastUtils } from '../../../session/utils'; export enum SessionSettingCategory { Appearance = 'appearance', @@ -444,35 +444,6 @@ export class SettingsView extends React.Component { onClick: undefined, confirmationDialogParams: undefined, }, - { - id: 'message-ttl', - title: window.i18n('messageTTL'), - description: window.i18n('messageTTLSettingDescription'), - // TODO: Revert - // TTL set to 2 days for mobile push notification compabability - // temporary fix .t 13/07/2020 - // - // TODO: Hook up this TTL to message sending when re-enabling. - // This setting is not used in any libsession sending code - hidden: true, - type: SessionSettingType.Slider, - category: SessionSettingCategory.Privacy, - setFn: undefined, - comparisonValue: undefined, - onClick: undefined, - content: { - dotsEnabled: true, - step: 6, - min: 12, - max: 96, - defaultValue: NumberUtils.msAsUnit( - window.CONSTANTS.TTL_DEFAULT_REGULAR_MESSAGE, - 'hour' - ), - info: (value: number) => `${value} Hours`, - }, - confirmationDialogParams: undefined, - }, { id: 'zoom-factor-setting', title: window.i18n('zoomFactorSettingTitle'), diff --git a/ts/session/utils/Number.ts b/ts/session/utils/Number.ts index 0948dcd67..d62d37a95 100644 --- a/ts/session/utils/Number.ts +++ b/ts/session/utils/Number.ts @@ -1,33 +1,4 @@ -type TimeUnit = - | 'second' - | 'seconds' - | 'minute' - | 'minutes' - | 'hour' - | 'hours' - | 'day' - | 'days'; - export const MINUTES = 60 * 1000; // in ms // tslint:disable: binary-expression-operand-order export const HOURS = 60 * MINUTES; // in ms export const DAYS = 24 * HOURS; // in ms - -export const msAsUnit = (value: number, unit: TimeUnit) => { - // Converts milliseconds to your preferred unit - // Valid units: second(s), minute(s), hour(s), day(s) - const unitAsSingular = unit.replace(new RegExp('s?$'), ''); - - switch (unitAsSingular) { - case 'second': - return value / 1000; - case 'minute': - return value / 60 / 1000; - case 'hour': - return value / 60 / 60 / 1000; - case 'day': - return value / 24 / 60 / 60 / 1000; - default: - return value; - } -}; From d670a47d5cd770edd99396567eafbc4c1dc1172c Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 1 Sep 2020 15:30:15 +1000 Subject: [PATCH 136/274] remove duplicated key translation --- _locales/en/messages.json | 13 ------------- _locales/fr/messages.json | 2 +- _locales/ru/messages.json | 12 ------------ ts/components/session/RegistrationTabs.tsx | 6 +++--- 4 files changed, 4 insertions(+), 29 deletions(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index f0b0a54fd..3dfdd9c35 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -532,7 +532,6 @@ "androidKey": "BucketedThreadMedia_This_month", "ignoreCase": true, "sentenceCase": true - }, "voiceMessage": { "message": "Voice Message", @@ -1893,12 +1892,6 @@ "message": "Password must only contain letters, numbers and symbols", "description": "Error string shown to the user when password contains an invalid character" }, - "change": { - "message": "Change" - }, - "set": { - "message": "Set" - }, "remove": { "message": "Remove", "androidKey": "ClearProfileActivity_remove" @@ -2007,15 +2000,9 @@ "message": "Enter a display name", "androidKey": "activity_display_name_edit_text_hint" }, - "optionalPassword": { - "message": "Verify Password" - }, "enterOptionalPassword": { "message": "Enter password (optional)" }, - "verifyPassword": { - "message": "Verify Password" - }, "devicePairingHeaderReassure": { "message": "Linking may take up to one minute to register on your primary device. Please be patient." }, diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index d77090bc0..116d5380a 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -752,7 +752,7 @@ "description": "Used in alt tag of image attachment" }, "videoAttachmentAlt": { - "message": "Capture d.écran de la vidéo jointe au message", + "message": "Capture d'écran de la vidéo jointe au message", "description": "Used in alt tag of video attachment preview" }, "lightboxImageAlt": { diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index 1f9ba2393..64252ccd1 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -1715,12 +1715,6 @@ "message": "Password must only contain letters, numbers and symbols", "description": "Error string shown to the user when password contains an invalid character" }, - "change": { - "message": "Change" - }, - "set": { - "message": "Set" - }, "invalidPubkeyFormat": { "message": "Invalid Pubkey Format", "description": "Error string shown when user types an invalid pubkey format" @@ -1774,15 +1768,9 @@ "message": "Anonymous", "description": "The name of currently unidentified users" }, - "optionalPassword": { - "message": "Verify Password" - }, "enterOptionalPassword": { "message": "Введите пароль (если используется)" }, - "verifyPassword": { - "message": "Verify Password" - }, "devicePairingHeaderReassure": { "message": "Linking may take up to one minute to register on your primary device. Please be patient." }, diff --git a/ts/components/session/RegistrationTabs.tsx b/ts/components/session/RegistrationTabs.tsx index 91c9cd3ce..ec81b6605 100644 --- a/ts/components/session/RegistrationTabs.tsx +++ b/ts/components/session/RegistrationTabs.tsx @@ -494,7 +494,7 @@ export class RegistrationTabs extends React.Component<{}, State> { /> { {!!password && ( { this.onPasswordVerifyChanged(val); From 54f1fb8998f27e850043ecef8046b717ff8424a1 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 1 Sep 2020 15:41:57 +1000 Subject: [PATCH 137/274] make french translation complete --- _locales/fr/messages.json | 241 ++++++++++++++++++-------------------- 1 file changed, 115 insertions(+), 126 deletions(-) diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index 116d5380a..2792452cd 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -1412,187 +1412,187 @@ "message": "Un groupe privé ne peut pas avoir plus de 10 membres" }, "contextMenuNoSuggestions": { - "message": "No Suggestions", + "message": "Pas de suggestions", "description": "Shown in the context menu for a misspelled word to indicate that there are no suggestions to replace the misspelled word" }, "done": { - "message": "Done", + "message": "Terminer", "description": "Button when a specific action is to be done." }, "cannotUpdateDetail": { - "message": "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.", + "message": "La mise a jour a échouée, mais il y a une nouvelle version disponible. Merci de visiter https://getsession.org/ et d'installer la nouvelle version manuellement, puis de contacter le support ou créer un ticket au sujet de ce bug", "description": "Shown if a general error happened while trying to install update package" }, "close": { - "message": "Close" + "message": "Fermer" }, "devicePairingRequestReceivedNoListenerDescription": { - "message": "Device linking request received but you are not on the device linking screen. \nGo to Settings > Device > Link New Device." + "message": "Une demande de liaison a été reçu, mais vous n’êtes pas sur l’écran de liaison d'un appareil. \nAller dans Paramètres > Appareil > Relier un nouvel appareil." }, "deviceIsSecondaryNoPairing": { - "message": "This device is a secondary device and so cannot be linked." + "message": "Cet appareil est un appareil secondaire et ne peux donc pas être relier." }, "pairingOngoing": { - "message": "A pairing request is already ongoing. Restart the app if it takes too long." + "message": "Une demande de liaison est déjà en cours. Redémarrer l'application si cela prends trop longtemps." }, "allowPairingWithDevice": { - "message": "Allow linking with this device?" + "message": "Autoriser la liaison avec cet appareil ?" }, "provideDeviceAlias": { - "message": "Please provide an alias for this linked device" + "message": "Merci de donner un alias à cet appareil relié" }, "showPairingWordsTitle": { - "message": "Linking Secret Words" + "message": "Mots secret de liaison" }, "confirmUnpairingTitle": { - "message": "Please confirm you want to unlink the following device:" + "message": "Merci de confirmer que vous souhaitez déconnecter l'appareil suivant:" }, "unpairDeviceWarning": { - "message": "Are you sure you want to unlink this device?", + "message": "Êtes-vous sur de vouloir déconnecter cet appareil ?", "description": "Warning for device unlinking in settings view" }, "unpairDeviceWarningSub": { - "message": "Unlinking this device will delete all history, including all messages, sessions, and contacts from this device.", + "message": "Déconnecter cet appareil va supprimer tout l'historique, ce qui inclus tous les messages, sessions, et contacts de cet appareil.", "description": "Warning description for device unlinking in settings view" }, "deletePublicWarning": { - "message": "Are you sure? This will permanently remove this message for everyone in this open group." + "message": "Êtes-vous sûr? Cela va supprimer ce message pour tout le monde dans ce groupe public." }, "deleteMultiplePublicWarning": { - "message": "Are you sure? This will permanently remove these messages for everyone in this open group." + "message": "Êtes-vous sûr? Cela va supprimer ces messages pour tout le monde dans ce groupe public." }, "deleteMultipleWarning": { - "message": "Are you sure? Clicking 'delete' will permanently remove these messages from this device only." + "message": "Êtes-vous sûr? En cliquant sur 'Supprimer' cela va supprimer ces messages de cet appareil uniquement." }, "messageDeletionForbidden": { - "message": "You don’t have permission to delete others’ messages", + "message": "Vous n'avez pas l'autorisation de supprimer les messages d'autres utilisateurs.", "description": "Toast message explaining that the user doens't have the rights to delete other people's messages." }, "sendMessageBlockedUser": { - "message": "You have blocked this contact" + "message": "Vous avez bloqué ce contact" }, "deleteMessageForEveryone": { - "message": "Delete Message For Everyone", + "message": "Supprimer ce message pour tout le monde", "description": "Menu item for deleting messages, title case." }, "deleteMessagesForEveryone": { - "message": "Delete Messages For Everyone", + "message": "Supprimer ces messages pour tout le monde", "description": "Menu item for deleting messages, title case." }, "deleteForEveryone": { - "message": "Delete For Everyone", + "message": "Supprimer ce message", "description": "Menu item for deleting messages, title case." }, "deletePublicConversationConfirmation": { - "message": "Permanently delete the messages locally from this open group?", + "message": "Êtes-vous sur de vouloir supprimer les messages de ce groupe public de façon permanente ?", "description": "Confirmation dialog text that asks the user if they really wish to delete the open group messages locally. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone." }, "sessionResetFailed": { - "message": "Secure session reset failed", + "message": "La réinitialisation de la session sécurisée a échoué", "description": "your secure session could not been transmitted to the other participant." }, "sessionResetOngoing": { - "message": "Secure session reset in progress", + "message": "Réinitialisation de la session sécurisée en cours", "description": "your secure session is currently being reset, waiting for the reset acknowledgment." }, "linkPreviewsConfirmMessage": { - "message": "You will not have full metadata protection when sending or receiving link previews." + "message": "Vous n'aurez pas une protection complète des métadonnées en envoyant ou recevant des aperçu de liens." }, "mediaPermissionsTitle": { - "message": "Microphone and Camera" + "message": "Microphone et camera" }, "spellCheckTitle": { - "message": "Spell Check", + "message": "Vérification orthographique", "description": "Description of the media permission description" }, "spellCheckDirty": { - "message": "You must restart Session to apply your new settings", + "message": "Vous devez redémarrer Session pour appliquer ces changements.", "description": "Shown when the user changes their spellcheck setting to indicate that they must restart Session." }, "readReceiptSettingDescription": { - "message": "See and share when messages have been read (enables read receipts in all sessions).", + "message": "Voir et partager quand les messages ont étés lus (activer les accusés de lecture dans toutes les sessions).", "description": "Description of the read receipts setting" }, "typingIndicatorsSettingDescription": { - "message": "See and share when messages are being typed (applies to all sessions).", + "message": "Voir et partager quand les messages sont rédigés (s'applique à toutes les sessions)).", "description": "Description of the typing indicators setting" }, "zoomFactorSettingTitle": { - "message": "Zoom Factor", + "message": "Facteur de zoom", "description": "Title of the Zoom Factor setting" }, "clockOutOfSync": { - "message": "Your clock is out of sync. Please update your clock and try again.", + "message": "Votre horloge est désynchronisée. Merci de mettre à jour votre horloge et de réessayer.", "description": "Notifcation that user's clock is out of sync with Loki's servers." }, "messageBodyTooLong": { - "message": "Message body is too long.", + "message": "Corps de message trop long.", "description": "Shown if the user tries to send more than 64kb of text" }, "changeNickname": { - "message": "Change Nickname", + "message": "Changer le surnom", "description": "Conversation menu option to change user nickname" }, "clearNickname": { - "message": "Clear nickname", + "message": "Supprimer le surnom", "description": "Conversation menu option to clear user nickname" }, "themeToggleDescription": { - "message": "Choose the theme best suited to you" + "message": "Choisissez le thème qui vous convient le plus" }, "hideMenuBarTitle": { - "message": "Hide Menu Bar", + "message": "Cacher la bar de menu", "description": "Label text for menu bar visibility setting" }, "hideMenuBarDescription": { - "message": "Toggle system menu bar visibility", + "message": "Activer/Désactiver la barre de menu système", "description": "Label text for menu bar visibility setting" }, "autoUpdateSettingTitle": { - "message": "Auto Update" + "message": "Mise à jour automatique" }, "autoUpdateSettingDescription": { - "message": "Automatically check for updates on launch" + "message": "Vérifier si une mise à jour est disponible au lancement" }, "autoUpdateDownloadedMessage": { - "message": "The new update has been downloaded." + "message": "La mise à jour a été telechargé." }, "autoUpdateDownloadInstructions": { - "message": "Would you like to download the update?" + "message": "Voulez-vous télécharger la mise à jour ?" }, "unblocked": { - "message": "Unblocked" + "message": "Débloqué" }, "banUser": { - "message": "Ban User", + "message": "Bannir l'utilisateur", "description": "Ban user from open group by public key." }, "banUserConfirm": { - "message": "Are you sure you want to ban user?", + "message": "Êtes-vous sûr que vous voulez bannir cet utilisateur ?", "description": "Message shown when confirming user ban." }, "userBanned": { - "message": "User banned successfully", + "message": "Utilisateur banni", "description": "Toast on succesful user ban." }, "userBanFailed": { - "message": "Ban failed!", + "message": "Le bannissement a échoué", "description": "Toast on unsuccesful user ban." }, "copyMessage": { - "message": "Copy message text", + "message": "Copier le texte du message", "description": "Button action that the user can click to copy their public keys" }, "selectMessage": { - "message": "Select message", + "message": "Sélectionner le message", "description": "Button action that the user can click to select the message" }, "editGroupName": { - "message": "Edit group name", + "message": "Éditer le nom du groupe", "description": "Button action that the user can click to edit a group name (closed)" }, "setAccountPasswordTitle": { - "message": "Set Account Password", + "message": "Sécuriser par mot de passe", "description": "Prompt for user to set account password in settings view" }, "setAccountPasswordDescription": { @@ -1600,230 +1600,219 @@ "description": "Description for set account password setting view" }, "changeAccountPasswordTitle": { - "message": "Change Account Password", + "message": "Changement de Mot de Passe", "description": "Prompt for user to change account password in settings view" }, "changeAccountPasswordDescription": { - "message": "Change your password", + "message": "Changer le mot de passe", "description": "Description for change account password setting view" }, "removeAccountPasswordTitle": { - "message": "Remove Account Password", + "message": "Supprimer le mot de passe", "description": "Prompt for user to remove account password in settings view" }, "removeAccountPasswordDescription": { - "message": "Remove the password associated with your account", + "message": "Supprimer le mot de passe de ce compte", "description": "Description for remove account password setting view" }, "enterPassword": { - "message": "Please enter your password" + "message": "Merci d'entrer votre mot de passe" }, "confirmPassword": { - "message": "Confirm password" + "message": "Confirmer le mot de passe" }, "pasteLongPasswordToastTitle": { - "message": "The clipboard content exceeds the maximum password length of $max_pwd_len$ characters.", + "message": "Le contenu du presse-papier est plus long que la longueur maximum d'un mot de passe ($max_pwd_len$ caractères).", "description": "Shown when user pastes a password which is longer than MAX_PASSWORD_LEN" }, "showRecoveryPhrasePasswordRequest": { - "message": "Please enter your password", + "message": "Merci d'entrer votre mot de passe", "description": "Request for user to enter password to show recovery phrase." }, "passwordViewTitle": { - "message": "Type In Your Password", + "message": "Entrer votre mot de passe", "description": "The title shown when user needs to type in a password to unlock the messenger" }, "password": { - "message": "Password", + "message": "Mot de passe", "description": "Placeholder for password input" }, "setPassword": { - "message": "Set Password", + "message": "Ajouter un mot de passe", "description": "Button action that the user can click to set a password" }, "changePassword": { - "message": "Change Password", + "message": "Changer le mot de passe", "description": "Button action that the user can click to change a password" }, "removePassword": { - "message": "Remove Password", + "message": "Supprimer le mot de passe", "description": "Button action that the user can click to remove a password" }, "maxPasswordAttempts": { - "message": "Invalid Password. Would you like to reset the database?" + "message": "Mot de passe invalide. Voulez-vous effacer la base de données?" }, "typeInOldPassword": { - "message": "Please type in your old password" + "message": "Merci de taper votre ancien mot de passe" }, "invalidOldPassword": { - "message": "Old password is invalid" + "message": "Ancien mot de passe invalide" }, "invalidPassword": { - "message": "Invalid password" + "message": "Mot de passe invalide" }, "noGivenPassword": { - "message": "Please enter your password" + "message": "Merci de taper votre mot de passe" }, "passwordsDoNotMatch": { - "message": "Passwords do not match" + "message": "Les mots de passe ne correspondent pas." }, "setPasswordInvalid": { - "message": "Passwords do not match" + "message": "Les mots de passe ne correspondent pas." }, "changePasswordInvalid": { - "message": "The old password you entered is incorrect" + "message": "L'ancien mot de passe est incorrect" }, "removePasswordInvalid": { - "message": "Incorrect password" + "message": "Mot de passe incorrect" }, "setPasswordTitle": { - "message": "Set Password" + "message": "Ajouter un mot de passe" }, "changePasswordTitle": { - "message": "Changed Password" + "message": "Changer le mot de passe" }, "removePasswordTitle": { - "message": "Removed Password" + "message": "Supprimer le mot de passe" }, "setPasswordToastDescription": { - "message": "Your password has been set. Please keep it safe." + "message": "Votre mot de passe a été défini. Veuillez le garder en sécurité." }, "changePasswordToastDescription": { - "message": "Your password has been changed. Please keep it safe." + "message": "Votre mot de passe a été changé. Veuillez le garder en sécurité." }, "removePasswordToastDescription": { - "message": "You have removed your password." + "message": "Vous avez supprimé votre mot de passe." }, "publicChatExists": { - "message": "You are already connected to this open group" + "message": "Vous êtes déjà connecté à ce groupe public" }, "connectToServerSuccess": { - "message": "Successfully connected to open group" + "message": "Connexion réussie au groupe public" }, "setPasswordFail": { - "message": "Failed to set password" + "message": "Échec de la définition du mot de passe" }, "passwordLengthError": { - "message": "Password must be between 6 and 50 characters long", + "message": "Le mot de passe doit avoir une longueur comprise entre 6 et 50 caractères", "description": "Error string shown to the user when password doesn't meet length criteria" }, "passwordTypeError": { - "message": "Password must be a string", + "message": "Le mot de passe doit être une chaîne de caractère", "description": "Error string shown to the user when password is not a string" }, "passwordCharacterError": { - "message": "Password must only contain letters, numbers and symbols", + "message": "Le mot de passe ne peux contenir que des lettres, des chiffres et des symboles", "description": "Error string shown to the user when password contains an invalid character" }, - "change": { - "message": "Change" - }, - "set": { - "message": "Set" - }, "invalidPubkeyFormat": { - "message": "Invalid Pubkey Format", + "message": "Format de clé publique non valide", "description": "Error string shown when user types an invalid pubkey format" }, "lnsMappingNotFound": { - "message": "There is no LNS mapping associated with this name", + "message": "Aucun mappage LNS n'est associé à ce nom", "description": "Shown in toast if user enters an unknown LNS name" }, "lnsLookupTimeout": { - "message": "LNS lookup timed out", + "message": "La recherche LNS a expiré", "description": "Shown in toast if user enters an unknown LNS name" }, "lnsTooFewNodes": { - "message": "Not enough nodes currently active for LNS lookup" + "message": "Pas assez de nœuds actuellement actifs pour la recherche LNS" }, "editProfileModalTitle": { - "message": "Profile", + "message": "Profil", "description": "Title for the Edit Profile modal" }, "addModerators": { - "message": "Add Moderators" + "message": "Ajouter un modérateur" }, "removeModerators": { - "message": "Remove Moderators" + "message": "Supprimer un modérateur" }, "groupInvitation": { - "message": "Group Invitation" + "message": "Invitation de groupe" }, "addingContacts": { - "message": "Adding contacts to" + "message": "Ajout de contact à" }, "noContactsToAdd": { - "message": "No contacts to add" + "message": "Aucun contact à ajouter" }, "noMembersInThisGroup": { - "message": "No other members in this group" + "message": "Aucun autre membre dans ce groupe" }, "noModeratorsToRemove": { - "message": "no moderators to remove" + "message": "Aucun modérateur à supprimer" }, "createAccount": { - "message": "Create Account" + "message": "Créer un compte" }, "signIn": { - "message": "Sign In" + "message": "Connexion" }, "getStarted": { - "message": "Get started" + "message": "Commencer" }, "anonymous": { - "message": "Anonymous", + "message": "Anonyme", "description": "The name of currently unidentified users" }, - "optionalPassword": { - "message": "Verify Password" - }, "enterOptionalPassword": { - "message": "Enter password (optional)" - }, - "verifyPassword": { - "message": "Verify Password" + "message": "Entrer un mot de passe (optionel)" }, + "devicePairingHeaderReassure": { "message": "Linking may take up to one minute to register on your primary device. Please be patient." }, "devicePairingHeader_Step1": { - "message": "Open Session on your other device." + "message": "Lancer Session sur votre autre appareil." }, "devicePairingHeader_Step2": { - "message": "Navigate to the Devices section in your user account screen." + "message": "Aller dans la sectionAppareils dans vos paramètres de compte." }, "devicePairingHeader_Step3": { - "message": "Select Link New Device to prepare your other device for pairing." + "message": "Sélectionnez Relier un nouvel appareil pour préparer votre autre appareil pour être relier." }, "devicePairingHeader_Step4": { - "message": "Enter your Session ID below to link this device to your Session ID." + "message": "Taper votre Session ID ci-dessous pour relier votre appareil." }, "linkDeviceToExistingAccount": { - "message": "Link Device to Existing Session ID" + "message": "Relier un appareil à un compte existant" }, "or": { - "message": "or" + "message": "ou" }, "ByUsingThisService...": { - "message": "By using this service, you agree to our Terms of Service and Privacy Policy" + "message": "En utilisant ce service, vous approuvez nos Conditions d'utilisation et notre Politique de confidentialité" }, "beginYourSession": { - "message": "Begin
your
Session." + "message": "Commencez
votre
Session." }, "welcomeToYourSession": { - "message": "Welcome to your Session" + "message": "Bienvenue sur Session" }, "message": { "message": "Message" }, "addContact": { - "message": "Add Contact" + "message": "Ajouter un contact" }, "permissionSettingsTitle": { - "message": "Permissions" + "message": "Autorisations" }, "members": { - "message": "$count$ members", + "message": "$count$ membres", "placeholders": { "count": { "content": "$1", From e5e1cf4e78a16c9b144af9bb8508a56d97faf75f Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 2 Sep 2020 08:47:24 +1000 Subject: [PATCH 138/274] fix fr transltion --- _locales/fr/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index 2792452cd..5eb1756a6 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -1271,7 +1271,7 @@ "message": "Modifier le groupe" }, "updateGroupDialogTitle": { - "message": "Mise à jour $name$…" + "message": "Mise à jour de $name$…" }, "showRecoveryPhrase": { "message": "Phrase de récupération" From 0097e9fa2d14a18a7a14e29709c2a0a386baf0f9 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 2 Sep 2020 12:06:22 +1000 Subject: [PATCH 139/274] remove already removed file reference --- background.html | 1 - background_test.html | 1 - test/index.html | 1 - 3 files changed, 3 deletions(-) diff --git a/background.html b/background.html index aadb906e4..afc272271 100644 --- a/background.html +++ b/background.html @@ -359,7 +359,6 @@ - diff --git a/background_test.html b/background_test.html index 1192436c6..14eff215e 100644 --- a/background_test.html +++ b/background_test.html @@ -362,7 +362,6 @@ - diff --git a/test/index.html b/test/index.html index 8a18cce3e..5e8d622e5 100644 --- a/test/index.html +++ b/test/index.html @@ -370,7 +370,6 @@ - From dafe8a80ab752a729e5a95bee9ce4acd0bee66c8 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 2 Sep 2020 12:07:44 +1000 Subject: [PATCH 140/274] shortcut newReceiver when calling dataMessage exported functions --- js/background.js | 6 +++--- preload.js | 1 + ts/receiver/receiver.ts | 15 +-------------- ts/receiver/syncMessages.ts | 4 +--- 4 files changed, 6 insertions(+), 20 deletions(-) diff --git a/js/background.js b/js/background.js index d2f5b7e9b..9010d6f3d 100644 --- a/js/background.js +++ b/js/background.js @@ -1326,7 +1326,7 @@ messageReceiver = new textsecure.MessageReceiver(mySignalingKey, options); messageReceiver.addEventListener( 'message', - window.NewReceiver.handleMessageEvent + window.DataMessageReceiver.handleMessageEvent ); window.textsecure.messaging = new textsecure.MessageSender(); return; @@ -1337,11 +1337,11 @@ messageReceiver = new textsecure.MessageReceiver(mySignalingKey, options); messageReceiver.addEventListener( 'message', - window.NewReceiver.handleMessageEvent + window.DataMessageReceiver.handleMessageEvent ); messageReceiver.addEventListener( 'sent', - window.NewReceiver.handleMessageEvent + window.DataMessageReceiver.handleMessageEvent ); messageReceiver.addEventListener('empty', onEmpty); messageReceiver.addEventListener('reconnect', onReconnect); diff --git a/preload.js b/preload.js index ea0ea7a7b..c22b99888 100644 --- a/preload.js +++ b/preload.js @@ -420,6 +420,7 @@ window.addEventListener('contextmenu', e => { }); window.NewReceiver = require('./ts/receiver/receiver'); +window.DataMessageReceiver = require('./ts/receiver/dataMessage'); window.NewSnodeAPI = require('./ts/session/snode_api/serviceNodeAPI'); window.SnodePool = require('./ts/session/snode_api/snodePool'); diff --git a/ts/receiver/receiver.ts b/ts/receiver/receiver.ts index 5825e63c0..cfe4743d0 100644 --- a/ts/receiver/receiver.ts +++ b/ts/receiver/receiver.ts @@ -19,27 +19,14 @@ import _ from 'lodash'; export { processMessage, onDeliveryReceipt }; -import { - handleDataMessage, - handleMessageEvent, - updateProfile, -} from './dataMessage'; +import { handleMessageEvent, updateProfile } from './dataMessage'; import { getEnvelopeId } from './common'; import { StringUtils } from '../session/utils'; import { SignalService } from '../protobuf'; -import { BlockedNumberController } from '../util/blockedNumberController'; import { MultiDeviceProtocol } from '../session/protocols'; // TODO: check if some of these exports no longer needed -export { - handleEndSession, - handleMediumGroupUpdate, - downloadAttachment, - handleDataMessage, - updateProfile, - handleMessageEvent, -}; interface ReqOptions { conversationId: string; diff --git a/ts/receiver/syncMessages.ts b/ts/receiver/syncMessages.ts index 10983ebb8..4c180ee87 100644 --- a/ts/receiver/syncMessages.ts +++ b/ts/receiver/syncMessages.ts @@ -11,14 +11,12 @@ import { handleMessageEvent, isMessageEmpty, processDecrypted, + updateProfile, } from './dataMessage'; -import { updateProfile } from './receiver'; import { handleContacts } from './multidevice'; import { updateOrCreateGroupFromSync } from '../session/medium_group'; import { MultiDeviceProtocol } from '../session/protocols'; -import { DataMessage } from '../session/messages/outgoing'; import { BlockedNumberController } from '../util'; -import { StringUtils } from '../session/utils'; export async function handleSyncMessage( envelope: EnvelopePlus, From cb911d4db10d7b1807291d3f26a39b219eb7bc07 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 2 Sep 2020 12:08:31 +1000 Subject: [PATCH 141/274] fix members ui for light mode --- stylesheets/_modules.scss | 4 +++- stylesheets/_session.scss | 5 ++++- stylesheets/_theme_dark.scss | 4 ---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/stylesheets/_modules.scss b/stylesheets/_modules.scss index d23297cd8..600431ca6 100644 --- a/stylesheets/_modules.scss +++ b/stylesheets/_modules.scss @@ -1203,7 +1203,9 @@ } .module-message-detail__unix-timestamp { - color: $color-light-10; + @include themify($themes) { + color: subtle(themed('textColor')); + } } .module-message-detail__delete-button-container { diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index 2a186d566..56899a7a0 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -370,7 +370,10 @@ $session-element-border-green: 4px solid $session-color-green; font-size: $session-font-md; &-text { - @include session-color-subtle($session-color-white); + @include themify($themes) { + @include session-color-subtle(themed('textColor')); + } + font-family: $session-font-default; font-weight: 300; font-size: $session-font-xs; diff --git a/stylesheets/_theme_dark.scss b/stylesheets/_theme_dark.scss index 9d3406dfa..a50aa1923 100644 --- a/stylesheets/_theme_dark.scss +++ b/stylesheets/_theme_dark.scss @@ -604,10 +604,6 @@ // Module: Message Detail - .module-message-detail__unix-timestamp { - color: $color-dark-55; - } - .module-message-detail__delete-button { background-color: $session-color-danger; color: $color-white; From cd686269cb30931cae7469a7f1145917fa9e53bb Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 2 Sep 2020 12:09:23 +1000 Subject: [PATCH 142/274] use server created_at timestamp to order messages Also update the way we check for duplicated message to allow a 10s window with the same body rather than an exact match of timestamp. This is needed as the timestamp of the message pulled is now the one of the creation of the server, and not the same we have locally (sent at). --- js/modules/data.d.ts | 4 ++++ js/modules/data.js | 18 +++++++++++++++ js/modules/loki_app_dot_net_api.js | 36 +++++++++++++++--------------- ts/receiver/dataMessage.ts | 29 +++++++++++++++++++----- 4 files changed, 63 insertions(+), 24 deletions(-) diff --git a/js/modules/data.d.ts b/js/modules/data.d.ts index 35a87b0f5..17ac87ebc 100644 --- a/js/modules/data.d.ts +++ b/js/modules/data.d.ts @@ -267,6 +267,10 @@ export function getMessageBySender( }: { source: any; sourceDevice: any; sent_at: any }, { Message }: { Message: any } ): Promise; +export function getMessagesBySender( + { source, sourceDevice }: { source: any; sourceDevice: any }, + { Message }: { Message: any } +): Promise; export function getMessageIdsFromServerIds( serverIds: any, conversationId: any diff --git a/js/modules/data.js b/js/modules/data.js index e532978e1..6de00db8c 100644 --- a/js/modules/data.js +++ b/js/modules/data.js @@ -151,6 +151,7 @@ module.exports = { removeAllMessagesInConversation, getMessageBySender, + getMessagesBySender, getMessageIdsFromServerIds, getMessageById, getAllMessages, @@ -1015,6 +1016,23 @@ async function getMessageBySender( return new Message(messages[0]); } +async function getMessagesBySender( + // eslint-disable-next-line camelcase + { source, sourceDevice, sent_at }, + { Message } +) { + const messages = await channels.getMessageBySender({ + source, + sourceDevice, + sent_at, + }); + if (!messages || !messages.length) { + return null; + } + + return messages.map(m => new Message(m)); +} + async function getUnreadByConversation(conversationId, { MessageCollection }) { const messages = await channels.getUnreadByConversation(conversationId); return new MessageCollection(messages); diff --git a/js/modules/loki_app_dot_net_api.js b/js/modules/loki_app_dot_net_api.js index ae606fb35..369de615a 100644 --- a/js/modules/loki_app_dot_net_api.js +++ b/js/modules/loki_app_dot_net_api.js @@ -6,13 +6,13 @@ const { URL, URLSearchParams } = require('url'); const FormData = require('form-data'); const https = require('https'); const path = require('path'); +const dataMessage = require('../../ts/receiver/dataMessage'); // Can't be less than 1200 if we have unauth'd requests const PUBLICCHAT_MSG_POLL_EVERY = 1.5 * 1000; // 1.5s const PUBLICCHAT_CHAN_POLL_EVERY = 20 * 1000; // 20s const PUBLICCHAT_DELETION_POLL_EVERY = 5 * 1000; // 5s const PUBLICCHAT_MOD_POLL_EVERY = 30 * 1000; // 30s -const PUBLICCHAT_MIN_TIME_BETWEEN_DUPLICATE_MESSAGES = 10 * 1000; // 10s // FIXME: replace with something on urlPubkeyMap... const FILESERVER_HOSTS = [ @@ -1799,7 +1799,7 @@ class LokiPublicChannelAPI { } return { - timestamp, + timestamp: new Date(`${adnMessage.created_at}`).getTime() || timestamp, attachments, preview, quote, @@ -1913,7 +1913,10 @@ class LokiPublicChannelAPI { if (messengerData === false) { return false; } - + // eslint-disable-next-line no-param-reassign + adnMessage.timestamp = messengerData.timestamp; + // eslint-disable-next-line no-param-reassign + adnMessage.body = messengerData.text; const { timestamp, quote, @@ -1927,20 +1930,15 @@ class LokiPublicChannelAPI { } // Duplicate check - const isDuplicate = message => { - // The username in this case is the users pubKey - const sameUsername = message.username === pubKey; - const sameText = message.text === adnMessage.text; - // Don't filter out messages that are too far apart from each other - const timestampsSimilar = - Math.abs(message.timestamp - timestamp) <= - PUBLICCHAT_MIN_TIME_BETWEEN_DUPLICATE_MESSAGES; - - return sameUsername && sameText && timestampsSimilar; - }; + const isDuplicate = (message, testedMessage) => + dataMessage.isDuplicate( + message, + testedMessage, + testedMessage.user.username + ); // Filter out any messages that we got previously - if (this.lastMessagesCache.some(isDuplicate)) { + if (this.lastMessagesCache.some(m => isDuplicate(m, adnMessage))) { return false; // Duplicate message } @@ -1949,9 +1947,11 @@ class LokiPublicChannelAPI { this.lastMessagesCache = [ ...this.lastMessagesCache, { - username: pubKey, - text: adnMessage.text, - timestamp, + propsForMessage: { + authorPhoneNumber: pubKey, + text: adnMessage.text, + timestamp, + }, }, ].splice(-5); diff --git a/ts/receiver/dataMessage.ts b/ts/receiver/dataMessage.ts index dddde9cfb..971d4ccc3 100644 --- a/ts/receiver/dataMessage.ts +++ b/ts/receiver/dataMessage.ts @@ -356,30 +356,49 @@ interface MessageId { source: any; sourceDevice: any; timestamp: any; + message: any; } +const PUBLICCHAT_MIN_TIME_BETWEEN_DUPLICATE_MESSAGES = 10 * 1000; // 10s async function isMessageDuplicate({ source, sourceDevice, timestamp, + message, }: MessageId) { const { Errors } = window.Signal.Types; try { - const result = await window.Signal.Data.getMessageBySender( - { source, sourceDevice, sent_at: timestamp }, + const result = await window.Signal.Data.getMessagesBySender( + { source, sourceDevice }, { Message: window.Whisper.Message, } ); + if (!result) { + return false; + } - return Boolean(result); + const isSimilar = result.some((m: any) => isDuplicate(m, message, source)); + return isSimilar; } catch (error) { window.log.error('isMessageDuplicate error:', Errors.toLogFormat(error)); return false; } } +export const isDuplicate = (m: any, testedMessage: any, source: string) => { + // The username in this case is the users pubKey + const sameUsername = m.propsForMessage.authorPhoneNumber === source; + const sameText = m.propsForMessage.text === testedMessage.body; + // Don't filter out messages that are too far apart from each other + const timestampsSimilar = + Math.abs(m.propsForMessage.timestamp - testedMessage.timestamp) <= + PUBLICCHAT_MIN_TIME_BETWEEN_DUPLICATE_MESSAGES; + + return sameUsername && sameText && timestampsSimilar; +}; + async function handleProfileUpdate( profileKeyBuffer: Uint8Array, convoId: string, @@ -588,9 +607,7 @@ export async function handleMessageEvent(event: MessageEvent): Promise { // if the message is `sent` (from secondary device) we have to set the sender manually... (at least for now) source = source || msg.get('source'); - const isDuplicate = await isMessageDuplicate(data); - - if (isDuplicate) { + if (await isMessageDuplicate(data)) { // RSS expects duplicates, so squelch log if (!source.match(/^rss:/)) { window.log.warn('Received duplicate message', msg.idForLogging()); From 290eb41815eb5ec16854d64f25a124c43eb7c99b Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 2 Sep 2020 12:16:14 +1000 Subject: [PATCH 143/274] fix fr translations --- _locales/fr/messages.json | 84 +++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index 5eb1756a6..9a3671a8f 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -1420,29 +1420,29 @@ "description": "Button when a specific action is to be done." }, "cannotUpdateDetail": { - "message": "La mise a jour a échouée, mais il y a une nouvelle version disponible. Merci de visiter https://getsession.org/ et d'installer la nouvelle version manuellement, puis de contacter le support ou créer un ticket au sujet de ce bug", + "message": "La mise a jour de Session a échouée. Une nouvelle version est disponible. Rendez-vous sur https://getsession.org/ pour installer la nouvelle version manuellement. Vous pouvez également contacter le support ou créer un ticket au sujet de ce problème.", "description": "Shown if a general error happened while trying to install update package" }, "close": { "message": "Fermer" }, "devicePairingRequestReceivedNoListenerDescription": { - "message": "Une demande de liaison a été reçu, mais vous n’êtes pas sur l’écran de liaison d'un appareil. \nAller dans Paramètres > Appareil > Relier un nouvel appareil." + "message": "Une demande de liaison a été reçue, mais vous n’êtes pas sur l’écran de liaison d'un appareil. \nRendez-vous dans Paramètres > Appareil > Relier un nouvel appareil." }, "deviceIsSecondaryNoPairing": { - "message": "Cet appareil est un appareil secondaire et ne peux donc pas être relier." + "message": "Cet appareil est un appareil secondaire et ne peux donc pas être relié." }, "pairingOngoing": { - "message": "Une demande de liaison est déjà en cours. Redémarrer l'application si cela prends trop longtemps." + "message": "Une demande de liaison est déjà en cours. Redémarrez l'application si cela prends trop longtemps." }, "allowPairingWithDevice": { "message": "Autoriser la liaison avec cet appareil ?" }, "provideDeviceAlias": { - "message": "Merci de donner un alias à cet appareil relié" + "message": "Choisissez un alias pour cet appareil" }, "showPairingWordsTitle": { - "message": "Mots secret de liaison" + "message": "Mots secrets pour la liaison" }, "confirmUnpairingTitle": { "message": "Merci de confirmer que vous souhaitez déconnecter l'appareil suivant:" @@ -1452,20 +1452,20 @@ "description": "Warning for device unlinking in settings view" }, "unpairDeviceWarningSub": { - "message": "Déconnecter cet appareil va supprimer tout l'historique, ce qui inclus tous les messages, sessions, et contacts de cet appareil.", + "message": "Déconnecter cet appareil supprimera tout l'historique, ce qui inclut tous les messages, sessions, et contacts de cet appareil.", "description": "Warning description for device unlinking in settings view" }, "deletePublicWarning": { - "message": "Êtes-vous sûr? Cela va supprimer ce message pour tout le monde dans ce groupe public." + "message": "Êtes-vous sûr? Cela supprimera ce message pour tous les membres de ce groupe public." }, "deleteMultiplePublicWarning": { - "message": "Êtes-vous sûr? Cela va supprimer ces messages pour tout le monde dans ce groupe public." + "message": "Êtes-vous sûr? Cela supprimera ces messages pour tous les membres de ce groupe public." }, "deleteMultipleWarning": { - "message": "Êtes-vous sûr? En cliquant sur 'Supprimer' cela va supprimer ces messages de cet appareil uniquement." + "message": "Êtes-vous sûr? En cliquant sur 'Supprimer' cela supprimera ces messages sur cet appareil uniquement." }, "messageDeletionForbidden": { - "message": "Vous n'avez pas l'autorisation de supprimer les messages d'autres utilisateurs.", + "message": "Vous n'êtes pas autorisé à supprimer les messages des autres utilisateurs.", "description": "Toast message explaining that the user doens't have the rights to delete other people's messages." }, "sendMessageBlockedUser": { @@ -1499,7 +1499,7 @@ "message": "Vous n'aurez pas une protection complète des métadonnées en envoyant ou recevant des aperçu de liens." }, "mediaPermissionsTitle": { - "message": "Microphone et camera" + "message": "Microphone et caméra" }, "spellCheckTitle": { "message": "Vérification orthographique", @@ -1510,11 +1510,11 @@ "description": "Shown when the user changes their spellcheck setting to indicate that they must restart Session." }, "readReceiptSettingDescription": { - "message": "Voir et partager quand les messages ont étés lus (activer les accusés de lecture dans toutes les sessions).", + "message": "Voir et partager quand les messages ont étés lus (s'applique à toutes les sessions).", "description": "Description of the read receipts setting" }, "typingIndicatorsSettingDescription": { - "message": "Voir et partager quand les messages sont rédigés (s'applique à toutes les sessions)).", + "message": "Voir et partager quand les messages sont rédigés (s'applique à toutes les sessions).", "description": "Description of the typing indicators setting" }, "zoomFactorSettingTitle": { @@ -1538,10 +1538,10 @@ "description": "Conversation menu option to clear user nickname" }, "themeToggleDescription": { - "message": "Choisissez le thème qui vous convient le plus" + "message": "Choisissez le thème qui vous convient le mieux" }, "hideMenuBarTitle": { - "message": "Cacher la bar de menu", + "message": "Cacher la barre de menu", "description": "Label text for menu bar visibility setting" }, "hideMenuBarDescription": { @@ -1552,10 +1552,10 @@ "message": "Mise à jour automatique" }, "autoUpdateSettingDescription": { - "message": "Vérifier si une mise à jour est disponible au lancement" + "message": "Rechercher automatiquement les mises à jour au lancement" }, "autoUpdateDownloadedMessage": { - "message": "La mise à jour a été telechargé." + "message": "La mise à jour a été telechargée." }, "autoUpdateDownloadInstructions": { "message": "Voulez-vous télécharger la mise à jour ?" @@ -1568,7 +1568,7 @@ "description": "Ban user from open group by public key." }, "banUserConfirm": { - "message": "Êtes-vous sûr que vous voulez bannir cet utilisateur ?", + "message": "Êtes-vous sûr de vouloir bannir cet utilisateur ?", "description": "Message shown when confirming user ban." }, "userBanned": { @@ -1592,7 +1592,7 @@ "description": "Button action that the user can click to edit a group name (closed)" }, "setAccountPasswordTitle": { - "message": "Sécuriser par mot de passe", + "message": "Définir un mot de passe", "description": "Prompt for user to set account password in settings view" }, "setAccountPasswordDescription": { @@ -1600,7 +1600,7 @@ "description": "Description for set account password setting view" }, "changeAccountPasswordTitle": { - "message": "Changement de Mot de Passe", + "message": "Changement de mot de passe", "description": "Prompt for user to change account password in settings view" }, "changeAccountPasswordDescription": { @@ -1616,21 +1616,21 @@ "description": "Description for remove account password setting view" }, "enterPassword": { - "message": "Merci d'entrer votre mot de passe" + "message": "Veuillez saisir votre mot de passe" }, "confirmPassword": { - "message": "Confirmer le mot de passe" + "message": "Confirmez le mot de passe" }, "pasteLongPasswordToastTitle": { - "message": "Le contenu du presse-papier est plus long que la longueur maximum d'un mot de passe ($max_pwd_len$ caractères).", + "message": "Le contenu du presse-papier dépasse la longueur maximum pour un mot de passe ($max_pwd_len$ caractères).", "description": "Shown when user pastes a password which is longer than MAX_PASSWORD_LEN" }, "showRecoveryPhrasePasswordRequest": { - "message": "Merci d'entrer votre mot de passe", + "message": "Veuillez saisir votre mot de passe", "description": "Request for user to enter password to show recovery phrase." }, "passwordViewTitle": { - "message": "Entrer votre mot de passe", + "message": "Saisissez votre mot de passe", "description": "The title shown when user needs to type in a password to unlock the messenger" }, "password": { @@ -1638,7 +1638,7 @@ "description": "Placeholder for password input" }, "setPassword": { - "message": "Ajouter un mot de passe", + "message": "Définir un mot de passe", "description": "Button action that the user can click to set a password" }, "changePassword": { @@ -1653,7 +1653,7 @@ "message": "Mot de passe invalide. Voulez-vous effacer la base de données?" }, "typeInOldPassword": { - "message": "Merci de taper votre ancien mot de passe" + "message": "Merci de saisir votre ancien mot de passe" }, "invalidOldPassword": { "message": "Ancien mot de passe invalide" @@ -1662,7 +1662,7 @@ "message": "Mot de passe invalide" }, "noGivenPassword": { - "message": "Merci de taper votre mot de passe" + "message": "Merci de saisir votre mot de passe" }, "passwordsDoNotMatch": { "message": "Les mots de passe ne correspondent pas." @@ -1677,7 +1677,7 @@ "message": "Mot de passe incorrect" }, "setPasswordTitle": { - "message": "Ajouter un mot de passe" + "message": "Définir un mot de passe" }, "changePasswordTitle": { "message": "Changer le mot de passe" @@ -1686,10 +1686,10 @@ "message": "Supprimer le mot de passe" }, "setPasswordToastDescription": { - "message": "Votre mot de passe a été défini. Veuillez le garder en sécurité." + "message": "Votre mot de passe a été défini. Veuillez le conserver en sécurité." }, "changePasswordToastDescription": { - "message": "Votre mot de passe a été changé. Veuillez le garder en sécurité." + "message": "Votre mot de passe a été changé. Veuillez le conserver en sécurité." }, "removePasswordToastDescription": { "message": "Vous avez supprimé votre mot de passe." @@ -1698,7 +1698,7 @@ "message": "Vous êtes déjà connecté à ce groupe public" }, "connectToServerSuccess": { - "message": "Connexion réussie au groupe public" + "message": "Connexion au groupe public réussie" }, "setPasswordFail": { "message": "Échec de la définition du mot de passe" @@ -1708,7 +1708,7 @@ "description": "Error string shown to the user when password doesn't meet length criteria" }, "passwordTypeError": { - "message": "Le mot de passe doit être une chaîne de caractère", + "message": "Le mot de passe doit être une chaîne de caractères", "description": "Error string shown to the user when password is not a string" }, "passwordCharacterError": { @@ -1728,7 +1728,7 @@ "description": "Shown in toast if user enters an unknown LNS name" }, "lnsTooFewNodes": { - "message": "Pas assez de nœuds actuellement actifs pour la recherche LNS" + "message": "Il n'y a pas assez de nœuds actifs actuellement pour la recherche LNS" }, "editProfileModalTitle": { "message": "Profil", @@ -1741,10 +1741,10 @@ "message": "Supprimer un modérateur" }, "groupInvitation": { - "message": "Invitation de groupe" + "message": "Invitation à rejoindre un groupe" }, "addingContacts": { - "message": "Ajout de contact à" + "message": "Ajouter des contacts à" }, "noContactsToAdd": { "message": "Aucun contact à ajouter" @@ -1779,13 +1779,13 @@ "message": "Lancer Session sur votre autre appareil." }, "devicePairingHeader_Step2": { - "message": "Aller dans la sectionAppareils dans vos paramètres de compte." + "message": "Rendez-vous dans Appareils dans les paramètres de votre compte." }, "devicePairingHeader_Step3": { - "message": "Sélectionnez Relier un nouvel appareil pour préparer votre autre appareil pour être relier." + "message": "Sélectionnez Relier un nouvel appareil pour préparer la liaison de votre autre appareil." }, "devicePairingHeader_Step4": { - "message": "Taper votre Session ID ci-dessous pour relier votre appareil." + "message": "Saisissez votre Session ID ci-dessous pour relier votre appareil." }, "linkDeviceToExistingAccount": { "message": "Relier un appareil à un compte existant" @@ -1794,7 +1794,7 @@ "message": "ou" }, "ByUsingThisService...": { - "message": "En utilisant ce service, vous approuvez nos Conditions d'utilisation et notre Politique de confidentialité" + "message": "En utilisant ce service, vous acceptez nos Conditions d'utilisation et notre Politique de confidentialité" }, "beginYourSession": { "message": "Commencez
votre
Session." @@ -1823,4 +1823,4 @@ "description": { "message": "Description" } -} \ No newline at end of file +} From 0a7035329f912ed98411d1059f1691c88c651f3e Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 2 Sep 2020 12:29:12 +1000 Subject: [PATCH 144/274] fix tests --- test/app/fixtures/menu-mac-os-setup.json | 2 +- test/app/fixtures/menu-mac-os.json | 2 +- test/app/fixtures/menu-windows-linux-setup.json | 2 +- test/app/fixtures/menu-windows-linux.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/app/fixtures/menu-mac-os-setup.json b/test/app/fixtures/menu-mac-os-setup.json index ff584845c..5332b7b73 100644 --- a/test/app/fixtures/menu-mac-os-setup.json +++ b/test/app/fixtures/menu-mac-os-setup.json @@ -77,7 +77,7 @@ "role": "delete" }, { - "label": "Select All", + "label": "Select all", "role": "selectall" }, { diff --git a/test/app/fixtures/menu-mac-os.json b/test/app/fixtures/menu-mac-os.json index 60851f18d..7e4a9a3c0 100644 --- a/test/app/fixtures/menu-mac-os.json +++ b/test/app/fixtures/menu-mac-os.json @@ -68,7 +68,7 @@ "role": "delete" }, { - "label": "Select All", + "label": "Select all", "role": "selectall" }, { diff --git a/test/app/fixtures/menu-windows-linux-setup.json b/test/app/fixtures/menu-windows-linux-setup.json index 5c07b68d5..3425a1184 100644 --- a/test/app/fixtures/menu-windows-linux-setup.json +++ b/test/app/fixtures/menu-windows-linux-setup.json @@ -53,7 +53,7 @@ "role": "delete" }, { - "label": "Select All", + "label": "Select all", "role": "selectall" } ] diff --git a/test/app/fixtures/menu-windows-linux.json b/test/app/fixtures/menu-windows-linux.json index de337349e..30a6301d0 100644 --- a/test/app/fixtures/menu-windows-linux.json +++ b/test/app/fixtures/menu-windows-linux.json @@ -46,7 +46,7 @@ "role": "delete" }, { - "label": "Select All", + "label": "Select all", "role": "selectall" } ] From adfaa8861f773bd4f590ba3735bc1068012bf2a2 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 2 Sep 2020 13:51:14 +1000 Subject: [PATCH 145/274] fix build --- ts/receiver/multidevice.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ts/receiver/multidevice.ts b/ts/receiver/multidevice.ts index c1c69261d..35f30e591 100644 --- a/ts/receiver/multidevice.ts +++ b/ts/receiver/multidevice.ts @@ -4,7 +4,7 @@ import { EnvelopePlus } from './types'; import * as Data from '../../js/modules/data'; import { SignalService } from '../protobuf'; -import { updateProfile } from './receiver'; +import { updateProfile } from './dataMessage'; import { onVerified } from './syncMessages'; import { StringUtils } from '../session/utils'; From f1cf93efad22ab9178281e6c071422de41323bf8 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 2 Sep 2020 14:46:05 +1000 Subject: [PATCH 146/274] fix emoji panel width --- stylesheets/_conversation.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/stylesheets/_conversation.scss b/stylesheets/_conversation.scss index 92a613e45..1e1c3b739 100644 --- a/stylesheets/_conversation.scss +++ b/stylesheets/_conversation.scss @@ -29,6 +29,7 @@ display: flex; flex-direction: column; flex-grow: 1; + width: 100%; } .main.panel { From 3d146348ac8005544626f221f32493034097e1b3 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 2 Sep 2020 15:08:35 +1000 Subject: [PATCH 147/274] reduce shadow of avatar upload --- stylesheets/_modal.scss | 4 +++- stylesheets/_session.scss | 1 - stylesheets/themes.scss | 2 ++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/stylesheets/_modal.scss b/stylesheets/_modal.scss index a0c314bb4..6f154ded3 100644 --- a/stylesheets/_modal.scss +++ b/stylesheets/_modal.scss @@ -206,7 +206,9 @@ position: relative; .module-avatar { - box-shadow: 0 0 23px 0 rgba($session-color-black, 0.78); + @include themify($themes) { + box-shadow: 0px 0px 13px 0.5px themed('sessionShadowColor'); + } } .qr-view-button { diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index 2a186d566..a56d9ac9b 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -922,7 +922,6 @@ label { height: 80px; border-radius: 100%; background-color: rgba($session-color-black, 0.72); - box-shadow: 0px 0px 3px 0.5px rgba(0, 0, 0, 0.75); opacity: 0; transition: $session-transition-duration; diff --git a/stylesheets/themes.scss b/stylesheets/themes.scss index ca7c5ebae..070d34596 100644 --- a/stylesheets/themes.scss +++ b/stylesheets/themes.scss @@ -34,6 +34,7 @@ $themes: ( receivedMessageText: $black, sentMessageText: $black, sessionShadow: 0 0 4px 0 rgba($black, 0.37), + sessionShadowColor: rgba($black, 0.37), // left pane conversationList: $white, conversationItemHasUnread: #fcfcfc, @@ -83,6 +84,7 @@ $themes: ( receivedMessageText: $white, sentMessageText: $white, sessionShadow: 0 0 4px 0 rgba($white, 0.2), + sessionShadowColor: rgba($white, 0.2), // left pane conversationList: #1b1b1b, conversationItemHasUnread: #2c2c2c, From b38299edcbad2b81e7dbf55f9b743764e7152e8f Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 2 Sep 2020 15:08:51 +1000 Subject: [PATCH 148/274] reduce size of session logo on empty screen --- stylesheets/_session_left_pane.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stylesheets/_session_left_pane.scss b/stylesheets/_session_left_pane.scss index 790b473f6..45b3160c2 100644 --- a/stylesheets/_session_left_pane.scss +++ b/stylesheets/_session_left_pane.scss @@ -348,7 +348,7 @@ $session-compose-margin: 20px; margin: auto; .session-brand-logo { - height: 215px; + height: 180px; filter: brightness(0) saturate(100%) invert(75%) sepia(84%) saturate(3272%) hue-rotate(103deg) brightness(106%) contrast(103%); } From 66dcfdfe6e067b5765c512d87439b87e1030f8ab Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 2 Sep 2020 15:24:50 +1000 Subject: [PATCH 149/274] show message when no blocked contact in settings --- _locales/en/messages.json | 4 ++++ .../session/settings/SessionSettings.tsx | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 3dfdd9c35..c19d175ca 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -2175,5 +2175,9 @@ "closedGroupMaxSize": { "message": "A closed group cannot have more than 10 members", "androidKey": "activity_create_closed_group_too_many_group_members_error" + }, + "noBlockedContacts": { + "message": "No blocked contacts", + "androidKey": "blocked_contacts_fragment__no_blocked_contacts" } } diff --git a/ts/components/session/settings/SessionSettings.tsx b/ts/components/session/settings/SessionSettings.tsx index e6562a8db..5a3928e89 100644 --- a/ts/components/session/settings/SessionSettings.tsx +++ b/ts/components/session/settings/SessionSettings.tsx @@ -613,6 +613,25 @@ export class SettingsView extends React.Component { confirmationDialogParams: undefined, }); } + + if (blockedNumbers.length === 0) { + return [ + { + id: 'noBlockedContacts', + title: '', + description: window.i18n('noBlockedContacts'), + type: undefined, + category: SessionSettingCategory.Blocked, + content: undefined, + comparisonValue: undefined, + setFn: undefined, + hidden: false, + onClick: undefined, + confirmationDialogParams: undefined, + }, + ]; + } + return results; } From 0b54fb2f0a8846ff683b0603560af358b9eb9e7f Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 2 Sep 2020 15:25:29 +1000 Subject: [PATCH 150/274] minor ui fix --- stylesheets/_conversation.scss | 2 +- stylesheets/_session_signin.scss | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/stylesheets/_conversation.scss b/stylesheets/_conversation.scss index 1e1c3b739..2c0ce17fc 100644 --- a/stylesheets/_conversation.scss +++ b/stylesheets/_conversation.scss @@ -429,7 +429,7 @@ display: flex; flex-direction: row; align-items: center; - margin-bottom: 8px; + margin-bottom: 7px; padding: 0px 15px; .send-message { diff --git a/stylesheets/_session_signin.scss b/stylesheets/_session_signin.scss index b07c9ddaa..786b39ce6 100644 --- a/stylesheets/_session_signin.scss +++ b/stylesheets/_session_signin.scss @@ -160,7 +160,7 @@ &__unique-session-id { @include registration-label-mixin; - padding-top: 3em; + padding-top: 1em; text-align: center; } From 0721d469db768ea5e1a3abdd94297b3d90470f6b Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 2 Sep 2020 15:49:43 +1000 Subject: [PATCH 151/274] increase timeout allowed for joining open group --- ts/components/session/LeftPaneMessageSection.tsx | 5 +++-- ts/session/types/OpenGroup.ts | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ts/components/session/LeftPaneMessageSection.tsx b/ts/components/session/LeftPaneMessageSection.tsx index a64486754..e66eb8e56 100644 --- a/ts/components/session/LeftPaneMessageSection.tsx +++ b/ts/components/session/LeftPaneMessageSection.tsx @@ -467,6 +467,7 @@ export class LeftPaneMessageSection extends React.Component { id: 'connectToServer', type: 'success', }); + this.setState({ loading: true }); await OpenGroup.join(serverUrl, async () => { if (await OpenGroup.serverExists(serverUrl)) { ToastUtils.push({ @@ -474,9 +475,8 @@ export class LeftPaneMessageSection extends React.Component { id: 'connectToServer', type: 'success', }); - - this.setState({ loading: true }); } + this.setState({ loading: false }); }); const openGroupConversation = await OpenGroup.getConversation(serverUrl); @@ -498,6 +498,7 @@ export class LeftPaneMessageSection extends React.Component { id: 'connectToServer', type: 'error', }); + this.setState({ loading: false }); } finally { this.setState({ loading: false, diff --git a/ts/session/types/OpenGroup.ts b/ts/session/types/OpenGroup.ts index 4666bdefa..e8fd0f2e2 100644 --- a/ts/session/types/OpenGroup.ts +++ b/ts/session/types/OpenGroup.ts @@ -129,7 +129,7 @@ export class OpenGroup { conversation = await PromiseUtils.timeout( window.attemptConnection(prefixedServer, channel), - 5000 + 15000 ); if (!conversation) { throw new Error(window.i18n('connectToServerFail')); From 62be54c05a33d39062e59e914b3c9094170c1a65 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 3 Sep 2020 11:32:04 +1000 Subject: [PATCH 152/274] update text for lightmode forced to user --- ts/components/session/ActionsPanel.tsx | 5 +++-- ts/components/session/SessionConfirm.tsx | 10 +++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/ts/components/session/ActionsPanel.tsx b/ts/components/session/ActionsPanel.tsx index 6c4580254..5b799e972 100644 --- a/ts/components/session/ActionsPanel.tsx +++ b/ts/components/session/ActionsPanel.tsx @@ -68,7 +68,9 @@ export class ActionsPanel extends React.Component { if (currentTheme !== 'light') { const message = 'Light Mode'; const messageSub = - 'Feeling the dark side more? Just toggle the theme from the bottom-left moon icon.'; + 'Whoops, who left the lights on?

\ + That’s right, Session has a spiffy new light mode! Take the fresh new color palette for a spin — it’s now the default mode.

\ + Want to go back to the dark side? Just tap the moon symbol in the lower left corner of the app to switch modes.'; const hasSeenLightMode = await getItemById('hasSeenLightModeDialog'); if (hasSeenLightMode?.value === true) { @@ -77,7 +79,6 @@ export class ActionsPanel extends React.Component { } // force light them right now, then ask for permission await window.Events.setThemeSetting('light'); - // FIXME add the SUN icon window.confirmationDialog({ message, messageSub, diff --git a/ts/components/session/SessionConfirm.tsx b/ts/components/session/SessionConfirm.tsx index a906a5f3c..f0b611834 100644 --- a/ts/components/session/SessionConfirm.tsx +++ b/ts/components/session/SessionConfirm.tsx @@ -79,11 +79,11 @@ export class SessionConfirm extends React.Component { className={messageSubText} html={message} /> - {messageSub && ( - - {messageSub} - - )} +
From 76b7f0780faf9066a509516ff5117046a2c9621e Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 3 Sep 2020 11:50:46 +1000 Subject: [PATCH 153/274] bump to v1.3.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e64a6aa8c..617a1c9a0 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "session-messenger-desktop", "productName": "Session", "description": "Private messaging from your desktop", - "version": "1.2.1", + "version": "1.3.0", "license": "GPL-3.0", "author": { "name": "Loki Project", From 71169a56fe5eee924d2a617f1d94c621f4e1e3aa Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 3 Sep 2020 14:16:34 +1000 Subject: [PATCH 154/274] fix light theme attachment doc UI --- stylesheets/_modules.scss | 17 +++++++---------- stylesheets/_theme_dark.scss | 20 -------------------- 2 files changed, 7 insertions(+), 30 deletions(-) diff --git a/stylesheets/_modules.scss b/stylesheets/_modules.scss index d23297cd8..020c42a5b 100644 --- a/stylesheets/_modules.scss +++ b/stylesheets/_modules.scss @@ -340,26 +340,23 @@ text-overflow: ellipsis; } +.module-message__generic-attachment__file-size, +.module-message__generic-attachment__file-name--outgoing, +.module-message__generic-attachment__file-size--incoming, +.module-message__generic-attachment__file-size--outgoing, .module-message__generic-attachment__file-name--incoming { - color: $color-white; + @include themify($themes) { + color: themed('textColor'); + } } .module-message__generic-attachment__file-size { - color: $color-gray-90; font-size: 11px; line-height: 16px; letter-spacing: 0.3px; margin-top: 3px; } -.module-message__generic-attachment__file-size--incoming { - color: $color-white; -} - -.module-message__generic-attachment__file-size--incoming { - color: $color-white; -} - .module-message__link-preview { cursor: pointer; margin-inline-start: -12px; diff --git a/stylesheets/_theme_dark.scss b/stylesheets/_theme_dark.scss index 9d3406dfa..c7fbfcdb4 100644 --- a/stylesheets/_theme_dark.scss +++ b/stylesheets/_theme_dark.scss @@ -365,26 +365,6 @@ color: $color-dark-05; } - .module-message__broken-video-screenshot--incoming { - color: $color-white; - } - - .module-message__generic-attachment__file-name { - color: $color-dark-05; - } - - .module-message__generic-attachment__file-name--incoming { - color: $color-white; - } - - .module-message__generic-attachment__file-size { - color: $color-dark-05; - } - - .module-message__generic-attachment__file-size--incoming { - color: $color-white; - } - .module-message__link-preview__content { background-color: $color-gray-95; border: 1px solid $color-gray-60; From b5f31a4f3fc6b03d6d25154afc39441dc934b4b5 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 3 Sep 2020 16:39:44 +1000 Subject: [PATCH 155/274] fix quote background and border --- stylesheets/_quote.scss | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/stylesheets/_quote.scss b/stylesheets/_quote.scss index e94deb026..8bdca3d76 100644 --- a/stylesheets/_quote.scss +++ b/stylesheets/_quote.scss @@ -7,12 +7,12 @@ flex-direction: row; align-items: stretch; overflow: hidden; - + border-radius: 4px; border-left-width: 4px; border-left-style: solid; @include themify($themes) { - border-color: themed('accent'); + border-color: themed('accentButton'); } &__primary__type-label { @@ -64,7 +64,16 @@ // This is related to the quote logic inside messages .module-quote { + &--incoming { + @include themify($themes) { + background: themed('sentMessageBackground'); + } + } + &--outgoing { + @include themify($themes) { + background: themed('receivedMessageBackground'); + } .module-quote__primary__author { @include themify($themes) { color: themed('sentMessageText'); From c35e1008a5f6f3c8313d59f3e57aa8e57de32375 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 4 Sep 2020 11:53:30 +1000 Subject: [PATCH 156/274] remove getAllPrivateConversations --- app/sql.js | 11 ----------- js/modules/data.d.ts | 1 - js/modules/data.js | 9 --------- 3 files changed, 21 deletions(-) diff --git a/app/sql.js b/app/sql.js index 4a246d3c7..5b95a6c64 100644 --- a/app/sql.js +++ b/app/sql.js @@ -110,7 +110,6 @@ module.exports = { getPublicConversationsByServer, getPubkeysInPublicConversation, getAllConversationIds, - getAllPrivateConversations, getAllGroupsInvolvingId, removeAllConversations, removeAllPrivateConversations, @@ -1948,16 +1947,6 @@ async function getAllConversationIds() { return map(rows, row => row.id); } -async function getAllPrivateConversations() { - const rows = await db.all( - `SELECT json FROM ${CONVERSATIONS_TABLE} WHERE - type = 'private' - ORDER BY id ASC;` - ); - - return map(rows, row => jsonToObject(row.json)); -} - async function getAllPublicConversations() { const rows = await db.all( `SELECT json FROM conversations WHERE diff --git a/js/modules/data.d.ts b/js/modules/data.d.ts index 17ac87ebc..0f70dd4da 100644 --- a/js/modules/data.d.ts +++ b/js/modules/data.d.ts @@ -197,7 +197,6 @@ export function getAllConversations({ }): Promise>; export function getAllConversationIds(): Promise>; -export function getAllPrivateConversations(): Promise>; export function getAllPublicConversations(): Promise>; export function getPublicConversationsByServer( server: string, diff --git a/js/modules/data.js b/js/modules/data.js index 6de00db8c..35417200a 100644 --- a/js/modules/data.js +++ b/js/modules/data.js @@ -123,7 +123,6 @@ module.exports = { getAllConversations, getAllConversationIds, - getAllPrivateConversations, getAllPublicConversations, getPublicConversationsByServer, getPubkeysInPublicConversation, @@ -819,14 +818,6 @@ async function getAllPublicConversations({ ConversationCollection }) { return collection; } -async function getAllPrivateConversations({ ConversationCollection }) { - const conversations = await channels.getAllPrivateConversations(); - - const collection = new ConversationCollection(); - collection.add(conversations); - return collection; -} - async function getPubkeysInPublicConversation(id) { return channels.getPubkeysInPublicConversation(id); } From e9f118317882dd668a4d1512ed26e2e01a9fa63b Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 4 Sep 2020 11:57:11 +1000 Subject: [PATCH 157/274] remove export of getMessageCount --- js/modules/data.d.ts | 1 - js/modules/data.js | 4 ---- 2 files changed, 5 deletions(-) diff --git a/js/modules/data.d.ts b/js/modules/data.d.ts index 0f70dd4da..f967fd287 100644 --- a/js/modules/data.d.ts +++ b/js/modules/data.d.ts @@ -223,7 +223,6 @@ export function searchMessagesInConversation( conversationId: string, { limit }?: { limit: any } ): Promise; -export function getMessageCount(): Promise; export function saveMessage( data: Mesasge, { forceSave, Message }?: { forceSave?: any; Message?: any } diff --git a/js/modules/data.js b/js/modules/data.js index 35417200a..cb2912fa5 100644 --- a/js/modules/data.js +++ b/js/modules/data.js @@ -134,7 +134,6 @@ module.exports = { searchMessages, searchMessagesInConversation, - getMessageCount, saveMessage, cleanSeenMessages, cleanLastHashes, @@ -874,9 +873,6 @@ async function searchMessagesInConversation( } // Message -async function getMessageCount() { - return channels.getMessageCount(); -} async function cleanSeenMessages() { await channels.cleanSeenMessages(); From 76664d9a11909219b9f7aeae85fe998fd997607e Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 4 Sep 2020 15:11:24 +1000 Subject: [PATCH 158/274] use created_at for public group to order messages --- app/sql.js | 32 ++++++++++++++++++++++++-- js/models/messages.js | 10 ++------ js/modules/data.d.ts | 1 + js/modules/loki_app_dot_net_api.js | 11 +++++---- ts/components/conversation/Message.tsx | 4 +++- ts/receiver/dataMessage.ts | 3 +++ 6 files changed, 46 insertions(+), 15 deletions(-) diff --git a/app/sql.js b/app/sql.js index 5b95a6c64..9781cba61 100644 --- a/app/sql.js +++ b/app/sql.js @@ -810,6 +810,7 @@ const LOKI_SCHEMA_VERSIONS = [ updateToLokiSchemaVersion5, updateToLokiSchemaVersion6, updateToLokiSchemaVersion7, + updateToLokiSchemaVersion8, ]; async function updateToLokiSchemaVersion1(currentVersion, instance) { @@ -823,7 +824,6 @@ async function updateToLokiSchemaVersion1(currentVersion, instance) { `ALTER TABLE messages ADD COLUMN serverId INTEGER;` ); - await instance.run( `CREATE TABLE servers( serverUrl STRING PRIMARY KEY ASC, @@ -1051,6 +1051,29 @@ async function updateToLokiSchemaVersion7(currentVersion, instance) { console.log('updateToLokiSchemaVersion7: success!'); } +async function updateToLokiSchemaVersion8(currentVersion, instance) { + if (currentVersion >= 8) { + return; + } + console.log('updateToLokiSchemaVersion8: starting...'); + await instance.run('BEGIN TRANSACTION;'); + + await instance.run( + `ALTER TABLE messages + ADD COLUMN serverTimestamp INTEGER;` + ); + + await instance.run( + `INSERT INTO loki_schema ( + version + ) values ( + 8 + );` + ); + await instance.run('COMMIT TRANSACTION;'); + console.log('updateToLokiSchemaVersion8: success!'); +} + async function updateLokiSchema(instance) { const result = await instance.get( "SELECT name FROM sqlite_master WHERE type = 'table' AND name='loki_schema';" @@ -2092,6 +2115,7 @@ async function saveMessage(data, { forceSave } = {}) { hasVisualMediaAttachments, id, serverId, + serverTimestamp, // eslint-disable-next-line camelcase received_at, schemaVersion, @@ -2111,6 +2135,7 @@ async function saveMessage(data, { forceSave } = {}) { $json: objectToJSON(data), $serverId: serverId, + $serverTimestamp: serverTimestamp, $body: body, $conversationId: conversationId, $expirationStartTimestamp: expirationStartTimestamp, @@ -2134,6 +2159,7 @@ async function saveMessage(data, { forceSave } = {}) { `UPDATE messages SET json = $json, serverId = $serverId, + serverTimestamp = $serverTimestamp, body = $body, conversationId = $conversationId, expirationStartTimestamp = $expirationStartTimestamp, @@ -2169,6 +2195,7 @@ async function saveMessage(data, { forceSave } = {}) { json, serverId, + serverTimestamp, body, conversationId, expirationStartTimestamp, @@ -2190,6 +2217,7 @@ async function saveMessage(data, { forceSave } = {}) { $json, $serverId, + $serverTimestamp, $body, $conversationId, $expirationStartTimestamp, @@ -2419,7 +2447,7 @@ async function getMessagesByConversation( conversationId = $conversationId AND received_at < $received_at AND type LIKE $type - ORDER BY sent_at DESC + ORDER BY serverTimestamp DESC, serverId DESC, sent_at DESC LIMIT $limit; `, { diff --git a/js/models/messages.js b/js/models/messages.js index bd69ec79e..4e826b410 100644 --- a/js/models/messages.js +++ b/js/models/messages.js @@ -596,6 +596,7 @@ id: this.id, direction: this.isIncoming() ? 'incoming' : 'outgoing', timestamp: this.get('sent_at'), + serverTimestamp: this.get('serverTimestamp'), status: this.getMessagePropStatus(), contact: this.getPropsForEmbeddedContact(), authorColor, @@ -1669,13 +1670,6 @@ Whisper.MessageCollection = Backbone.Collection.extend({ model: Whisper.Message, - comparator(left, right) { - if (left.get('sent_at') === right.get('sent_at')) { - return (left.get('received_at') || 0) - (right.get('received_at') || 0); - } - - return (left.get('sent_at') || 0) - (right.get('sent_at') || 0); - }, initialize(models, options) { if (options) { this.conversation = options.conversation; @@ -1726,7 +1720,7 @@ ); } - this.add(models); + this.add(models.reverse()); if (unreadCount <= 0) { return; diff --git a/js/modules/data.d.ts b/js/modules/data.d.ts index f967fd287..0b344b121 100644 --- a/js/modules/data.d.ts +++ b/js/modules/data.d.ts @@ -324,6 +324,7 @@ export function getMessagesByConversation( type?: string; } ): Promise; + export function getSeenMessagesByHashList(hashes: any): Promise; export function getLastHashBySnode(convoId: any, snode: any): Promise; diff --git a/js/modules/loki_app_dot_net_api.js b/js/modules/loki_app_dot_net_api.js index 369de615a..b2a7a6b6e 100644 --- a/js/modules/loki_app_dot_net_api.js +++ b/js/modules/loki_app_dot_net_api.js @@ -1799,7 +1799,9 @@ class LokiPublicChannelAPI { } return { - timestamp: new Date(`${adnMessage.created_at}`).getTime() || timestamp, + timestamp, + serverTimestamp: + new Date(`${adnMessage.created_at}`).getTime() || timestamp, attachments, preview, quote, @@ -1919,6 +1921,7 @@ class LokiPublicChannelAPI { adnMessage.body = messengerData.text; const { timestamp, + serverTimestamp, quote, attachments, preview, @@ -1990,9 +1993,9 @@ class LokiPublicChannelAPI { isSessionRequest: false, source: pubKey, sourceDevice: 1, - timestamp, + timestamp, // sender timestamp - serverTimestamp: timestamp, + serverTimestamp, // server created_at, used to order messages receivedAt, isPublic: true, message: { @@ -2008,7 +2011,7 @@ class LokiPublicChannelAPI { profileKey, timestamp, received_at: receivedAt, - sent_at: timestamp, + sent_at: timestamp, // sender timestamp inner quote, contact: [], preview, diff --git a/ts/components/conversation/Message.tsx b/ts/components/conversation/Message.tsx index a1bcd66ad..6d1974ff2 100644 --- a/ts/components/conversation/Message.tsx +++ b/ts/components/conversation/Message.tsx @@ -65,6 +65,7 @@ export interface Props { collapseMetadata?: boolean; direction: 'incoming' | 'outgoing'; timestamp: number; + serverTimestamp?: number; status?: 'sending' | 'sent' | 'delivered' | 'read' | 'error'; // What if changed this over to a single contact like quote, and put the events on it? contact?: Contact & { @@ -257,6 +258,7 @@ export class Message extends React.PureComponent { text, textPending, timestamp, + serverTimestamp, } = this.props; if (collapseMetadata) { @@ -299,7 +301,7 @@ export class Message extends React.PureComponent { ) : ( Date: Mon, 7 Sep 2020 13:58:24 +1000 Subject: [PATCH 159/274] fix polling logic on network errors #995 --- ts/receiver/receiver.ts | 3 ++- ts/session/snode_api/serviceNodeAPI.ts | 2 ++ ts/session/snode_api/swarmPolling.ts | 17 +++++++++-------- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/ts/receiver/receiver.ts b/ts/receiver/receiver.ts index 5825e63c0..368a7b392 100644 --- a/ts/receiver/receiver.ts +++ b/ts/receiver/receiver.ts @@ -126,7 +126,6 @@ async function handleRequestDetail( lastPromise: Promise ): Promise { const { textsecure } = window; - const envelope: any = SignalService.Envelope.decode(plaintext); // After this point, decoding errors are not the server's @@ -166,7 +165,9 @@ async function handleRequestDetail( // receiving pipeline refactor. It is to be implemented in the next PR. // To ensure that we queue in the same order we receive messages + await lastPromise; + queueEnvelope(envelope); } catch (error) { window.log.error( diff --git a/ts/session/snode_api/serviceNodeAPI.ts b/ts/session/snode_api/serviceNodeAPI.ts index 7dad5fdee..0d1bf96af 100644 --- a/ts/session/snode_api/serviceNodeAPI.ts +++ b/ts/session/snode_api/serviceNodeAPI.ts @@ -387,6 +387,8 @@ export async function retrieveNextMessages( const json = JSON.parse(res.body); return json.messages || []; } catch (e) { + window.log.warn('exception while parsing json of nextMessage:', e); + return []; } } diff --git a/ts/session/snode_api/swarmPolling.ts b/ts/session/snode_api/swarmPolling.ts index b481bd4ed..ac2eaacc7 100644 --- a/ts/session/snode_api/swarmPolling.ts +++ b/ts/session/snode_api/swarmPolling.ts @@ -21,7 +21,6 @@ export function processMessage(message: string, options: any = {}) { try { const dataPlaintext = new Uint8Array(StringUtils.encode(message, 'base64')); const messageBuf = SignalService.WebSocketMessage.decode(dataPlaintext); - if (messageBuf.type === SignalService.WebSocketMessage.Type.REQUEST) { // tslint:disable-next-line no-floating-promises Receiver.handleRequest(messageBuf.request?.body, options); @@ -48,8 +47,7 @@ export class SwarmPolling { public async start(): Promise { this.loadGroupIds(); - // tslint:disable: no-floating-promises - this.pollForAllKeys(); + void this.pollForAllKeys(); } public addGroupId(pubkey: PubKey) { @@ -133,7 +131,7 @@ export class SwarmPolling { const lastMessage = _.last(messages); - this.updateLastHash( + await this.updateLastHash( edkey, pubkey, lastMessage.hash, @@ -187,10 +185,13 @@ export class SwarmPolling { const groupPromises = this.groupPubkeys.map(async pk => { return this.pollOnceForKey(pk, true); }); - - await Promise.all(_.concat(directPromises, groupPromises)); - - setTimeout(this.pollForAllKeys.bind(this), 2000); + try { + await Promise.all(_.concat(directPromises, groupPromises)); + } catch (e) { + window.log.warn('pollForAllKeys swallowing exception: ', e); + } finally { + setTimeout(this.pollForAllKeys.bind(this), 2000); + } } private async updateLastHash( From 1e446b0a81d6e87db3df46301ca6fc29350b68ff Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 8 Sep 2020 09:37:51 +1000 Subject: [PATCH 160/274] fix order for open groups message which are out of sync --- js/background.js | 9 +++++++-- js/models/conversations.js | 6 +++++- js/models/messages.js | 13 +++++++++++++ js/modules/loki_app_dot_net_api.d.ts | 2 +- js/modules/loki_app_dot_net_api.js | 10 ++++++---- js/modules/loki_message_api.js | 3 ++- ts/session/sending/MessageQueue.ts | 5 +++-- ts/session/sending/MessageSender.ts | 4 ++-- ts/test/session/unit/sending/MessageQueue_test.ts | 8 ++++---- 9 files changed, 43 insertions(+), 17 deletions(-) diff --git a/js/background.js b/js/background.js index 9010d6f3d..8707c3a8b 100644 --- a/js/background.js +++ b/js/background.js @@ -1121,10 +1121,15 @@ Whisper.events.on( 'publicMessageSent', - ({ pubKey, timestamp, serverId }) => { + ({ pubKey, timestamp, serverId, serverTimestamp }) => { try { const conversation = ConversationController.get(pubKey); - conversation.onPublicMessageSent(pubKey, timestamp, serverId); + conversation.onPublicMessageSent( + pubKey, + timestamp, + serverId, + serverTimestamp + ); } catch (e) { window.log.error('Error setting public on message'); } diff --git a/js/models/conversations.js b/js/models/conversations.js index 6bf7dac12..111ed1a2f 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -540,12 +540,13 @@ await Promise.all(messages.map(m => m.setCalculatingPoW())); }, - async onPublicMessageSent(pubKey, timestamp, serverId) { + async onPublicMessageSent(pubKey, timestamp, serverId, serverTimestamp) { const messages = this._getMessagesWithTimestamp(pubKey, timestamp); await Promise.all( messages.map(message => [ message.setIsPublic(true), message.setServerId(serverId), + message.setServerTimestamp(serverTimestamp), ]) ); }, @@ -1295,6 +1296,9 @@ if (this.isPrivate()) { message.set({ destination }); } + if (this.isPublic()) { + message.setServerTimestamp(new Date().getTime()); + } const id = await window.Signal.Data.saveMessage(message.attributes, { Message: Whisper.Message, diff --git a/js/models/messages.js b/js/models/messages.js index 4e826b410..67f2fe7fb 100644 --- a/js/models/messages.js +++ b/js/models/messages.js @@ -1441,6 +1441,19 @@ Message: Whisper.Message, }); }, + async setServerTimestamp(serverTimestamp) { + if (_.isEqual(this.get('serverTimestamp'), serverTimestamp)) { + return; + } + + this.set({ + serverTimestamp, + }); + + await window.Signal.Data.saveMessage(this.attributes, { + Message: Whisper.Message, + }); + }, async setIsPublic(isPublic) { if (_.isEqual(this.get('isPublic'), isPublic)) { return; diff --git a/js/modules/loki_app_dot_net_api.d.ts b/js/modules/loki_app_dot_net_api.d.ts index 75cb0f02d..68d705850 100644 --- a/js/modules/loki_app_dot_net_api.d.ts +++ b/js/modules/loki_app_dot_net_api.d.ts @@ -30,7 +30,7 @@ export interface LokiPublicChannelAPI { body?: string; }, timestamp: number - ): Promise; + ): Promise<{ serverId; serverTimestamp }>; } declare class LokiAppDotNetServerAPI implements LokiAppDotNetServerInterface { diff --git a/js/modules/loki_app_dot_net_api.js b/js/modules/loki_app_dot_net_api.js index b2a7a6b6e..921692309 100644 --- a/js/modules/loki_app_dot_net_api.js +++ b/js/modules/loki_app_dot_net_api.js @@ -2345,7 +2345,10 @@ class LokiPublicChannelAPI { objBody: payload, }); if (!res.err && res.response) { - return res.response.data.id; + return { + serverId: res.response.data.id, + serverTimestamp: new Date(`${res.response.data.created_at}`).getTime(), + }; } if (res.err) { log.error(`POST ${this.baseChannelUrl}/messages failed`); @@ -2357,9 +2360,8 @@ class LokiPublicChannelAPI { } else { log.warn(res.response); } - // there's no retry on desktop - // this is supposed to be after retries - return -1; + + return { serverId: -1, serverTimestamp: -1 }; } } diff --git a/js/modules/loki_message_api.js b/js/modules/loki_message_api.js index 586e57df3..fa67288cb 100644 --- a/js/modules/loki_message_api.js +++ b/js/modules/loki_message_api.js @@ -60,7 +60,8 @@ class LokiMessageAPI { 'Failed to send public chat message' ); } - messageEventData.serverId = res; + messageEventData.serverId = res.serverId; + messageEventData.serverTimestamp = res.serverTimestamp; window.Whisper.events.trigger('publicMessageSent', messageEventData); return; } diff --git a/ts/session/sending/MessageQueue.ts b/ts/session/sending/MessageQueue.ts index a92248378..d880e91f0 100644 --- a/ts/session/sending/MessageQueue.ts +++ b/ts/session/sending/MessageQueue.ts @@ -62,13 +62,14 @@ export class MessageQueue implements MessageQueueInterface { try { const result = await MessageSender.sendToOpenGroup(message); // sendToOpenGroup returns -1 if failed or an id if succeeded - if (result < 0) { + if (result.serverId < 0) { this.events.emit('fail', message, error); } else { const messageEventData = { pubKey: message.group.groupId, timestamp: message.timestamp, - serverId: result, + serverId: result.serverId, + serverTimestamp: result.serverTimestamp, }; this.events.emit('success', message); diff --git a/ts/session/sending/MessageSender.ts b/ts/session/sending/MessageSender.ts index 835f9468f..1477e25ce 100644 --- a/ts/session/sending/MessageSender.ts +++ b/ts/session/sending/MessageSender.ts @@ -98,7 +98,7 @@ function wrapEnvelope(envelope: SignalService.Envelope): Uint8Array { */ export async function sendToOpenGroup( message: OpenGroupMessage -): Promise { +): Promise<{ serverId: number; serverTimestamp: number }> { /* Note: Retrying wasn't added to this but it can be added in the future if needed. The only problem is that `channelAPI.sendMessage` returns true/false and doesn't throw any error so we can never be sure why sending failed. @@ -112,7 +112,7 @@ export async function sendToOpenGroup( ); if (!channelAPI) { - return -1; + return { serverId: -1, serverTimestamp: -1 }; } // Returns -1 on fail or an id > 0 on success diff --git a/ts/test/session/unit/sending/MessageQueue_test.ts b/ts/test/session/unit/sending/MessageQueue_test.ts index c300eb62b..6e07eac2f 100644 --- a/ts/test/session/unit/sending/MessageQueue_test.ts +++ b/ts/test/session/unit/sending/MessageQueue_test.ts @@ -321,12 +321,12 @@ describe('MessageQueue', () => { describe('open groups', async () => { let sendToOpenGroupStub: sinon.SinonStub< [OpenGroupMessage], - Promise + Promise<{ serverId: number; serverTimestamp: number }> >; beforeEach(() => { sendToOpenGroupStub = sandbox .stub(MessageSender, 'sendToOpenGroup') - .resolves(-1); + .resolves({ serverId: -1, serverTimestamp: -1 }); }); it('can send to open group', async () => { @@ -336,7 +336,7 @@ describe('MessageQueue', () => { }); it('should emit a success event when send was successful', async () => { - sendToOpenGroupStub.resolves(123456); + sendToOpenGroupStub.resolves({ serverId: -1, serverTimestamp: -1 }); const message = TestUtils.generateOpenGroupMessage(); const eventPromise = PromiseUtils.waitForTask(complete => { @@ -348,7 +348,7 @@ describe('MessageQueue', () => { }); it('should emit a fail event if something went wrong', async () => { - sendToOpenGroupStub.resolves(-1); + sendToOpenGroupStub.resolves({ serverId: -1, serverTimestamp: -1 }); const message = TestUtils.generateOpenGroupMessage(); const eventPromise = PromiseUtils.waitForTask(complete => { messageQueueStub.events.once('fail', complete); From b96ddf4f079bda799d9d467cb6dd1f09acdb0b0a Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 8 Sep 2020 10:23:37 +1000 Subject: [PATCH 161/274] drop duplicate message with a timestamp close to the sent one --- app/sql.js | 15 +++++++++++++++ js/modules/data.js | 5 ++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/app/sql.js b/app/sql.js index 9781cba61..225fb7e45 100644 --- a/app/sql.js +++ b/app/sql.js @@ -129,6 +129,7 @@ module.exports = { removeMessage, getUnreadByConversation, getMessageBySender, + getMessagesBySender, getMessageIdsFromServerIds, getMessageById, getAllMessages, @@ -2411,6 +2412,20 @@ async function getMessageBySender({ source, sourceDevice, sent_at }) { return map(rows, row => jsonToObject(row.json)); } +async function getMessagesBySender({ source, sourceDevice }) { + const rows = await db.all( + `SELECT json FROM messages WHERE + source = $source AND + sourceDevice = $sourceDevice`, + { + $source: source, + $sourceDevice: sourceDevice, + } + ); + + return map(rows, row => jsonToObject(row.json)); +} + async function getAllUnsentMessages() { const rows = await db.all(` SELECT json FROM messages WHERE diff --git a/js/modules/data.js b/js/modules/data.js index cb2912fa5..8111770f5 100644 --- a/js/modules/data.js +++ b/js/modules/data.js @@ -1005,13 +1005,12 @@ async function getMessageBySender( async function getMessagesBySender( // eslint-disable-next-line camelcase - { source, sourceDevice, sent_at }, + { source, sourceDevice }, { Message } ) { - const messages = await channels.getMessageBySender({ + const messages = await channels.getMessagesBySender({ source, sourceDevice, - sent_at, }); if (!messages || !messages.length) { return null; From e6f367a61e18bf8c4581459b63dda379a0a11882 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 8 Sep 2020 10:49:59 +1000 Subject: [PATCH 162/274] fix messagequeue test --- ts/test/session/unit/sending/MessageQueue_test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ts/test/session/unit/sending/MessageQueue_test.ts b/ts/test/session/unit/sending/MessageQueue_test.ts index 6e07eac2f..41d65d9e8 100644 --- a/ts/test/session/unit/sending/MessageQueue_test.ts +++ b/ts/test/session/unit/sending/MessageQueue_test.ts @@ -27,6 +27,7 @@ chai.use(chaiAsPromised); const { expect } = chai; +// tslint:disable-next-line: max-func-body-length describe('MessageQueue', () => { // Initialize new stubbed cache const sandbox = sinon.createSandbox(); @@ -336,7 +337,7 @@ describe('MessageQueue', () => { }); it('should emit a success event when send was successful', async () => { - sendToOpenGroupStub.resolves({ serverId: -1, serverTimestamp: -1 }); + sendToOpenGroupStub.resolves({ serverId: 5125, serverTimestamp: 5125 }); const message = TestUtils.generateOpenGroupMessage(); const eventPromise = PromiseUtils.waitForTask(complete => { From a0e437ab8702fb753207f15168fc0404a09b775f Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 8 Oct 2020 14:29:36 +1100 Subject: [PATCH 163/274] fix ordering of our own message on message pulled from server --- js/models/conversations.js | 12 +++++------- js/modules/loki_app_dot_net_api.js | 8 ++++---- ts/receiver/dataMessage.ts | 16 +++++++++++----- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/js/models/conversations.js b/js/models/conversations.js index 111ed1a2f..578604373 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -542,13 +542,11 @@ async onPublicMessageSent(pubKey, timestamp, serverId, serverTimestamp) { const messages = this._getMessagesWithTimestamp(pubKey, timestamp); - await Promise.all( - messages.map(message => [ - message.setIsPublic(true), - message.setServerId(serverId), - message.setServerTimestamp(serverTimestamp), - ]) - ); + if (messages && messages.length === 1) { + await messages[0].setIsPublic(true); + await messages[0].setServerId(serverId); + await messages[0].setServerTimestamp(serverTimestamp); + } }, async onNewMessage(message) { diff --git a/js/modules/loki_app_dot_net_api.js b/js/modules/loki_app_dot_net_api.js index 921692309..4ade77836 100644 --- a/js/modules/loki_app_dot_net_api.js +++ b/js/modules/loki_app_dot_net_api.js @@ -1950,10 +1950,10 @@ class LokiPublicChannelAPI { this.lastMessagesCache = [ ...this.lastMessagesCache, { - propsForMessage: { - authorPhoneNumber: pubKey, - text: adnMessage.text, - timestamp, + attributes: { + source: pubKey, + body: adnMessage.text, + sent_at: timestamp, }, }, ].splice(-5); diff --git a/ts/receiver/dataMessage.ts b/ts/receiver/dataMessage.ts index 335f269f1..ac0787d2a 100644 --- a/ts/receiver/dataMessage.ts +++ b/ts/receiver/dataMessage.ts @@ -378,8 +378,12 @@ async function isMessageDuplicate({ if (!result) { return false; } - - const isSimilar = result.some((m: any) => isDuplicate(m, message, source)); + const filteredResult = result.filter( + (m: any) => m.attributes.body === message.body + ); + const isSimilar = filteredResult.some((m: any) => + isDuplicate(m, message, source) + ); return isSimilar; } catch (error) { window.log.error('isMessageDuplicate error:', Errors.toLogFormat(error)); @@ -389,11 +393,11 @@ async function isMessageDuplicate({ export const isDuplicate = (m: any, testedMessage: any, source: string) => { // The username in this case is the users pubKey - const sameUsername = m.propsForMessage.authorPhoneNumber === source; - const sameText = m.propsForMessage.text === testedMessage.body; + const sameUsername = m.attributes.source === source; + const sameText = m.attributes.body === testedMessage.body; // Don't filter out messages that are too far apart from each other const timestampsSimilar = - Math.abs(m.propsForMessage.timestamp - testedMessage.timestamp) <= + Math.abs(m.attributes.sent_at - testedMessage.timestamp) <= PUBLICCHAT_MIN_TIME_BETWEEN_DUPLICATE_MESSAGES; return sameUsername && sameText && timestampsSimilar; @@ -498,6 +502,7 @@ function createSentMessage(data: MessageCreationData): MessageModel { const { timestamp, + serverTimestamp, isPublic, receivedAt, sourceDevice, @@ -530,6 +535,7 @@ function createSentMessage(data: MessageCreationData): MessageModel { const messageData: any = { source: window.textsecure.storage.user.getNumber(), sourceDevice, + serverTimestamp, sent_at: timestamp, received_at: isPublic ? receivedAt : now, conversationId: destination, // conversation ID will might change later (if it is a group) From bd6bd24f2ba307e68dc4a23aaab1834c4471666f Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 8 Sep 2020 16:01:17 +1000 Subject: [PATCH 164/274] show display name on conversation list on groupUpdate --- js/models/messages.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/models/messages.js b/js/models/messages.js index 67f2fe7fb..c079bf834 100644 --- a/js/models/messages.js +++ b/js/models/messages.js @@ -175,7 +175,7 @@ if (!conversation) { return number; } - return conversation.getDisplayName(); + return conversation.getProfileName(); }, getLokiNameForNumber(number) { const conversation = ConversationController.get(number); From f682cbd9d050ad69c020ead02253791f2ca0c83e Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 8 Sep 2020 16:15:03 +1000 Subject: [PATCH 165/274] fix the media panel with lots of media (bottom button hidden) --- stylesheets/_modules.scss | 2 +- stylesheets/_session_group_panel.scss | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/stylesheets/_modules.scss b/stylesheets/_modules.scss index e252c7f6f..21c8b0cd4 100644 --- a/stylesheets/_modules.scss +++ b/stylesheets/_modules.scss @@ -1318,7 +1318,7 @@ flex-direction: column; flex-grow: 1; width: 100%; - height: 100%; + overflow: hidden; } .module-media-gallery__tab-container { diff --git a/stylesheets/_session_group_panel.scss b/stylesheets/_session_group_panel.scss index 5cee99926..56ac3a8f5 100644 --- a/stylesheets/_session_group_panel.scss +++ b/stylesheets/_session_group_panel.scss @@ -149,6 +149,7 @@ 22vw / 3.5 ); //.group-settings is 22vw and we want three rows with some space so divide it by 3.5 margin: auto; + margin-bottom: 1vh; } } } From 29dfb092eb7e72f352ca05f7c6912e219976127d Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 8 Sep 2020 16:52:25 +1000 Subject: [PATCH 166/274] add Secondary Device only if it's not a primary device --- js/models/messages.js | 12 +++++++----- js/views/conversation_view.js | 6 +++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/js/models/messages.js b/js/models/messages.js index 67f2fe7fb..aa9132fa3 100644 --- a/js/models/messages.js +++ b/js/models/messages.js @@ -836,7 +836,7 @@ return Boolean(lookup[contactId]); }, - getPropsForMessageDetail() { + async getPropsForMessageDetail() { const newIdentity = i18n('newIdentity'); const OUTGOING_KEY_ERROR = 'OutgoingIdentityKeyError'; @@ -872,8 +872,7 @@ // that contact. Otherwise, it will be a standalone entry. const errors = _.reject(allErrors, error => Boolean(error.number)); const errorsGroupedById = _.groupBy(allErrors, 'number'); - const primaryDevicePubKey = this.get('conversationId'); - const finalContacts = (phoneNumbers || []).map(id => { + const finalContacts = await Promise.all((phoneNumbers || []).map(async id => { const errorsForContact = errorsGroupedById[id]; const isOutgoingKeyError = Boolean( _.find(errorsForContact, error => error.name === OUTGOING_KEY_ERROR) @@ -881,8 +880,11 @@ const isUnidentifiedDelivery = storage.get('unidentifiedDeliveryIndicators') && this.isUnidentifiedDelivery(id, unidentifiedLookup); + const primary = await window.libsession.Protocols.MultiDeviceProtocol.getPrimaryDevice( + id + ); - const isPrimaryDevice = id === primaryDevicePubKey; + const isPrimaryDevice = id === primary.key; const contact = this.findAndFormatContact(id); const profileName = isPrimaryDevice @@ -904,7 +906,7 @@ onShowSafetyNumber: () => this.trigger('show-identity', this.findContact(id)), }; - }); + })); // The prefix created here ensures that contacts with errors are listed // first; otherwise it's alphabetical diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index dee2d56c5..59106847e 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -1496,14 +1496,14 @@ Signal.Backbone.Views.Lightbox.show(this.lightboxGalleryView.el); }, - showMessageDetail(message) { + async showMessageDetail(message) { const onClose = () => { this.stopListening(message, 'change', update); this.resetPanel(); this.updateHeader(); }; - const props = message.getPropsForMessageDetail(); + const props = await message.getPropsForMessageDetail(); const view = new Whisper.ReactWrapperView({ className: 'message-detail-wrapper', Component: Signal.Components.MessageDetail, @@ -1511,7 +1511,7 @@ onClose, }); - const update = () => view.update(message.getPropsForMessageDetail()); + const update = async () => view.update(await message.getPropsForMessageDetail()); this.listenTo(message, 'change', update); this.listenTo(message, 'expired', onClose); // We could listen to all involved contacts, but we'll call that overkill From f43ea3d940a5c500b41277b4c181dd41f01887f2 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 8 Sep 2020 16:56:56 +1000 Subject: [PATCH 167/274] fix size of sent badge on message detail view --- stylesheets/_modules.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stylesheets/_modules.scss b/stylesheets/_modules.scss index e252c7f6f..58ef21818 100644 --- a/stylesheets/_modules.scss +++ b/stylesheets/_modules.scss @@ -1224,7 +1224,7 @@ } .module-message-detail__contact-container { - margin: 20px; + margin: 20px 0 20px 0; } .module-message-detail__contact { From 57160cb45ce3da45c85473576a0bc90a6b193e01 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 9 Sep 2020 10:38:24 +1000 Subject: [PATCH 168/274] fix custom avatar show on dialogs and list --- ts/components/conversation/InviteContactsDialog.tsx | 1 + ts/components/conversation/UpdateGroupMembersDialog.tsx | 1 + ts/components/session/SessionClosableOverlay.tsx | 1 + 3 files changed, 3 insertions(+) diff --git a/ts/components/conversation/InviteContactsDialog.tsx b/ts/components/conversation/InviteContactsDialog.tsx index 07194bef1..871c6f0e8 100644 --- a/ts/components/conversation/InviteContactsDialog.tsx +++ b/ts/components/conversation/InviteContactsDialog.tsx @@ -42,6 +42,7 @@ export class InviteContactsDialog extends React.Component { id: d.id, authorPhoneNumber: d.id, authorProfileName: name, + authorAvatarPath: d?.cachedProps?.avatarPath, selected: false, authorName: name, authorColor: d.getColor(), diff --git a/ts/components/conversation/UpdateGroupMembersDialog.tsx b/ts/components/conversation/UpdateGroupMembersDialog.tsx index 09b0a6c8f..a8f60afd9 100644 --- a/ts/components/conversation/UpdateGroupMembersDialog.tsx +++ b/ts/components/conversation/UpdateGroupMembersDialog.tsx @@ -49,6 +49,7 @@ export class UpdateGroupMembersDialog extends React.Component { id: d.id, authorPhoneNumber: d.id, authorProfileName: name, + authorAvatarPath: d?.cachedProps?.avatarPath, selected: false, authorName: name, // different from ProfileName? authorColor: d.getColor(), diff --git a/ts/components/session/SessionClosableOverlay.tsx b/ts/components/session/SessionClosableOverlay.tsx index 22e6063d5..3977aa86f 100644 --- a/ts/components/session/SessionClosableOverlay.tsx +++ b/ts/components/session/SessionClosableOverlay.tsx @@ -92,6 +92,7 @@ export class SessionClosableOverlay extends React.Component { id: d.id, authorPhoneNumber: d.id, authorProfileName: title, + authorAvatarPath: d.avatarPath, selected: false, authorName: name, authorColor: d.color, From 2aef1f313291a1aa8b105955d3d9d72642204237 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 9 Sep 2020 10:39:55 +1000 Subject: [PATCH 169/274] be sure blocked border is shown even with mention or unread --- stylesheets/_modules.scss | 6 ++++++ stylesheets/_session.scss | 2 -- stylesheets/_session_group_panel.scss | 4 +++- stylesheets/_session_left_pane.scss | 2 +- stylesheets/_theme_dark.scss | 9 --------- stylesheets/themes.scss | 2 ++ 6 files changed, 12 insertions(+), 13 deletions(-) diff --git a/stylesheets/_modules.scss b/stylesheets/_modules.scss index e252c7f6f..9376aa3f2 100644 --- a/stylesheets/_modules.scss +++ b/stylesheets/_modules.scss @@ -1520,6 +1520,12 @@ .module-avatar { background-color: $color-dark-85; } + + &--is-blocked { + @include themify($themes) { + border-left: 4px solid themed('destructive') !important; + } + } } .module-conversation-list-item__unread-count { diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index 5456d8aae..abcad5b3c 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -344,8 +344,6 @@ textarea { } } -$session-element-border-green: 4px solid $session-color-green; - /* CONVERSATION AND MESSAGES */ @mixin standard-icon-button() { diff --git a/stylesheets/_session_group_panel.scss b/stylesheets/_session_group_panel.scss index 5cee99926..4096f899a 100644 --- a/stylesheets/_session_group_panel.scss +++ b/stylesheets/_session_group_panel.scss @@ -132,7 +132,9 @@ margin: 0 auto; width: 70%; padding-top: 0.5rem; - border-bottom: $session-element-border-green; + @include themify($themes) { + border-bottom: themed('sessionUnreadBorder'); + } } } } diff --git a/stylesheets/_session_left_pane.scss b/stylesheets/_session_left_pane.scss index 45b3160c2..7338410aa 100644 --- a/stylesheets/_session_left_pane.scss +++ b/stylesheets/_session_left_pane.scss @@ -48,8 +48,8 @@ $session-compose-margin: 20px; } &--has-unread { - border-left: $session-element-border-green !important; @include themify($themes) { + border-left: themed('sessionUnreadBorder'); background: themed('conversationItemHasUnread'); } } diff --git a/stylesheets/_theme_dark.scss b/stylesheets/_theme_dark.scss index b2ba60f25..baef39f70 100644 --- a/stylesheets/_theme_dark.scss +++ b/stylesheets/_theme_dark.scss @@ -664,17 +664,8 @@ .module-empty-state { color: $color-dark-55; } - // Module: Conversation List Item - .module-conversation-list-item--has-unread { - border-left: 4px solid $color-loki-green; - } - - .module-conversation-list-item--is-blocked { - border-left: 4px solid $session-color-danger; - } - .module-conversation-list-item--is-selected { background-color: $color-dark-70; } diff --git a/stylesheets/themes.scss b/stylesheets/themes.scss index 070d34596..45abec93d 100644 --- a/stylesheets/themes.scss +++ b/stylesheets/themes.scss @@ -41,6 +41,7 @@ $themes: ( conversationItemSelected: #f0f0f0, clickableHovered: #dfdfdf, sessionBorder: 1px solid #f1f1f1, + sessionUnreadBorder: 4px solid $accentLightTheme, leftpaneOverlayBackground: $white, // scrollbars scrollBarTrack: #fcfcfc, @@ -91,6 +92,7 @@ $themes: ( conversationItemSelected: #404040, clickableHovered: #414347, sessionBorder: 1px solid rgba($white, 0.06), + sessionUnreadBorder: 4px solid $accentDarkTheme, leftpaneOverlayBackground: linear-gradient(180deg, #171717 0%, #121212 100%), // scrollbars scrollBarTrack: #1b1b1b, From 5bab1c665f91a86487627abb5b93d296f9ab355c Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 9 Sep 2020 10:42:52 +1000 Subject: [PATCH 170/274] lint --- js/models/messages.js | 68 ++++++++++++++++++----------------- js/views/conversation_view.js | 3 +- 2 files changed, 37 insertions(+), 34 deletions(-) diff --git a/js/models/messages.js b/js/models/messages.js index aa9132fa3..95f4b0dda 100644 --- a/js/models/messages.js +++ b/js/models/messages.js @@ -872,41 +872,43 @@ // that contact. Otherwise, it will be a standalone entry. const errors = _.reject(allErrors, error => Boolean(error.number)); const errorsGroupedById = _.groupBy(allErrors, 'number'); - const finalContacts = await Promise.all((phoneNumbers || []).map(async id => { - const errorsForContact = errorsGroupedById[id]; - const isOutgoingKeyError = Boolean( - _.find(errorsForContact, error => error.name === OUTGOING_KEY_ERROR) - ); - const isUnidentifiedDelivery = - storage.get('unidentifiedDeliveryIndicators') && - this.isUnidentifiedDelivery(id, unidentifiedLookup); - const primary = await window.libsession.Protocols.MultiDeviceProtocol.getPrimaryDevice( - id - ); + const finalContacts = await Promise.all( + (phoneNumbers || []).map(async id => { + const errorsForContact = errorsGroupedById[id]; + const isOutgoingKeyError = Boolean( + _.find(errorsForContact, error => error.name === OUTGOING_KEY_ERROR) + ); + const isUnidentifiedDelivery = + storage.get('unidentifiedDeliveryIndicators') && + this.isUnidentifiedDelivery(id, unidentifiedLookup); + const primary = await window.libsession.Protocols.MultiDeviceProtocol.getPrimaryDevice( + id + ); - const isPrimaryDevice = id === primary.key; + const isPrimaryDevice = id === primary.key; - const contact = this.findAndFormatContact(id); - const profileName = isPrimaryDevice - ? contact.profileName - : `${contact.profileName} (Secondary Device)`; - return { - ...contact, - status: this.getStatus(id), - errors: errorsForContact, - isOutgoingKeyError, - isUnidentifiedDelivery, - isPrimaryDevice, - profileName, - onSendAnyway: () => - this.trigger('force-send', { - contact: this.findContact(id), - message: this, - }), - onShowSafetyNumber: () => - this.trigger('show-identity', this.findContact(id)), - }; - })); + const contact = this.findAndFormatContact(id); + const profileName = isPrimaryDevice + ? contact.profileName + : `${contact.profileName} (Secondary Device)`; + return { + ...contact, + status: this.getStatus(id), + errors: errorsForContact, + isOutgoingKeyError, + isUnidentifiedDelivery, + isPrimaryDevice, + profileName, + onSendAnyway: () => + this.trigger('force-send', { + contact: this.findContact(id), + message: this, + }), + onShowSafetyNumber: () => + this.trigger('show-identity', this.findContact(id)), + }; + }) + ); // The prefix created here ensures that contacts with errors are listed // first; otherwise it's alphabetical diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index 59106847e..097556d16 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -1511,7 +1511,8 @@ onClose, }); - const update = async () => view.update(await message.getPropsForMessageDetail()); + const update = async () => + view.update(await message.getPropsForMessageDetail()); this.listenTo(message, 'change', update); this.listenTo(message, 'expired', onClose); // We could listen to all involved contacts, but we'll call that overkill From d3badba681d2a83d6b4ecb09a1e101d9a13bb376 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 9 Sep 2020 10:48:26 +1000 Subject: [PATCH 171/274] hide reset session from menu when user is blocked --- ts/components/conversation/ConversationHeader.tsx | 1 + ts/session/utils/Menu.tsx | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/ts/components/conversation/ConversationHeader.tsx b/ts/components/conversation/ConversationHeader.tsx index 94c0baef5..25c4cc45b 100644 --- a/ts/components/conversation/ConversationHeader.tsx +++ b/ts/components/conversation/ConversationHeader.tsx @@ -475,6 +475,7 @@ export class ConversationHeader extends React.Component { isPublic, isRss, isGroup, + isBlocked, onResetSession, i18n ); diff --git a/ts/session/utils/Menu.tsx b/ts/session/utils/Menu.tsx index 1834daf48..2d7637f43 100644 --- a/ts/session/utils/Menu.tsx +++ b/ts/session/utils/Menu.tsx @@ -32,9 +32,10 @@ function showSafetyNumber( function showResetSession( isPublic: boolean, isRss: boolean, - isGroup: boolean + isGroup: boolean, + isBlocked: boolean ): boolean { - return !isPublic && !isRss && !isGroup; + return !isPublic && !isRss && !isGroup && !isBlocked; } function showBlock(isMe: boolean, isPrivate: boolean): boolean { @@ -299,10 +300,11 @@ export function getResetSessionMenuItem( isPublic: boolean | undefined, isRss: boolean | undefined, isGroup: boolean | undefined, + isBlocked: boolean | undefined, action: any, i18n: LocalizerType ): JSX.Element | null { - if (showResetSession(Boolean(isPublic), Boolean(isRss), Boolean(isGroup))) { + if (showResetSession(Boolean(isPublic), Boolean(isRss), Boolean(isGroup), Boolean(isBlocked),)) { return {i18n('resetSession')}; } return null; From 84c7ce006b9585b3b6cffa527760e26c19629ec2 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 9 Sep 2020 11:16:33 +1000 Subject: [PATCH 172/274] fix ctx menu on repeated block/unblock --- ts/components/ConversationListItem.tsx | 2 +- ts/components/conversation/ConversationHeader.tsx | 2 +- ts/components/conversation/Message.tsx | 8 ++++---- ts/session/utils/Menu.tsx | 9 ++++++++- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/ts/components/ConversationListItem.tsx b/ts/components/ConversationListItem.tsx index 076e13976..0b2a71ef5 100644 --- a/ts/components/ConversationListItem.tsx +++ b/ts/components/ConversationListItem.tsx @@ -309,7 +309,7 @@ export class ConversationListItem extends React.PureComponent { mentionedUs, } = this.props; - const triggerId = `${phoneNumber}-ctxmenu-${Date.now()}`; + const triggerId = `conversation-item-${phoneNumber}-ctxmenu`; return (
diff --git a/ts/components/conversation/ConversationHeader.tsx b/ts/components/conversation/ConversationHeader.tsx index 25c4cc45b..c097a2ad1 100644 --- a/ts/components/conversation/ConversationHeader.tsx +++ b/ts/components/conversation/ConversationHeader.tsx @@ -389,7 +389,7 @@ export class ConversationHeader extends React.Component { public render() { const { id, isKickedFromGroup } = this.props; - const triggerId = `conversation-${id}-${Date.now()}`; + const triggerId = `conversation-header-${id}`; return ( <> diff --git a/ts/components/conversation/Message.tsx b/ts/components/conversation/Message.tsx index 6d1974ff2..be36185be 100644 --- a/ts/components/conversation/Message.tsx +++ b/ts/components/conversation/Message.tsx @@ -1073,11 +1073,11 @@ export class Message extends React.PureComponent { // It needs to be unique. // The Date.now() is a workaround to be sure a single triggerID with this id exists const triggerId = id - ? String(`${id}-${Date.now()}`) - : String(`${authorPhoneNumber}-${timestamp}`); + ? String(`message-${id}-${Date.now()}`) + : String(`message-${authorPhoneNumber}-${timestamp}`); const rightClickTriggerId = id - ? String(`${id}-ctx-${Date.now()}`) - : String(`${authorPhoneNumber}-ctx-${timestamp}`); + ? String(`message-ctx-${id}-${Date.now()}`) + : String(`message-ctx-${authorPhoneNumber}-${timestamp}`); if (expired) { return null; } diff --git a/ts/session/utils/Menu.tsx b/ts/session/utils/Menu.tsx index 2d7637f43..2fe4b77f6 100644 --- a/ts/session/utils/Menu.tsx +++ b/ts/session/utils/Menu.tsx @@ -304,7 +304,14 @@ export function getResetSessionMenuItem( action: any, i18n: LocalizerType ): JSX.Element | null { - if (showResetSession(Boolean(isPublic), Boolean(isRss), Boolean(isGroup), Boolean(isBlocked),)) { + if ( + showResetSession( + Boolean(isPublic), + Boolean(isRss), + Boolean(isGroup), + Boolean(isBlocked) + ) + ) { return {i18n('resetSession')}; } return null; From 48d271578b8b08f7763dd1afdc9484f394c5c424 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 9 Sep 2020 15:01:05 +1000 Subject: [PATCH 173/274] fix segfault on app start with tray icon --- app/tray_icon.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/tray_icon.js b/app/tray_icon.js index f803ac6b0..88a32ac93 100644 --- a/app/tray_icon.js +++ b/app/tray_icon.js @@ -65,12 +65,12 @@ function createTrayIcon(getMainWindow, messages) { trayContextMenu = Menu.buildFromTemplate([ { id: 'toggleWindowVisibility', - label: messages[mainWindow.isVisible() ? 'hide' : 'show'].message, + label: messages[mainWindow.isVisible() ? 'appMenuHide' : 'show'].message, click: tray.toggleWindowVisibility, }, { id: 'quit', - label: messages.quit.message, + label: messages.appMenuQuit.message, click: app.quit.bind(app), }, ]); From b6c7c414021e03a95b4f13d82d9d692cabd3bd1e Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 10 Sep 2020 09:06:05 +1000 Subject: [PATCH 174/274] fix read-receipt being sent onFocus on invalid conversation --- app/tray_icon.js | 3 ++- js/views/conversation_view.js | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/tray_icon.js b/app/tray_icon.js index 88a32ac93..7dfdf1fd2 100644 --- a/app/tray_icon.js +++ b/app/tray_icon.js @@ -65,7 +65,8 @@ function createTrayIcon(getMainWindow, messages) { trayContextMenu = Menu.buildFromTemplate([ { id: 'toggleWindowVisibility', - label: messages[mainWindow.isVisible() ? 'appMenuHide' : 'show'].message, + label: + messages[mainWindow.isVisible() ? 'appMenuHide' : 'show'].message, click: tray.toggleWindowVisibility, }, { diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index 097556d16..3f3cb13c4 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -391,7 +391,10 @@ this.window.addEventListener('resize', this.onResize); this.onFocus = () => { - if (this.$el.css('display') !== 'none') { + if ( + this.$el.css('display') !== 'none' && + this.$el.css('display') !== '' + ) { this.markRead(); } }; From 1da4ae69c2f5bb99b2d722a5e93cf6e71db0d432 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 10 Sep 2020 15:52:36 +1000 Subject: [PATCH 175/274] render NoteToSelf list item as a normal conversation --- js/background.js | 8 ++++++++ js/models/conversations.js | 2 +- stylesheets/_modules.scss | 5 ----- ts/components/ConversationListItem.tsx | 7 ++++--- ts/components/session/ActionsPanel.tsx | 1 + ts/receiver/dataMessage.ts | 2 +- ts/util/getInitials.ts | 2 +- ts/window.d.ts | 1 + 8 files changed, 17 insertions(+), 11 deletions(-) diff --git a/js/background.js b/js/background.js index 8707c3a8b..094d63fee 100644 --- a/js/background.js +++ b/js/background.js @@ -550,6 +550,13 @@ window.dispatchEvent(new Event('storage_ready')); window.log.info('Cleanup: starting...'); + window.getOurDisplayName = () => { + const ourNumber = window.storage.get('primaryDevicePubKey'); + const conversation = ConversationController.get(ourNumber, 'private'); + const profile = conversation.getLokiProfile(); + return profile && profile.displayName; + }; + const results = await Promise.all([ window.Signal.Data.getOutgoingWithoutExpiresAt({ MessageCollection: Whisper.MessageCollection, @@ -690,6 +697,7 @@ window.showSeedDialog = window.owsDesktopApp.appView.showSeedDialog; window.showPasswordDialog = window.owsDesktopApp.appView.showPasswordDialog; + window.showEditProfileDialog = async callback => { const ourNumber = window.storage.get('primaryDevicePubKey'); const conversation = await ConversationController.getOrCreateAndWait( diff --git a/js/models/conversations.js b/js/models/conversations.js index 578604373..e2be0e221 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -1995,7 +1995,7 @@ }); } - // if set to null, it will show a jazzIcon + // if set to null, it will show a placeholder with color and first letter await this.setProfileAvatar({ path: newProfile.avatar }); await this.updateProfileName(); diff --git a/stylesheets/_modules.scss b/stylesheets/_modules.scss index 2d603f543..c595ca77b 100644 --- a/stylesheets/_modules.scss +++ b/stylesheets/_modules.scss @@ -1517,10 +1517,6 @@ background-color: $color-dark-70; } - .module-avatar { - background-color: $color-dark-85; - } - &--is-blocked { @include themify($themes) { border-left: 4px solid themed('destructive') !important; @@ -1579,7 +1575,6 @@ text-overflow: ellipsis; font-weight: 300; - color: $color-gray-05; } .module-conversation-list-item__header__name--with-unread { diff --git a/ts/components/ConversationListItem.tsx b/ts/components/ConversationListItem.tsx index 0b2a71ef5..9e90ec3a4 100644 --- a/ts/components/ConversationListItem.tsx +++ b/ts/components/ConversationListItem.tsx @@ -139,7 +139,7 @@ export class ConversationListItem extends React.PureComponent { : null )} > - {isMe ? i18n('noteToSelf') : this.renderUser()} + {this.renderUser()}
{this.renderUnread()} { @@ -347,18 +347,19 @@ export class ConversationListItem extends React.PureComponent { } private renderUser() { - const { name, phoneNumber, profileName } = this.props; + const { name, phoneNumber, profileName, isMe, i18n } = this.props; const shortenedPubkey = window.shortenPubkey(phoneNumber); const displayedPubkey = profileName ? shortenedPubkey : phoneNumber; + const displayName = isMe ? i18n('noteToSelf') : profileName; return (
{ phoneNumber={window.storage.get('primaryDevicePubKey')} size={28} onAvatarClick={handleClick} + profileName={window.getOurDisplayName()} /> ); } diff --git a/ts/receiver/dataMessage.ts b/ts/receiver/dataMessage.ts index ac0787d2a..907cd8daa 100644 --- a/ts/receiver/dataMessage.ts +++ b/ts/receiver/dataMessage.ts @@ -43,7 +43,7 @@ export async function updateProfile( isRaw: true, }); - // null => use jazzicon + // null => use placeholder with color and first letter let path = null; if (profileKey) { // Convert profileKey to ArrayBuffer, if needed diff --git a/ts/util/getInitials.ts b/ts/util/getInitials.ts index 1b38c0984..8f7e30b5e 100644 --- a/ts/util/getInitials.ts +++ b/ts/util/getInitials.ts @@ -17,5 +17,5 @@ export function getInitials(name?: string): string | undefined { return; } - return initials.slice(0, 2).join(''); + return initials[0]; } diff --git a/ts/window.d.ts b/ts/window.d.ts index 52a3f7e59..51387b0d3 100644 --- a/ts/window.d.ts +++ b/ts/window.d.ts @@ -80,6 +80,7 @@ declare global { setSettingValue: any; shortenPubkey: any; showEditProfileDialog: any; + getOurDisplayName: () => string | undefined; showPasswordDialog: any; showSeedDialog: any; storage: any; From 28eec84783455f7d660f82dc3c1e9620570a0fcd Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 10 Sep 2020 15:53:36 +1000 Subject: [PATCH 176/274] remove JazzIcon and use instead a colored circle with Initial --- ts/components/Avatar.tsx | 73 +++----- .../AvatarPlaceHolder/AvatarPlaceHolder.tsx | 101 +++++++++++ ts/components/AvatarPlaceHolder/index.ts | 1 + ts/components/JazzIcon/JazzIcon.tsx | 166 ------------------ ts/components/JazzIcon/Paper.tsx | 25 --- ts/components/JazzIcon/RNG.tsx | 21 --- ts/components/JazzIcon/index.tsx | 2 - 7 files changed, 122 insertions(+), 267 deletions(-) create mode 100644 ts/components/AvatarPlaceHolder/AvatarPlaceHolder.tsx create mode 100644 ts/components/AvatarPlaceHolder/index.ts delete mode 100644 ts/components/JazzIcon/JazzIcon.tsx delete mode 100644 ts/components/JazzIcon/Paper.tsx delete mode 100644 ts/components/JazzIcon/RNG.tsx delete mode 100644 ts/components/JazzIcon/index.tsx diff --git a/ts/components/Avatar.tsx b/ts/components/Avatar.tsx index 6adb05d16..4c85c5e65 100644 --- a/ts/components/Avatar.tsx +++ b/ts/components/Avatar.tsx @@ -1,9 +1,9 @@ import React from 'react'; import classNames from 'classnames'; -import { JazzIcon } from './JazzIcon'; import { getInitials } from '../util/getInitials'; import { LocalizerType } from '../types/Util'; +import { AvatarPlaceHolder } from './AvatarPlaceHolder'; interface Props { avatarPath?: string; @@ -48,30 +48,25 @@ export class Avatar extends React.PureComponent { } public renderIdenticon() { - const { phoneNumber, borderColor, borderWidth, size } = this.props; + const { phoneNumber, size, name, profileName } = this.props; if (!phoneNumber) { - return this.renderNoImage(); + throw new Error('Empty phoneNumber for identifcon'); } - const borderStyle = this.getBorderStyle(borderColor, borderWidth); - - // Generate the seed - const hash = phoneNumber.substring(0, 12); - const seed = parseInt(hash, 16) || 1234; - - return ; + const userName = profileName || name; + return ( + + ); } public renderImage() { - const { - avatarPath, - name, - phoneNumber, - profileName, - borderColor, - borderWidth, - } = this.props; + const { avatarPath, name, phoneNumber, profileName } = this.props; const { imageBroken } = this.state; if (!avatarPath || imageBroken) { @@ -82,11 +77,8 @@ export class Avatar extends React.PureComponent { !name && profileName ? ` ~${profileName}` : '' }`; - const borderStyle = this.getBorderStyle(borderColor, borderWidth); - return ( {window.i18n('contactAvatarAlt', { } public renderNoImage() { - const { - conversationType, - name, - noteToSelf, - size, - borderColor, - borderWidth, - } = this.props; + const { conversationType, name, noteToSelf, size } = this.props; const initials = getInitials(name); const isGroup = conversationType === 'group'; @@ -119,8 +104,6 @@ export class Avatar extends React.PureComponent { ); } - const borderStyle = this.getBorderStyle(borderColor, borderWidth); - if (!isGroup && initials) { return (
{ 'module-avatar__label', `module-avatar__label--${size}` )} - style={borderStyle} > {initials}
@@ -142,24 +124,17 @@ export class Avatar extends React.PureComponent { `module-avatar__icon--${conversationType}`, `module-avatar__icon--${size}` )} - style={borderStyle} /> ); } public render() { - const { - avatarPath, - color, - size, - noteToSelf, - conversationType, - } = this.props; + const { avatarPath, color, size, conversationType } = this.props; const { imageBroken } = this.state; // If it's a direct conversation then we must have an identicon const hasAvatar = avatarPath || conversationType === 'direct'; - const hasImage = !noteToSelf && hasAvatar && !imageBroken; + const hasImage = hasAvatar && !imageBroken; if ( size !== 28 && @@ -207,17 +182,9 @@ export class Avatar extends React.PureComponent { : this.renderIdenticon(); } - private getBorderStyle(_color?: string, _width?: number) { - //const borderWidth = typeof width === 'number' ? width : 3; - - // no border at all for now - return undefined; - /* return color - ? { - borderColor: color, - borderStyle: 'solid', - borderWidth: borderWidth, - } - : undefined; */ + private getAvatarColors(): Array { + // const theme = window.Events.getThemedSettings(); + // defined in session-android as `profile_picture_placeholder_colors` + return ['#5ff8b0', '#26cdb9', '#f3c615', '#fcac5a']; } } diff --git a/ts/components/AvatarPlaceHolder/AvatarPlaceHolder.tsx b/ts/components/AvatarPlaceHolder/AvatarPlaceHolder.tsx new file mode 100644 index 000000000..da9929a43 --- /dev/null +++ b/ts/components/AvatarPlaceHolder/AvatarPlaceHolder.tsx @@ -0,0 +1,101 @@ +import React from 'react'; +import { getInitials } from '../../util/getInitials'; + +interface Props { + diameter: number; + phoneNumber: string; + colors: Array; + name?: string; +} + +interface State { + sha512Seed?: string; +} + +export class AvatarPlaceHolder extends React.PureComponent { + public constructor(props: Props) { + super(props); + + this.state = { + sha512Seed: undefined, + }; + } + + public componentDidMount() { + void this.sha512(this.props.phoneNumber).then((sha512Seed: string) => { + this.setState({ sha512Seed }); + }); + } + + public componentDidUpdate(prevProps: Props, prevState: State) { + if (this.props.phoneNumber === prevProps.phoneNumber) { + return; + } + void this.sha512(this.props.phoneNumber).then((sha512Seed: string) => { + this.setState({ sha512Seed }); + }); + } + + public render() { + if (!this.state.sha512Seed) { + return <>; + } + + const { colors, diameter, phoneNumber, name } = this.props; + const r = diameter / 2; + const initial = + getInitials(name)?.toLocaleUpperCase() || + getInitials(phoneNumber)?.toLocaleUpperCase() || + '0'; + const viewBox = `0 0 ${diameter} ${diameter}`; + const fontSize = diameter * 0.5; + + // Generate the seed simulate the .hashCode as Java + const hash = parseInt(this.state.sha512Seed.substring(0, 12), 16) || 0; + + const bgColorIndex = hash % colors.length; + + const bgColor = colors[bgColorIndex]; + + return ( + + + + + {initial} + + + + ); + } + + private async sha512(str: string) { + // tslint:disable-next-line: await-promise + const buf = await crypto.subtle.digest( + 'SHA-512', + new TextEncoder().encode(str) + ); + + // tslint:disable: prefer-template restrict-plus-operands + return Array.prototype.map + .call(new Uint8Array(buf), (x: any) => ('00' + x.toString(16)).slice(-2)) + .join(''); + } +} diff --git a/ts/components/AvatarPlaceHolder/index.ts b/ts/components/AvatarPlaceHolder/index.ts new file mode 100644 index 000000000..5b9cfd23a --- /dev/null +++ b/ts/components/AvatarPlaceHolder/index.ts @@ -0,0 +1 @@ +export { AvatarPlaceHolder } from './AvatarPlaceHolder'; diff --git a/ts/components/JazzIcon/JazzIcon.tsx b/ts/components/JazzIcon/JazzIcon.tsx deleted file mode 100644 index 3cc17044b..000000000 --- a/ts/components/JazzIcon/JazzIcon.tsx +++ /dev/null @@ -1,166 +0,0 @@ -// Modified from https://github.com/redlanta/react-jazzicon - -import React from 'react'; -import Color from 'color'; -import { Paper } from './Paper'; -import { RNG } from './RNG'; - -const defaultColors = [ - '#01888c', // teal - '#fc7500', // bright orange - '#034f5d', // dark teal - '#E784BA', // light pink - '#81C8B6', // bright green - '#c7144c', // raspberry - '#f3c100', // goldenrod - '#1598f2', // lightning blue - '#2465e1', // sail blue - '#f19e02', // gold -]; - -const isColor = (str: string) => /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(str); -const isColors = (arr: Array) => { - if (!Array.isArray(arr)) { - return false; - } - - if (arr.every(value => typeof value === 'string' && isColor(value))) { - return true; - } - - return false; -}; - -interface Props { - diameter: number; - seed: number; - paperStyles?: Object; - svgStyles?: Object; - shapeCount?: number; - wobble?: number; - colors?: Array; -} - -// tslint:disable-next-line no-http-string -const svgns = 'http://www.w3.org/2000/svg'; -const shapeCount = 4; -const wobble = 30; - -export class JazzIcon extends React.PureComponent { - public render() { - const { - colors: customColors, - diameter, - paperStyles, - seed, - svgStyles, - } = this.props; - - const generator = new RNG(seed); - - const colors = customColors || defaultColors; - - const newColours = this.hueShift( - this.colorsForIcon(colors).slice(), - generator - ); - const shapesArr = Array(shapeCount).fill(null); - const shuffledColours = this.shuffleArray(newColours, generator); - - return ( - - - {shapesArr.map((_, i) => - this.genShape( - shuffledColours[i + 1], - diameter, - i, - shapeCount - 1, - generator - ) - )} - - - ); - } - - private hueShift(colors: Array, generator: RNG) { - const amount = generator.random() * 30 - wobble / 2; - - return colors.map(hex => - Color(hex) - .rotate(amount) - .hex() - ); - } - - private genShape( - colour: string, - diameter: number, - i: number, - total: number, - generator: RNG - ) { - const center = diameter / 2; - const firstRot = generator.random(); - const angle = Math.PI * 2 * firstRot; - const velocity = - (diameter / total) * generator.random() + (i * diameter) / total; - const tx = Math.cos(angle) * velocity; - const ty = Math.sin(angle) * velocity; - const translate = `translate(${tx} ${ty})`; - - // Third random is a shape rotation on top of all of that. - const secondRot = generator.random(); - const rot = firstRot * 360 + secondRot * 180; - const rotate = `rotate(${rot.toFixed(1)} ${center} ${center})`; - const transform = `${translate} ${rotate}`; - - return ( - - ); - } - - private colorsForIcon(arr: Array) { - if (isColors(arr)) { - return arr; - } - - return defaultColors; - } - - private shuffleArray(array: Array, generator: RNG) { - let currentIndex = array.length; - const newArray = [...array]; - - // While there remain elements to shuffle... - while (currentIndex > 0) { - // Pick a remaining element... - const randomIndex = generator.next() % currentIndex; - currentIndex -= 1; - // And swap it with the current element. - const temporaryValue = newArray[currentIndex]; - newArray[currentIndex] = newArray[randomIndex]; - newArray[randomIndex] = temporaryValue; - } - - return newArray; - } -} diff --git a/ts/components/JazzIcon/Paper.tsx b/ts/components/JazzIcon/Paper.tsx deleted file mode 100644 index ee3791637..000000000 --- a/ts/components/JazzIcon/Paper.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import React from 'react'; - -const styles = { - borderRadius: '50%', - display: 'inline-block', - margin: 0, - overflow: 'hidden', - padding: 0, -}; - -// @ts-ignore -export const Paper = ({ children, color, diameter, style: styleOverrides }) => ( -
- {children} -
-); diff --git a/ts/components/JazzIcon/RNG.tsx b/ts/components/JazzIcon/RNG.tsx deleted file mode 100644 index b6c18ac6b..000000000 --- a/ts/components/JazzIcon/RNG.tsx +++ /dev/null @@ -1,21 +0,0 @@ -export class RNG { - private _seed: number; - constructor(seed: number) { - this._seed = seed % 2147483647; - if (this._seed <= 0) { - this._seed += 2147483646; - } - } - - public next() { - return (this._seed = (this._seed * 16807) % 2147483647); - } - - public nextFloat() { - return (this.next() - 1) / 2147483646; - } - - public random() { - return this.nextFloat(); - } -} diff --git a/ts/components/JazzIcon/index.tsx b/ts/components/JazzIcon/index.tsx deleted file mode 100644 index 204774dc6..000000000 --- a/ts/components/JazzIcon/index.tsx +++ /dev/null @@ -1,2 +0,0 @@ -import { JazzIcon } from './JazzIcon'; -export { JazzIcon }; From bc8999e0b61422dc58d143ef35466c709ac6f282 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 10 Sep 2020 16:16:46 +1000 Subject: [PATCH 177/274] fix tests --- test/views/inbox_view_test.js | 1 + ts/components/Avatar.tsx | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/test/views/inbox_view_test.js b/test/views/inbox_view_test.js index dea936399..c16b24ef4 100644 --- a/test/views/inbox_view_test.js +++ b/test/views/inbox_view_test.js @@ -22,6 +22,7 @@ describe('InboxView', () => { textsecure.storage.user.getNumber(), 'private' ); + window.getOurDisplayName = () => 'display name test'; inboxView = new Whisper.InboxView({ model: {}, window, diff --git a/ts/components/Avatar.tsx b/ts/components/Avatar.tsx index 4c85c5e65..28762e5e0 100644 --- a/ts/components/Avatar.tsx +++ b/ts/components/Avatar.tsx @@ -51,7 +51,8 @@ export class Avatar extends React.PureComponent { const { phoneNumber, size, name, profileName } = this.props; if (!phoneNumber) { - throw new Error('Empty phoneNumber for identifcon'); + window.log.error('Empty phoneNumber for identicon'); + return <>; } const userName = profileName || name; From 35ea6af27fa0041d813cf48e94662c676f216de0 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 11 Sep 2020 15:06:13 +1000 Subject: [PATCH 178/274] Add group avatar as on mobile: with multiple group members avatar --- js/models/conversations.d.ts | 2 + stylesheets/_avatar.scss | 11 +-- stylesheets/themes.scss | 13 ++-- ts/components/Avatar.tsx | 38 +++++++++-- .../AvatarPlaceHolder/AvatarPlaceHolder.tsx | 7 +- .../AvatarPlaceHolder/ClosedGroupAvatar.tsx | 67 +++++++++++++++++++ ts/components/AvatarPlaceHolder/index.ts | 1 + ts/components/ConversationListItem.tsx | 43 ++++++++++-- ts/components/LeftPane.tsx | 12 +++- ts/components/UserDetailsDialog.tsx | 1 - .../conversation/ConversationHeader.tsx | 6 +- ts/components/conversation/MemberList.tsx | 1 + .../conversation/UpdateGroupNameDialog.tsx | 1 + ts/components/conversation/_contactUtil.tsx | 1 + .../session/LeftPaneMessageSection.tsx | 39 ++--------- .../session/SessionGroupSettings.tsx | 1 + ts/state/selectors/conversations.ts | 6 +- 17 files changed, 180 insertions(+), 70 deletions(-) create mode 100644 ts/components/AvatarPlaceHolder/ClosedGroupAvatar.tsx diff --git a/js/models/conversations.d.ts b/js/models/conversations.d.ts index cc0432437..4556d85d2 100644 --- a/js/models/conversations.d.ts +++ b/js/models/conversations.d.ts @@ -15,6 +15,8 @@ interface ConversationAttributes { timestamp: number; // timestamp of what? groupAdmins?: Array; isKickedFromGroup?: boolean; + avatarPath?: string; + isMe?: boolean; } export interface ConversationModel diff --git a/stylesheets/_avatar.scss b/stylesheets/_avatar.scss index 02efb2fe3..caa899939 100644 --- a/stylesheets/_avatar.scss +++ b/stylesheets/_avatar.scss @@ -9,6 +9,7 @@ img { object-fit: cover; border-radius: 50%; + border: 1px solid $borderAvatarColor; } } @@ -167,8 +168,6 @@ @include color-svg('../images/note-28.svg', $color-white); } -// Module: Avatar - .module-avatar__label { color: $color-gray-05; } @@ -189,8 +188,10 @@ background-color: $color-gray-75; } -.module-avatar--no-image { - @include themify($themes) { - background-color: themed('steelColorShade'); +.module-avatar__icon-closed { + .module-avatar:last-child { + position: absolute; + right: 0px; + bottom: 0px; } } diff --git a/stylesheets/themes.scss b/stylesheets/themes.scss index 45abec93d..cf5b80caf 100644 --- a/stylesheets/themes.scss +++ b/stylesheets/themes.scss @@ -6,6 +6,11 @@ $destructive: #ff453a; $accentLightTheme: #00e97b; $accentDarkTheme: #00f782; +$borderLightTheme: #f1f1f1; // search for references on ts TODO: make this exposed on ts +$borderDarkTheme: rgba($white, 0.06); + +$borderAvatarColor: #000a; // search for references on ts TODO: make this exposed on ts + $themes: ( light: ( accent: $accentLightTheme, @@ -40,7 +45,7 @@ $themes: ( conversationItemHasUnread: #fcfcfc, conversationItemSelected: #f0f0f0, clickableHovered: #dfdfdf, - sessionBorder: 1px solid #f1f1f1, + sessionBorder: 1px solid $borderLightTheme, sessionUnreadBorder: 4px solid $accentLightTheme, leftpaneOverlayBackground: $white, // scrollbars @@ -52,8 +57,6 @@ $themes: ( // context menu contextMenuBackground: #f5f5f5, filterSessionText: brightness(0) saturate(100%), - steelColor: #6b6b78, - steelColorShade: #5a5a63, lastSeenIndicatorColor: #62656a, lastSeenIndicatorTextColor: #070c14, quoteBottomBarBackground: #f0f0f0, @@ -91,7 +94,7 @@ $themes: ( conversationItemHasUnread: #2c2c2c, conversationItemSelected: #404040, clickableHovered: #414347, - sessionBorder: 1px solid rgba($white, 0.06), + sessionBorder: 1px solid $borderDarkTheme, sessionUnreadBorder: 4px solid $accentDarkTheme, leftpaneOverlayBackground: linear-gradient(180deg, #171717 0%, #121212 100%), // scrollbars @@ -103,8 +106,6 @@ $themes: ( // context menu contextMenuBackground: #212121, filterSessionText: none, - steelColor: #6b6b78, - steelColorShade: #5a5a63, lastSeenIndicatorColor: #353535, lastSeenIndicatorTextColor: #a8a9aa, quoteBottomBarBackground: #404040, diff --git a/ts/components/Avatar.tsx b/ts/components/Avatar.tsx index 28762e5e0..0ff7cb3f6 100644 --- a/ts/components/Avatar.tsx +++ b/ts/components/Avatar.tsx @@ -3,19 +3,20 @@ import classNames from 'classnames'; import { getInitials } from '../util/getInitials'; import { LocalizerType } from '../types/Util'; -import { AvatarPlaceHolder } from './AvatarPlaceHolder'; +import { AvatarPlaceHolder, ClosedGroupAvatar } from './AvatarPlaceHolder'; +import { ConversationAttributes } from '../../js/models/conversations'; interface Props { avatarPath?: string; color?: string; conversationType: 'group' | 'direct'; + isPublic?: boolean; noteToSelf?: boolean; name?: string; phoneNumber?: string; profileName?: string; size: number; - borderColor?: string; - borderWidth?: number; + closedMemberConversations?: Array; i18n?: LocalizerType; onAvatarClick?: () => void; } @@ -40,8 +41,9 @@ export class Avatar extends React.PureComponent { } public handleImageError() { - // tslint:disable-next-line no-console - console.log('Avatar: Image failed to load; failing over to placeholder'); + window.log.warn( + 'Avatar: Image failed to load; failing over to placeholder' + ); this.setState({ imageBroken: true, }); @@ -62,6 +64,7 @@ export class Avatar extends React.PureComponent { diameter={size} name={userName} colors={this.getAvatarColors()} + borderColor={this.getAvatarBorderColor()} /> ); } @@ -88,7 +91,15 @@ export class Avatar extends React.PureComponent { } public renderNoImage() { - const { conversationType, name, noteToSelf, size } = this.props; + const { + conversationType, + closedMemberConversations, + isPublic, + name, + noteToSelf, + size, + i18n, + } = this.props; const initials = getInitials(name); const isGroup = conversationType === 'group'; @@ -118,6 +129,17 @@ export class Avatar extends React.PureComponent { ); } + if (isGroup && !isPublic && closedMemberConversations) { + const forcedI18n = i18n || window.i18n; + return ( + + ); + } + return (
{ // defined in session-android as `profile_picture_placeholder_colors` return ['#5ff8b0', '#26cdb9', '#f3c615', '#fcac5a']; } + + private getAvatarBorderColor(): string { + return '#000A'; // borderAvatarColor in themes.scss + } } diff --git a/ts/components/AvatarPlaceHolder/AvatarPlaceHolder.tsx b/ts/components/AvatarPlaceHolder/AvatarPlaceHolder.tsx index da9929a43..056be82bd 100644 --- a/ts/components/AvatarPlaceHolder/AvatarPlaceHolder.tsx +++ b/ts/components/AvatarPlaceHolder/AvatarPlaceHolder.tsx @@ -5,6 +5,7 @@ interface Props { diameter: number; phoneNumber: string; colors: Array; + borderColor: string; name?: string; } @@ -41,7 +42,7 @@ export class AvatarPlaceHolder extends React.PureComponent { return <>; } - const { colors, diameter, phoneNumber, name } = this.props; + const { borderColor, colors, diameter, phoneNumber, name } = this.props; const r = diameter / 2; const initial = getInitials(name)?.toLocaleUpperCase() || @@ -66,8 +67,8 @@ export class AvatarPlaceHolder extends React.PureComponent { r={r} fill={bgColor} shape-rendering="geometricPrecision" - // stroke="black" - // stroke-width="1" + stroke={borderColor} + stroke-width="1" /> ; + i18n: LocalizerType; +} + +export class ClosedGroupAvatar extends React.PureComponent { + public render() { + const { conversations, size, i18n } = this.props; + + if (conversations.length === 1) { + const conv = conversations[0]; + return ( + + ); + } else if (conversations.length > 1) { + // in a closed group avatar, each visible avatar member size is 2/3 of the group avatar in size + const avatarsDiameter = 28; //FIXME audric (size * 2) / 3; + const conv1 = conversations[0]; + const conv2 = conversations[1]; + // use the 2 first members as group avatars + return ( +
+ + +
+ ); + } else { + return <>; + } + } +} diff --git a/ts/components/AvatarPlaceHolder/index.ts b/ts/components/AvatarPlaceHolder/index.ts index 5b9cfd23a..f6f819bd6 100644 --- a/ts/components/AvatarPlaceHolder/index.ts +++ b/ts/components/AvatarPlaceHolder/index.ts @@ -1 +1,2 @@ export { AvatarPlaceHolder } from './AvatarPlaceHolder'; +export { ClosedGroupAvatar } from './ClosedGroupAvatar'; diff --git a/ts/components/ConversationListItem.tsx b/ts/components/ConversationListItem.tsx index 9e90ec3a4..a8bfe939f 100644 --- a/ts/components/ConversationListItem.tsx +++ b/ts/components/ConversationListItem.tsx @@ -10,7 +10,7 @@ import { Timestamp } from './conversation/Timestamp'; import { ContactName } from './conversation/ContactName'; import { TypingAnimation } from './conversation/TypingAnimation'; -import { Colors, LocalizerType } from '../types/Util'; +import { LocalizerType } from '../types/Util'; import { getBlockMenuItem, getClearNicknameMenuItem, @@ -20,6 +20,9 @@ import { getInviteContactMenuItem, getLeaveGroupMenuItem, } from '../session/utils/Menu'; +import { ConversationAttributes } from '../../js/models/conversations'; +import { GroupUtils } from '../session/utils'; +import { PubKey } from '../session/types'; export type PropsData = { id: string; @@ -71,7 +74,32 @@ type PropsHousekeeping = { type Props = PropsData & PropsHousekeeping; -export class ConversationListItem extends React.PureComponent { +type State = { + closedMemberConversations?: Array; +}; + +export class ConversationListItem extends React.PureComponent { + public constructor(props: Props) { + super(props); + this.state = { closedMemberConversations: undefined }; + } + + public componentDidMount() { + void this.fetchClosedConversationDetails(); + } + + public async fetchClosedConversationDetails() { + if (!this.props.isPublic && this.props.type === 'group') { + const groupId = this.props.phoneNumber; + const members = await GroupUtils.getGroupMembers(PubKey.cast(groupId)); + const membersConvos = members.map(m => + window.ConversationController.get(m.key) + ); + + this.setState({ closedMemberConversations: membersConvos }); + } + } + public renderAvatar() { const { avatarPath, @@ -82,10 +110,14 @@ export class ConversationListItem extends React.PureComponent { name, phoneNumber, profileName, - isOnline, + isPublic, } = this.props; - const borderColor = isOnline ? Colors.ONLINE : Colors.OFFLINE; + if (!isPublic && type === 'group') { + if (!this.state.closedMemberConversations) { + return <>; + } + } const iconSize = 36; @@ -101,7 +133,8 @@ export class ConversationListItem extends React.PureComponent { phoneNumber={phoneNumber} profileName={profileName} size={iconSize} - borderColor={borderColor} + isPublic={isPublic} + closedMemberConversations={this.state.closedMemberConversations} />
); diff --git a/ts/components/LeftPane.tsx b/ts/components/LeftPane.tsx index a4c4c600c..dbf97a13e 100644 --- a/ts/components/LeftPane.tsx +++ b/ts/components/LeftPane.tsx @@ -112,6 +112,7 @@ export class LeftPane extends React.Component { const { openConversationInternal, conversations, + contacts, searchResults, searchTerm, isSecondaryDevice, @@ -119,12 +120,19 @@ export class LeftPane extends React.Component { search, clearSearch, } = this.props; + // be sure to filter out secondary conversations + let filteredConversations = conversations; + if (conversations !== undefined) { + filteredConversations = conversations.filter( + conversation => !conversation.isSecondary + ); + } return ( { profileName={this.props.profileName} size={size} onAvatarClick={this.handleShowEnlargedDialog} - borderWidth={size / 2} /> ); } diff --git a/ts/components/conversation/ConversationHeader.tsx b/ts/components/conversation/ConversationHeader.tsx index c097a2ad1..451e2576c 100644 --- a/ts/components/conversation/ConversationHeader.tsx +++ b/ts/components/conversation/ConversationHeader.tsx @@ -202,10 +202,9 @@ export class ConversationHeader extends React.Component { name, phoneNumber, profileName, - isOnline, + isPublic, } = this.props; - const borderColor = isOnline ? Colors.ONLINE : Colors.OFFLINE_LIGHT; const conversationType = isGroup ? 'group' : 'direct'; return ( @@ -219,11 +218,10 @@ export class ConversationHeader extends React.Component { phoneNumber={phoneNumber} profileName={profileName} size={28} - borderColor={borderColor} - borderWidth={0} onAvatarClick={() => { this.onAvatarClickBound(phoneNumber); }} + isPublic={isPublic} /> ); diff --git a/ts/components/conversation/MemberList.tsx b/ts/components/conversation/MemberList.tsx index 69a7c2d58..2d494a54c 100644 --- a/ts/components/conversation/MemberList.tsx +++ b/ts/components/conversation/MemberList.tsx @@ -101,6 +101,7 @@ class MemberItem extends React.Component { phoneNumber={this.props.member.authorPhoneNumber} profileName={this.props.member.authorProfileName} size={28} + isPublic={false} /> ); } diff --git a/ts/components/conversation/UpdateGroupNameDialog.tsx b/ts/components/conversation/UpdateGroupNameDialog.tsx index ad7f380e7..b0aa7a34d 100644 --- a/ts/components/conversation/UpdateGroupNameDialog.tsx +++ b/ts/components/conversation/UpdateGroupNameDialog.tsx @@ -179,6 +179,7 @@ export class UpdateGroupNameDialog extends React.Component { conversationType="group" i18n={this.props.i18n} size={80} + isPublic={isPublic} />
); } diff --git a/ts/components/session/LeftPaneMessageSection.tsx b/ts/components/session/LeftPaneMessageSection.tsx index e66eb8e56..a7c1a405d 100644 --- a/ts/components/session/LeftPaneMessageSection.tsx +++ b/ts/components/session/LeftPaneMessageSection.tsx @@ -77,19 +77,6 @@ export class LeftPaneMessageSection extends React.Component { valuePasted: '', }; - const conversations = this.getCurrentConversations(); - - const realConversations: Array = []; - if (conversations) { - conversations.forEach(conversation => { - const isRSS = - conversation.id && - !!(conversation.id && conversation.id.match(/^rss:/)); - - return !isRSS && realConversations.push(conversation); - }); - } - this.updateSearchBound = this.updateSearch.bind(this); this.handleOnPaste = this.handleOnPaste.bind(this); @@ -112,29 +99,12 @@ export class LeftPaneMessageSection extends React.Component { this.updateSearch(''); } - public getCurrentConversations(): - | Array - | undefined { - const { conversations } = this.props; - - let conversationList = conversations; - if (conversationList !== undefined) { - conversationList = conversationList.filter( - conversation => !conversation.isSecondary - ); - } - - return conversationList; - } - public renderRow = ({ index, key, style, }: RowRendererParamsType): JSX.Element => { - const { openConversationInternal } = this.props; - - const conversations = this.getCurrentConversations(); + const { conversations, openConversationInternal } = this.props; if (!conversations) { throw new Error('renderRow: Tried to render without conversations'); @@ -154,7 +124,11 @@ export class LeftPaneMessageSection extends React.Component { }; public renderList(): JSX.Element | Array { - const { openConversationInternal, searchResults } = this.props; + const { + conversations, + openConversationInternal, + searchResults, + } = this.props; const contacts = searchResults?.contacts || []; if (searchResults) { @@ -168,7 +142,6 @@ export class LeftPaneMessageSection extends React.Component { ); } - const conversations = this.getCurrentConversations(); if (!conversations) { throw new Error( 'render: must provided conversations if no search results are provided' diff --git a/ts/components/session/SessionGroupSettings.tsx b/ts/components/session/SessionGroupSettings.tsx index c94f09f9a..4b2f0f196 100644 --- a/ts/components/session/SessionGroupSettings.tsx +++ b/ts/components/session/SessionGroupSettings.tsx @@ -335,6 +335,7 @@ export class SessionGroupSettings extends React.Component { phoneNumber={id} conversationType="group" size={80} + isPublic={isPublic} />
{showInviteContacts && ( diff --git a/ts/state/selectors/conversations.ts b/ts/state/selectors/conversations.ts index f2189f24e..63b86af9e 100644 --- a/ts/state/selectors/conversations.ts +++ b/ts/state/selectors/conversations.ts @@ -108,12 +108,8 @@ export const _getLeftPaneLists = ( const archivedConversations: Array = []; const allContacts: Array = []; - const max = sorted.length; let unreadCount = 0; - - for (let i = 0; i < max; i += 1) { - let conversation = sorted[i]; - + for (let conversation of sorted) { if (selectedConversation === conversation.id) { conversation = { ...conversation, From 9576944191b7f395001bb26eae367436ae75ddef Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 11 Sep 2020 16:38:54 +1000 Subject: [PATCH 179/274] fix download of attachments on open group --- ts/receiver/receiver.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ts/receiver/receiver.ts b/ts/receiver/receiver.ts index 94309fbd1..b2ced26a1 100644 --- a/ts/receiver/receiver.ts +++ b/ts/receiver/receiver.ts @@ -1,9 +1,7 @@ // TODO: fix libloki and textsecure not being available here yet -import { handleEndSession } from './sessionHandling'; import { EnvelopePlus } from './types'; -import { downloadAttachment } from './attachments'; -import { handleMediumGroupUpdate } from './mediumGroups'; +export { downloadAttachment } from './attachments'; import { addToCache, getAllFromCache, removeFromCache } from './cache'; import { processMessage } from '../session/snode_api/swarmPolling'; From 0290c9a2bf2d4495e757231f4e0e355463a204fa Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 9 Sep 2020 15:01:05 +1000 Subject: [PATCH 180/274] fix segfault on app start with tray icon --- app/tray_icon.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/tray_icon.js b/app/tray_icon.js index f803ac6b0..88a32ac93 100644 --- a/app/tray_icon.js +++ b/app/tray_icon.js @@ -65,12 +65,12 @@ function createTrayIcon(getMainWindow, messages) { trayContextMenu = Menu.buildFromTemplate([ { id: 'toggleWindowVisibility', - label: messages[mainWindow.isVisible() ? 'hide' : 'show'].message, + label: messages[mainWindow.isVisible() ? 'appMenuHide' : 'show'].message, click: tray.toggleWindowVisibility, }, { id: 'quit', - label: messages.quit.message, + label: messages.appMenuQuit.message, click: app.quit.bind(app), }, ]); From a5474ac5e2e3c5ad8de6f0d338a7935715a76099 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 10 Sep 2020 09:06:05 +1000 Subject: [PATCH 181/274] fix read-receipt being sent onFocus on invalid conversation --- app/tray_icon.js | 3 ++- js/views/conversation_view.js | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/tray_icon.js b/app/tray_icon.js index 88a32ac93..7dfdf1fd2 100644 --- a/app/tray_icon.js +++ b/app/tray_icon.js @@ -65,7 +65,8 @@ function createTrayIcon(getMainWindow, messages) { trayContextMenu = Menu.buildFromTemplate([ { id: 'toggleWindowVisibility', - label: messages[mainWindow.isVisible() ? 'appMenuHide' : 'show'].message, + label: + messages[mainWindow.isVisible() ? 'appMenuHide' : 'show'].message, click: tray.toggleWindowVisibility, }, { diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index 097556d16..3f3cb13c4 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -391,7 +391,10 @@ this.window.addEventListener('resize', this.onResize); this.onFocus = () => { - if (this.$el.css('display') !== 'none') { + if ( + this.$el.css('display') !== 'none' && + this.$el.css('display') !== '' + ) { this.markRead(); } }; From ec64ad80b4807f8f4e9a1937d9571a9c9ead1d0d Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 11 Sep 2020 16:21:48 +1000 Subject: [PATCH 182/274] rename LOKI_FRIEND_REQUEST to FALLBACK_MESSAGE --- js/modules/metadata/CiphertextMessage.js | 2 +- js/modules/metadata/SecretSessionCipher.js | 10 +++++----- protos/UnidentifiedDelivery.proto | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/js/modules/metadata/CiphertextMessage.js b/js/modules/metadata/CiphertextMessage.js index 1e2ddb6ea..20274e204 100644 --- a/js/modules/metadata/CiphertextMessage.js +++ b/js/modules/metadata/CiphertextMessage.js @@ -11,5 +11,5 @@ module.exports = { ENCRYPTED_MESSAGE_OVERHEAD: 53, - LOKI_FRIEND_REQUEST: 101, + FALLBACK_MESSAGE: 101, }; diff --git a/js/modules/metadata/SecretSessionCipher.js b/js/modules/metadata/SecretSessionCipher.js index 5f8d38495..3e0166c42 100644 --- a/js/modules/metadata/SecretSessionCipher.js +++ b/js/modules/metadata/SecretSessionCipher.js @@ -199,8 +199,8 @@ function _createUnidentifiedSenderMessageContentFromBuffer(serialized) { case TypeEnum.PREKEY_MESSAGE: type = CiphertextMessage.PREKEY_TYPE; break; - case TypeEnum.LOKI_FRIEND_REQUEST: - type = CiphertextMessage.LOKI_FRIEND_REQUEST; + case TypeEnum.FALLBACK_MESSAGE: + type = CiphertextMessage.FALLBACK_MESSAGE; break; default: throw new Error(`Unknown type: ${message.type}`); @@ -226,8 +226,8 @@ function _getProtoMessageType(type) { return TypeEnum.MESSAGE; case CiphertextMessage.PREKEY_TYPE: return TypeEnum.PREKEY_MESSAGE; - case CiphertextMessage.LOKI_FRIEND_REQUEST: - return TypeEnum.LOKI_FRIEND_REQUEST; + case CiphertextMessage.FALLBACK_MESSAGE: + return TypeEnum.FALLBACK_MESSAGE; default: throw new Error(`_getProtoMessageType: type '${type}' does not exist`); } @@ -481,7 +481,7 @@ SecretSessionCipher.prototype = { signalProtocolStore, sender ).decryptPreKeyWhisperMessage(message.content); - case CiphertextMessage.LOKI_FRIEND_REQUEST: + case CiphertextMessage.FALLBACK_MESSAGE: return new libloki.crypto.FallBackSessionCipher(sender).decrypt( message.content ); diff --git a/protos/UnidentifiedDelivery.proto b/protos/UnidentifiedDelivery.proto index 9b49b8c9b..ee7422d65 100644 --- a/protos/UnidentifiedDelivery.proto +++ b/protos/UnidentifiedDelivery.proto @@ -25,7 +25,7 @@ message UnidentifiedSenderMessage { enum Type { PREKEY_MESSAGE = 1; MESSAGE = 2; - LOKI_FRIEND_REQUEST = 3; + FALLBACK_MESSAGE = 3; } optional Type type = 1; From 7054268b14aff69dec7c6b8d570fba69cb57cdf6 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 11 Sep 2020 16:32:26 +1000 Subject: [PATCH 183/274] use source from decoded content and not envelope on ssk --- ts/receiver/contentMessage.ts | 19 +++++++++++++++---- ts/session/sending/MessageSender.ts | 13 +++++++++++-- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/ts/receiver/contentMessage.ts b/ts/receiver/contentMessage.ts index 87439cb82..4425a528c 100644 --- a/ts/receiver/contentMessage.ts +++ b/ts/receiver/contentMessage.ts @@ -18,6 +18,7 @@ import ByteBuffer from 'bytebuffer'; import { BlockedNumberController } from '../util/blockedNumberController'; import { decryptWithSenderKey } from '../session/medium_group/ratchet'; import { StringUtils } from '../session/utils'; +import { UserUtil } from '../util'; export async function handleContentMessage(envelope: EnvelopePlus) { const plaintext = await decrypt(envelope, envelope.content); @@ -46,8 +47,6 @@ async function decryptForMediumGroup( throw new Error(`Secret key is empty for group ${groupId}!`); } - const { senderIdentity } = envelope; - const { ciphertext: outerCiphertext, ephemeralKey, @@ -64,15 +63,27 @@ async function decryptForMediumGroup( outerCiphertext ); - const { ciphertext, keyIdx } = SignalService.MediumGroupCiphertext.decode( + const { + source, + ciphertext, + keyIdx, + } = SignalService.MediumGroupCiphertext.decode( new Uint8Array(mediumGroupCiphertext) ); + const ourNumber = (await UserUtil.getCurrentDevicePubKey()) as string; + + if (source === ourNumber) { + window.console.info( + 'Dropping message from ourself after decryptForMediumGroup' + ); + return; + } const plaintext = await decryptWithSenderKey( ciphertext, keyIdx, groupId, - senderIdentity + source ); return plaintext; diff --git a/ts/session/sending/MessageSender.ts b/ts/session/sending/MessageSender.ts index 1477e25ce..6d28cbcb9 100644 --- a/ts/session/sending/MessageSender.ts +++ b/ts/session/sending/MessageSender.ts @@ -39,7 +39,12 @@ export async function send( plainTextBuffer, encryption ); - const envelope = await buildEnvelope(envelopeType, timestamp, cipherText); + const envelope = await buildEnvelope( + envelopeType, + device.key, + timestamp, + cipherText + ); const data = wrapEnvelope(envelope); return pRetry( @@ -54,11 +59,15 @@ export async function send( async function buildEnvelope( type: SignalService.Envelope.Type, + sskSource: string | undefined, timestamp: number, content: Uint8Array ): Promise { let source: string | undefined; - if (type !== SignalService.Envelope.Type.UNIDENTIFIED_SENDER) { + + if (type === SignalService.Envelope.Type.MEDIUM_GROUP_CIPHERTEXT) { + source = sskSource; + } else if (type !== SignalService.Envelope.Type.UNIDENTIFIED_SENDER) { source = await UserUtil.getCurrentDevicePubKey(); } From 9584d0a1afe3ba35deaecab3bb385991ca4c34a1 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 14 Sep 2020 14:29:37 +1000 Subject: [PATCH 184/274] fix closed group avatar for conversationlistItem --- stylesheets/_avatar.scss | 1 + stylesheets/themes.scss | 2 +- ts/components/Avatar.tsx | 2 +- .../AvatarPlaceHolder/ClosedGroupAvatar.tsx | 25 ++++++++++++++++++- ts/components/ConversationListItem.tsx | 20 +++++++-------- 5 files changed, 36 insertions(+), 14 deletions(-) diff --git a/stylesheets/_avatar.scss b/stylesheets/_avatar.scss index caa899939..ba61d4076 100644 --- a/stylesheets/_avatar.scss +++ b/stylesheets/_avatar.scss @@ -55,6 +55,7 @@ @include color-svg('../images/profile-individual.svg', $color-white); } +.module-avatar__icon-closed .module-avatar--28, .module-avatar--28 { height: 28px; width: 28px; diff --git a/stylesheets/themes.scss b/stylesheets/themes.scss index cf5b80caf..0c9835a55 100644 --- a/stylesheets/themes.scss +++ b/stylesheets/themes.scss @@ -9,7 +9,7 @@ $accentDarkTheme: #00f782; $borderLightTheme: #f1f1f1; // search for references on ts TODO: make this exposed on ts $borderDarkTheme: rgba($white, 0.06); -$borderAvatarColor: #000a; // search for references on ts TODO: make this exposed on ts +$borderAvatarColor: #00000059; // search for references on ts TODO: make this exposed on ts $themes: ( light: ( diff --git a/ts/components/Avatar.tsx b/ts/components/Avatar.tsx index 0ff7cb3f6..d354cacc1 100644 --- a/ts/components/Avatar.tsx +++ b/ts/components/Avatar.tsx @@ -212,6 +212,6 @@ export class Avatar extends React.PureComponent { } private getAvatarBorderColor(): string { - return '#000A'; // borderAvatarColor in themes.scss + return '#00000059'; // borderAvatarColor in themes.scss } } diff --git a/ts/components/AvatarPlaceHolder/ClosedGroupAvatar.tsx b/ts/components/AvatarPlaceHolder/ClosedGroupAvatar.tsx index 63ee61afc..b4a5b5902 100644 --- a/ts/components/AvatarPlaceHolder/ClosedGroupAvatar.tsx +++ b/ts/components/AvatarPlaceHolder/ClosedGroupAvatar.tsx @@ -30,7 +30,30 @@ export class ClosedGroupAvatar extends React.PureComponent { ); } else if (conversations.length > 1) { // in a closed group avatar, each visible avatar member size is 2/3 of the group avatar in size - const avatarsDiameter = 28; //FIXME audric (size * 2) / 3; + // Always use the size directly under the one requested + let avatarsDiameter = 0; + switch (size) { + case 36: { + avatarsDiameter = 28; + break; + } + case 48: { + avatarsDiameter = 36; + break; + } + case 80: { + avatarsDiameter = 48; + break; + } + case 300: { + avatarsDiameter = 80; + break; + } + default: + throw new Error( + `Invalid size request for closed group avatar: ${size}` + ); + } const conv1 = conversations[0]; const conv2 = conversations[1]; // use the 2 first members as group avatars diff --git a/ts/components/ConversationListItem.tsx b/ts/components/ConversationListItem.tsx index a8bfe939f..a87b219e9 100644 --- a/ts/components/ConversationListItem.tsx +++ b/ts/components/ConversationListItem.tsx @@ -23,6 +23,7 @@ import { import { ConversationAttributes } from '../../js/models/conversations'; import { GroupUtils } from '../session/utils'; import { PubKey } from '../session/types'; +import { UserUtil } from '../util'; export type PropsData = { id: string; @@ -91,11 +92,15 @@ export class ConversationListItem extends React.PureComponent { public async fetchClosedConversationDetails() { if (!this.props.isPublic && this.props.type === 'group') { const groupId = this.props.phoneNumber; - const members = await GroupUtils.getGroupMembers(PubKey.cast(groupId)); - const membersConvos = members.map(m => - window.ConversationController.get(m.key) + let members = await GroupUtils.getGroupMembers(PubKey.cast(groupId)); + const ourPrimary = await UserUtil.getPrimary(); + members = members.filter(m => m.key !== ourPrimary.key); + members.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0)); + const membersConvos = members.map( + m => window.ConversationController.get(m.key).cachedProps ); - + // no need to forward more than 2 conversation for rendering the group avatar + membersConvos.slice(0, 2); this.setState({ closedMemberConversations: membersConvos }); } } @@ -113,12 +118,6 @@ export class ConversationListItem extends React.PureComponent { isPublic, } = this.props; - if (!isPublic && type === 'group') { - if (!this.state.closedMemberConversations) { - return <>; - } - } - const iconSize = 36; return ( @@ -341,7 +340,6 @@ export class ConversationListItem extends React.PureComponent { style, mentionedUs, } = this.props; - const triggerId = `conversation-item-${phoneNumber}-ctxmenu`; return ( From b845ba96423d2e5b8a2d838c044876130890e9ed Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 14 Sep 2020 16:06:24 +1000 Subject: [PATCH 185/274] use a HOC to fetch closed group conversations for avatar rendering --- js/modules/signal.js | 8 +-- js/views/conversation_view.js | 4 +- ts/components/ConversationListItem.tsx | 40 +++---------- ts/components/SearchResults.tsx | 6 +- .../conversation/ConversationHeader.tsx | 12 +++- .../session/LeftPaneContactSection.tsx | 4 +- .../session/LeftPaneMessageSection.tsx | 4 +- .../session/SessionGroupSettings.tsx | 10 +++- .../usingClosedConversationDetails.tsx | 60 +++++++++++++++++++ 9 files changed, 101 insertions(+), 47 deletions(-) create mode 100644 ts/components/session/usingClosedConversationDetails.tsx diff --git a/js/modules/signal.js b/js/modules/signal.js index a5c459f29..6a4206726 100644 --- a/js/modules/signal.js +++ b/js/modules/signal.js @@ -30,10 +30,10 @@ const { const { ContactListItem } = require('../../ts/components/ContactListItem'); const { ContactName } = require('../../ts/components/conversation/ContactName'); const { - ConversationHeader, + ConversationHeaderWithDetails, } = require('../../ts/components/conversation/ConversationHeader'); const { - SessionGroupSettings, + SessionGroupSettingsWithDetails, } = require('../../ts/components/session/SessionGroupSettings'); const { EmbeddedContact, @@ -275,8 +275,8 @@ exports.setup = (options = {}) => { ContactDetail, ContactListItem, ContactName, - ConversationHeader, - SessionGroupSettings, + ConversationHeaderWithDetails, + SessionGroupSettingsWithDetails, SettingsView, EmbeddedContact, Emojify, diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index 097556d16..a63b0e8d9 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -325,7 +325,7 @@ }; this.titleView = new Whisper.ReactWrapperView({ className: 'title-wrapper', - Component: window.Signal.Components.ConversationHeader, + Component: window.Signal.Components.ConversationHeaderWithDetails, props: getHeaderProps(), }); this.updateHeader = () => this.titleView.update(getHeaderProps()); @@ -359,7 +359,7 @@ if (!this.groupSettings) { this.groupSettings = new Whisper.ReactWrapperView({ className: 'group-settings', - Component: window.Signal.Components.SessionGroupSettings, + Component: window.Signal.Components.SessionGroupSettingsWithDetails, props: getGroupSettingsProps(this.model), }); this.$('.conversation-content-right').append(this.groupSettings.el); diff --git a/ts/components/ConversationListItem.tsx b/ts/components/ConversationListItem.tsx index a87b219e9..48206c2e9 100644 --- a/ts/components/ConversationListItem.tsx +++ b/ts/components/ConversationListItem.tsx @@ -20,10 +20,8 @@ import { getInviteContactMenuItem, getLeaveGroupMenuItem, } from '../session/utils/Menu'; -import { ConversationAttributes } from '../../js/models/conversations'; -import { GroupUtils } from '../session/utils'; -import { PubKey } from '../session/types'; -import { UserUtil } from '../util'; + +import { usingClosedConversationDetails } from './session/usingClosedConversationDetails'; export type PropsData = { id: string; @@ -57,6 +55,7 @@ export type PropsData = { isSecondary?: boolean; isGroupInvitation?: boolean; isKickedFromGroup?: boolean; + closedMemberConversations?: any; // this is added by usingClosedConversationDetails }; type PropsHousekeeping = { @@ -75,34 +74,9 @@ type PropsHousekeeping = { type Props = PropsData & PropsHousekeeping; -type State = { - closedMemberConversations?: Array; -}; - -export class ConversationListItem extends React.PureComponent { +class ConversationListItem extends React.PureComponent { public constructor(props: Props) { super(props); - this.state = { closedMemberConversations: undefined }; - } - - public componentDidMount() { - void this.fetchClosedConversationDetails(); - } - - public async fetchClosedConversationDetails() { - if (!this.props.isPublic && this.props.type === 'group') { - const groupId = this.props.phoneNumber; - let members = await GroupUtils.getGroupMembers(PubKey.cast(groupId)); - const ourPrimary = await UserUtil.getPrimary(); - members = members.filter(m => m.key !== ourPrimary.key); - members.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0)); - const membersConvos = members.map( - m => window.ConversationController.get(m.key).cachedProps - ); - // no need to forward more than 2 conversation for rendering the group avatar - membersConvos.slice(0, 2); - this.setState({ closedMemberConversations: membersConvos }); - } } public renderAvatar() { @@ -133,7 +107,7 @@ export class ConversationListItem extends React.PureComponent { profileName={profileName} size={iconSize} isPublic={isPublic} - closedMemberConversations={this.state.closedMemberConversations} + closedMemberConversations={this.props.closedMemberConversations} />
); @@ -399,3 +373,7 @@ export class ConversationListItem extends React.PureComponent { ); } } + +export const ConversationListItemWithDetails = usingClosedConversationDetails( + ConversationListItem +); diff --git a/ts/components/SearchResults.tsx b/ts/components/SearchResults.tsx index 8532a3984..0791320e5 100644 --- a/ts/components/SearchResults.tsx +++ b/ts/components/SearchResults.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { - ConversationListItem, + ConversationListItemWithDetails, PropsData as ConversationListItemPropsType, } from './ConversationListItem'; import { @@ -62,7 +62,7 @@ export class SearchResults extends React.Component { {i18n('conversationsHeader')}
{conversations.map(conversation => ( - {
{header}
{items.map(contact => ( - void; i18n: LocalizerType; + closedMemberConversations?: any; // this is added by usingClosedConversationDetails } -export class ConversationHeader extends React.Component { +class ConversationHeader extends React.Component { public showMenuBound: (event: React.MouseEvent) => void; public onAvatarClickBound: (userPubKey: string) => void; public menuTriggerRef: React.RefObject; @@ -196,6 +198,7 @@ export class ConversationHeader extends React.Component { public renderAvatar() { const { avatarPath, + closedMemberConversations, i18n, isGroup, isMe, @@ -217,11 +220,12 @@ export class ConversationHeader extends React.Component { name={name} phoneNumber={phoneNumber} profileName={profileName} - size={28} + size={36} onAvatarClick={() => { this.onAvatarClickBound(phoneNumber); }} isPublic={isPublic} + closedMemberConversations={closedMemberConversations} /> ); @@ -497,3 +501,7 @@ export class ConversationHeader extends React.Component { ); } } + +export const ConversationHeaderWithDetails = usingClosedConversationDetails( + ConversationHeader +); diff --git a/ts/components/session/LeftPaneContactSection.tsx b/ts/components/session/LeftPaneContactSection.tsx index 4490062e3..8ff7e85fc 100644 --- a/ts/components/session/LeftPaneContactSection.tsx +++ b/ts/components/session/LeftPaneContactSection.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { - ConversationListItem, + ConversationListItemWithDetails, PropsData as ConversationListItemPropsType, } from '../ConversationListItem'; import { PropsData as SearchResultsProps } from '../SearchResults'; @@ -116,7 +116,7 @@ export class LeftPaneContactSection extends React.Component { const item = contacts[index]; return ( - { const conversation = conversations[index]; return ( - void; onInviteContacts: () => void; @@ -33,7 +35,7 @@ interface Props { onSetDisappearingMessages: (seconds: number) => void; } -export class SessionGroupSettings extends React.Component { +class SessionGroupSettings extends React.Component { public constructor(props: Props) { super(props); @@ -309,6 +311,7 @@ export class SessionGroupSettings extends React.Component { private renderHeader() { const { + closedMemberConversations, id, onGoBack, onInviteContacts, @@ -336,6 +339,7 @@ export class SessionGroupSettings extends React.Component { conversationType="group" size={80} isPublic={isPublic} + closedMemberConversations={closedMemberConversations} />
{showInviteContacts && ( @@ -350,3 +354,7 @@ export class SessionGroupSettings extends React.Component { ); } } + +export const SessionGroupSettingsWithDetails = usingClosedConversationDetails( + SessionGroupSettings +); diff --git a/ts/components/session/usingClosedConversationDetails.tsx b/ts/components/session/usingClosedConversationDetails.tsx new file mode 100644 index 000000000..62f88cf7c --- /dev/null +++ b/ts/components/session/usingClosedConversationDetails.tsx @@ -0,0 +1,60 @@ +import { GroupUtils } from '../../session/utils'; +import { UserUtil } from '../../util'; +import { PubKey } from '../../session/types'; +import React from 'react'; +import { ConversationAttributes } from '../../../js/models/conversations'; +type State = { + closedMemberConversations?: Array; +}; + +export function usingClosedConversationDetails(WrappedComponent: any) { + return class extends React.Component { + constructor(props: any) { + super(props); + this.state = { + closedMemberConversations: undefined, + }; + } + + public componentDidMount() { + void this.fetchClosedConversationDetails(); + } + + public render() { + return ( + + ); + } + + private async fetchClosedConversationDetails() { + const { + isPublic, + type, + conversationType, + isGroup, + phoneNumber, + id, + } = this.props; + if ( + !isPublic && + (conversationType === 'group' || type === 'group' || isGroup) + ) { + console.warn('fetchClosedConversationDetails'); + const groupId = id || phoneNumber; + let members = await GroupUtils.getGroupMembers(PubKey.cast(groupId)); + const ourPrimary = await UserUtil.getPrimary(); + members = members.filter(m => m.key !== ourPrimary.key); + members.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0)); + const membersConvos = members.map( + m => window.ConversationController.get(m.key).cachedProps + ); + // no need to forward more than 2 conversation for rendering the group avatar + membersConvos.slice(0, 2); + this.setState({ closedMemberConversations: membersConvos }); + } + } + }; +} From 217cc04ad145270ca3d37e8576b053d4b0099697 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 14 Sep 2020 16:06:58 +1000 Subject: [PATCH 186/274] cleanup avatar rendering and add a 64px size --- images/profile-group.svg | 22 ----- images/profile-individual.svg | 22 ----- stylesheets/_avatar.scss | 97 +++---------------- ts/components/Avatar.tsx | 32 +----- .../AvatarPlaceHolder/ClosedGroupAvatar.tsx | 6 +- 5 files changed, 19 insertions(+), 160 deletions(-) delete mode 100644 images/profile-group.svg delete mode 100644 images/profile-individual.svg diff --git a/images/profile-group.svg b/images/profile-group.svg deleted file mode 100644 index a6c9788bc..000000000 --- a/images/profile-group.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - Group/group-28 - Created with Sketch. - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/images/profile-individual.svg b/images/profile-individual.svg deleted file mode 100644 index f28b9ea45..000000000 --- a/images/profile-individual.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - Profile/profile-28 - Created with Sketch. - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/stylesheets/_avatar.scss b/stylesheets/_avatar.scss index ba61d4076..3f3fd2eda 100644 --- a/stylesheets/_avatar.scss +++ b/stylesheets/_avatar.scss @@ -47,14 +47,6 @@ width: 100%; } -.module-avatar__icon--group { - @include color-svg('../images/profile-group.svg', $color-white); -} - -.module-avatar__icon--direct { - @include color-svg('../images/profile-individual.svg', $color-white); -} - .module-avatar__icon-closed .module-avatar--28, .module-avatar--28 { height: 28px; @@ -66,16 +58,7 @@ } } -.module-avatar__label--28 { - font-size: 14px; - line-height: 28px; -} - -.module-avatar__icon--28 { - height: 16px; - width: 16px; -} - +.module-avatar__icon-closed .module-avatar--36, .module-avatar--36 { height: 36px; width: 36px; @@ -86,19 +69,7 @@ } } -.module-avatar__label--36 { - margin-top: 1px; - width: 36px; - font-size: 16px; - letter-spacing: 0.19px; - line-height: 36px; -} - -.module-avatar__icon--36 { - height: 20px; - width: 20px; -} - +.module-avatar__icon-closed .module-avatar--48, .module-avatar--48 { height: 48px; width: 48px; @@ -109,18 +80,18 @@ } } -.module-avatar__label--48 { - width: 48px; - font-size: 20px; - letter-spacing: 0.19px; - line-height: 48px; -} - -.module-avatar__icon--48 { - height: 26px; - width: 26px; +.module-avatar__icon-closed .module-avatar--64, +.module-avatar--64 { + height: 64px; + width: 64px; + + img { + height: 64px; + width: 64px; + } } +.module-avatar__icon-closed .module-avatar--80, .module-avatar--80 { height: 80px; width: 80px; @@ -131,17 +102,6 @@ } } -.module-avatar__label--80 { - width: 80px; - font-size: 40px; - line-height: 82px; -} - -.module-avatar__icon--80 { - height: 42px; - width: 42px; -} - .module-avatar--300 { height: 300px; width: 300px; @@ -152,39 +112,6 @@ } } -.module-avatar__label--300 { - width: 300px; - font-size: 150px; - line-height: 302px; -} - -.module-avatar__icon--300 { - height: 158px; - width: 158px; -} - -.module-avatar__icon--note-to-self { - width: 70%; - height: 70%; - @include color-svg('../images/note-28.svg', $color-white); -} - -.module-avatar__label { - color: $color-gray-05; -} - -.module-avatar__icon--group { - background-color: $color-gray-05; -} - -.module-avatar__icon--direct { - background-color: $color-gray-05; -} - -.module-avatar__icon--note-to-self { - background-color: $color-gray-05; -} - .module-avatar__icon--crown-wrapper { background-color: $color-gray-75; } diff --git a/ts/components/Avatar.tsx b/ts/components/Avatar.tsx index d354cacc1..98eb04b59 100644 --- a/ts/components/Avatar.tsx +++ b/ts/components/Avatar.tsx @@ -95,40 +95,12 @@ export class Avatar extends React.PureComponent { conversationType, closedMemberConversations, isPublic, - name, - noteToSelf, size, i18n, } = this.props; - const initials = getInitials(name); const isGroup = conversationType === 'group'; - if (noteToSelf) { - return ( -
- ); - } - - if (!isGroup && initials) { - return ( -
- {initials} -
- ); - } - if (isGroup && !isPublic && closedMemberConversations) { const forcedI18n = i18n || window.i18n; return ( @@ -144,8 +116,7 @@ export class Avatar extends React.PureComponent {
); @@ -163,6 +134,7 @@ export class Avatar extends React.PureComponent { size !== 28 && size !== 36 && size !== 48 && + size !== 64 && size !== 80 && size !== 300 ) { diff --git a/ts/components/AvatarPlaceHolder/ClosedGroupAvatar.tsx b/ts/components/AvatarPlaceHolder/ClosedGroupAvatar.tsx index b4a5b5902..6b4224c75 100644 --- a/ts/components/AvatarPlaceHolder/ClosedGroupAvatar.tsx +++ b/ts/components/AvatarPlaceHolder/ClosedGroupAvatar.tsx @@ -41,10 +41,14 @@ export class ClosedGroupAvatar extends React.PureComponent { avatarsDiameter = 36; break; } - case 80: { + case 64: { avatarsDiameter = 48; break; } + case 80: { + avatarsDiameter = 64; + break; + } case 300: { avatarsDiameter = 80; break; From afb1296c3d5790cb7752887fc381a8f6c34a49f6 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 14 Sep 2020 16:39:43 +1000 Subject: [PATCH 187/274] center avatar on group panel --- stylesheets/_session.scss | 5 ----- stylesheets/_session_group_panel.scss | 7 ++----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index abcad5b3c..79e868d7d 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -1514,11 +1514,6 @@ input { } } -.invite-friends-container { - height: $session-icon-size-lg; - width: $session-icon-size-lg; -} - .module-message-detail { .module-message { pointer-events: none; diff --git a/stylesheets/_session_group_panel.scss b/stylesheets/_session_group_panel.scss index a0b0610b4..21f7a9619 100644 --- a/stylesheets/_session_group_panel.scss +++ b/stylesheets/_session_group_panel.scss @@ -18,6 +18,8 @@ &-header { margin-top: $session-margin-lg; + margin-inline-start: $session-margin-sm; + margin-inline-end: $session-margin-sm; width: -webkit-fill-available; display: flex; flex-direction: row; @@ -26,11 +28,6 @@ .module-avatar { margin: auto; } - - .session-icon-button, - .invite-friends-container { - margin: 0 $session-margin-md; - } } h2 { From bc1aff747a87471a0f6ce97c57661526e4d94b70 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 14 Sep 2020 16:45:06 +1000 Subject: [PATCH 188/274] refresh avatar for closed group on new props --- ts/components/Avatar.tsx | 12 ++++-------- .../session/usingClosedConversationDetails.tsx | 5 ++++- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/ts/components/Avatar.tsx b/ts/components/Avatar.tsx index 98eb04b59..69863c2a6 100644 --- a/ts/components/Avatar.tsx +++ b/ts/components/Avatar.tsx @@ -111,15 +111,11 @@ export class Avatar extends React.PureComponent { /> ); } - - return ( -
+ console.warn( + 'renderNoImage should not happen with something else than a closed group' ); + + return
; } public render() { diff --git a/ts/components/session/usingClosedConversationDetails.tsx b/ts/components/session/usingClosedConversationDetails.tsx index 62f88cf7c..8d80fdefd 100644 --- a/ts/components/session/usingClosedConversationDetails.tsx +++ b/ts/components/session/usingClosedConversationDetails.tsx @@ -20,6 +20,10 @@ export function usingClosedConversationDetails(WrappedComponent: any) { void this.fetchClosedConversationDetails(); } + public componentDidUpdate() { + void this.fetchClosedConversationDetails(); + } + public render() { return ( Date: Tue, 15 Sep 2020 09:00:10 +1000 Subject: [PATCH 189/274] make medium group pubkey be in bytes rather than str --- protos/SignalService.proto | 2 +- ts/receiver/contentMessage.ts | 6 +++--- ts/session/crypto/MessageEncrypter.ts | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/protos/SignalService.proto b/protos/SignalService.proto index 54391519f..f7b76be2f 100644 --- a/protos/SignalService.proto +++ b/protos/SignalService.proto @@ -42,7 +42,7 @@ message Content { message MediumGroupCiphertext { optional bytes ciphertext = 1; - optional string source = 2; + optional bytes source = 2; optional uint32 keyIdx = 3; } diff --git a/ts/receiver/contentMessage.ts b/ts/receiver/contentMessage.ts index 4425a528c..7c125267c 100644 --- a/ts/receiver/contentMessage.ts +++ b/ts/receiver/contentMessage.ts @@ -71,8 +71,8 @@ async function decryptForMediumGroup( new Uint8Array(mediumGroupCiphertext) ); const ourNumber = (await UserUtil.getCurrentDevicePubKey()) as string; - - if (source === ourNumber) { + const sourceAsStr = StringUtils.decode(source, 'hex'); + if (sourceAsStr === ourNumber) { window.console.info( 'Dropping message from ourself after decryptForMediumGroup' ); @@ -83,7 +83,7 @@ async function decryptForMediumGroup( ciphertext, keyIdx, groupId, - source + sourceAsStr ); return plaintext; diff --git a/ts/session/crypto/MessageEncrypter.ts b/ts/session/crypto/MessageEncrypter.ts index ba97ca7a2..3380cb205 100644 --- a/ts/session/crypto/MessageEncrypter.ts +++ b/ts/session/crypto/MessageEncrypter.ts @@ -4,6 +4,7 @@ import { UserUtil } from '../../util'; import { CipherTextObject } from '../../../libtextsecure/libsignal-protocol'; import { encryptWithSenderKey } from '../../session/medium_group/ratchet'; import { PubKey } from '../types'; +import { StringUtils } from '../utils'; /** * Add padding to a message buffer @@ -90,7 +91,7 @@ export async function encryptForMediumGroup( // We should include ciphertext idx in the message const content = SignalService.MediumGroupCiphertext.encode({ ciphertext, - source: ourKey, + source: new Uint8Array(StringUtils.encode(ourKey, 'hex')), keyIdx, }).finish(); From ff1c554e8a8d5b3fe765b724723fc49824422418 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 15 Sep 2020 09:40:50 +1000 Subject: [PATCH 190/274] make MediumGroupChatMessage share impl with ClosedGroupChatMessage --- .../data/mediumgroup/MediumGroupChatMessage.ts | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/ts/session/messages/outgoing/content/data/mediumgroup/MediumGroupChatMessage.ts b/ts/session/messages/outgoing/content/data/mediumgroup/MediumGroupChatMessage.ts index 1d5021c16..5cbeb8625 100644 --- a/ts/session/messages/outgoing/content/data/mediumgroup/MediumGroupChatMessage.ts +++ b/ts/session/messages/outgoing/content/data/mediumgroup/MediumGroupChatMessage.ts @@ -1,7 +1,6 @@ -import { SignalService } from '../../../../../../protobuf'; import { ChatMessage } from '../ChatMessage'; import { PubKey } from '../../../../../types'; -import { MediumGroupMessage } from './MediumGroupMessage'; +import { ClosedGroupChatMessage } from '../group/ClosedGroupChatMessage'; interface MediumGroupChatMessageParams { identifier?: string; @@ -9,21 +8,12 @@ interface MediumGroupChatMessageParams { chatMessage: ChatMessage; } -export class MediumGroupChatMessage extends MediumGroupMessage { - private readonly chatMessage: ChatMessage; - +export class MediumGroupChatMessage extends ClosedGroupChatMessage { constructor(params: MediumGroupChatMessageParams) { super({ - timestamp: params.chatMessage.timestamp, identifier: params.identifier ?? params.chatMessage.identifier, groupId: params.groupId, + chatMessage: params.chatMessage, }); - this.chatMessage = params.chatMessage; - } - - public dataProto(): SignalService.DataMessage { - const messageProto = this.chatMessage.dataProto(); - - return messageProto; } } From 28d2481389e2926892b614dd98cfd88462ea214f Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 15 Sep 2020 10:10:34 +1000 Subject: [PATCH 191/274] fix tests --- ts/test/session/unit/crypto/MessageEncrypter_test.ts | 2 +- ts/test/session/unit/sending/MessageSender_test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ts/test/session/unit/crypto/MessageEncrypter_test.ts b/ts/test/session/unit/crypto/MessageEncrypter_test.ts index eb85516e2..fc130eab7 100644 --- a/ts/test/session/unit/crypto/MessageEncrypter_test.ts +++ b/ts/test/session/unit/crypto/MessageEncrypter_test.ts @@ -12,7 +12,7 @@ import * as Ratchet from '../../../../session/medium_group/ratchet'; // tslint:disable-next-line: max-func-body-length describe('MessageEncrypter', () => { const sandbox = sinon.createSandbox(); - const ourNumber = 'ourNumber'; + const ourNumber = '0123456789abcdef'; beforeEach(() => { TestUtils.stubWindow('libsignal', { diff --git a/ts/test/session/unit/sending/MessageSender_test.ts b/ts/test/session/unit/sending/MessageSender_test.ts index 1b1411572..66ea30d39 100644 --- a/ts/test/session/unit/sending/MessageSender_test.ts +++ b/ts/test/session/unit/sending/MessageSender_test.ts @@ -36,7 +36,7 @@ describe('MessageSender', () => { }); describe('send', () => { - const ourNumber = 'ourNumber'; + const ourNumber = '0123456789abcdef'; let lokiMessageAPISendStub: sinon.SinonStub< [string, Uint8Array, number, number], Promise From cd1a94071983acdf2f5dec746bbb5e536f16c182 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 15 Sep 2020 10:32:16 +1000 Subject: [PATCH 192/274] add back Copy Session ID but show it only for user context click --- _locales/en/messages.json | 5 +++++ ts/session/utils/Menu.tsx | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/_locales/en/messages.json b/_locales/en/messages.json index c19d175ca..d4c769bfc 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1072,6 +1072,11 @@ "description": "Copy to clipboard button text", "androidKey": "copy" }, + "copySessionID": { + "message": "Copy Session ID", + "description": "Copy to clipboard session ID", + "androidKey": "activity_conversation_menu_copy_session_id" + }, "save": { "message": "Save", "description": "Used as a 'commit changes' button in the Caption Editor for outgoing image attachments", diff --git a/ts/session/utils/Menu.tsx b/ts/session/utils/Menu.tsx index 2fe4b77f6..812cca30c 100644 --- a/ts/session/utils/Menu.tsx +++ b/ts/session/utils/Menu.tsx @@ -212,7 +212,7 @@ export function getCopyMenuItem( i18n: LocalizerType ): JSX.Element | null { if (showCopyId(Boolean(isPublic), Boolean(isRss), Boolean(isGroup))) { - const copyIdLabel = i18n('editMenuCopy'); + const copyIdLabel = i18n('copySessionID'); return {copyIdLabel}; } return null; From d1bd8290110a63b76b45b6490e042659a02a52ab Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 15 Sep 2020 11:00:22 +1000 Subject: [PATCH 193/274] do not trigger markRead if conversation isHidden --- js/views/conversation_view.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index 4d9a2adb7..165ac3032 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -391,10 +391,7 @@ this.window.addEventListener('resize', this.onResize); this.onFocus = () => { - if ( - this.$el.css('display') !== 'none' && - this.$el.css('display') !== '' - ) { + if (!this.isHidden()) { this.markRead(); } }; @@ -2654,7 +2651,8 @@ isHidden() { return ( - this.$el.css('display') === 'none' || + (this.$el.css('display') !== 'none' && + this.$el.css('display') !== '') || this.$('.panel').css('display') === 'none' ); }, From 30416d98ab60b1772248ab8b1c71a862680e63d4 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 15 Sep 2020 11:38:05 +1000 Subject: [PATCH 194/274] show our avatar on a group if less than 2 members --- .../usingClosedConversationDetails.tsx | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/ts/components/session/usingClosedConversationDetails.tsx b/ts/components/session/usingClosedConversationDetails.tsx index 8d80fdefd..8cdf962a4 100644 --- a/ts/components/session/usingClosedConversationDetails.tsx +++ b/ts/components/session/usingClosedConversationDetails.tsx @@ -47,15 +47,29 @@ export function usingClosedConversationDetails(WrappedComponent: any) { (conversationType === 'group' || type === 'group' || isGroup) ) { const groupId = id || phoneNumber; - let members = await GroupUtils.getGroupMembers(PubKey.cast(groupId)); const ourPrimary = await UserUtil.getPrimary(); + let members = await GroupUtils.getGroupMembers(PubKey.cast(groupId)); + + const ourself = members.find(m => m.key !== ourPrimary.key); + // add ourself back at the back, so it's shown only if only 1 member and we are still a member members = members.filter(m => m.key !== ourPrimary.key); members.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0)); - const membersConvos = members.map( - m => window.ConversationController.get(m.key).cachedProps - ); + if (ourself) { + members.push(ourPrimary); + } // no need to forward more than 2 conversation for rendering the group avatar - membersConvos.slice(0, 2); + members.slice(0, 2); + const membersConvos = await Promise.all( + members.map( + async m => + ( + await window.ConversationController.getOrCreateAndWait( + m.key, + 'private' + ) + ).cachedProps + ) + ); this.setState({ closedMemberConversations: membersConvos }); } } From 6eb13e43e39fbbc13b6565f31766eeffa5ee7405 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 15 Sep 2020 15:07:22 +1000 Subject: [PATCH 195/274] simplify a lot avatar props --- js/views/create_group_dialog_view.js | 1 + ts/components/Avatar.tsx | 66 +++++-------------- .../AvatarPlaceHolder/AvatarPlaceHolder.tsx | 17 ++--- .../AvatarPlaceHolder/ClosedGroupAvatar.tsx | 35 ++++------ ts/components/ContactListItem.tsx | 19 ++---- ts/components/ConversationListItem.tsx | 23 ++----- ts/components/EditProfileDialog.tsx | 16 ++--- ts/components/MessageSearchResult.tsx | 13 ++-- ts/components/UserDetailsDialog.tsx | 14 ++-- .../conversation/ConversationHeader.tsx | 15 +---- ts/components/conversation/MemberList.tsx | 19 +++--- ts/components/conversation/Message.tsx | 9 +-- ts/components/conversation/MessageDetail.tsx | 11 ++-- ts/components/conversation/TypingBubble.tsx | 11 +--- .../conversation/UpdateGroupNameDialog.tsx | 5 +- ts/components/conversation/_contactUtil.tsx | 11 +--- ts/components/session/ActionsPanel.tsx | 9 ++- .../session/SessionGroupSettings.tsx | 6 +- .../session/SessionMemberListItem.tsx | 17 +++-- .../usingClosedConversationDetails.tsx | 1 + 20 files changed, 104 insertions(+), 214 deletions(-) diff --git a/js/views/create_group_dialog_view.js b/js/views/create_group_dialog_view.js index d461cedcb..fdc1b688e 100644 --- a/js/views/create_group_dialog_view.js +++ b/js/views/create_group_dialog_view.js @@ -46,6 +46,7 @@ props: { titleText: this.titleText, isPublic: this.isPublic, + pubkey: this.groupId, groupName: this.groupName, okText: i18n('ok'), cancelText: i18n('cancel'), diff --git a/ts/components/Avatar.tsx b/ts/components/Avatar.tsx index 69863c2a6..3c30a6c30 100644 --- a/ts/components/Avatar.tsx +++ b/ts/components/Avatar.tsx @@ -1,23 +1,15 @@ import React from 'react'; import classNames from 'classnames'; -import { getInitials } from '../util/getInitials'; -import { LocalizerType } from '../types/Util'; import { AvatarPlaceHolder, ClosedGroupAvatar } from './AvatarPlaceHolder'; import { ConversationAttributes } from '../../js/models/conversations'; interface Props { avatarPath?: string; - color?: string; - conversationType: 'group' | 'direct'; - isPublic?: boolean; - noteToSelf?: boolean; - name?: string; - phoneNumber?: string; - profileName?: string; + name?: string; // display name, profileName or phoneNumber, whatever is set first + pubkey: string; size: number; closedMemberConversations?: Array; - i18n?: LocalizerType; onAvatarClick?: () => void; } @@ -50,19 +42,15 @@ export class Avatar extends React.PureComponent { } public renderIdenticon() { - const { phoneNumber, size, name, profileName } = this.props; + const { size, name, pubkey } = this.props; - if (!phoneNumber) { - window.log.error('Empty phoneNumber for identicon'); - return <>; - } + const userName = name || '0'; - const userName = profileName || name; return ( @@ -70,44 +58,31 @@ export class Avatar extends React.PureComponent { } public renderImage() { - const { avatarPath, name, phoneNumber, profileName } = this.props; + const { avatarPath, name } = this.props; const { imageBroken } = this.state; if (!avatarPath || imageBroken) { return null; } - const title = `${name || phoneNumber}${ - !name && profileName ? ` ~${profileName}` : '' - }`; - return ( {window.i18n('contactAvatarAlt', ); } public renderNoImage() { - const { - conversationType, - closedMemberConversations, - isPublic, - size, - i18n, - } = this.props; - - const isGroup = conversationType === 'group'; - - if (isGroup && !isPublic && closedMemberConversations) { - const forcedI18n = i18n || window.i18n; + const { closedMemberConversations, size } = this.props; + // if no image but we have conversations set for the group, renders group members avatars + if (closedMemberConversations) { return ( ); } @@ -119,12 +94,9 @@ export class Avatar extends React.PureComponent { } public render() { - const { avatarPath, color, size, conversationType } = this.props; + const { avatarPath, size } = this.props; const { imageBroken } = this.state; - - // If it's a direct conversation then we must have an identicon - const hasAvatar = avatarPath || conversationType === 'direct'; - const hasImage = hasAvatar && !imageBroken; + const hasImage = avatarPath && !imageBroken; if ( size !== 28 && @@ -142,8 +114,7 @@ export class Avatar extends React.PureComponent { className={classNames( 'module-avatar', `module-avatar--${size}`, - hasImage ? 'module-avatar--with-image' : 'module-avatar--no-image', - !hasImage ? `module-avatar--${color}` : null + hasImage ? 'module-avatar--with-image' : 'module-avatar--no-image' )} onClick={e => { this.onAvatarClickBound(e); @@ -163,14 +134,9 @@ export class Avatar extends React.PureComponent { } private renderAvatarOrIdenticon() { - const { avatarPath, conversationType } = this.props; + const { avatarPath } = this.props; - // If it's a direct conversation then we must have an identicon - const hasAvatar = avatarPath || conversationType === 'direct'; - - return hasAvatar && avatarPath - ? this.renderImage() - : this.renderIdenticon(); + return avatarPath ? this.renderImage() : this.renderIdenticon(); } private getAvatarColors(): Array { diff --git a/ts/components/AvatarPlaceHolder/AvatarPlaceHolder.tsx b/ts/components/AvatarPlaceHolder/AvatarPlaceHolder.tsx index 056be82bd..ae7c7774d 100644 --- a/ts/components/AvatarPlaceHolder/AvatarPlaceHolder.tsx +++ b/ts/components/AvatarPlaceHolder/AvatarPlaceHolder.tsx @@ -3,10 +3,10 @@ import { getInitials } from '../../util/getInitials'; interface Props { diameter: number; - phoneNumber: string; + name: string; + pubkey: string; colors: Array; borderColor: string; - name?: string; } interface State { @@ -23,16 +23,16 @@ export class AvatarPlaceHolder extends React.PureComponent { } public componentDidMount() { - void this.sha512(this.props.phoneNumber).then((sha512Seed: string) => { + void this.sha512(this.props.pubkey).then((sha512Seed: string) => { this.setState({ sha512Seed }); }); } public componentDidUpdate(prevProps: Props, prevState: State) { - if (this.props.phoneNumber === prevProps.phoneNumber) { + if (this.props.name === prevProps.name) { return; } - void this.sha512(this.props.phoneNumber).then((sha512Seed: string) => { + void this.sha512(this.props.name).then((sha512Seed: string) => { this.setState({ sha512Seed }); }); } @@ -42,12 +42,9 @@ export class AvatarPlaceHolder extends React.PureComponent { return <>; } - const { borderColor, colors, diameter, phoneNumber, name } = this.props; + const { borderColor, colors, diameter, name } = this.props; const r = diameter / 2; - const initial = - getInitials(name)?.toLocaleUpperCase() || - getInitials(phoneNumber)?.toLocaleUpperCase() || - '0'; + const initial = getInitials(name)?.toLocaleUpperCase() || '0'; const viewBox = `0 0 ${diameter} ${diameter}`; const fontSize = diameter * 0.5; diff --git a/ts/components/AvatarPlaceHolder/ClosedGroupAvatar.tsx b/ts/components/AvatarPlaceHolder/ClosedGroupAvatar.tsx index 6b4224c75..ce74df90a 100644 --- a/ts/components/AvatarPlaceHolder/ClosedGroupAvatar.tsx +++ b/ts/components/AvatarPlaceHolder/ClosedGroupAvatar.tsx @@ -11,21 +11,17 @@ interface Props { export class ClosedGroupAvatar extends React.PureComponent { public render() { - const { conversations, size, i18n } = this.props; - - if (conversations.length === 1) { + const { conversations, size } = this.props; + // FIXME audric render grey circle for missing avatar + if (conversations.length < 2) { const conv = conversations[0]; + const name = conv.name || conv.id; return ( ); } else if (conversations.length > 1) { @@ -60,30 +56,23 @@ export class ClosedGroupAvatar extends React.PureComponent { } const conv1 = conversations[0]; const conv2 = conversations[1]; + const name1 = conv1.name || conv1.id; + const name2 = conv2.name || conv2.id; + // use the 2 first members as group avatars return (
); diff --git a/ts/components/ContactListItem.tsx b/ts/components/ContactListItem.tsx index ebffc0b32..2796dcb7d 100644 --- a/ts/components/ContactListItem.tsx +++ b/ts/components/ContactListItem.tsx @@ -20,25 +20,16 @@ interface Props { export class ContactListItem extends React.Component { public renderAvatar() { - const { - avatarPath, - i18n, - color, - name, - phoneNumber, - profileName, - } = this.props; + const { avatarPath, name, phoneNumber, profileName } = this.props; + + const userName = name || profileName || phoneNumber; return ( ); } diff --git a/ts/components/ConversationListItem.tsx b/ts/components/ConversationListItem.tsx index 48206c2e9..06ac39a3a 100644 --- a/ts/components/ConversationListItem.tsx +++ b/ts/components/ConversationListItem.tsx @@ -80,34 +80,19 @@ class ConversationListItem extends React.PureComponent { } public renderAvatar() { - const { - avatarPath, - color, - type, - i18n, - isMe, - name, - phoneNumber, - profileName, - isPublic, - } = this.props; + const { avatarPath, i18n, name, phoneNumber, profileName } = this.props; const iconSize = 36; + const userName = name || profileName || phoneNumber; return (
); diff --git a/ts/components/EditProfileDialog.tsx b/ts/components/EditProfileDialog.tsx index 25f470cb4..11a72966e 100644 --- a/ts/components/EditProfileDialog.tsx +++ b/ts/components/EditProfileDialog.tsx @@ -257,20 +257,12 @@ export class EditProfileDialog extends React.Component { } private renderAvatar() { - const avatarPath = this.state.avatar; - const color = this.props.avatarColor; + const { avatar, profileName } = this.state; + const { pubkey } = this.props; + const userName = name || profileName || pubkey; return ( - + ); } diff --git a/ts/components/MessageSearchResult.tsx b/ts/components/MessageSearchResult.tsx index 7c561a8e0..087e07e73 100644 --- a/ts/components/MessageSearchResult.tsx +++ b/ts/components/MessageSearchResult.tsx @@ -100,20 +100,15 @@ export class MessageSearchResult extends React.PureComponent { } public renderAvatar() { - const { from, i18n, to } = this.props; - const isNoteToSelf = from.isMe && to.isMe; + const { from } = this.props; + const userName = from.phoneNumber || from.profileName; return ( ); } diff --git a/ts/components/UserDetailsDialog.tsx b/ts/components/UserDetailsDialog.tsx index b3c7473a6..4b75af776 100644 --- a/ts/components/UserDetailsDialog.tsx +++ b/ts/components/UserDetailsDialog.tsx @@ -14,7 +14,7 @@ interface Props { isRss: boolean; profileName: string; avatarPath: string; - avatarColor: string; + avatarColor: string; //fixme audric toremove pubkey: string; onClose: any; onStartConversation: any; @@ -64,21 +64,17 @@ export class UserDetailsDialog extends React.Component { } private renderAvatar() { - const avatarPath = this.props.avatarPath; - const color = this.props.avatarColor; + const { avatarPath, pubkey, profileName } = this.props; const size = this.state.isEnlargedImageShown ? 300 : 80; + const userName = name || profileName || pubkey; return ( ); } diff --git a/ts/components/conversation/ConversationHeader.tsx b/ts/components/conversation/ConversationHeader.tsx index 2edda0e13..0b3bf2467 100644 --- a/ts/components/conversation/ConversationHeader.tsx +++ b/ts/components/conversation/ConversationHeader.tsx @@ -199,33 +199,24 @@ class ConversationHeader extends React.Component { const { avatarPath, closedMemberConversations, - i18n, - isGroup, - isMe, name, phoneNumber, profileName, - isPublic, } = this.props; - const conversationType = isGroup ? 'group' : 'direct'; + const userName = name || profileName || phoneNumber; return ( { this.onAvatarClickBound(phoneNumber); }} - isPublic={isPublic} closedMemberConversations={closedMemberConversations} + pubkey={phoneNumber} /> ); diff --git a/ts/components/conversation/MemberList.tsx b/ts/components/conversation/MemberList.tsx index 2d494a54c..d2121e3a2 100644 --- a/ts/components/conversation/MemberList.tsx +++ b/ts/components/conversation/MemberList.tsx @@ -91,17 +91,20 @@ class MemberItem extends React.Component { } private renderAvatar() { + const { + authorName, + authorAvatarPath, + authorPhoneNumber, + authorProfileName, + } = this.props.member; + const userName = authorName || authorProfileName || authorPhoneNumber; + return ( ); } diff --git a/ts/components/conversation/Message.tsx b/ts/components/conversation/Message.tsx index be36185be..d82c6a8f2 100644 --- a/ts/components/conversation/Message.tsx +++ b/ts/components/conversation/Message.tsx @@ -682,21 +682,18 @@ export class Message extends React.PureComponent { ) { return; } + const userName = authorName || authorProfileName || authorPhoneNumber; return (
{ onShowUserDetails(authorPhoneNumber); }} + pubkey={authorPhoneNumber} /> {senderIsModerator && (
diff --git a/ts/components/conversation/MessageDetail.tsx b/ts/components/conversation/MessageDetail.tsx index 5fbe88419..235deb18b 100644 --- a/ts/components/conversation/MessageDetail.tsx +++ b/ts/components/conversation/MessageDetail.tsx @@ -37,18 +37,15 @@ interface Props { export class MessageDetail extends React.Component { public renderAvatar(contact: Contact) { const { i18n } = this.props; - const { avatarPath, color, phoneNumber, name, profileName } = contact; + const { avatarPath, phoneNumber, name, profileName } = contact; + const userName = name || profileName || phoneNumber; return ( ); } diff --git a/ts/components/conversation/TypingBubble.tsx b/ts/components/conversation/TypingBubble.tsx index ea5e716e1..5a683ca2f 100644 --- a/ts/components/conversation/TypingBubble.tsx +++ b/ts/components/conversation/TypingBubble.tsx @@ -20,29 +20,24 @@ export class TypingBubble extends React.Component { public renderAvatar() { const { avatarPath, - color, name, phoneNumber, profileName, conversationType, - i18n, } = this.props; if (conversationType !== 'group') { return; } + const userName = name || profileName || phoneNumber; return (
); diff --git a/ts/components/conversation/UpdateGroupNameDialog.tsx b/ts/components/conversation/UpdateGroupNameDialog.tsx index b0aa7a34d..7dc9e12c7 100644 --- a/ts/components/conversation/UpdateGroupNameDialog.tsx +++ b/ts/components/conversation/UpdateGroupNameDialog.tsx @@ -7,6 +7,7 @@ import { Avatar } from '../Avatar'; interface Props { titleText: string; + pubkey: string; isPublic: boolean; groupName: string; okText: string; @@ -176,10 +177,8 @@ export class UpdateGroupNameDialog extends React.Component {
+ ); } diff --git a/ts/components/session/ActionsPanel.tsx b/ts/components/session/ActionsPanel.tsx index 03b545943..16ad70c82 100644 --- a/ts/components/session/ActionsPanel.tsx +++ b/ts/components/session/ActionsPanel.tsx @@ -140,16 +140,15 @@ export class ActionsPanel extends React.Component { : undefined; if (type === SectionType.Profile) { + const pubkey = window.storage.get('primaryDevicePubKey'); + const userName = window.getOurDisplayName() || pubkey; return ( ); } diff --git a/ts/components/session/SessionGroupSettings.tsx b/ts/components/session/SessionGroupSettings.tsx index f580a50a2..1ebd8c9b2 100644 --- a/ts/components/session/SessionGroupSettings.tsx +++ b/ts/components/session/SessionGroupSettings.tsx @@ -325,6 +325,7 @@ class SessionGroupSettings extends React.Component { const showInviteContacts = (isPublic || isAdmin) && !isKickedFromGroup && !isBlocked; + const userName = id; return (
{ />
{showInviteContacts && ( diff --git a/ts/components/session/SessionMemberListItem.tsx b/ts/components/session/SessionMemberListItem.tsx index 1d76b1cb9..7a07d20d9 100644 --- a/ts/components/session/SessionMemberListItem.tsx +++ b/ts/components/session/SessionMemberListItem.tsx @@ -86,16 +86,19 @@ export class SessionMemberListItem extends React.Component { } private renderAvatar() { + const { + authorAvatarPath, + authorName, + authorPhoneNumber, + authorProfileName, + } = this.props.member; + const userName = authorName || authorProfileName || authorPhoneNumber; return ( ); } diff --git a/ts/components/session/usingClosedConversationDetails.tsx b/ts/components/session/usingClosedConversationDetails.tsx index 8cdf962a4..9f6285fe0 100644 --- a/ts/components/session/usingClosedConversationDetails.tsx +++ b/ts/components/session/usingClosedConversationDetails.tsx @@ -42,6 +42,7 @@ export function usingClosedConversationDetails(WrappedComponent: any) { phoneNumber, id, } = this.props; + if ( !isPublic && (conversationType === 'group' || type === 'group' || isGroup) From 56cd42d34cb8814998ef7977a23c157c933568cb Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 15 Sep 2020 15:24:57 +1000 Subject: [PATCH 196/274] remove authorColor unused in Session --- images/group_default.png | Bin 555 -> 0 bytes js/background.js | 3 --- js/models/conversations.js | 17 ++--------------- js/models/messages.js | 7 +------ js/modules/loki_app_dot_net_api.js | 2 +- js/views/contact_list_view.js | 1 - js/views/conversation_view.js | 2 -- js/views/edit_profile_dialog_view.js | 10 +--------- js/views/user_details_dialog_view.js | 2 -- ts/components/Avatar.tsx | 13 ++----------- ts/components/ContactListItem.tsx | 1 - ts/components/EditProfileDialog.tsx | 1 - ts/components/UserDetailsDialog.tsx | 1 - .../conversation/CreateGroupDialog.tsx | 1 - .../conversation/InviteContactsDialog.tsx | 1 - ts/components/conversation/MemberList.tsx | 1 - ts/components/conversation/Message.tsx | 8 -------- .../conversation/ModeratorsAddDialog.tsx | 2 -- .../conversation/ModeratorsRemoveDialog.tsx | 2 -- ts/components/conversation/Quote.tsx | 2 -- .../conversation/UpdateGroupMembersDialog.tsx | 1 - ts/components/session/ActionsPanel.tsx | 1 - .../session/SessionClosableOverlay.tsx | 1 - .../session/SessionMemberListItem.tsx | 1 - 24 files changed, 7 insertions(+), 74 deletions(-) delete mode 100644 images/group_default.png diff --git a/images/group_default.png b/images/group_default.png deleted file mode 100644 index 6b503e9ff80f31824ea4cdcb67e8f24494638ed0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 555 zcmeAS@N?(olHy`uVBq!ia0vp^DIm4nJ za0`PlBg3pY5H=O_6N*jg7ShvJ}R>q7#R0>x;TbZ+xGdHYDo|V!@`5|}R-29a*6(*> zKUr7p%{Itu*Ksj)6mVn_biqe(#!p)`cdC&XtIsZz6~+ZmB>OgM9O$v}F*GcyhJU_t|H-u zwg1I)e9w*uK6!dy@QAiQugmgy$1k=<)iY$bX>RiCOMNh1-tOgvMXvRWo+^s3t4!*? znT&Gjp5p5^X&&>my%=w8uY6K% z!f2keU#K+#cfS%&Roqd wt!XJazjZUWlE)R-`^rrmN*xM#iM@XqU)1F+`?}690T{Imp00i_>zopr02zYUJ^%m! diff --git a/js/background.js b/js/background.js index 094d63fee..567e1d83f 100644 --- a/js/background.js +++ b/js/background.js @@ -73,7 +73,6 @@ 'folder-outline.svg', 'forward.svg', 'gear.svg', - 'group_default.png', 'hourglass_empty.svg', 'hourglass_full.svg', 'icon_1024.png', @@ -731,7 +730,6 @@ profileName: displayName, pubkey: ourNumber, avatarPath, - avatarColor: conversation.getColor(), onOk: async (newName, avatar) => { let newAvatarPath = ''; let url = null; @@ -1065,7 +1063,6 @@ profileName: displayName, pubkey: userPubKey, avatarPath, - avatarColor: conversation.getColor(), isRss: conversation.isRss(), onStartConversation: () => { Whisper.events.trigger('showConversation', userPubKey); diff --git a/js/models/conversations.js b/js/models/conversations.js index e2be0e221..87843e33f 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -32,7 +32,6 @@ UNRESTRICTED: 3, }; - const { Util } = window.Signal; const { Conversation, Contact, @@ -571,7 +570,6 @@ getProps() { const { format } = PhoneNumber; const regionCode = storage.get('regionCode'); - const color = this.getColor(); const typingKeys = Object.keys(this.contactTypingTimers || {}); const result = { @@ -579,7 +577,6 @@ isArchived: this.get('isArchived'), activeAt: this.get('active_at'), avatarPath: this.getAvatarPath(), - color, type: this.isPrivate() ? 'direct' : 'group', isMe: this.isMe(), isPublic: this.isPublic(), @@ -2526,14 +2523,6 @@ return this.get('type') === 'private'; }, - getColor() { - if (!this.isPrivate()) { - return 'signal-blue'; - } - - const { migrateColor } = Util; - return migrateColor(this.get('color')); - }, getAvatarPath() { const avatar = this.get('avatar') || this.get('profileAvatar'); @@ -2549,19 +2538,17 @@ }, getAvatar() { const title = this.get('name'); - const color = this.getColor(); const url = this.getAvatarPath(); if (url) { - return { url, color }; + return { url }; } else if (this.isPrivate()) { const symbol = this.isValid() ? '#' : '!'; return { - color, content: this.getInitials(title) || symbol, }; } - return { url: 'images/group_default.png', color }; + return { url: null }; }, getNotificationIcon() { diff --git a/js/models/messages.js b/js/models/messages.js index 6e444ef22..4da827afc 100644 --- a/js/models/messages.js +++ b/js/models/messages.js @@ -414,7 +414,6 @@ const regionCode = storage.get('regionCode'); const contactModel = this.findContact(phoneNumber); - const color = contactModel ? contactModel.getColor() : null; let profileName; if (phoneNumber === window.storage.get('primaryDevicePubKey')) { profileName = i18n('you'); @@ -426,7 +425,7 @@ phoneNumber: format(phoneNumber, { ourRegionCode: regionCode, }), - color, + color: null, avatarPath: contactModel ? contactModel.getAvatarPath() : null, name: contactModel ? contactModel.getName() : null, profileName, @@ -565,7 +564,6 @@ const contact = this.findAndFormatContact(phoneNumber); const contactModel = this.findContact(phoneNumber); - const authorColor = contactModel ? contactModel.getColor() : null; const authorAvatarPath = contactModel ? contactModel.getAvatarPath() : null; @@ -599,7 +597,6 @@ serverTimestamp: this.get('serverTimestamp'), status: this.getMessagePropStatus(), contact: this.getPropsForEmbeddedContact(), - authorColor, authorName: contact.name, authorProfileName: contact.profileName, authorPhoneNumber: contact.phoneNumber, @@ -764,7 +761,6 @@ const { author, id, referencedMessageNotFound } = quote; const contact = author && ConversationController.get(author); - const authorColor = contact ? contact.getColor() : 'grey'; const authorPhoneNumber = format(author, { ourRegionCode: regionCode, @@ -794,7 +790,6 @@ authorPhoneNumber, authorProfileName, authorName, - authorColor, onClick, referencedMessageNotFound, }; diff --git a/js/modules/loki_app_dot_net_api.js b/js/modules/loki_app_dot_net_api.js index 4ade77836..c506e87fa 100644 --- a/js/modules/loki_app_dot_net_api.js +++ b/js/modules/loki_app_dot_net_api.js @@ -1424,7 +1424,7 @@ class LokiPublicChannelAPI { value: { name: 'Your Public Chat', description: 'Your public chat room', - avatar: 'images/group_default.png', + avatar: null, }, }, ]; diff --git a/js/views/contact_list_view.js b/js/views/contact_list_view.js index 106598813..631ec390d 100644 --- a/js/views/contact_list_view.js +++ b/js/views/contact_list_view.js @@ -32,7 +32,6 @@ Component: window.Signal.Components.ContactListItem, props: { isMe, - color: this.model.getColor(), avatarPath: this.model.getAvatarPath(), phoneNumber: this.model.getNumber(), name: this.model.getName(), diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index 165ac3032..eb57925da 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -165,7 +165,6 @@ name: this.model.getName(), phoneNumber: this.model.getNumber(), profileName: this.model.getProfileName(), - color: this.model.getColor(), avatarPath: this.model.getAvatarPath(), isVerified: this.model.isVerified(), isMe: this.model.isMe(), @@ -279,7 +278,6 @@ name: this.model.getName(), phoneNumber: this.model.getNumber(), profileName: this.model.getProfileName(), - color: this.model.getColor(), avatarPath: this.model.getAvatarPath(), isGroup: !this.model.isPrivate(), isPublic: this.model.isPublic(), diff --git a/js/views/edit_profile_dialog_view.js b/js/views/edit_profile_dialog_view.js index b96eabfec..cb1996753 100644 --- a/js/views/edit_profile_dialog_view.js +++ b/js/views/edit_profile_dialog_view.js @@ -8,21 +8,13 @@ Whisper.EditProfileDialogView = Whisper.View.extend({ className: 'loki-dialog modal', - initialize({ - profileName, - avatarPath, - avatarColor, - pubkey, - onOk, - callback, - }) { + initialize({ profileName, avatarPath, pubkey, onOk, callback }) { this.close = this.close.bind(this); this.callback = callback; this.profileName = profileName; this.pubkey = pubkey; this.avatarPath = avatarPath; - this.avatarColor = avatarColor; this.onOk = onOk; this.$el.focus(); diff --git a/js/views/user_details_dialog_view.js b/js/views/user_details_dialog_view.js index 98c164691..d86340cfb 100644 --- a/js/views/user_details_dialog_view.js +++ b/js/views/user_details_dialog_view.js @@ -11,7 +11,6 @@ initialize({ profileName, avatarPath, - avatarColor, pubkey, isRss, onOk, @@ -23,7 +22,6 @@ this.pubkey = pubkey; this.isRss = isRss; this.avatarPath = avatarPath; - this.avatarColor = avatarColor; this.onOk = onOk; this.onStartConversation = onStartConversation; diff --git a/ts/components/Avatar.tsx b/ts/components/Avatar.tsx index 3c30a6c30..b84c1c202 100644 --- a/ts/components/Avatar.tsx +++ b/ts/components/Avatar.tsx @@ -86,11 +86,8 @@ export class Avatar extends React.PureComponent { /> ); } - console.warn( - 'renderNoImage should not happen with something else than a closed group' - ); - return
; + return this.renderIdenticon(); } public render() { @@ -121,7 +118,7 @@ export class Avatar extends React.PureComponent { }} role="button" > - {hasImage ? this.renderAvatarOrIdenticon() : this.renderNoImage()} + {hasImage ? this.renderImage() : this.renderNoImage()}
); } @@ -133,12 +130,6 @@ export class Avatar extends React.PureComponent { } } - private renderAvatarOrIdenticon() { - const { avatarPath } = this.props; - - return avatarPath ? this.renderImage() : this.renderIdenticon(); - } - private getAvatarColors(): Array { // const theme = window.Events.getThemedSettings(); // defined in session-android as `profile_picture_placeholder_colors` diff --git a/ts/components/ContactListItem.tsx b/ts/components/ContactListItem.tsx index 2796dcb7d..0cf81a6f4 100644 --- a/ts/components/ContactListItem.tsx +++ b/ts/components/ContactListItem.tsx @@ -10,7 +10,6 @@ interface Props { phoneNumber: string; isMe?: boolean; name?: string; - color: string; verified: boolean; profileName?: string; avatarPath?: string; diff --git a/ts/components/EditProfileDialog.tsx b/ts/components/EditProfileDialog.tsx index 11a72966e..065490bcb 100644 --- a/ts/components/EditProfileDialog.tsx +++ b/ts/components/EditProfileDialog.tsx @@ -30,7 +30,6 @@ interface Props { i18n: any; profileName: string; avatarPath: string; - avatarColor: string; pubkey: string; onClose: any; onOk: any; diff --git a/ts/components/UserDetailsDialog.tsx b/ts/components/UserDetailsDialog.tsx index 4b75af776..db566a323 100644 --- a/ts/components/UserDetailsDialog.tsx +++ b/ts/components/UserDetailsDialog.tsx @@ -14,7 +14,6 @@ interface Props { isRss: boolean; profileName: string; avatarPath: string; - avatarColor: string; //fixme audric toremove pubkey: string; onClose: any; onStartConversation: any; diff --git a/ts/components/conversation/CreateGroupDialog.tsx b/ts/components/conversation/CreateGroupDialog.tsx index 3ae0fa1b0..9ea4baa47 100644 --- a/ts/components/conversation/CreateGroupDialog.tsx +++ b/ts/components/conversation/CreateGroupDialog.tsx @@ -50,7 +50,6 @@ export class CreateGroupDialog extends React.Component { authorProfileName: name, selected: false, authorName: name, // different from ProfileName? - authorColor: d.getColor(), checkmarked: false, }; }); diff --git a/ts/components/conversation/InviteContactsDialog.tsx b/ts/components/conversation/InviteContactsDialog.tsx index 871c6f0e8..3268564a3 100644 --- a/ts/components/conversation/InviteContactsDialog.tsx +++ b/ts/components/conversation/InviteContactsDialog.tsx @@ -45,7 +45,6 @@ export class InviteContactsDialog extends React.Component { authorAvatarPath: d?.cachedProps?.avatarPath, selected: false, authorName: name, - authorColor: d.getColor(), checkmarked: false, existingMember, }; diff --git a/ts/components/conversation/MemberList.tsx b/ts/components/conversation/MemberList.tsx index d2121e3a2..0ea697af2 100644 --- a/ts/components/conversation/MemberList.tsx +++ b/ts/components/conversation/MemberList.tsx @@ -8,7 +8,6 @@ export interface Contact { authorProfileName: string; authorPhoneNumber: string; authorName: string; - authorColor: any; authorAvatarPath: string; checkmarked: boolean; existingMember: boolean; diff --git a/ts/components/conversation/Message.tsx b/ts/components/conversation/Message.tsx index d82c6a8f2..510910539 100644 --- a/ts/components/conversation/Message.tsx +++ b/ts/components/conversation/Message.tsx @@ -78,7 +78,6 @@ export interface Props { authorProfileName?: string; /** Note: this should be formatted for display */ authorPhoneNumber: string; - authorColor?: ColorType; conversationType: 'group' | 'direct'; attachments?: Array; quote?: { @@ -88,7 +87,6 @@ export interface Props { authorPhoneNumber: string; authorProfileName?: string; authorName?: string; - authorColor?: ColorType; onClick?: () => void; referencedMessageNotFound: boolean; }; @@ -585,7 +583,6 @@ export class Message extends React.PureComponent { public renderQuote() { const { conversationType, - authorColor, direction, i18n, quote, @@ -599,8 +596,6 @@ export class Message extends React.PureComponent { const withContentAbove = conversationType === 'group' && direction === 'incoming'; - const quoteColor = - direction === 'incoming' ? authorColor : quote.authorColor; const shortenedPubkey = window.shortenPubkey(quote.authorPhoneNumber); @@ -621,7 +616,6 @@ export class Message extends React.PureComponent { authorPhoneNumber={displayedPubkey} authorProfileName={quote.authorProfileName} authorName={quote.authorName} - authorColor={quoteColor} referencedMessageNotFound={quote.referencedMessageNotFound} isFromMe={quote.isFromMe} withContentAbove={withContentAbove} @@ -668,7 +662,6 @@ export class Message extends React.PureComponent { authorProfileName, collapseMetadata, senderIsModerator, - authorColor, conversationType, direction, i18n, @@ -1052,7 +1045,6 @@ export class Message extends React.PureComponent { public render() { const { authorPhoneNumber, - authorColor, direction, id, isKickedFromGroup, diff --git a/ts/components/conversation/ModeratorsAddDialog.tsx b/ts/components/conversation/ModeratorsAddDialog.tsx index 71ad9cd38..c97b6a869 100644 --- a/ts/components/conversation/ModeratorsAddDialog.tsx +++ b/ts/components/conversation/ModeratorsAddDialog.tsx @@ -51,7 +51,6 @@ export class AddModeratorsDialog extends React.Component { authorProfileName: name, selected: false, authorName: name, - authorColor: d.getColor(), checkmarked: false, existingMember, }; @@ -97,7 +96,6 @@ export class AddModeratorsDialog extends React.Component { authorAvatarPath: '', selected: true, authorName: this.state.inputBoxValue, - authorColor: '#000000', checkmarked: true, existingMember: false, }); diff --git a/ts/components/conversation/ModeratorsRemoveDialog.tsx b/ts/components/conversation/ModeratorsRemoveDialog.tsx index 85d830938..bc00b10d7 100644 --- a/ts/components/conversation/ModeratorsRemoveDialog.tsx +++ b/ts/components/conversation/ModeratorsRemoveDialog.tsx @@ -34,7 +34,6 @@ export class RemoveModeratorsDialog extends React.Component { const lokiProfile = d.getLokiProfile(); name = lokiProfile ? lokiProfile.displayName : 'Anonymous'; } - const authorColor = d.getColor ? d.getColor() : '#000000'; // TODO: should take existing members into account const existingMember = false; @@ -44,7 +43,6 @@ export class RemoveModeratorsDialog extends React.Component { authorProfileName: name, selected: false, authorName: name, - authorColor, checkmarked: true, existingMember, }; diff --git a/ts/components/conversation/Quote.tsx b/ts/components/conversation/Quote.tsx index cf9a27c9e..3737817b9 100644 --- a/ts/components/conversation/Quote.tsx +++ b/ts/components/conversation/Quote.tsx @@ -15,7 +15,6 @@ interface Props { authorPhoneNumber: string; authorProfileName?: string; authorName?: string; - authorColor?: ColorType; i18n: LocalizerType; isFromMe: boolean; isIncoming: boolean; @@ -365,7 +364,6 @@ export class Quote extends React.Component { public render() { const { - authorColor, isIncoming, onClick, referencedMessageNotFound, diff --git a/ts/components/conversation/UpdateGroupMembersDialog.tsx b/ts/components/conversation/UpdateGroupMembersDialog.tsx index a8f60afd9..97ce71de7 100644 --- a/ts/components/conversation/UpdateGroupMembersDialog.tsx +++ b/ts/components/conversation/UpdateGroupMembersDialog.tsx @@ -52,7 +52,6 @@ export class UpdateGroupMembersDialog extends React.Component { authorAvatarPath: d?.cachedProps?.avatarPath, selected: false, authorName: name, // different from ProfileName? - authorColor: d.getColor(), checkmarked: false, existingMember, }; diff --git a/ts/components/session/ActionsPanel.tsx b/ts/components/session/ActionsPanel.tsx index 16ad70c82..a8f1ea8f7 100644 --- a/ts/components/session/ActionsPanel.tsx +++ b/ts/components/session/ActionsPanel.tsx @@ -122,7 +122,6 @@ export class ActionsPanel extends React.Component { onSelect?: (event: SectionType) => void; type: SectionType; avatarPath?: string; - avatarColor?: string; notificationCount?: number; }) => { const handleClick = onSelect diff --git a/ts/components/session/SessionClosableOverlay.tsx b/ts/components/session/SessionClosableOverlay.tsx index 3977aa86f..342859376 100644 --- a/ts/components/session/SessionClosableOverlay.tsx +++ b/ts/components/session/SessionClosableOverlay.tsx @@ -95,7 +95,6 @@ export class SessionClosableOverlay extends React.Component { authorAvatarPath: d.avatarPath, selected: false, authorName: name, - authorColor: d.color, checkmarked: false, existingMember, }; diff --git a/ts/components/session/SessionMemberListItem.tsx b/ts/components/session/SessionMemberListItem.tsx index 7a07d20d9..7497800b5 100644 --- a/ts/components/session/SessionMemberListItem.tsx +++ b/ts/components/session/SessionMemberListItem.tsx @@ -10,7 +10,6 @@ export interface ContactType { authorProfileName: string; authorPhoneNumber: string; authorName: string; - authorColor: any; authorAvatarPath: string; checkmarked: boolean; existingMember: boolean; From 76dc5960dd8bb01776c5160f87828a7a09340fc3 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 15 Sep 2020 15:48:06 +1000 Subject: [PATCH 197/274] render grey Icon if no pubkey or avatarPath on Avatar --- ts/components/Avatar.tsx | 2 +- .../AvatarPlaceHolder/AvatarPlaceHolder.tsx | 47 ++++++-- .../AvatarPlaceHolder/ClosedGroupAvatar.tsx | 113 +++++++----------- 3 files changed, 81 insertions(+), 81 deletions(-) diff --git a/ts/components/Avatar.tsx b/ts/components/Avatar.tsx index b84c1c202..a440bdd1d 100644 --- a/ts/components/Avatar.tsx +++ b/ts/components/Avatar.tsx @@ -7,7 +7,7 @@ import { ConversationAttributes } from '../../js/models/conversations'; interface Props { avatarPath?: string; name?: string; // display name, profileName or phoneNumber, whatever is set first - pubkey: string; + pubkey?: string; size: number; closedMemberConversations?: Array; onAvatarClick?: () => void; diff --git a/ts/components/AvatarPlaceHolder/AvatarPlaceHolder.tsx b/ts/components/AvatarPlaceHolder/AvatarPlaceHolder.tsx index ae7c7774d..12d89d1be 100644 --- a/ts/components/AvatarPlaceHolder/AvatarPlaceHolder.tsx +++ b/ts/components/AvatarPlaceHolder/AvatarPlaceHolder.tsx @@ -4,7 +4,7 @@ import { getInitials } from '../../util/getInitials'; interface Props { diameter: number; name: string; - pubkey: string; + pubkey?: string; colors: Array; borderColor: string; } @@ -23,29 +23,52 @@ export class AvatarPlaceHolder extends React.PureComponent { } public componentDidMount() { - void this.sha512(this.props.pubkey).then((sha512Seed: string) => { - this.setState({ sha512Seed }); - }); + const { pubkey } = this.props; + if (pubkey) { + void this.sha512(pubkey).then((sha512Seed: string) => { + this.setState({ sha512Seed }); + }); + } } public componentDidUpdate(prevProps: Props, prevState: State) { - if (this.props.name === prevProps.name) { + const { pubkey, name } = this.props; + if (pubkey === prevProps.pubkey && name === prevProps.name) { return; } - void this.sha512(this.props.name).then((sha512Seed: string) => { - this.setState({ sha512Seed }); - }); + + if (pubkey) { + void this.sha512(pubkey).then((sha512Seed: string) => { + this.setState({ sha512Seed }); + }); + } } public render() { + const { borderColor, colors, diameter, name } = this.props; + const viewBox = `0 0 ${diameter} ${diameter}`; + const r = diameter / 2; + if (!this.state.sha512Seed) { - return <>; + // return grey circle + return ( + + + + + + ); } - const { borderColor, colors, diameter, name } = this.props; - const r = diameter / 2; const initial = getInitials(name)?.toLocaleUpperCase() || '0'; - const viewBox = `0 0 ${diameter} ${diameter}`; const fontSize = diameter * 0.5; // Generate the seed simulate the .hashCode as Java diff --git a/ts/components/AvatarPlaceHolder/ClosedGroupAvatar.tsx b/ts/components/AvatarPlaceHolder/ClosedGroupAvatar.tsx index ce74df90a..cbaccad85 100644 --- a/ts/components/AvatarPlaceHolder/ClosedGroupAvatar.tsx +++ b/ts/components/AvatarPlaceHolder/ClosedGroupAvatar.tsx @@ -10,74 +10,51 @@ interface Props { } export class ClosedGroupAvatar extends React.PureComponent { - public render() { - const { conversations, size } = this.props; - // FIXME audric render grey circle for missing avatar - if (conversations.length < 2) { - const conv = conversations[0]; - const name = conv.name || conv.id; - return ( - - ); - } else if (conversations.length > 1) { - // in a closed group avatar, each visible avatar member size is 2/3 of the group avatar in size - // Always use the size directly under the one requested - let avatarsDiameter = 0; - switch (size) { - case 36: { - avatarsDiameter = 28; - break; - } - case 48: { - avatarsDiameter = 36; - break; - } - case 64: { - avatarsDiameter = 48; - break; - } - case 80: { - avatarsDiameter = 64; - break; - } - case 300: { - avatarsDiameter = 80; - break; - } - default: - throw new Error( - `Invalid size request for closed group avatar: ${size}` - ); - } - const conv1 = conversations[0]; - const conv2 = conversations[1]; - const name1 = conv1.name || conv1.id; - const name2 = conv2.name || conv2.id; - - // use the 2 first members as group avatars - return ( -
- - -
- ); - } else { - return <>; + public getClosedGroupAvatarsSize(size: number) { + // Always use the size directly under the one requested + switch (size) { + case 36: + return 28; + case 48: + return 36; + case 64: + return 48; + case 80: + return 64; + case 300: + return 80; + default: + throw new Error( + `Invalid size request for closed group avatar: ${size}` + ); } } + + public render() { + const { conversations, size } = this.props; + const avatarsDiameter = this.getClosedGroupAvatarsSize(size); + + const conv1 = conversations.length > 0 ? conversations[0] : undefined; + const conv2 = conversations.length > 1 ? conversations[1] : undefined; + const name1 = conv1?.name || conv1?.id || undefined; + const name2 = conv2?.name || conv2?.id || undefined; + + // use the 2 first members as group avatars + return ( +
+ + +
+ ); + } } From 4d801fd8e5844a3237b58827cab8dec87141dd93 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 15 Sep 2020 16:38:24 +1000 Subject: [PATCH 198/274] check for changes on member avatars only on re rendering --- ts/components/Avatar.tsx | 10 ++--- .../AvatarPlaceHolder/ClosedGroupAvatar.tsx | 10 ++--- ts/components/ConversationListItem.tsx | 18 ++++++-- .../conversation/ConversationHeader.tsx | 11 +++-- .../session/SessionGroupSettings.tsx | 11 +++-- .../usingClosedConversationDetails.tsx | 41 ++++++++++++------- 6 files changed, 64 insertions(+), 37 deletions(-) diff --git a/ts/components/Avatar.tsx b/ts/components/Avatar.tsx index a440bdd1d..8c8226c2f 100644 --- a/ts/components/Avatar.tsx +++ b/ts/components/Avatar.tsx @@ -2,14 +2,14 @@ import React from 'react'; import classNames from 'classnames'; import { AvatarPlaceHolder, ClosedGroupAvatar } from './AvatarPlaceHolder'; -import { ConversationAttributes } from '../../js/models/conversations'; +import { ConversationAvatar } from './session/usingClosedConversationDetails'; interface Props { avatarPath?: string; name?: string; // display name, profileName or phoneNumber, whatever is set first pubkey?: string; size: number; - closedMemberConversations?: Array; + memberAvatars?: Array; // this is added by usingClosedConversationDetails onAvatarClick?: () => void; } @@ -75,13 +75,13 @@ export class Avatar extends React.PureComponent { } public renderNoImage() { - const { closedMemberConversations, size } = this.props; + const { memberAvatars, size } = this.props; // if no image but we have conversations set for the group, renders group members avatars - if (closedMemberConversations) { + if (memberAvatars) { return ( ); diff --git a/ts/components/AvatarPlaceHolder/ClosedGroupAvatar.tsx b/ts/components/AvatarPlaceHolder/ClosedGroupAvatar.tsx index cbaccad85..31a8b2fea 100644 --- a/ts/components/AvatarPlaceHolder/ClosedGroupAvatar.tsx +++ b/ts/components/AvatarPlaceHolder/ClosedGroupAvatar.tsx @@ -1,11 +1,11 @@ import React from 'react'; import { Avatar } from '../Avatar'; import { LocalizerType } from '../../types/Util'; -import { ConversationAttributes } from '../../../js/models/conversations'; +import { ConversationAvatar } from '../session/usingClosedConversationDetails'; interface Props { size: number; - conversations: Array; + memberAvatars: Array; // this is added by usingClosedConversationDetails i18n: LocalizerType; } @@ -31,11 +31,11 @@ export class ClosedGroupAvatar extends React.PureComponent { } public render() { - const { conversations, size } = this.props; + const { memberAvatars, size } = this.props; const avatarsDiameter = this.getClosedGroupAvatarsSize(size); - const conv1 = conversations.length > 0 ? conversations[0] : undefined; - const conv2 = conversations.length > 1 ? conversations[1] : undefined; + const conv1 = memberAvatars.length > 0 ? memberAvatars[0] : undefined; + const conv2 = memberAvatars.length > 1 ? memberAvatars[1] : undefined; const name1 = conv1?.name || conv1?.id || undefined; const name2 = conv2?.name || conv2?.id || undefined; diff --git a/ts/components/ConversationListItem.tsx b/ts/components/ConversationListItem.tsx index 06ac39a3a..1f7db35c3 100644 --- a/ts/components/ConversationListItem.tsx +++ b/ts/components/ConversationListItem.tsx @@ -21,7 +21,10 @@ import { getLeaveGroupMenuItem, } from '../session/utils/Menu'; -import { usingClosedConversationDetails } from './session/usingClosedConversationDetails'; +import { + ConversationAvatar, + usingClosedConversationDetails, +} from './session/usingClosedConversationDetails'; export type PropsData = { id: string; @@ -55,7 +58,7 @@ export type PropsData = { isSecondary?: boolean; isGroupInvitation?: boolean; isKickedFromGroup?: boolean; - closedMemberConversations?: any; // this is added by usingClosedConversationDetails + memberAvatars?: Array; // this is added by usingClosedConversationDetails }; type PropsHousekeeping = { @@ -80,7 +83,14 @@ class ConversationListItem extends React.PureComponent { } public renderAvatar() { - const { avatarPath, i18n, name, phoneNumber, profileName } = this.props; + const { + avatarPath, + i18n, + name, + phoneNumber, + profileName, + memberAvatars, + } = this.props; const iconSize = 36; const userName = name || profileName || phoneNumber; @@ -91,7 +101,7 @@ class ConversationListItem extends React.PureComponent { avatarPath={avatarPath} name={userName} size={iconSize} - closedMemberConversations={this.props.closedMemberConversations} + memberAvatars={memberAvatars} pubkey={phoneNumber} />
diff --git a/ts/components/conversation/ConversationHeader.tsx b/ts/components/conversation/ConversationHeader.tsx index 0b3bf2467..82151ed7f 100644 --- a/ts/components/conversation/ConversationHeader.tsx +++ b/ts/components/conversation/ConversationHeader.tsx @@ -16,7 +16,10 @@ import { SessionButtonType, } from '../session/SessionButton'; import * as Menu from '../../session/utils/Menu'; -import { usingClosedConversationDetails } from '../session/usingClosedConversationDetails'; +import { + ConversationAvatar, + usingClosedConversationDetails, +} from '../session/usingClosedConversationDetails'; export interface TimerOption { name: string; @@ -92,7 +95,7 @@ interface Props { onUpdateGroupName: () => void; i18n: LocalizerType; - closedMemberConversations?: any; // this is added by usingClosedConversationDetails + memberAvatars?: Array; // this is added by usingClosedConversationDetails } class ConversationHeader extends React.Component { @@ -198,7 +201,7 @@ class ConversationHeader extends React.Component { public renderAvatar() { const { avatarPath, - closedMemberConversations, + memberAvatars, name, phoneNumber, profileName, @@ -215,7 +218,7 @@ class ConversationHeader extends React.Component { onAvatarClick={() => { this.onAvatarClickBound(phoneNumber); }} - closedMemberConversations={closedMemberConversations} + memberAvatars={memberAvatars} pubkey={phoneNumber} /> diff --git a/ts/components/session/SessionGroupSettings.tsx b/ts/components/session/SessionGroupSettings.tsx index 1ebd8c9b2..2f182c9ca 100644 --- a/ts/components/session/SessionGroupSettings.tsx +++ b/ts/components/session/SessionGroupSettings.tsx @@ -10,7 +10,10 @@ import { SessionDropdown } from './SessionDropdown'; import { MediaGallery } from '../conversation/media-gallery/MediaGallery'; import _ from 'lodash'; import { TimerOption } from '../conversation/ConversationHeader'; -import { usingClosedConversationDetails } from '../session/usingClosedConversationDetails'; +import { + ConversationAvatar, + usingClosedConversationDetails, +} from '../session/usingClosedConversationDetails'; interface Props { id: string; @@ -24,7 +27,7 @@ interface Props { amMod: boolean; isKickedFromGroup: boolean; isBlocked: boolean; - closedMemberConversations?: any; // this is added by usingClosedConversationDetails + memberAvatars?: Array; // this is added by usingClosedConversationDetails onGoBack: () => void; onInviteContacts: () => void; @@ -311,7 +314,7 @@ class SessionGroupSettings extends React.Component { private renderHeader() { const { - closedMemberConversations, + memberAvatars, id, onGoBack, onInviteContacts, @@ -338,7 +341,7 @@ class SessionGroupSettings extends React.Component { avatarPath={avatarPath} name={userName} size={80} - closedMemberConversations={closedMemberConversations} + memberAvatars={memberAvatars} pubkey={id} />
diff --git a/ts/components/session/usingClosedConversationDetails.tsx b/ts/components/session/usingClosedConversationDetails.tsx index 9f6285fe0..e09f84ecf 100644 --- a/ts/components/session/usingClosedConversationDetails.tsx +++ b/ts/components/session/usingClosedConversationDetails.tsx @@ -2,9 +2,16 @@ import { GroupUtils } from '../../session/utils'; import { UserUtil } from '../../util'; import { PubKey } from '../../session/types'; import React from 'react'; -import { ConversationAttributes } from '../../../js/models/conversations'; +import * as _ from 'lodash'; + +export type ConversationAvatar = { + avatarPath?: string; + id?: string; // member's pubkey + name?: string; +}; + type State = { - closedMemberConversations?: Array; + memberAvatars?: Array; // this is added by usingClosedConversationDetails }; export function usingClosedConversationDetails(WrappedComponent: any) { @@ -12,7 +19,7 @@ export function usingClosedConversationDetails(WrappedComponent: any) { constructor(props: any) { super(props); this.state = { - closedMemberConversations: undefined, + memberAvatars: undefined, }; } @@ -27,7 +34,7 @@ export function usingClosedConversationDetails(WrappedComponent: any) { public render() { return ( ); @@ -58,20 +65,24 @@ export function usingClosedConversationDetails(WrappedComponent: any) { if (ourself) { members.push(ourPrimary); } - // no need to forward more than 2 conversation for rendering the group avatar + // no need to forward more than 2 conversations for rendering the group avatar members.slice(0, 2); - const membersConvos = await Promise.all( - members.map( - async m => - ( - await window.ConversationController.getOrCreateAndWait( - m.key, - 'private' - ) - ).cachedProps + const memberConvos = await Promise.all( + members.map(async m => + window.ConversationController.getOrCreateAndWait(m.key, 'private') ) ); - this.setState({ closedMemberConversations: membersConvos }); + const memberAvatars = memberConvos.map(m => { + return { + avatarPath: m.getAvatar()?.url || null, + id: m.id, + name: m.get('name') || m.get('profileName') || m.id, + }; + }); + + if (!_.isEqual(memberAvatars, this.state.memberAvatars)) { + this.setState({ memberAvatars }); + } } } }; From c0fa5fe290de11600d2f50392f9ee040ff0dd308 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 15 Sep 2020 16:39:11 +1000 Subject: [PATCH 199/274] hide annoying log --- js/modules/loki_app_dot_net_api.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/js/modules/loki_app_dot_net_api.js b/js/modules/loki_app_dot_net_api.js index c506e87fa..4bedce58b 100644 --- a/js/modules/loki_app_dot_net_api.js +++ b/js/modules/loki_app_dot_net_api.js @@ -169,14 +169,14 @@ const sendViaOnion = async (srvPubKey, url, fetchOptions, options = {}) => { ); } } else { - // why is + // FIXME why is // https://chat-dev.lokinet.org/loki/v1/channel/1/deletes?count=200&since_id= // difference in response than all the other calls.... - log.info( - `loki_app_dot_net:::sendViaOnion #${ - options.requestNumber - } - got object response ${url.toString()}` - ); + // log.info( + // `loki_app_dot_net:::sendViaOnion #${ + // options.requestNumber + // } - got object response ${url.toString()}` + // ); } // result.status has the http response code if (!txtResponse) { From 6d53c7562ba23a5edbf7ae6c7b8f410295b534cc Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 16 Sep 2020 08:57:49 +1000 Subject: [PATCH 200/274] fix test --- test/models/conversations_test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/test/models/conversations_test.js b/test/models/conversations_test.js index e8a7b1548..226e80365 100644 --- a/test/models/conversations_test.js +++ b/test/models/conversations_test.js @@ -133,7 +133,6 @@ describe('Conversation', () => { const convo = new Whisper.ConversationCollection().add(attributes); const avatar = convo.getAvatar(); assert.property(avatar, 'content'); - assert.property(avatar, 'color'); }); describe('when set to private', () => { From 5f9a8eea610728d49f1a808b42d9036b6a1451b3 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 16 Sep 2020 11:27:22 +1000 Subject: [PATCH 201/274] fix localized tools for japanese (no plurals issue) --- tools/mapAndroidTranslationsToDesktop.py | 52 +++++++++++++++++++++--- 1 file changed, 47 insertions(+), 5 deletions(-) diff --git a/tools/mapAndroidTranslationsToDesktop.py b/tools/mapAndroidTranslationsToDesktop.py index 5ec77f933..5d69e6e32 100755 --- a/tools/mapAndroidTranslationsToDesktop.py +++ b/tools/mapAndroidTranslationsToDesktop.py @@ -51,7 +51,13 @@ def getStringFromFileAsJSON(filepath): return getDictFromFile(filepath, 'string') def getPluralsFromFileAsJSON(filepath): - return getDictFromFile(filepath, 'plurals') + plurals = getDictFromFile(filepath, 'plurals') + # we need to force plurals to be an array (if plurals contains only one item, the dict won't contain an array itself) + for item in plurals: + if not isinstance(item['item'], list): + item['item'] = [item['item']] + + return plurals # read and extract values from xml file in EN android side androidEnJsonSingular = getStringFromFileAsJSON(androidEnValueFile) @@ -70,17 +76,27 @@ missingAndroidKeyCount = 0 notMatchingCount = 0 def findCountInItem(quantityStr, items): + # print(f'searching qty: {quantityStr}, items: {items}') found = [item for item in items if item['@quantity'] == quantityStr] # print(f'findCountInItem: {found}, quantityStr: {quantityStr}') if len(found) != 1: - str = f'quantityStr not found: "{quantityStr}"' - raise KeyError(str) + # special case for japanese. There is no plural, so all quantityString = `other` + if dest == 'ja': + found = [item for item in items if item['@quantity'] == 'other'] + if len(found) != 1: + str = f'quantityStr not found: other' + raise KeyError(str) + else: + str = f'quantityStr not found: "{quantityStr}"' + raise KeyError(str) return dict(found[0]) def findByNameSingular(keySearchedFor, singularString): found = [item for item in singularString if item['@name'] == keySearchedFor] + # print(f'findByNameSingular: searching {keySearchedFor}, found: {found}') + if len(found) != 1: str = f'android key singular not found: "{keySearchedFor}" but should have been found' raise KeyError(str) @@ -92,6 +108,8 @@ def findByNamePlurals(keySearchedFor, pluralsString, quantityStr): if len(found) != 1: str = f'android key plurals not found: "{keySearchedFor}" but should have been found' raise KeyError(str) + # f = found[0] + # print(f'\t\tquantityStr {quantityStr}, found {found}, f {f}, pluralsString {pluralsString}') return findCountInItem(quantityStr, found[0]['item']) @@ -121,7 +139,31 @@ def morphToDesktopSyntax(androidString, desktopItem): replaced = f'{toAdd}{replaced}' return replaced + # morph a string from android syntax to desktop syntax. Like replacing char, or %s +def morphToDesktopSyntaxTranslated(androidString, desktopItem): + replaced = androidString.replace(r"\'", "'") + + if('sentenceCase' in desktopItem.keys() and desktopItem['sentenceCase']): + replaced = replaced.capitalize() + + if ('androidReplace' in desktopItem.keys()): + for key, value in desktopItem['androidReplace'].items(): + replaced = replaced.replace(key.title(), value) + replaced = replaced.replace(key, value) + + # print(f"desktopItem: '{desktopItem}', replaced: '{desktopItem}'") + if ('addStart' in desktopItem.keys()): + toAdd = desktopItem['addStart'] + # special case for ja. appen the & and first char from desktop EN item + if dest == 'ja': + replaced = f'{replaced} ({toAdd}{desktopItem["message"][1]})' + else: + replaced = f'{toAdd}{replaced}' + return replaced + def getAndroidItem(androidKey, androidKeyCount, singularJson, pluralsJson): + # print(f"\tandroidKey: '{androidKey}'") + # print(f"\tandroidKeyCount: '{androidKeyCount}'") if androidKeyCount: return findByNamePlurals(androidKey, pluralsJson, androidKeyCount) else: @@ -177,12 +219,12 @@ for key, itemEnDesktop in desktopSrc.items(): notMatchingCount = notMatchingCount + 1 else: # if it does match, find the corresponding value on the target language on android - # print(f'EN to EN MATCH, continuing... : "{txtEnDesktop}" vs "{morphedEnAndroid}"') + # print(f'=============== EN to EN MATCH, continuing... : "{txtEnDesktop}" vs "{morphedEnAndroid}"') try: textTranslated = getAndroidItem(androidKey, androidKeyCount, androidDestJsonSingular, androidDestJsonPlurals)['#text'] # print(f'textTranslated: "{textTranslated}"') - textMorphed = morphToDesktopSyntax(textTranslated, itemEnDesktop) + textMorphed = morphToDesktopSyntaxTranslated(textTranslated, itemEnDesktop) existingItemTranslated = None existingTranslation = None if key in desktopDest.keys(): From 860999f35b59a5cdfd63a37becb0cc09f03f1635 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 16 Sep 2020 11:51:13 +1000 Subject: [PATCH 202/274] add japanese translation from mobile --- _locales/ja/messages.json | 369 +++++++++++++++++++++++++++++++------- 1 file changed, 309 insertions(+), 60 deletions(-) diff --git a/_locales/ja/messages.json b/_locales/ja/messages.json index 220030576..c7b5def55 100644 --- a/_locales/ja/messages.json +++ b/_locales/ja/messages.json @@ -16,7 +16,7 @@ "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": "表示 (&V)", + "message": "見る (&V)", "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": { @@ -56,7 +56,7 @@ "description": "Edit menu command to remove selected text and add it to clipboard" }, "editMenuCopy": { - "message": "コピー", + "message": "コピーする", "description": "Edit menu command to add selected text to clipboard" }, "editMenuPaste": { @@ -68,7 +68,7 @@ "description": "Edit menu command to insert text from clipboard at cursor location, taking only text and not style information" }, "editMenuDelete": { - "message": "削除する", + "message": "削除", "description": "Edit menu command to remove the selected text" }, "editMenuSelectAll": { @@ -128,7 +128,7 @@ "description": "Only available on development modes, menu option to open up the standalone device setup sequence" }, "loading": { - "message": "読み込んでいます", + "message": "読込中...", "description": "Message shown on the loading screen before we've loaded any messages" }, "optimizingApplication": { @@ -198,19 +198,19 @@ "description": "The label for yourself when shown in a group member list" }, "view": { - "message": "表示", + "message": "見る", "description": "Used as a label on a button allowing user to see more information" }, "youLeftTheGroup": { - "message": "グループを退出しました。", + "message": "グループを抜けました", "description": "Displayed when a user can't send a message because they have left the group" }, "unreadMessage": { - "message": "1 件の未読メッセージ", + "message": "$count$通の未読メッセージ", "description": "Text for unread message separator, just one message" }, "unreadMessages": { - "message": "$count$ 件の未読メッセージ", + "message": "$count$通の未読メッセージ", "description": "Text for unread message separator, with count", "placeholders": { "count": { @@ -220,7 +220,7 @@ } }, "youMarkedAsVerified": { - "message": "$name$との安全番号を検証済みにしました", + "message": "$name$に対する安全番号を検証済みにしました", "description": "Shown in the conversation history when the user marks a contact as verified.", "placeholders": { "name": { @@ -230,7 +230,7 @@ } }, "youMarkedAsNotVerified": { - "message": "$name$との安全番号を未検証にしました", + "message": "$name$に対する安全番号を未検証にしました", "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": { @@ -240,7 +240,7 @@ } }, "youMarkedAsVerifiedOtherDevice": { - "message": "$name$との安全番号を他の端末で検証済みにしました", + "message": "$name$に対する安全番号を他端末で検証済みにしました", "description": "Shown in the conversation history when we discover that the user marked a contact as verified on another device.", "placeholders": { "name": { @@ -250,7 +250,7 @@ } }, "youMarkedAsNotVerifiedOtherDevice": { - "message": "$name$との安全番号を他の端末で未検証にしました", + "message": "$name$に対する安全番号を他端末で未検証にしました", "description": "Shown in the conversation history when we discover that the user marked a contact as not verified on another device.", "placeholders": { "name": { @@ -268,7 +268,7 @@ "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "$name$との安全番号に変更があります。誰かが通信を傍受しようとしているかも知れませんし,$name$がSignalをインストールし直しただけかも知れません。", + "message": "$name$に対する安全番号が変更され、未検証となりました。だれかが通信を傍受しようとしているかも知れませんし、$name$がSessionを再インストールしただけかも知れません。", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -292,7 +292,7 @@ "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "$name$との安全番号が最近変わりました。誰かが通信を傍受しているかも知れませんし,$name$がSignalをインストールし直しただけかも知れません。", + "message": "$name$との安全番号が変更されました。通信が傍受されている可能性がありますが,$name$がSessionを再インストールしただけかも知れません。", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -342,11 +342,11 @@ "description": "Link to open the issue tracker" }, "gotIt": { - "message": "了解", + "message": "分かりました", "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": "提出", + "message": "送信する", "description": "" }, "verify": { @@ -358,7 +358,7 @@ "description": "" }, "isVerified": { - "message": "$name$との安全番号を検証しました", + "message": "$name$に対する安全番号を検証済みにしました", "description": "Summary state shown at top of the safety number screen if user has verified contact.", "placeholders": { "name": { @@ -394,15 +394,15 @@ "description": "Header of the default pane in the media gallery, showing images and videos" }, "mediaEmptyState": { - "message": "この会話にはメディアがありません", + "message": "メディアがありません", "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)" }, "documents": { - "message": "文書", + "message": "ドキュメント", "description": "Header of the secondary pane in the media gallery, showing every non-media attachment" }, "documentsEmptyState": { - "message": "この会話にはドキュメントがありません", + "message": "ドキュメントが見つかりません", "description": "Message shown to user in the media gallery when there are no messages with document attachments (anything other than images or video)" }, "today": { @@ -472,15 +472,15 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "選択したファイルが大きすぎます", + "message": "添付ファイルのサイズが上限を超えています", "description": "" }, "unableToLoadAttachment": { - "message": "選択された添付ファイルをロードできません。", + "message": "添付中にエラーが発生しました。", "description": "" }, "connecting": { - "message": "接続完了", + "message": "接続中...", "description": "Displayed when the desktop client is currently connecting to the server." }, "offline": { @@ -534,7 +534,7 @@ "description": "Placeholder text in the search input" }, "noSearchResults": { - "message": "No results for \"$searchTerm$\"", + "message": "「%s」に一致する情報は見つかりませんでした。", "description": "Shown in the search left pane when no results were found", "placeholders": { "searchTerm": { @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Signalにようこそ", + "message": "Sessionにようこそ", "description": "" }, "typingAlt": { @@ -614,11 +614,11 @@ "description": "Shown in triple-dot menu next to message to allow user to start crafting a message with a quotation" }, "originalMessageNotFound": { - "message": "元のメッセージを見つけれません", + "message": "元のメッセージが見つかりません", "description": "Shown in quote if reference message was not found as message was initially downloaded and processed" }, "originalMessageNotAvailable": { - "message": "元のメッセージは入手できません", + "message": "元のメッセージはすでに削除されています", "description": "Shown in toast if user clicks on quote that references message no longer in database" }, "messageFoundButNotLoaded": { @@ -630,11 +630,11 @@ "description": "Shown in toast if tries to record a voice note with any staged attachments" }, "you": { - "message": "自分", + "message": "あなた", "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "音声メッセージを送るには、Signalのマイクへのアクセスを許可してください。", + "message": "音声メッセージを送るには、Sessionのマイクへのアクセスを許可してください。", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -670,7 +670,7 @@ "description": "" }, "delete": { - "message": "削除する", + "message": "削除", "description": "" }, "deleteWarning": { @@ -678,15 +678,15 @@ "description": "" }, "deleteThisMessage": { - "message": "このメッセージを削除する", + "message": "メッセージの削除", "description": "" }, "from": { - "message": "差出人", + "message": "From:", "description": "Label for the sender of a message" }, "to": { - "message": "to", + "message": "To:", "description": "Label for the receiver of a message" }, "sent": { @@ -702,15 +702,15 @@ "description": "Placeholder text in the message entry field" }, "groupMembers": { - "message": "グループのメンバー", + "message": "グループメンバー", "description": "" }, "resetSession": { - "message": "接触を再設定", + "message": "安全なセッションをリセット", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." }, "showSafetyNumber": { - "message": "安全番号を表示する", + "message": "安全番号を見る", "description": "" }, "verifyHelp": { @@ -728,7 +728,7 @@ "description": "" }, "deleteMessage": { - "message": "メッセージを削除", + "message": "メッセージの削除", "description": "Shown on the drop-down menu for an individual message, deletes single message" }, "deleteMessages": { @@ -782,7 +782,7 @@ } }, "linkNewDevice": { - "message": "新規の端末をリンクする", + "message": "新しい端末を追加", "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { @@ -810,7 +810,7 @@ "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "通知をオフにする", + "message": "通知をミュート", "description": "Label for disabling notifications" }, "nameAndMessage": { @@ -834,11 +834,11 @@ "description": "Displayed in notifications for multiple messages" }, "notificationMostRecentFrom": { - "message": "最近の連絡先から:", + "message": "最新の受信: $name$", "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting" }, "notificationFrom": { - "message": "差出人:", + "message": "From:", "description": "Displayed in notifications when setting is 'name only' and one message is waiting" }, "notificationMostRecent": { @@ -846,7 +846,7 @@ "description": "Displayed in notifications when setting is 'name and message' and more than one message is waiting" }, "sendFailed": { - "message": "送信できませんでした", + "message": "送信失敗", "description": "Shown on outgoing message if it fails to send" }, "learnMore": { @@ -862,11 +862,11 @@ "description": "Label text for button to upgrade the app to the latest version" }, "mediaMessage": { - "message": "メディアメッセージ", + "message": "メディアでのメッセージ", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, "timestamp_s": { - "message": "1分以内", + "message": "今", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." }, "timestamp_m": { @@ -890,7 +890,7 @@ "description": "Brief message shown when trying to message a blocked group" }, "youChangedTheTimer": { - "message": "消えるメッセージのタイマーを$time$に設定しました", + "message": "消えるメッセージの消去時間を$time$に設定しました", "description": "Message displayed when you change the message expiration timer in a conversation.", "placeholders": { "time": { @@ -910,7 +910,7 @@ } }, "theyChangedTheTimer": { - "message": "$name$が消えるメッセージのタイマーを$time$に設定しました", + "message": "$name$が消えるメッセージの消去時間を$time$に設定しました", "description": "Message displayed when someone else changes the message expiration timer in a conversation.", "placeholders": { "name": { @@ -1024,11 +1024,11 @@ "description": "Very short format indicating current timer setting in the conversation header" }, "disappearingMessagesDisabled": { - "message": "消えるメッセージを無効にされました", + "message": "消えるメッセージが無効にされました", "description": "Displayed in the left pane when the timer is turned off" }, "disabledDisappearingMessages": { - "message": "$name$が消えるメッセージを無効にしました", + "message": "$name$ が消えるメッセージを無効にしました。", "description": "Displayed in the conversation list when the timer is turned off", "placeholders": { "name": { @@ -1038,11 +1038,11 @@ } }, "youDisabledDisappearingMessages": { - "message": "消えるメッセージを無効にしました", + "message": "消えるメッセージを無効にしました。", "description": "Displayed in the conversation list when the timer is turned off" }, "timerSetTo": { - "message": "タイマーが$time$に設定されました", + "message": "消えるメッセージの消去時間が$time$に設定されました", "description": "Displayed in the conversation list when the timer is updated by some automatic action, or in the left pane", "placeholders": { "time": { @@ -1052,11 +1052,11 @@ } }, "safetyNumberChanged": { - "message": "安全番号が変更されました", + "message": "安全番号が変わりました", "description": "A notification shown in the conversation when a contact reinstalls" }, "safetyNumberChangedGroup": { - "message": "$name$ との安全番号が変更されました", + "message": "$name$との安全番号が変わりました", "description": "A notification shown in a group conversation when a contact reinstalls, showing the contact name", "placeholders": { "name": { @@ -1066,7 +1066,7 @@ } }, "verifyNewNumber": { - "message": "安全番号を確認", + "message": "安全番号を検証する", "description": "Label on button included with safety number change notification in the conversation" }, "yourSafetyNumberWith": { @@ -1080,7 +1080,7 @@ } }, "noteToSelf": { - "message": "自分のためのメモ", + "message": "自分用メモ", "description": "Name for the conversation with your own phone number" }, "startConversation": { @@ -1108,11 +1108,11 @@ "description": "" }, "autoUpdateLaterButtonLabel": { - "message": "あとで", + "message": "後で", "description": "" }, "leftTheGroup": { - "message": "$name$ がグループを退会しました", + "message": "$name$がグループを抜けました。", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { @@ -1132,11 +1132,11 @@ } }, "updatedTheGroup": { - "message": "グループがアップデートされました", + "message": "グループが更新されました", "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "タイトルが '$name$' になりました", + "message": "グループ名が「$name$」になりました", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1146,7 +1146,7 @@ } }, "joinedTheGroup": { - "message": "$name$ がグループに参加しました", + "message": "$name$がグループに加わりました", "description": "Shown in the conversation history when a single person joins the group", "placeholders": { "name": { @@ -1156,7 +1156,7 @@ } }, "multipleJoinedTheGroup": { - "message": "$names$ がグループに参加しました", + "message": "$name$がグループに加わりました", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { "names": { @@ -1164,5 +1164,254 @@ "example": "Alice, Bob" } } + }, + "privacyPolicy": { + "message": "使用条件とプライバシーポリシー" + }, + "unknown": { + "message": "不明" + }, + "changedSinceVerifiedTitle": { + "message": "安全番号が変わりました" + }, + "youMayWishToVerifyContact": { + "message": "この連絡先との安全番号を確認しておいた方がいいかも知れません。" + }, + "about": { + "message": "Sessionについて" + }, + "settingsHeader": { + "message": "設定" + }, + "continue": { + "message": "続行" + }, + "devicePairingRequestReceivedLimitTitle": { + "message": "デバイス制限に達しました" + }, + "devicePairingRequestReceivedLimitDescription": { + "message": "追加している端末が多すぎます。いくつか削除してください。" + }, + "devicePairingRequestReceivedNoListenerTitle": { + "message": "リンクリクエストを受け取りました" + }, + "waitingForDeviceToRegister": { + "message": "デバイス待ち" + }, + "pairNewDevicePrompt": { + "message": "追加する端末に表示されているQRコードをスキャンする" + }, + "noPairedDevices": { + "message": "追加されている端末はありません" + }, + "deviceUnpaired": { + "message": "デバイスは正常にリンク解除されました" + }, + "sendMessageLeftGroup": { + "message": "グループを抜けました" + }, + "moreInformation": { + "message": "詳細" + }, + "resend": { + "message": "再送" + }, + "clearAllData": { + "message": "すべてのデータを消去する" + }, + "deleteAccountWarning": { + "message": "これにより、メッセージ、Session、連絡先が完全に削除されます。" + }, + "deleteContactConfirmation": { + "message": "この会話を削除してもよろしいですか?" + }, + "copy": { + "message": "コピーする" + }, + "linkPreviewsTitle": { + "message": "リンクプレビューを送る" + }, + "linkPreviewDescription": { + "message": "プレビューはImgur、Instagram、Pinterest、RedditおよびYouTubeリンクをサポートしています" + }, + "readReceiptSettingTitle": { + "message": "既読通知" + }, + "typingIndicatorsSettingTitle": { + "message": "入力中アイコン" + }, + "themeToggleTitle": { + "message": "ライト" + }, + "successUnlinked": { + "message": "デバイスは正常にリンク解除されました" + }, + "autoUpdateDownloadButtonLabel": { + "message": "ダウンロード" + }, + "blockUser": { + "message": "ブロック" + }, + "unblockUser": { + "message": "ブロック解除" + }, + "blockedSettingsTitle": { + "message": "ブロックした連絡先" + }, + "leaveGroup": { + "message": "グループを抜ける" + }, + "leaveGroupConfirmation": { + "message": "このグループを退会しますか?" + }, + "noContactsForGroup": { + "message": "まだ連絡先がありません" + }, + "editGroup": { + "message": "グループを編集する" + }, + "updateGroupDialogTitle": { + "message": "$name$をアップデート中..." + }, + "showRecoveryPhrase": { + "message": "リカバリーフレーズ" + }, + "yourSessionID": { + "message": "あなたの Session ID" + }, + "recoveryPhraseSavePromptMain": { + "message": "リカバリーフレーズは、Session ID のマスターキーです。デバイスにアクセスできなくなった場合、これを使用して Session ID を復元できます。リカバリーフレーズを安全な場所に保管し、誰にも教えないでください。" + }, + "copiedToClipboard": { + "message": "クリップボードにコピーされました" + }, + "unlock": { + "message": "ロック解除" + }, + "connectToServerFail": { + "message": "グループに参加できませんでした" + }, + "connectingToServer": { + "message": "接続中..." + }, + "remove": { + "message": "削除" + }, + "invalidSessionId": { + "message": "Session ID が無効です" + }, + "emptyGroupNameError": { + "message": "グループ名を入力してください" + }, + "groupNamePlaceholder": { + "message": "グループ名" + }, + "inviteContacts": { + "message": "友達にオススメする" + }, + "yourUniqueSessionID": { + "message": "Session ID をご紹介します" + }, + "allUsersAreRandomly...": { + "message": "Session ID は、Session で連絡を取るために使用できる一意のアドレスです。本当のアイデンティティに関係なく、あなたの Session ID は設計上完全に匿名でプライベートです。" + }, + "generateSessionID": { + "message": "Session ID を作成する" + }, + "recoveryPhrase": { + "message": "リカバリーフレーズ" + }, + "enterRecoveryPhrase": { + "message": "リカバリーフレーズを入力してください" + }, + "enterDisplayName": { + "message": "表示名を入力してください" + }, + "enterSessionIDHere": { + "message": "Session ID を入力してください" + }, + "continueYourSession": { + "message": "Session を続ける" + }, + "linkDevice": { + "message": "デバイスをリンクする" + }, + "restoreUsingRecoveryPhrase": { + "message": "アカウントを復元する" + }, + "newSession": { + "message": "新しい Session" + }, + "searchFor...": { + "message": "会話やメッセージ、連絡先を検索します。" + }, + "enterSessionID": { + "message": "Session ID を入力してください" + }, + "enterSessionIDOfRecipient": { + "message": "受信者の Session ID を入力してください" + }, + "usersCanShareTheir...": { + "message": "ユーザーは、アカウント設定に移動して [Session ID を共有] をタップするか、QR コードを共有することで、Session ID を共有できます。" + }, + "appearanceSettingsTitle": { + "message": "デザイン設定" + }, + "privacySettingsTitle": { + "message": "プライバシー" + }, + "notificationsSettingsTitle": { + "message": "通知" + }, + "devicesSettingsTitle": { + "message": "追加されている端末" + }, + "recoveryPhraseEmpty": { + "message": "リカバリーフレーズを入力してください" + }, + "displayNameEmpty": { + "message": "表示名を選択してください" + }, + "joinOpenGroup": { + "message": "オープングループに参加する" + }, + "newClosedGroup": { + "message": "新しいクローズドグループ" + }, + "newClosedGroupDescription": { + "message": "クローズドグループは最大 10 人のメンバーをサポートし、1 対 1 の Session と同じプライバシー保護を提供します。" + }, + "createClosedGroupNamePrompt": { + "message": "グループ名" + }, + "createClosedGroupPlaceholder": { + "message": "グループ名を入力してください" + }, + "openGroupURL": { + "message": "グループの URL を開く" + }, + "enterAnOpenGroupURL": { + "message": "オープングループの URL を入力する" + }, + "next": { + "message": "進む" + }, + "pairingDevice": { + "message": "端末を追加中" + }, + "invalidGroupNameTooShort": { + "message": "グループ名を入力してください" + }, + "invalidGroupNameTooLong": { + "message": "短いグループ名を入力してください" + }, + "pickClosedGroupMember": { + "message": "グループメンバーを少なくとも 2 人選択してください" + }, + "closedGroupMaxSize": { + "message": "閉じたグループは 10 人を超えるメンバーを抱えることはできません" + }, + "noBlockedContacts": { + "message": "ブロックしている連絡先はありません" } } \ No newline at end of file From 03911faab3681a47983269163265f636281a82af Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 16 Sep 2020 11:53:09 +1000 Subject: [PATCH 203/274] add polish translation from mobile --- _locales/pl/messages.json | 342 ++++++++++++++++++++++++++++++++------ 1 file changed, 294 insertions(+), 48 deletions(-) diff --git a/_locales/pl/messages.json b/_locales/pl/messages.json index 47b80199a..e86d406f0 100644 --- a/_locales/pl/messages.json +++ b/_locales/pl/messages.json @@ -16,7 +16,7 @@ "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": "&Widok", + "message": "&Zobacz", "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": { @@ -202,15 +202,15 @@ "description": "Used as a label on a button allowing user to see more information" }, "youLeftTheGroup": { - "message": "Opuściłeś(aś) grupę", + "message": "Opuściłeś(aś) grupę.", "description": "Displayed when a user can't send a message because they have left the group" }, "unreadMessage": { - "message": "1 nieprzeczytana wiadomość", + "message": "$count$ nieprzeczytana wiadomość", "description": "Text for unread message separator, just one message" }, "unreadMessages": { - "message": "Nieprzeczytane wiadomości: $count$", + "message": "$count$ nieprzeczytanych wiadomości", "description": "Text for unread message separator, with count", "placeholders": { "count": { @@ -220,7 +220,7 @@ } }, "youMarkedAsVerified": { - "message": "Oznaczyłeś(aś) Twój numer bezpieczeństwa z $name$ jako zweryfikowany", + "message": "Oznaczyłeś(aś) numer bezpieczeństwa z $name$ jako zweryfikowany", "description": "Shown in the conversation history when the user marks a contact as verified.", "placeholders": { "name": { @@ -230,7 +230,7 @@ } }, "youMarkedAsNotVerified": { - "message": "Oznaczyłeś(aś) Twój numer bezpieczeństwa z $name$ jako niezweryfikowany", + "message": "Oznaczyłeś(aś) numer bezpieczeństwa z $name$ jako niezweryfikowany", "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": { @@ -240,7 +240,7 @@ } }, "youMarkedAsVerifiedOtherDevice": { - "message": "Oznaczyłeś(aś) Twój numer bezpieczeństwa z $name$ jako zweryfikowany z innego urządzenia", + "message": "Oznaczyłeś(aś) numer bezpieczeństwa z $name$ jako zweryfikowany na innym urządzeniu", "description": "Shown in the conversation history when we discover that the user marked a contact as verified on another device.", "placeholders": { "name": { @@ -250,7 +250,7 @@ } }, "youMarkedAsNotVerifiedOtherDevice": { - "message": "Oznaczyłeś(aś) Twój numer bezpieczeństwa z $name$ jako niezweryfikowany z innego urządzenia", + "message": "Oznaczyłeś(aś) numer bezpieczeństwa z $name$ jako niezweryfikowany na innym urządzeniu", "description": "Shown in the conversation history when we discover that the user marked a contact as not verified on another device.", "placeholders": { "name": { @@ -268,7 +268,7 @@ "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Twój numer bezpieczeństwa z $name$ zmienił się od ostatniego czasu gdy go zweryfikowałeś. To może oznaczać, że ktoś próbuje przechwycić Twoją komunikację, albo że $name$ po prostu przeinstalował(a) aplikację Session. ", + "message": "Twój numer bezpieczeństwa z $name$ zmienił się i nie już zweryfikowany. To może oznaczać, że ktoś próbuje przechwycić Twoją komunikację lub, że $name$ przeinstalował Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -292,7 +292,7 @@ "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Numer bezpieczeństwa $name$ zmienił się. To może oznaczać, że ktoś próbuje przechwycić Twoją komunikację lub że po prostu $name$ przeinstalował(a) aplikację Session. ", + "message": "Numer bezpieczeństwa z $name$ zmienił się. To może oznaczać, że ktoś próbuje przechwycić Twoją komunikację, lub że po prostu $name$ przeinstalował Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -342,7 +342,7 @@ "description": "Link to open the issue tracker" }, "gotIt": { - "message": "Rozumiem!", + "message": "Rozumiem", "description": "Label for a button that dismisses a dialog. The user clicks it to confirm that they understand the message in the dialog." }, "submit": { @@ -358,7 +358,7 @@ "description": "" }, "isVerified": { - "message": "Zweryfikowałeś(aś) numer bezpieczeństwa z $name$.", + "message": "Oznaczyłeś(aś) numer bezpieczeństwa z $name$ jako zweryfikowany", "description": "Summary state shown at top of the safety number screen if user has verified contact.", "placeholders": { "name": { @@ -378,7 +378,7 @@ } }, "verified": { - "message": "Zweryfikowany", + "message": "Zweryfikowano", "description": "" }, "newIdentity": { @@ -390,11 +390,11 @@ "description": "" }, "media": { - "message": "Media", + "message": "Multimedia", "description": "Header of the default pane in the media gallery, showing images and videos" }, "mediaEmptyState": { - "message": "Nie masz żadnych mediów w tej rozmowie", + "message": "Brak multimediów", "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)" }, "documents": { @@ -402,11 +402,11 @@ "description": "Header of the secondary pane in the media gallery, showing every non-media attachment" }, "documentsEmptyState": { - "message": "Nie masz żadnych dokumentów w tej rozmowie", + "message": "Brak dokumentów", "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": "Dziś", + "message": "Dzisiaj", "description": "Section header in the media gallery" }, "yesterday": { @@ -418,7 +418,7 @@ "description": "Section header in the media gallery" }, "thisMonth": { - "message": "Ten miesiąc", + "message": "W tym miesiącu", "description": "Section header in the media gallery" }, "voiceMessage": { @@ -472,15 +472,15 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "Wybrany plik przekracza ograniczenia rozmiaru wiadomości.", + "message": "Rozmiar tego załącznika przekracza limit wiadomości.", "description": "" }, "unableToLoadAttachment": { - "message": "Nie można załadować wybranego załącznika.", + "message": "Przepraszamy, wystąpił błąd podczas dodawania załącznika.", "description": "" }, "connecting": { - "message": "Trwa łączenie", + "message": "Łączenie...", "description": "Displayed when the desktop client is currently connecting to the server." }, "offline": { @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Witamy w Session", + "message": "Witamy w Session.", "description": "" }, "typingAlt": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "Aby wysyłać wiadomości audio, zezwól aplikacji Session Desktop na dostęp do mikrofonu.", + "message": "Aby wysyłać wiadomości głosowe, zezwól Session na dostęp do mikrofonu.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -642,7 +642,7 @@ "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, "audio": { - "message": "Dzwięk", + "message": "Dźwięk", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" }, "video": { @@ -682,11 +682,11 @@ "description": "" }, "from": { - "message": "Od", + "message": "Od:", "description": "Label for the sender of a message" }, "to": { - "message": "do", + "message": "Do:", "description": "Label for the receiver of a message" }, "sent": { @@ -694,7 +694,7 @@ "description": "Label for the time a message was sent" }, "received": { - "message": "Odebrano", + "message": "Otrzymano", "description": "Label for the time a message was received" }, "sendMessage": { @@ -706,7 +706,7 @@ "description": "" }, "resetSession": { - "message": "Reset sesji", + "message": "Reset bezpiecznej sesji", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." }, "showSafetyNumber": { @@ -782,7 +782,7 @@ } }, "linkNewDevice": { - "message": "Połącz nowe urządzenie", + "message": "Dodaj nowe urządzenie", "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { @@ -810,7 +810,7 @@ "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "Wyłącz powiadomienia", + "message": "Wycisz powiadomienia", "description": "Label for disabling notifications" }, "nameAndMessage": { @@ -834,7 +834,7 @@ "description": "Displayed in notifications for multiple messages" }, "notificationMostRecentFrom": { - "message": "Najnowsze od:", + "message": "Najnowsza z: $name$", "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting" }, "notificationFrom": { @@ -846,7 +846,7 @@ "description": "Displayed in notifications when setting is 'name and message' and more than one message is waiting" }, "sendFailed": { - "message": "Wysyłanie nie powiodło się", + "message": "Nie udało się wysłać", "description": "Shown on outgoing message if it fails to send" }, "learnMore": { @@ -866,7 +866,7 @@ "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, "timestamp_s": { - "message": "teraz", + "message": "Teraz", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." }, "timestamp_m": { @@ -890,7 +890,7 @@ "description": "Brief message shown when trying to message a blocked group" }, "youChangedTheTimer": { - "message": "Ustawiłeś(aś) znikające wiadomości na $time$", + "message": "Ustawiłeś(aś) znikające wiadomości na $time$.", "description": "Message displayed when you change the message expiration timer in a conversation.", "placeholders": { "time": { @@ -910,7 +910,7 @@ } }, "theyChangedTheTimer": { - "message": "$name$ ustawił(a) znikające wiadomości na $time$", + "message": "$name$ ustawił(a) znikające wiadomości na $time$.", "description": "Message displayed when someone else changes the message expiration timer in a conversation.", "placeholders": { "name": { @@ -924,7 +924,7 @@ } }, "timerOption_0_seconds": { - "message": "wyłącz", + "message": "Wyłączone", "description": "Label for option to turn off message expiration in the timer menu" }, "timerOption_5_seconds": { @@ -976,7 +976,7 @@ "description": "Conversation menu option to enable disappearing messages" }, "timerOption_0_seconds_abbreviated": { - "message": "wyłączone", + "message": "wyłączona", "description": "Short format indicating current timer setting in the conversation list snippet" }, "timerOption_5_seconds_abbreviated": { @@ -1024,11 +1024,11 @@ "description": "Very short format indicating current timer setting in the conversation header" }, "disappearingMessagesDisabled": { - "message": "Znikające wiadomości wyłączone", + "message": "Znikające wiadomości zostały wyłączone", "description": "Displayed in the left pane when the timer is turned off" }, "disabledDisappearingMessages": { - "message": "$name$ wyłączył(a) znikające wiadomości", + "message": "$name$ wyłączył(a) znikające wiadomości.", "description": "Displayed in the conversation list when the timer is turned off", "placeholders": { "name": { @@ -1038,11 +1038,11 @@ } }, "youDisabledDisappearingMessages": { - "message": "Wyłączyłeś(aś) znikające wiadomości", + "message": "Wyłączyłeś(aś) znikające wiadomości.", "description": "Displayed in the conversation list when the timer is turned off" }, "timerSetTo": { - "message": "Czas ustawiony na $time$.", + "message": "Czas znikania wiadomości ustawiony na $time$", "description": "Displayed in the conversation list when the timer is updated by some automatic action, or in the left pane", "placeholders": { "time": { @@ -1052,11 +1052,11 @@ } }, "safetyNumberChanged": { - "message": "Numer bezpieczeństwa się zmienił", + "message": "Numer bezpieczeństwa zmienił się", "description": "A notification shown in the conversation when a contact reinstalls" }, "safetyNumberChangedGroup": { - "message": "Numer bezpieczeństwa z $name$ został zmieniony", + "message": "Twój numer bezpieczeństwa z $name$ zmienił się.", "description": "A notification shown in a group conversation when a contact reinstalls, showing the contact name", "placeholders": { "name": { @@ -1112,7 +1112,7 @@ "description": "" }, "leftTheGroup": { - "message": "$name$ opuścił(a) grupę", + "message": "$name$ opuścił(a) grupę.", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { @@ -1132,11 +1132,11 @@ } }, "updatedTheGroup": { - "message": "Grupa została uaktualniona", + "message": "Grupa zaktualizowana", "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Zmiana tytułu na '$name$'", + "message": "Aktualna nazwa grupy to '$name$'.", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1146,7 +1146,7 @@ } }, "joinedTheGroup": { - "message": "$name$ dołączył(a) do grupy", + "message": "$name$ dołączył(a) do grupy.", "description": "Shown in the conversation history when a single person joins the group", "placeholders": { "name": { @@ -1156,7 +1156,7 @@ } }, "multipleJoinedTheGroup": { - "message": "$names$ dołączyli do grupy", + "message": "$name$ dołączyli do grupy.", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { "names": { @@ -1164,5 +1164,251 @@ "example": "Alice, Bob" } } + }, + "privacyPolicy": { + "message": "Regulamin & Polityka prywatności" + }, + "unknown": { + "message": "Nieznany" + }, + "changedSinceVerifiedTitle": { + "message": "Numer bezpieczeństwa zmienił się" + }, + "youMayWishToVerifyContact": { + "message": "Możesz zweryfikować numer bezpieczeństwa z tym kontaktem." + }, + "about": { + "message": "O mnie" + }, + "settingsHeader": { + "message": "Ustawienia" + }, + "continue": { + "message": "Kontynuuj" + }, + "devicePairingRequestReceivedLimitTitle": { + "message": "Osiągnięto limit urządzeń" + }, + "devicePairingRequestReceivedLimitDescription": { + "message": "Masz zbyt dużo powiązanych urządzeń, spróbuj usunąć któreś z nich zanim spróbujesz ponownie" + }, + "devicePairingRequestReceivedNoListenerTitle": { + "message": "Otrzymano żądanie połączenia" + }, + "waitingForDeviceToRegister": { + "message": "Oczekiwanie na urządzenie" + }, + "pairNewDevicePrompt": { + "message": "Zeskanuj kod QR wyświetlony na urządzeniu, które chcesz dodać" + }, + "noPairedDevices": { + "message": "Brak powiązanych urządzeń" + }, + "deviceUnpaired": { + "message": "Twoje urządzenie zostało rozłączone pomyślnie" + }, + "sendMessageLeftGroup": { + "message": "Opuściłeś(aś) grupę." + }, + "moreInformation": { + "message": "Więcej informacji" + }, + "resend": { + "message": "Wyślij ponownie" + }, + "clearAllData": { + "message": "Wyczyść wszystkie dane" + }, + "deleteAccountWarning": { + "message": "Spowoduje to trwałe usunięcie wiadomości, Session i kontaktów." + }, + "deleteContactConfirmation": { + "message": "Czy na pewno chcesz usunąć tę rozmowę?" + }, + "copy": { + "message": "Kopiuj" + }, + "linkPreviewsTitle": { + "message": "Podgląd linków" + }, + "linkPreviewDescription": { + "message": "Podglądy linków są wspierane dla Imgur, Instagram, Pinterest, Reddit i YouTube." + }, + "readReceiptSettingTitle": { + "message": "Potwierdzenia przeczytania" + }, + "typingIndicatorsSettingTitle": { + "message": "Wskaźniki pisania" + }, + "themeToggleTitle": { + "message": "Jasny" + }, + "successUnlinked": { + "message": "Twoje urządzenie zostało rozłączone pomyślnie" + }, + "autoUpdateDownloadButtonLabel": { + "message": "Pobierz" + }, + "blockUser": { + "message": "Zablokuj" + }, + "unblockUser": { + "message": "Odblokuj" + }, + "blockedSettingsTitle": { + "message": "Zablokowane kontakty" + }, + "leaveGroup": { + "message": "Opuść grupę" + }, + "leaveGroupConfirmation": { + "message": "Czy na pewno chcesz opuścić tę grupę?" + }, + "noContactsForGroup": { + "message": "Nie masz jeszcze żadnych kontaktów" + }, + "editGroup": { + "message": "Edytuj grupę" + }, + "updateGroupDialogTitle": { + "message": "Aktualizowanie $name$..." + }, + "showRecoveryPhrase": { + "message": "Zwrot odzyskiwania" + }, + "yourSessionID": { + "message": "Twój identyfikator Session" + }, + "recoveryPhraseSavePromptMain": { + "message": "Twoja fraza odzyskiwania jest kluczem głównym do identyfikatora Session - możesz go użyć do przywrócenia identyfikatora Session, jeśli stracisz dostęp do urządzenia. Przechowuj swoją frazę odzyskiwania w bezpiecznym miejscu i nikomu jej nie udostępniaj." + }, + "copiedToClipboard": { + "message": "Skopiowane do schowka" + }, + "unlock": { + "message": "Odblokuj" + }, + "connectToServerFail": { + "message": "Nie można dołączyć do grupy" + }, + "connectingToServer": { + "message": "Łączenie..." + }, + "remove": { + "message": "Usuń" + }, + "invalidSessionId": { + "message": "Nieprawidłowy identyfikator Session" + }, + "emptyGroupNameError": { + "message": "Wpisz nazwę grupy" + }, + "groupNamePlaceholder": { + "message": "Nazwa grupy" + }, + "inviteContacts": { + "message": "Zaproś znajomych" + }, + "yourUniqueSessionID": { + "message": "Przywitaj się z identyfikatorem Session" + }, + "allUsersAreRandomly...": { + "message": "Twój identyfikator Session to unikalny adres, za pomocą którego można się z Tobą kontaktować w Sesji. Bez połączenia z twoją prawdziwą tożsamością, identyfikator Session jest z założenia całkowicie anonimowy i prywatny." + }, + "generateSessionID": { + "message": "Utwórz identyfikator Session" + }, + "recoveryPhrase": { + "message": "Zwrot odzyskiwania" + }, + "enterRecoveryPhrase": { + "message": "Wpisz swoją frazę odzyskiwania" + }, + "enterDisplayName": { + "message": "Wprowadź wyświetlaną nazwe" + }, + "enterSessionIDHere": { + "message": "Wpisz swój identyfikator Session" + }, + "continueYourSession": { + "message": "Kontynuuj swoją sesję" + }, + "linkDevice": { + "message": "Połącz urządzenie" + }, + "restoreUsingRecoveryPhrase": { + "message": "Przywróć swoje konto" + }, + "newSession": { + "message": "Nowa Session" + }, + "searchFor...": { + "message": "Szukaj rozmów, kontaktów i wiadomości" + }, + "enterSessionID": { + "message": "Wpisz identyfikator Session" + }, + "enterSessionIDOfRecipient": { + "message": "Wprowadź identyfikator Session odbiorcy" + }, + "usersCanShareTheir...": { + "message": "Użytkownicy mogą udostępnić swój identyfikator Session, przechodząc do ustawień konta i stukając opcję Udostępnij identyfikator Session lub udostępniając kod QR." + }, + "appearanceSettingsTitle": { + "message": "Wygląd" + }, + "privacySettingsTitle": { + "message": "Prywatność" + }, + "notificationsSettingsTitle": { + "message": "Powiadomienia" + }, + "devicesSettingsTitle": { + "message": "Połączone urządzenia" + }, + "recoveryPhraseEmpty": { + "message": "Wpisz swoją frazę odzyskiwania" + }, + "displayNameEmpty": { + "message": "Wybierz wyświetlaną nazwę" + }, + "joinOpenGroup": { + "message": "Dołącz do Open Group" + }, + "newClosedGroup": { + "message": "Nowa grupa zamknięta" + }, + "newClosedGroupDescription": { + "message": "Grupy zamknięte obsługują do 10 członków i zapewniają taką samą ochronę prywatności jak sesje jeden na jednego." + }, + "createClosedGroupNamePrompt": { + "message": "Nazwa grupy" + }, + "createClosedGroupPlaceholder": { + "message": "Wpisz nazwę grupy" + }, + "openGroupURL": { + "message": "Otwórz adres URL grupy" + }, + "enterAnOpenGroupURL": { + "message": "Wprowadź adres URL otwartej grupy" + }, + "next": { + "message": "Dalej" + }, + "pairingDevice": { + "message": "Rejestrowanie urządzenia" + }, + "invalidGroupNameTooShort": { + "message": "Wpisz nazwę grupy" + }, + "invalidGroupNameTooLong": { + "message": "Wprowadź krótszą nazwę grupy" + }, + "closedGroupMaxSize": { + "message": "Grupa zamknięta nie może mieć więcej niż 10 członków" + }, + "noBlockedContacts": { + "message": "Brak zablokowanych kontaktów" } } \ No newline at end of file From 9a0acd140883881691872684671f1d81c4b5c1f9 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 16 Sep 2020 11:55:03 +1000 Subject: [PATCH 204/274] add vietnamese translation from mobile --- _locales/vi/messages.json | 280 ++++++++++++++++++++++++++++++++------ 1 file changed, 242 insertions(+), 38 deletions(-) diff --git a/_locales/vi/messages.json b/_locales/vi/messages.json index 5fdc8a190..1a287b89f 100644 --- a/_locales/vi/messages.json +++ b/_locales/vi/messages.json @@ -24,7 +24,7 @@ "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", + "message": "&Trợ giúp", "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." }, "appMenuHide": { @@ -44,7 +44,7 @@ "description": "Application menu command to close the application" }, "editMenuUndo": { - "message": "Undo", + "message": "Hoàn tác", "description": "Edit menu command to remove recently-typed text" }, "editMenuRedo": { @@ -56,7 +56,7 @@ "description": "Edit menu command to remove selected text and add it to clipboard" }, "editMenuCopy": { - "message": "Copy", + "message": "Sao chép", "description": "Edit menu command to add selected text to clipboard" }, "editMenuPaste": { @@ -68,11 +68,11 @@ "description": "Edit menu command to insert text from clipboard at cursor location, taking only text and not style information" }, "editMenuDelete": { - "message": "Delete", + "message": "Xóa", "description": "Edit menu command to remove the selected text" }, "editMenuSelectAll": { - "message": "Select All", + "message": "Chọn tất cả", "description": "Edit menu comand to select all of the text in selected text box" }, "editMenuStartSpeaking": { @@ -202,7 +202,7 @@ "description": "Used as a label on a button allowing user to see more information" }, "youLeftTheGroup": { - "message": "You left the group", + "message": "Bạn đã rời nhóm.", "description": "Displayed when a user can't send a message because they have left the group" }, "unreadMessage": { @@ -292,7 +292,7 @@ "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Your safety number with $name$ has changed recently. This could mean that someone is trying to intercept your communication or that $name$ has simply reinstalled Session.", + "message": "Mã số an toàn với $name$ đã thay đổi. Điều này có thể là do ai đó đang tìm cách đánh chặn thông tin của bạn, hoặc $name$ đã chỉ vừa mới cài lại Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -342,11 +342,11 @@ "description": "Link to open the issue tracker" }, "gotIt": { - "message": "Đã rõ!", + "message": "Đã nhận được", "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": "Gửi", + "message": "Nộp", "description": "" }, "verify": { @@ -398,7 +398,7 @@ "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)" }, "documents": { - "message": "Documents", + "message": "Tài liệu", "description": "Header of the secondary pane in the media gallery, showing every non-media attachment" }, "documentsEmptyState": { @@ -406,7 +406,7 @@ "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", + "message": "Hôm nay", "description": "Section header in the media gallery" }, "yesterday": { @@ -414,11 +414,11 @@ "description": "Section header in the media gallery" }, "thisWeek": { - "message": "This Week", + "message": "Tuần này", "description": "Section header in the media gallery" }, "thisMonth": { - "message": "This Month", + "message": "Tháng này", "description": "Section header in the media gallery" }, "voiceMessage": { @@ -472,15 +472,15 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "Rất tiếc, các tập tin đã chọn vượt quá giới hạn kích thước của tin nhắn.", + "message": "Văn bản đính kèm vượt quá giới hạn kích cỡ cho loại tin nhắn mà bạn đang gửi.", "description": "" }, "unableToLoadAttachment": { - "message": "Unable to load selected attachment.", + "message": "Xin lỗi, có lỗi thiết đặt tập tin đính kèm của bạn.", "description": "" }, "connecting": { - "message": "Đang kết nối", + "message": "Đang kết nối...", "description": "Displayed when the desktop client is currently connecting to the server." }, "offline": { @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Chào mừng đến với Session", + "message": "Chào mừng bạn đến với Session.", "description": "" }, "typingAlt": { @@ -630,7 +630,7 @@ "description": "Shown in toast if tries to record a voice note with any staged attachments" }, "you": { - "message": "You", + "message": "Bạn", "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { @@ -642,11 +642,11 @@ "description": "Button shown in popup asking to enable microphon/video permissions to send audio messages" }, "audio": { - "message": "Audio", + "message": "Âm thanh", "description": "Shown in a quotation of a message containing an audio attachment if no text was originally provided with that attachment" }, "video": { - "message": "Video", + "message": "Đoạn phim", "description": "Shown in a quotation of a message containing a video if no text was originally provided with that video" }, "photo": { @@ -670,7 +670,7 @@ "description": "" }, "delete": { - "message": "Delete", + "message": "Xóa", "description": "" }, "deleteWarning": { @@ -678,15 +678,15 @@ "description": "" }, "deleteThisMessage": { - "message": "xóa tin nhắn này", + "message": "Xóa tin nhắn", "description": "" }, "from": { - "message": "Từ", + "message": "Từ:", "description": "Label for the sender of a message" }, "to": { - "message": "to", + "message": "Đến:", "description": "Label for the receiver of a message" }, "sent": { @@ -702,11 +702,11 @@ "description": "Placeholder text in the message entry field" }, "groupMembers": { - "message": "Thành viên", + "message": "Thành viên trong nhóm", "description": "" }, "resetSession": { - "message": "Đăng nhập lại", + "message": "Tái thiết lập phiên bảo mật", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." }, "showSafetyNumber": { @@ -728,7 +728,7 @@ "description": "" }, "deleteMessage": { - "message": "Delete Message", + "message": "Xóa tin nhắn", "description": "Shown on the drop-down menu for an individual message, deletes single message" }, "deleteMessages": { @@ -782,7 +782,7 @@ } }, "linkNewDevice": { - "message": "Link New Device", + "message": "Liên kết thiết bị mới", "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { @@ -810,7 +810,7 @@ "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "Vô hiệu hóa thông báo", + "message": "Tạm im thông báo", "description": "Label for disabling notifications" }, "nameAndMessage": { @@ -834,11 +834,11 @@ "description": "Displayed in notifications for multiple messages" }, "notificationMostRecentFrom": { - "message": "Most recent from:", + "message": "Gần đây nhất từ: $name$", "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting" }, "notificationFrom": { - "message": "From:", + "message": "Từ:", "description": "Displayed in notifications when setting is 'name only' and one message is waiting" }, "notificationMostRecent": { @@ -846,7 +846,7 @@ "description": "Displayed in notifications when setting is 'name and message' and more than one message is waiting" }, "sendFailed": { - "message": "Send failed", + "message": "Gửi thất bại", "description": "Shown on outgoing message if it fails to send" }, "learnMore": { @@ -866,7 +866,7 @@ "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, "timestamp_s": { - "message": "hiện tại", + "message": "Bây giờ", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." }, "timestamp_m": { @@ -976,7 +976,7 @@ "description": "Conversation menu option to enable disappearing messages" }, "timerOption_0_seconds_abbreviated": { - "message": "Tắt", + "message": "tắt", "description": "Short format indicating current timer setting in the conversation list snippet" }, "timerOption_5_seconds_abbreviated": { @@ -1108,11 +1108,11 @@ "description": "" }, "autoUpdateLaterButtonLabel": { - "message": "Later", + "message": "Sau này", "description": "" }, "leftTheGroup": { - "message": "$name$ left the group", + "message": "$name$ đã rời khỏi nhóm.", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { @@ -1136,7 +1136,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Group name has been set to '$name$'", + "message": "Tên nhóm hiện giờ là '$name$'.", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1156,7 +1156,7 @@ } }, "multipleJoinedTheGroup": { - "message": "$names$ joined the group", + "message": "$name$ đã tham gia nhóm.", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { "names": { @@ -1164,5 +1164,209 @@ "example": "Alice, Bob" } } + }, + "unknown": { + "message": "Không rõ" + }, + "youMayWishToVerifyContact": { + "message": "Bạn có thể sẽ cần xác minh mã số an toàn với liên hệ này." + }, + "settingsHeader": { + "message": "Cài đặt" + }, + "continue": { + "message": "Tiếp tục" + }, + "devicePairingRequestReceivedLimitTitle": { + "message": "Đã đạt tới giới hạn thiết bị" + }, + "devicePairingRequestReceivedNoListenerTitle": { + "message": "Đã nhận được yêu cầu liên kết" + }, + "waitingForDeviceToRegister": { + "message": "Đang đợi thiết bị" + }, + "pairNewDevicePrompt": { + "message": "Quét mã QR hiển thị trên thiết bị để liên kết" + }, + "deviceUnpaired": { + "message": "Thiết bị của bạn đã được hủy liên kết thành công" + }, + "sendMessageLeftGroup": { + "message": "Bạn đã rời nhóm." + }, + "resend": { + "message": "Gửi lại" + }, + "clearAllData": { + "message": "Xóa tất cả dữ liệu" + }, + "deleteAccountWarning": { + "message": "Thao tác này sẽ xóa vĩnh viễn các tin nhắn, sessions, và danh bạ của bạn." + }, + "deleteContactConfirmation": { + "message": "Bạn có chắc chắn rằng bạn muốn xoá cuộc hội thoại này không?" + }, + "copy": { + "message": "Sao chép" + }, + "themeToggleTitle": { + "message": "Lợt" + }, + "successUnlinked": { + "message": "Thiết bị của bạn đã được ngắt liên kết thành công" + }, + "blockUser": { + "message": "Chặn" + }, + "unblockUser": { + "message": "Không chặn" + }, + "blockedSettingsTitle": { + "message": "Chặn các liên lạc" + }, + "leaveGroup": { + "message": "Rời nhóm" + }, + "leaveGroupConfirmation": { + "message": "Bạn có chắc chắn rằng bạn muốn rời nhóm này không?" + }, + "noContactsForGroup": { + "message": "Bạn chưa có danh bạ nào" + }, + "updateGroupDialogTitle": { + "message": "Cập nhật $name$..." + }, + "showRecoveryPhrase": { + "message": "Cụm từ khôi phục" + }, + "yourSessionID": { + "message": "Session ID của bạn" + }, + "recoveryPhraseSavePromptMain": { + "message": "Cụm từ khôi phục của bạn là chìa khoá chủ cho Session ID của bạn — bạn có thể sử dụng nó để khôi phục Session ID khi bị mất tiếp cận với thiết bị của bạn. Hãy lưu cụm từ khôi phục của bạn ở một nơi an toàn và không cung cấp cho bất kì ai." + }, + "copiedToClipboard": { + "message": "Sao chép vào bộ nhớ tạm" + }, + "unlock": { + "message": "Mở khóa" + }, + "connectToServerFail": { + "message": "Không thể tham gia nhóm" + }, + "connectingToServer": { + "message": "Đang kết nối..." + }, + "remove": { + "message": "Bỏ" + }, + "invalidSessionId": { + "message": "Session ID không hợp lệ" + }, + "emptyGroupNameError": { + "message": "Vui lòng nhập tên nhóm" + }, + "groupNamePlaceholder": { + "message": "Tên nhóm" + }, + "inviteContacts": { + "message": "Mời bạn bè" + }, + "yourUniqueSessionID": { + "message": "Bắt đầu với Session ID của bạn" + }, + "allUsersAreRandomly...": { + "message": "Session ID của bạn là địa chỉ duy nhất mà mọi người có thể dùng để liên lạc với bạn trên ứng dụng Session. Session ID của bạn được thiết kế đảm bảo tuyệt đối ẩn danh và riêng tư vì nó không liên kết với danh tính thật của bạn." + }, + "generateSessionID": { + "message": "Tạo Session ID" + }, + "recoveryPhrase": { + "message": "Cụm từ khôi phục" + }, + "enterRecoveryPhrase": { + "message": "Nhập cụm từ khôi phục của bạn." + }, + "enterDisplayName": { + "message": "Nhập một tên hiển thị" + }, + "enterSessionIDHere": { + "message": "Nhập Session ID của bạn" + }, + "continueYourSession": { + "message": "Tiếp tục Session của bạn" + }, + "linkDevice": { + "message": "Liên kết Thiết bị" + }, + "restoreUsingRecoveryPhrase": { + "message": "Khôi phục lại tài khoản của bạn" + }, + "newSession": { + "message": "Session mới" + }, + "enterSessionID": { + "message": "Nhập Session ID" + }, + "enterSessionIDOfRecipient": { + "message": "Nhập Session ID của người nhận" + }, + "usersCanShareTheir...": { + "message": "Người dùng có thể chia sẻ Session ID của mình bằng cách tới mục cài đặt tài khoản và chạm vào “Chia sẻ Session ID”, hoặc bằng cách chia sẻ mã QR của họ." + }, + "appearanceSettingsTitle": { + "message": "Diện mạo" + }, + "privacySettingsTitle": { + "message": "Riêng tư" + }, + "notificationsSettingsTitle": { + "message": "Thông báo" + }, + "devicesSettingsTitle": { + "message": "Các thiết bị đã liên kết" + }, + "recoveryPhraseEmpty": { + "message": "Nhập cụm từ khôi phục của bạn." + }, + "displayNameEmpty": { + "message": "Vui lòng chọn một tên hiển thị" + }, + "joinOpenGroup": { + "message": "Tham gia nhóm mở" + }, + "newClosedGroup": { + "message": "Nhóm kín mới" + }, + "newClosedGroupDescription": { + "message": "Nhóm kín hỗ trợ tối đa 10 thành viên và cung cấp dịch vụ bảo mật giống như các session một-một" + }, + "createClosedGroupNamePrompt": { + "message": "Tên nhóm" + }, + "createClosedGroupPlaceholder": { + "message": "Nhập tên nhóm" + }, + "openGroupURL": { + "message": "URL của nhóm mở" + }, + "enterAnOpenGroupURL": { + "message": "Nhập URL của nhóm mở" + }, + "pairingDevice": { + "message": "Liên kết thiết bị" + }, + "invalidGroupNameTooShort": { + "message": "Vui lòng nhập tên nhóm" + }, + "invalidGroupNameTooLong": { + "message": "Vui lòng nhập một tên nhóm ngắn hơn" + }, + "pickClosedGroupMember": { + "message": "Vui lòng chọn ít nhất 2 thành viên trong nhóm" + }, + "closedGroupMaxSize": { + "message": "Một nhóm kín không thể có nhiều hơn 10 thành viên" } } \ No newline at end of file From dfdb515904b9c57abbab0e9135d8906ad819b4f3 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 16 Sep 2020 12:02:28 +1000 Subject: [PATCH 205/274] locale tools, map indonesia `in` mobile locale to our `id` --- tools/mapAndroidTranslationsToDesktop.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/mapAndroidTranslationsToDesktop.py b/tools/mapAndroidTranslationsToDesktop.py index 5d69e6e32..a49a0ca7e 100755 --- a/tools/mapAndroidTranslationsToDesktop.py +++ b/tools/mapAndroidTranslationsToDesktop.py @@ -16,7 +16,8 @@ ALLOWED_ITEM_KEYS = ['message', 'description', 'comment', 'placeholders', 'andro SPECIFIC_LOCALES_MAPPING = { 'zh_CN': 'zh-rCN', - 'pt_BR': 'pt-rBR' + 'pt_BR': 'pt-rBR', + 'id': 'in' } if len(sys.argv) != 3: From 317723553575151e9c32fa908d807ccb1845f6e3 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 16 Sep 2020 12:06:51 +1000 Subject: [PATCH 206/274] add indonesian locale from mobile --- _locales/id/messages.json | 349 ++++++++++++++++++++++++++++++++------ 1 file changed, 296 insertions(+), 53 deletions(-) diff --git a/_locales/id/messages.json b/_locales/id/messages.json index dcf92c046..feb840cba 100644 --- a/_locales/id/messages.json +++ b/_locales/id/messages.json @@ -44,7 +44,7 @@ "description": "Application menu command to close the application" }, "editMenuUndo": { - "message": "Kembali", + "message": "Ulang", "description": "Edit menu command to remove recently-typed text" }, "editMenuRedo": { @@ -72,7 +72,7 @@ "description": "Edit menu command to remove the selected text" }, "editMenuSelectAll": { - "message": "Pilih Semua", + "message": "Pilih semua", "description": "Edit menu comand to select all of the text in selected text box" }, "editMenuStartSpeaking": { @@ -202,7 +202,7 @@ "description": "Used as a label on a button allowing user to see more information" }, "youLeftTheGroup": { - "message": "Anda telah meninggalkan group", + "message": "Anda telah keluar dari grup.", "description": "Displayed when a user can't send a message because they have left the group" }, "unreadMessage": { @@ -210,7 +210,7 @@ "description": "Text for unread message separator, just one message" }, "unreadMessages": { - "message": "$count$ Pesan Belum Dibaca", + "message": "$count$ pesan belum dibaca", "description": "Text for unread message separator, with count", "placeholders": { "count": { @@ -220,7 +220,7 @@ } }, "youMarkedAsVerified": { - "message": "Anda menandai nomor keamanan $name$ terverifikasi", + "message": "Anda menandai nomor keamanan anda dengan $name$ terverifikasi", "description": "Shown in the conversation history when the user marks a contact as verified.", "placeholders": { "name": { @@ -230,7 +230,7 @@ } }, "youMarkedAsNotVerified": { - "message": "Anda menandai nomor keamanan Anda $name$ tidak terverifikasi", + "message": "Anda menandai nomor keamanan anda dengan $name$ tidak terverifikasi", "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": { @@ -240,7 +240,7 @@ } }, "youMarkedAsVerifiedOtherDevice": { - "message": "Anda memberi tanda nomor keamanan Anda dengan $name$ terverifikasi dari perangkat lainnya.", + "message": "Anda menandai nomor keamanan anda dengan $name$ terverifikasi dari perangkat lain", "description": "Shown in the conversation history when we discover that the user marked a contact as verified on another device.", "placeholders": { "name": { @@ -250,7 +250,7 @@ } }, "youMarkedAsNotVerifiedOtherDevice": { - "message": "Anda memberi tanda nomor keamanan dengan $name$ sebagai nomor tidak terverifikasi dari perangkat lain.", + "message": "Anda menandai nomor keamanan anda dengan $name$ tidak terverifikasi dari perangkat lain", "description": "Shown in the conversation history when we discover that the user marked a contact as not verified on another device.", "placeholders": { "name": { @@ -268,7 +268,7 @@ "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedSinceVerified": { - "message": "Nomor keamanan Anda dengan $name$ telah berubah sejak Anda terakhir diverifikasi. Ini bisa berarti seseorang mencoba mencegat komunikasi Anda atau bahwa $name$ hanya memasang ulang Session.", + "message": "Nomor keamanan anda dengan $name$ telah berubah dan tidak lagi terverifikasi. Ini bisa berarti bahwa seseorang mencoba mencegat komunikasi anda, atau dikarenakan$name$ telah memasang ulang Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -292,7 +292,7 @@ "description": "Shown on confirmation dialog when user attempts to send a message" }, "changedRecently": { - "message": "Nomor keamanan Anda dengan $name$ telah berubah baru-baru ini. Ini bisa berarti seseorang mencoba mencegat komunikasi Anda atau bahwa $name$ hanya memasang ulang Session.", + "message": "Angka keamanan Anda dengan $name$ telah berubah. Ini bisa disebabkan seseorang mencoba mencegat komunikasi Anda, atau disebabkan $name$ telah memasang ulang Session.", "description": "Shown on confirmation dialog when user attempts to send a message", "placeholders": { "name": { @@ -342,7 +342,7 @@ "description": "Link to open the issue tracker" }, "gotIt": { - "message": "Saya mengerti!", + "message": "Paham", "description": "Label for a button that dismisses a dialog. The user clicks it to confirm that they understand the message in the dialog." }, "submit": { @@ -358,7 +358,7 @@ "description": "" }, "isVerified": { - "message": "Anda telah memverifikasi nomor keamanan Anda dengan $name$.", + "message": "Anda menandai nomor keamanan anda dengan $name$ terverifikasi", "description": "Summary state shown at top of the safety number screen if user has verified contact.", "placeholders": { "name": { @@ -382,7 +382,7 @@ "description": "" }, "newIdentity": { - "message": "Nomor keamanan baru", + "message": "Angka keamanan baru", "description": "Header for a key change dialog" }, "incomingError": { @@ -394,7 +394,7 @@ "description": "Header of the default pane in the media gallery, showing images and videos" }, "mediaEmptyState": { - "message": "Anda tak memiliki media di dalam percakapan ini", + "message": "Tidak ada media", "description": "Message shown to user in the media gallery when there are no messages with media attachments (images or video)" }, "documents": { @@ -402,7 +402,7 @@ "description": "Header of the secondary pane in the media gallery, showing every non-media attachment" }, "documentsEmptyState": { - "message": "Anda tidak memiliki dokumen dari percakapan ini", + "message": "Tidak ada dokumen", "description": "Message shown to user in the media gallery when there are no messages with document attachments (anything other than images or video)" }, "today": { @@ -472,15 +472,15 @@ "description": "An error popup when the user has attempted to add an attachment" }, "fileSizeWarning": { - "message": "Maaf, berkas tersebut melebihi batas ukuran pesan.", + "message": "Lampiran melebihi batas ukuran untuk tipe pesan yang Anda kirimkan.", "description": "" }, "unableToLoadAttachment": { - "message": "Tidak bisa memuat lampiran yang dipilih.", + "message": "Maaf, terjadi kesalahan pada pengaturan lampiran anda.", "description": "" }, "connecting": { - "message": "Menghubungi", + "message": "Menghubungkan...", "description": "Displayed when the desktop client is currently connecting to the server." }, "offline": { @@ -526,15 +526,15 @@ "description": "Item under the Edit menu, with 'start/stop speaking' items below it" }, "show": { - "message": "Tunjukkan", + "message": "Tampilkan", "description": "Command under Window menu, to show the window" }, "search": { - "message": "Pencarian", + "message": "Cari", "description": "Placeholder text in the search input" }, "noSearchResults": { - "message": "No results for \"$searchTerm$\"", + "message": "Tidak ditemukan hasil untuk \"$searchTerm$\"", "description": "Shown in the search left pane when no results were found", "placeholders": { "searchTerm": { @@ -556,7 +556,7 @@ "description": "Shown to separate the types of search results" }, "welcomeToSession": { - "message": "Selamat datang di Session", + "message": "Selamat datang di Session.", "description": "" }, "typingAlt": { @@ -578,11 +578,11 @@ "description": "Shown on contact detail screen as a label for an address/phone/email" }, "work": { - "message": "kerja", + "message": "Kerja", "description": "Shown on contact detail screen as a label for an address/phone/email" }, "mobile": { - "message": "mobil", + "message": "Mobil", "description": "Shown on contact detail screen as a label for aa phone or email" }, "email": { @@ -610,7 +610,7 @@ "description": "Shown in a message's triple-dot menu if there isn't room for a dedicated download button" }, "replyToMessage": { - "message": "Membalas Pesan", + "message": "Balas pesan", "description": "Shown in triple-dot menu next to message to allow user to start crafting a message with a quotation" }, "originalMessageNotFound": { @@ -634,7 +634,7 @@ "description": "In Android theme, shown in quote if you or someone else replies to you" }, "audioPermissionNeeded": { - "message": "Untuk mengirimkan pesan suara, izinkan Session Desktop untuk mengakses mikrofon anda.", + "message": "Untuk mengirim pesan suara, izinkan Session mengakses mikrofon Anda.", "description": "Shown if the user attempts to send an audio message without audio permssions turned on" }, "allowAccess": { @@ -678,15 +678,15 @@ "description": "" }, "deleteThisMessage": { - "message": "Hapus pesan ini", + "message": "Hapus pesan", "description": "" }, "from": { - "message": "Dari", + "message": "Dari:", "description": "Label for the sender of a message" }, "to": { - "message": "to", + "message": "Kepada:", "description": "Label for the receiver of a message" }, "sent": { @@ -694,7 +694,7 @@ "description": "Label for the time a message was sent" }, "received": { - "message": "Menerima", + "message": "Diterima", "description": "Label for the time a message was received" }, "sendMessage": { @@ -702,11 +702,11 @@ "description": "Placeholder text in the message entry field" }, "groupMembers": { - "message": "Anggota Grup", + "message": "Anggota grup", "description": "" }, "resetSession": { - "message": "Mengatur ulang sesi", + "message": "Setel ulang sesi aman", "description": "This is a menu item for resetting the session, using the imperative case, as in a command." }, "showSafetyNumber": { @@ -728,7 +728,7 @@ "description": "" }, "deleteMessage": { - "message": "Hapus Pesan", + "message": "Hapus pesan", "description": "Shown on the drop-down menu for an individual message, deletes single message" }, "deleteMessages": { @@ -782,7 +782,7 @@ } }, "linkNewDevice": { - "message": "Sambungkan Perangkat Baru", + "message": "Kaitkan perangkat baru", "description": "The menu option shown in Session iOS to add a new linked device" }, "permissions": { @@ -810,7 +810,7 @@ "description": "Explain the purpose of the notification settings" }, "disableNotifications": { - "message": "Matikan pemberitahuan", + "message": "Bisukan pemberitahuan", "description": "Label for disabling notifications" }, "nameAndMessage": { @@ -834,7 +834,7 @@ "description": "Displayed in notifications for multiple messages" }, "notificationMostRecentFrom": { - "message": "Terkini dari:", + "message": "Paling baru dari: $name$", "description": "Displayed in notifications when setting is 'name only' and more than one message is waiting" }, "notificationFrom": { @@ -846,7 +846,7 @@ "description": "Displayed in notifications when setting is 'name and message' and more than one message is waiting" }, "sendFailed": { - "message": "Pengiriman gagal", + "message": "Gagal Mengirim", "description": "Shown on outgoing message if it fails to send" }, "learnMore": { @@ -862,11 +862,11 @@ "description": "Label text for button to upgrade the app to the latest version" }, "mediaMessage": { - "message": "Pesan berisi media", + "message": "Pesan media", "description": "Description of a message that has an attachment and no text, displayed in the conversation list as a preview." }, "timestamp_s": { - "message": "sekarang", + "message": "Sekarang", "description": "Brief timestamp for messages sent less than a minute ago. Displayed in the conversation list and message bubble." }, "timestamp_m": { @@ -890,7 +890,7 @@ "description": "Brief message shown when trying to message a blocked group" }, "youChangedTheTimer": { - "message": "Anda mengatur pesan menghilang dalam waktu $time$", + "message": "Anda mengatur pesan menghilang dalam $time$", "description": "Message displayed when you change the message expiration timer in a conversation.", "placeholders": { "time": { @@ -910,7 +910,7 @@ } }, "theyChangedTheTimer": { - "message": "$name$ atur pesan menghilang dalam waktu $time$", + "message": "$name$ atur pesan menghilang menjadi $time$", "description": "Message displayed when someone else changes the message expiration timer in a conversation.", "placeholders": { "name": { @@ -924,7 +924,7 @@ } }, "timerOption_0_seconds": { - "message": "padam", + "message": "Mati", "description": "Label for option to turn off message expiration in the timer menu" }, "timerOption_5_seconds": { @@ -972,7 +972,7 @@ "description": "Label for a selectable option in the message expiration timer menu" }, "disappearingMessages": { - "message": "Menghilangkan pesan", + "message": "Pesan hilang", "description": "Conversation menu option to enable disappearing messages" }, "timerOption_0_seconds_abbreviated": { @@ -1028,7 +1028,7 @@ "description": "Displayed in the left pane when the timer is turned off" }, "disabledDisappearingMessages": { - "message": "$name$menonaktifkan pesan menghilang", + "message": "$name$ menonaktifkan pesan menghilang.", "description": "Displayed in the conversation list when the timer is turned off", "placeholders": { "name": { @@ -1038,11 +1038,11 @@ } }, "youDisabledDisappearingMessages": { - "message": "Anda menonaktifkan pesan menghilang", + "message": "Anda menonaktifkan pesan menghilang.", "description": "Displayed in the conversation list when the timer is turned off" }, "timerSetTo": { - "message": "Setel pengatur waktu ke $time$", + "message": "Waktu pesan hilang diatur ke $time$", "description": "Displayed in the conversation list when the timer is updated by some automatic action, or in the left pane", "placeholders": { "time": { @@ -1052,11 +1052,11 @@ } }, "safetyNumberChanged": { - "message": "Angka keamanan telah diganti", + "message": "Nomor keamanan berubah", "description": "A notification shown in the conversation when a contact reinstalls" }, "safetyNumberChangedGroup": { - "message": "Angka keamanan dengan $name$ telah diganti", + "message": "Angka keamanan anda dengan $name$ telah berubah.", "description": "A notification shown in a group conversation when a contact reinstalls, showing the contact name", "placeholders": { "name": { @@ -1066,7 +1066,7 @@ } }, "verifyNewNumber": { - "message": "Verifikasi Nomor Keamanan", + "message": "Periksa angka keamanan", "description": "Label on button included with safety number change notification in the conversation" }, "yourSafetyNumberWith": { @@ -1108,11 +1108,11 @@ "description": "" }, "autoUpdateLaterButtonLabel": { - "message": "Selanjutnya", + "message": "Nanti", "description": "" }, "leftTheGroup": { - "message": "$name$ telah meninggalkan grup", + "message": "$name$ telah meninggalkan grup.", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { @@ -1136,7 +1136,7 @@ "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { - "message": "Judul sekarang adalah '$name$'", + "message": "Nama grup sekarang '$name$'.", "description": "Shown in the conversation history when someone changes the title of the group", "placeholders": { "name": { @@ -1156,7 +1156,7 @@ } }, "multipleJoinedTheGroup": { - "message": "$names$ bergabung dalam group", + "message": "$name$ bergabung dengan grup", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { "names": { @@ -1164,5 +1164,248 @@ "example": "Alice, Bob" } } + }, + "privacyPolicy": { + "message": "Istilah & Kebijakan Privasi" + }, + "unknown": { + "message": "Tidak dikenal" + }, + "changedSinceVerifiedTitle": { + "message": "Nomor keamanan berubah" + }, + "youMayWishToVerifyContact": { + "message": "Mungkin sebaiknya Anda memastikan angka keamanan dengan kontak ini." + }, + "about": { + "message": "Tentang" + }, + "settingsHeader": { + "message": "Pengaturan" + }, + "continue": { + "message": "Lanjutkan" + }, + "devicePairingRequestReceivedLimitDescription": { + "message": "Maaf, Anda memiliki terlalu banyak perangkat yang terhubung, coba buang beberapa" + }, + "devicePairingRequestReceivedNoListenerTitle": { + "message": "Permintaan penautan diterima" + }, + "waitingForDeviceToRegister": { + "message": "Menunggu perangkat" + }, + "pairNewDevicePrompt": { + "message": "Pindai kode QR yang tertera pada perangkat ke tautan" + }, + "noPairedDevices": { + "message": "Tidak ada perangkat yang terhubung" + }, + "deviceUnpaired": { + "message": "Sukses memutus perangkat" + }, + "sendMessageLeftGroup": { + "message": "Anda telah keluar dari grup." + }, + "moreInformation": { + "message": "Informasi lebih lanjut" + }, + "resend": { + "message": "Kirim ulang" + }, + "clearAllData": { + "message": "Hapus semua data" + }, + "deleteAccountWarning": { + "message": "Pesan, Session, dan kontak anda akan dihapus secara permanen" + }, + "deleteContactConfirmation": { + "message": "Apakah anda yakin ingin menghapus percakapan ini?" + }, + "copy": { + "message": "Salin" + }, + "linkPreviewsTitle": { + "message": "Kirim pratinjau tautan" + }, + "readReceiptSettingTitle": { + "message": "Pesan terbaca" + }, + "typingIndicatorsSettingTitle": { + "message": "Indikator penulisan" + }, + "themeToggleTitle": { + "message": "Terang" + }, + "successUnlinked": { + "message": "Sukses memutus koneksi perangkat" + }, + "autoUpdateDownloadButtonLabel": { + "message": "Unduh" + }, + "blockUser": { + "message": "Blokir" + }, + "unblockUser": { + "message": "Buka blokir" + }, + "blockedSettingsTitle": { + "message": "Kontak yang diblokir" + }, + "leaveGroup": { + "message": "Keluar grup" + }, + "leaveGroupConfirmation": { + "message": "Apakah anda yakin ingin meninggalkan grup ini?" + }, + "noContactsForGroup": { + "message": "anda belum memiliki kontak" + }, + "editGroup": { + "message": "Ubah grup" + }, + "updateGroupDialogTitle": { + "message": "Memperbarui $name$..." + }, + "showRecoveryPhrase": { + "message": "Kata pemulihan" + }, + "yourSessionID": { + "message": "Session ID anda" + }, + "recoveryPhraseSavePromptMain": { + "message": "Kata pemulihan adalah kunci Session ID -- bisa digunakan untuk mengembalikan Session ID ketika anda kehilangan perangkat. Simpan kata pemulihan di tempat yang aman dan jangan berikan kepada siapapun" + }, + "copiedToClipboard": { + "message": "Salin ke clipboard" + }, + "unlock": { + "message": "Buka Kunci" + }, + "connectToServerFail": { + "message": "Tak bisa bergabung dengan grup" + }, + "connectingToServer": { + "message": "Menghubungkan..." + }, + "remove": { + "message": "Hapus" + }, + "invalidSessionId": { + "message": "Session salah" + }, + "emptyGroupNameError": { + "message": "Masukkan nama grup" + }, + "groupNamePlaceholder": { + "message": "Nama grup" + }, + "inviteContacts": { + "message": "Undang teman" + }, + "yourUniqueSessionID": { + "message": "Ucapkan halo pada Session ID anda" + }, + "allUsersAreRandomly...": { + "message": "Session ID adalah alamat unik yang bisa digunakan untuk mengontak anda. Tanpa koneksi dengan identitas asli, Session ID anda didesain bersifat anonim dan rahasia." + }, + "generateSessionID": { + "message": "Buat Session ID" + }, + "recoveryPhrase": { + "message": "Kata pemulihan" + }, + "enterRecoveryPhrase": { + "message": "masukan kata pemulihan" + }, + "enterDisplayName": { + "message": "Masukkan nama" + }, + "enterSessionIDHere": { + "message": "Masuk ke Session ID" + }, + "continueYourSession": { + "message": "Lanjutkan Session" + }, + "linkDevice": { + "message": "Tautkan perangkat" + }, + "restoreUsingRecoveryPhrase": { + "message": "Kembalikan akun" + }, + "newSession": { + "message": "Session baru" + }, + "searchFor...": { + "message": "Cari untuk percakapan, daftar kontak dan pesan" + }, + "enterSessionID": { + "message": "Masuk ke Session ID" + }, + "enterSessionIDOfRecipient": { + "message": "Masukkan Session ID penerima" + }, + "usersCanShareTheir...": { + "message": "Pengguna bisa membagikan Session ID miliknya dengan masuk ke pengaturan akun dan mengetuk \"Bagikan Session ID\" atau dengan membagikan kode QR mereka" + }, + "appearanceSettingsTitle": { + "message": "Penampilan" + }, + "privacySettingsTitle": { + "message": "Privasi" + }, + "notificationsSettingsTitle": { + "message": "Pemberitahuan" + }, + "devicesSettingsTitle": { + "message": "Perangkat terkait" + }, + "recoveryPhraseEmpty": { + "message": "masukan kata pemulihan" + }, + "displayNameEmpty": { + "message": "Pilih nama yang ditampilkan" + }, + "joinOpenGroup": { + "message": "Gabung ke grup terbuka" + }, + "newClosedGroup": { + "message": "Grup tertutup baru" + }, + "newClosedGroupDescription": { + "message": "Grup tertutup maksimal berisi 10 anggota dan memiliki perlindungan privasi yang sama dengan Session antara dua pengguna" + }, + "createClosedGroupNamePrompt": { + "message": "Nama grup" + }, + "createClosedGroupPlaceholder": { + "message": "Masukkan nama grup" + }, + "openGroupURL": { + "message": "Buka URL grup" + }, + "enterAnOpenGroupURL": { + "message": "Masukkan sebuah URL grup terbuka" + }, + "next": { + "message": "Berikutnya" + }, + "pairingDevice": { + "message": "Mengaitkan perangkat" + }, + "invalidGroupNameTooShort": { + "message": "Masukkan nama grup" + }, + "invalidGroupNameTooLong": { + "message": "Masukkan nama grup yang lebih pendek" + }, + "pickClosedGroupMember": { + "message": "Pilih setidaknya 2 anggota grup" + }, + "closedGroupMaxSize": { + "message": "Grup tertutup maksimal berisi 10 anggota" + }, + "noBlockedContacts": { + "message": "Tidak ada kontak yang diblokir" } } \ No newline at end of file From ceab8228fcb46d4601db148a8cbb155f022b3700 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 16 Sep 2020 14:46:33 +1000 Subject: [PATCH 207/274] close leftpane overlay on message sent to that conversation --- .../session/LeftPaneContactSection.tsx | 20 ++++++++++--------- .../session/LeftPaneMessageSection.tsx | 9 +++++++++ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/ts/components/session/LeftPaneContactSection.tsx b/ts/components/session/LeftPaneContactSection.tsx index 8ff7e85fc..b605fac98 100644 --- a/ts/components/session/LeftPaneContactSection.tsx +++ b/ts/components/session/LeftPaneContactSection.tsx @@ -40,7 +40,6 @@ export interface Props { interface State { showAddContactView: boolean; - selectedTab: number; addContactRecipientID: string; pubKeyPasted: string; } @@ -52,27 +51,23 @@ export class LeftPaneContactSection extends React.Component { super(props); this.state = { showAddContactView: false, - selectedTab: 0, addContactRecipientID: '', pubKeyPasted: '', }; this.debouncedSearch = debounce(this.search.bind(this), 20); - this.handleTabSelected = this.handleTabSelected.bind(this); this.handleToggleOverlay = this.handleToggleOverlay.bind(this); this.handleOnAddContact = this.handleOnAddContact.bind(this); this.handleRecipientSessionIDChanged = this.handleRecipientSessionIDChanged.bind( this ); + this.closeOverlay = this.closeOverlay.bind(this); } public componentWillUnmount() { this.updateSearch(''); this.setState({ addContactRecipientID: '' }); - } - - public handleTabSelected(tabType: number) { - this.setState({ selectedTab: tabType, showAddContactView: false }); + window.Whisper.events.off('calculatingPoW', this.closeOverlay); } public renderHeader(): JSX.Element | undefined { @@ -80,7 +75,7 @@ export class LeftPaneContactSection extends React.Component { return LeftPane.RENDER_HEADER( labels, - this.handleTabSelected, + null, undefined, undefined, undefined, @@ -90,6 +85,8 @@ export class LeftPaneContactSection extends React.Component { public componentDidMount() { MainViewController.renderMessageView(); + + window.Whisper.events.on('calculatingPoW', this.closeOverlay); } public componentDidUpdate() { @@ -182,6 +179,12 @@ export class LeftPaneContactSection extends React.Component { ); } + private closeOverlay({ pubKey }: { pubKey: string }) { + if (this.state.addContactRecipientID === pubKey) { + this.setState({ showAddContactView: false, addContactRecipientID: '' }); + } + } + private handleToggleOverlay() { this.setState((prevState: { showAddContactView: boolean }) => ({ showAddContactView: !prevState.showAddContactView, @@ -217,7 +220,6 @@ export class LeftPaneContactSection extends React.Component { } private renderBottomButtons(): JSX.Element { - const { selectedTab } = this.state; const addContact = window.i18n('addContact'); return ( diff --git a/ts/components/session/LeftPaneMessageSection.tsx b/ts/components/session/LeftPaneMessageSection.tsx index 0e1c1f746..7685e92dc 100644 --- a/ts/components/session/LeftPaneMessageSection.tsx +++ b/ts/components/session/LeftPaneMessageSection.tsx @@ -93,10 +93,12 @@ export class LeftPaneMessageSection extends React.Component { this.renderClosableOverlay = this.renderClosableOverlay.bind(this); this.debouncedSearch = debounce(this.search.bind(this), 20); + this.closeOverlay = this.closeOverlay.bind(this); } public componentWillUnmount() { this.updateSearch(''); + window.Whisper.events.off('calculatingPoW', this.closeOverlay); } public renderRow = ({ @@ -178,12 +180,19 @@ export class LeftPaneMessageSection extends React.Component { public componentDidMount() { MainViewController.renderMessageView(); + window.Whisper.events.on('calculatingPoW', this.closeOverlay); } public componentDidUpdate() { MainViewController.renderMessageView(); } + public closeOverlay({ pubKey }: { pubKey: string }) { + if (this.state.valuePasted === pubKey) { + this.setState({ overlay: false, valuePasted: '' }); + } + } + public renderHeader(): JSX.Element { const labels = [window.i18n('messagesHeader')]; From f11cb7744dc4188773f1bde6e12233c07cb01ce2 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 16 Sep 2020 15:33:10 +1000 Subject: [PATCH 208/274] fix round avatars with border top and bottom width --- ts/components/AvatarPlaceHolder/AvatarPlaceHolder.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ts/components/AvatarPlaceHolder/AvatarPlaceHolder.tsx b/ts/components/AvatarPlaceHolder/AvatarPlaceHolder.tsx index 12d89d1be..431065f88 100644 --- a/ts/components/AvatarPlaceHolder/AvatarPlaceHolder.tsx +++ b/ts/components/AvatarPlaceHolder/AvatarPlaceHolder.tsx @@ -46,8 +46,10 @@ export class AvatarPlaceHolder extends React.PureComponent { public render() { const { borderColor, colors, diameter, name } = this.props; + const diameterWithoutBorder = diameter - 2; const viewBox = `0 0 ${diameter} ${diameter}`; const r = diameter / 2; + const rWithoutBorder = diameterWithoutBorder / 2; if (!this.state.sha512Seed) { // return grey circle @@ -57,7 +59,7 @@ export class AvatarPlaceHolder extends React.PureComponent { { Date: Thu, 17 Sep 2020 19:36:46 +1000 Subject: [PATCH 209/274] fix avatar closed group and pubkey for medium mobile groups --- ts/components/Avatar.tsx | 5 +- ts/components/ConversationListItem.tsx | 2 +- .../usingClosedConversationDetails.tsx | 11 +- ts/receiver/contentMessage.ts | 138 +++++++++--------- ts/session/types/PubKey.ts | 23 ++- 5 files changed, 97 insertions(+), 82 deletions(-) diff --git a/ts/components/Avatar.tsx b/ts/components/Avatar.tsx index 8c8226c2f..6fdbbcb0a 100644 --- a/ts/components/Avatar.tsx +++ b/ts/components/Avatar.tsx @@ -91,9 +91,10 @@ export class Avatar extends React.PureComponent { } public render() { - const { avatarPath, size } = this.props; + const { avatarPath, size, memberAvatars } = this.props; const { imageBroken } = this.state; - const hasImage = avatarPath && !imageBroken; + const isClosedGroupAvatar = memberAvatars && memberAvatars.length; + const hasImage = avatarPath && !imageBroken && !isClosedGroupAvatar; if ( size !== 28 && diff --git a/ts/components/ConversationListItem.tsx b/ts/components/ConversationListItem.tsx index 1f7db35c3..3bcc26d29 100644 --- a/ts/components/ConversationListItem.tsx +++ b/ts/components/ConversationListItem.tsx @@ -312,7 +312,7 @@ class ConversationListItem extends React.PureComponent { const triggerId = `conversation-item-${phoneNumber}-ctxmenu`; return ( -
+
window.ConversationController.getOrCreateAndWait(m.key, 'private') @@ -79,10 +79,9 @@ export function usingClosedConversationDetails(WrappedComponent: any) { name: m.get('name') || m.get('profileName') || m.id, }; }); - - if (!_.isEqual(memberAvatars, this.state.memberAvatars)) { - this.setState({ memberAvatars }); - } + this.setState({ memberAvatars }); + } else { + this.setState({ memberAvatars: undefined }); } } }; diff --git a/ts/receiver/contentMessage.ts b/ts/receiver/contentMessage.ts index 7c125267c..b37df76d2 100644 --- a/ts/receiver/contentMessage.ts +++ b/ts/receiver/contentMessage.ts @@ -388,81 +388,83 @@ export async function innerHandleContentMessage( plaintext: ArrayBuffer ): Promise { const { ConversationController } = window; + try { + const content = SignalService.Content.decode(new Uint8Array(plaintext)); - const content = SignalService.Content.decode(new Uint8Array(plaintext)); + const blocked = await isBlocked(envelope.source); + if (blocked) { + // We want to allow a blocked user message if that's a control message for a known group and the group is not blocked + if (shouldDropBlockedUserMessage(content)) { + window.log.info('Dropping blocked user message'); + return; + } else { + window.log.info( + 'Allowing group-control message only from blocked user' + ); + } + } + const { FALLBACK_MESSAGE } = SignalService.Envelope.Type; - const blocked = await isBlocked(envelope.source); - if (blocked) { - // We want to allow a blocked user message if that's a control message for a known group and the group is not blocked - if (shouldDropBlockedUserMessage(content)) { - window.log.info('Dropping blocked user message'); + await ConversationController.getOrCreateAndWait(envelope.source, 'private'); + + if (content.preKeyBundleMessage) { + await handleSessionRequestMessage(envelope, content.preKeyBundleMessage); + } else if (envelope.type !== FALLBACK_MESSAGE) { + const device = new PubKey(envelope.source); + + await SessionProtocol.onSessionEstablished(device); + await libsession.getMessageQueue().processPending(device); + } + + if (content.pairingAuthorisation) { + await handlePairingAuthorisationMessage( + envelope, + content.pairingAuthorisation, + content.dataMessage + ); return; - } else { - window.log.info('Allowing group-control message only from blocked user'); } - } - const { FALLBACK_MESSAGE } = SignalService.Envelope.Type; - - await ConversationController.getOrCreateAndWait(envelope.source, 'private'); - - if (content.preKeyBundleMessage) { - await handleSessionRequestMessage(envelope, content.preKeyBundleMessage); - } else if (envelope.type !== FALLBACK_MESSAGE) { - const device = new PubKey(envelope.source); - - await SessionProtocol.onSessionEstablished(device); - await libsession.getMessageQueue().processPending(device); - } - - if (content.pairingAuthorisation) { - await handlePairingAuthorisationMessage( - envelope, - content.pairingAuthorisation, - content.dataMessage - ); - return; - } - - if (content.syncMessage) { - await handleSyncMessage(envelope, content.syncMessage); - return; - } - - if (content.dataMessage) { - if ( - content.dataMessage.profileKey && - content.dataMessage.profileKey.length === 0 - ) { - content.dataMessage.profileKey = null; + if (content.syncMessage) { + await handleSyncMessage(envelope, content.syncMessage); + return; } - await handleDataMessage(envelope, content.dataMessage); - return; - } - if (content.nullMessage) { - await handleNullMessage(envelope); - return; - } - if (content.callMessage) { - await handleCallMessage(envelope); - return; - } - if (content.receiptMessage) { - await handleReceiptMessage(envelope, content.receiptMessage); - return; - } - if (content.typingMessage) { - if ( - content.typingMessage.groupId && - content.typingMessage.groupId.length === 0 - ) { - content.typingMessage.groupId = null; - } - await handleTypingMessage(envelope, content.typingMessage); - return; - } - return; + if (content.dataMessage) { + if ( + content.dataMessage.profileKey && + content.dataMessage.profileKey.length === 0 + ) { + content.dataMessage.profileKey = null; + } + await handleDataMessage(envelope, content.dataMessage); + return; + } + if (content.nullMessage) { + await handleNullMessage(envelope); + return; + } + if (content.callMessage) { + await handleCallMessage(envelope); + return; + } + if (content.receiptMessage) { + await handleReceiptMessage(envelope, content.receiptMessage); + return; + } + if (content.typingMessage) { + if ( + content.typingMessage.groupId && + content.typingMessage.groupId.length === 0 + ) { + content.typingMessage.groupId = null; + } + await handleTypingMessage(envelope, content.typingMessage); + return; + } + } catch (e) { + window.log.warn(e); + } } function onReadReceipt(readAt: any, timestamp: any, reader: any) { diff --git a/ts/session/types/PubKey.ts b/ts/session/types/PubKey.ts index d3fbb7c0c..db333185d 100644 --- a/ts/session/types/PubKey.ts +++ b/ts/session/types/PubKey.ts @@ -1,17 +1,30 @@ export class PubKey { public static readonly PUBKEY_LEN = 66; + private static readonly HEX = '[0-9a-fA-F]'; + // This is a temporary fix to allow groupPubkeys created from mobile to be handled correctly // They have a different regex to match // FIXME move this to a new class which validates group ids and use it in all places where we have group ids (message sending included) - public static readonly MOBILE_GROUP_PUBKEY_LEN = 32; - public static readonly regexForPubkeys = `((05)?[0-9a-fA-F]{${PubKey.PUBKEY_LEN - - 2}})`; + // tslint:disable: member-ordering + public static readonly regexForPubkeys = `((05)?${PubKey.HEX}{64})`; + public static readonly PREFIX_GROUP_TEXTSECURE = '__textsecure_group__!'; - private static readonly regexForMobileGroupID = `__textsecure_group__![0-9a-fA-F]{${PubKey.MOBILE_GROUP_PUBKEY_LEN}}`; // prettier-ignore private static readonly regex: RegExp = new RegExp( - `^${PubKey.regexForPubkeys}|${PubKey.regexForMobileGroupID}$` + `^(${PubKey.PREFIX_GROUP_TEXTSECURE})?(05)?(${PubKey.HEX}{64}|${PubKey.HEX}{32})$` ); + /** + * If you want to update this regex. Be sure that those are matches ; + * __textsecure_group__!05010203040506070809a0b0c0d0e0f0ff010203040506070809a0b0c0d0e0f0ff + * __textsecure_group__!010203040506070809a0b0c0d0e0f0ff010203040506070809a0b0c0d0e0f0ff + * __textsecure_group__!05010203040506070809a0b0c0d0e0f0ff + * __textsecure_group__!010203040506070809a0b0c0d0e0f0ff + * 05010203040506070809a0b0c0d0e0f0ff010203040506070809a0b0c0d0e0f0ff + * 010203040506070809a0b0c0d0e0f0ff010203040506070809a0B0c0d0e0f0FF + * 05010203040506070809a0b0c0d0e0f0ff + * 010203040506070809a0b0c0d0e0f0ff + */ + public readonly key: string; /** From 215c964fabd772d160a9759519479918f87f1b86 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 17 Sep 2020 19:33:25 +1000 Subject: [PATCH 210/274] fix padding for medium group --- ts/receiver/contentMessage.ts | 20 +++++++++++-------- ts/session/crypto/MessageEncrypter.ts | 2 +- .../outgoing/content/data/ChatMessage.ts | 2 +- .../data/ExpirationTimerUpdateMessage.ts | 2 +- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/ts/receiver/contentMessage.ts b/ts/receiver/contentMessage.ts index b37df76d2..646582bfb 100644 --- a/ts/receiver/contentMessage.ts +++ b/ts/receiver/contentMessage.ts @@ -21,15 +21,19 @@ import { StringUtils } from '../session/utils'; import { UserUtil } from '../util'; export async function handleContentMessage(envelope: EnvelopePlus) { - const plaintext = await decrypt(envelope, envelope.content); + try { + const plaintext = await decrypt(envelope, envelope.content); - if (!plaintext) { - window.log.warn('handleContentMessage: plaintext was falsey'); - return; - } else if (plaintext instanceof ArrayBuffer && plaintext.byteLength === 0) { - return; + if (!plaintext) { + window.log.warn('handleContentMessage: plaintext was falsey'); + return; + } else if (plaintext instanceof ArrayBuffer && plaintext.byteLength === 0) { + return; + } + await innerHandleContentMessage(envelope, plaintext); + } catch (e) { + window.log.warn(e); } - await innerHandleContentMessage(envelope, plaintext); } async function decryptForMediumGroup( @@ -86,7 +90,7 @@ async function decryptForMediumGroup( sourceAsStr ); - return plaintext; + return unpad(plaintext); } function unpad(paddedData: ArrayBuffer): ArrayBuffer { diff --git a/ts/session/crypto/MessageEncrypter.ts b/ts/session/crypto/MessageEncrypter.ts index 3380cb205..a605034cb 100644 --- a/ts/session/crypto/MessageEncrypter.ts +++ b/ts/session/crypto/MessageEncrypter.ts @@ -52,7 +52,7 @@ export async function encrypt( const plainText = padPlainTextBuffer(plainTextBuffer); if (encryptionType === EncryptionType.MediumGroup) { - return encryptForMediumGroup(device, plainTextBuffer); + return encryptForMediumGroup(device, plainText); } const address = new window.libsignal.SignalProtocolAddress(device.key, 1); diff --git a/ts/session/messages/outgoing/content/data/ChatMessage.ts b/ts/session/messages/outgoing/content/data/ChatMessage.ts index 3f07a3de4..83026306c 100644 --- a/ts/session/messages/outgoing/content/data/ChatMessage.ts +++ b/ts/session/messages/outgoing/content/data/ChatMessage.ts @@ -108,7 +108,7 @@ export class ChatMessage extends DataMessage { } dataMessage.profile = profile; } - if (this.profileKey) { + if (this.profileKey && this.profileKey.length) { dataMessage.profileKey = this.profileKey; } diff --git a/ts/session/messages/outgoing/content/data/ExpirationTimerUpdateMessage.ts b/ts/session/messages/outgoing/content/data/ExpirationTimerUpdateMessage.ts index 3a25caa7b..2da6fc6b3 100644 --- a/ts/session/messages/outgoing/content/data/ExpirationTimerUpdateMessage.ts +++ b/ts/session/messages/outgoing/content/data/ExpirationTimerUpdateMessage.ts @@ -48,7 +48,7 @@ export class ExpirationTimerUpdateMessage extends DataMessage { if (this.expireTimer) { data.expireTimer = this.expireTimer; } - if (this.profileKey) { + if (this.profileKey && this.profileKey.length) { data.profileKey = this.profileKey; } From 514eb9ba987b05985e92e9e4eaa08d476cbf1081 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 17 Sep 2020 19:46:06 +1000 Subject: [PATCH 211/274] fix pubkey regex for mobile medium groups --- ts/receiver/contentMessage.ts | 2 +- .../outgoing/content/data/group/ClosedGroupMessage.ts | 7 ++++++- ts/session/types/PubKey.ts | 1 - 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/ts/receiver/contentMessage.ts b/ts/receiver/contentMessage.ts index 646582bfb..77780f73a 100644 --- a/ts/receiver/contentMessage.ts +++ b/ts/receiver/contentMessage.ts @@ -80,7 +80,7 @@ async function decryptForMediumGroup( window.console.info( 'Dropping message from ourself after decryptForMediumGroup' ); - return; + return null; } const plaintext = await decryptWithSenderKey( diff --git a/ts/session/messages/outgoing/content/data/group/ClosedGroupMessage.ts b/ts/session/messages/outgoing/content/data/group/ClosedGroupMessage.ts index 9b6c80704..c17fdbe4f 100644 --- a/ts/session/messages/outgoing/content/data/group/ClosedGroupMessage.ts +++ b/ts/session/messages/outgoing/content/data/group/ClosedGroupMessage.ts @@ -32,7 +32,12 @@ export abstract class ClosedGroupMessage extends DataMessage { } protected groupContext(): SignalService.GroupContext { - const id = new Uint8Array(StringUtils.encode(this.groupId.key, 'utf8')); + let groupIdWithPrefix: string = this.groupId.key; + if (!this.groupId.key.startsWith(PubKey.PREFIX_GROUP_TEXTSECURE)) { + groupIdWithPrefix = PubKey.PREFIX_GROUP_TEXTSECURE + this.groupId.key; + } + const encoded = StringUtils.encode(groupIdWithPrefix, 'utf8'); + const id = new Uint8Array(encoded); return new SignalService.GroupContext({ id }); } diff --git a/ts/session/types/PubKey.ts b/ts/session/types/PubKey.ts index db333185d..7e63b32e9 100644 --- a/ts/session/types/PubKey.ts +++ b/ts/session/types/PubKey.ts @@ -8,7 +8,6 @@ export class PubKey { // tslint:disable: member-ordering public static readonly regexForPubkeys = `((05)?${PubKey.HEX}{64})`; public static readonly PREFIX_GROUP_TEXTSECURE = '__textsecure_group__!'; - // prettier-ignore private static readonly regex: RegExp = new RegExp( `^(${PubKey.PREFIX_GROUP_TEXTSECURE})?(05)?(${PubKey.HEX}{64}|${PubKey.HEX}{32})$` From 58d85c0f8eb3bd7acf56e9d1a5aafa01237a66f2 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 18 Sep 2020 09:42:30 +1000 Subject: [PATCH 212/274] fix methods order --- .../session/LeftPaneContactSection.tsx | 20 +++++++++---------- .../session/LeftPaneMessageSection.tsx | 18 ++++++++--------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/ts/components/session/LeftPaneContactSection.tsx b/ts/components/session/LeftPaneContactSection.tsx index b605fac98..eec649874 100644 --- a/ts/components/session/LeftPaneContactSection.tsx +++ b/ts/components/session/LeftPaneContactSection.tsx @@ -64,6 +64,16 @@ export class LeftPaneContactSection extends React.Component { this.closeOverlay = this.closeOverlay.bind(this); } + public componentDidMount() { + MainViewController.renderMessageView(); + + window.Whisper.events.on('calculatingPoW', this.closeOverlay); + } + + public componentDidUpdate() { + MainViewController.renderMessageView(); + } + public componentWillUnmount() { this.updateSearch(''); this.setState({ addContactRecipientID: '' }); @@ -83,16 +93,6 @@ export class LeftPaneContactSection extends React.Component { ); } - public componentDidMount() { - MainViewController.renderMessageView(); - - window.Whisper.events.on('calculatingPoW', this.closeOverlay); - } - - public componentDidUpdate() { - MainViewController.renderMessageView(); - } - public render(): JSX.Element { return (
diff --git a/ts/components/session/LeftPaneMessageSection.tsx b/ts/components/session/LeftPaneMessageSection.tsx index 7685e92dc..08e93a46a 100644 --- a/ts/components/session/LeftPaneMessageSection.tsx +++ b/ts/components/session/LeftPaneMessageSection.tsx @@ -96,6 +96,15 @@ export class LeftPaneMessageSection extends React.Component { this.closeOverlay = this.closeOverlay.bind(this); } + public componentDidMount() { + MainViewController.renderMessageView(); + window.Whisper.events.on('calculatingPoW', this.closeOverlay); + } + + public componentDidUpdate() { + MainViewController.renderMessageView(); + } + public componentWillUnmount() { this.updateSearch(''); window.Whisper.events.off('calculatingPoW', this.closeOverlay); @@ -178,15 +187,6 @@ export class LeftPaneMessageSection extends React.Component { return [list]; } - public componentDidMount() { - MainViewController.renderMessageView(); - window.Whisper.events.on('calculatingPoW', this.closeOverlay); - } - - public componentDidUpdate() { - MainViewController.renderMessageView(); - } - public closeOverlay({ pubKey }: { pubKey: string }) { if (this.state.valuePasted === pubKey) { this.setState({ overlay: false, valuePasted: '' }); From d283636fa38568202c3695f47caaee705c036e4e Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 18 Sep 2020 09:34:55 +1000 Subject: [PATCH 213/274] fix tests --- .../session/unit/messages/ClosedGroupChatMessage_test.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ts/test/session/unit/messages/ClosedGroupChatMessage_test.ts b/ts/test/session/unit/messages/ClosedGroupChatMessage_test.ts index 74692fd58..beac186eb 100644 --- a/ts/test/session/unit/messages/ClosedGroupChatMessage_test.ts +++ b/ts/test/session/unit/messages/ClosedGroupChatMessage_test.ts @@ -31,7 +31,12 @@ describe('ClosedGroupChatMessage', () => { .to.have.property('group') .to.have.deep.property( 'id', - new Uint8Array(StringUtils.encode(groupId.key, 'utf8')) + new Uint8Array( + StringUtils.encode( + PubKey.PREFIX_GROUP_TEXTSECURE + groupId.key, + 'utf8' + ) + ) ); expect(decoded.dataMessage) .to.have.property('group') From 663654ef2c4fd11aeca4bf2e5ac7fd29a6000d1c Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 18 Sep 2020 10:43:58 +1000 Subject: [PATCH 214/274] remove getInitials from conversation - unused --- js/models/conversations.js | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/js/models/conversations.js b/js/models/conversations.js index 87843e33f..096806d37 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -2504,21 +2504,6 @@ return this.id; }, - getInitials(name) { - if (!name) { - return null; - } - - const cleaned = name.replace(/[^A-Za-z\s]+/g, '').replace(/\s+/g, ' '); - const parts = cleaned.split(' '); - const initials = parts.map(part => part.trim()[0]); - if (!initials.length) { - return null; - } - - return initials.slice(0, 2).join(''); - }, - isPrivate() { return this.get('type') === 'private'; }, @@ -2537,18 +2522,9 @@ return null; }, getAvatar() { - const title = this.get('name'); const url = this.getAvatarPath(); - if (url) { - return { url }; - } else if (this.isPrivate()) { - const symbol = this.isValid() ? '#' : '!'; - return { - content: this.getInitials(title) || symbol, - }; - } - return { url: null }; + return url ? { url } : { url: null }; }, getNotificationIcon() { From e83912e44918a3e9301aa6d0bc4b6ccf48eac554 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 18 Sep 2020 10:48:18 +1000 Subject: [PATCH 215/274] avatar placeholder skip first 05 for initial from pubkey --- ts/components/MessageSearchResult.tsx | 2 +- ts/util/getInitials.ts | 18 ++++-------------- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/ts/components/MessageSearchResult.tsx b/ts/components/MessageSearchResult.tsx index 087e07e73..0a56b0aff 100644 --- a/ts/components/MessageSearchResult.tsx +++ b/ts/components/MessageSearchResult.tsx @@ -101,7 +101,7 @@ export class MessageSearchResult extends React.PureComponent { public renderAvatar() { const { from } = this.props; - const userName = from.phoneNumber || from.profileName; + const userName = from.profileName || from.phoneNumber; return ( part.trim()[0]); - if (!initials.length) { - return; + if (name.length > 2 && name.startsWith('05')) { + return name[2]; } - return initials[0]; + return name[0]; } From d6ad2a1911ddc993e1f9dd87c5cfc56bc8f80cea Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 18 Sep 2020 11:36:47 +1000 Subject: [PATCH 216/274] select message on click on message directly --- js/models/conversations.js | 2 +- ts/components/conversation/Message.tsx | 32 +++++++++++++------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/js/models/conversations.js b/js/models/conversations.js index 096806d37..d340ce79f 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -2524,7 +2524,7 @@ getAvatar() { const url = this.getAvatarPath(); - return url ? { url } : { url: null }; + return url ? { url } : { url: null }; }, getNotificationIcon() { diff --git a/ts/components/conversation/Message.tsx b/ts/components/conversation/Message.tsx index 510910539..73143a2b0 100644 --- a/ts/components/conversation/Message.tsx +++ b/ts/components/conversation/Message.tsx @@ -1109,22 +1109,6 @@ export class Message extends React.PureComponent { `module-message--${direction}`, expiring ? 'module-message--expired' : null )} - role="button" - onClick={event => { - const selection = window.getSelection(); - // Text is being selected - if (selection && selection.type === 'Range') { - return; - } - - // User clicked on message body - const target = event.target as HTMLDivElement; - if (target.className === 'text-selectable') { - return; - } - - this.props.onSelectMessage(); - }} > {this.renderError(isIncoming)} {isRss || isKickedFromGroup @@ -1138,6 +1122,22 @@ export class Message extends React.PureComponent { style={{ width: isShowingImage ? width : undefined, }} + role="button" + onClick={event => { + const selection = window.getSelection(); + // Text is being selected + if (selection && selection.type === 'Range') { + return; + } + + // User clicked on message body + const target = event.target as HTMLDivElement; + if (target.className === 'text-selectable') { + return; + } + + this.props.onSelectMessage(); + }} > {this.renderAuthor()} {this.renderQuote()} From 0837ff522382e10dcfefc00caf6182adb7dec912 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 18 Sep 2020 13:48:46 +1000 Subject: [PATCH 217/274] fix tests --- js/models/conversations.js | 2 +- test/models/conversations_test.js | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/js/models/conversations.js b/js/models/conversations.js index d340ce79f..b2ec3bf66 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -2524,7 +2524,7 @@ getAvatar() { const url = this.getAvatarPath(); - return url ? { url } : { url: null }; + return { url: url || null }; }, getNotificationIcon() { diff --git a/test/models/conversations_test.js b/test/models/conversations_test.js index 226e80365..4e9c741d6 100644 --- a/test/models/conversations_test.js +++ b/test/models/conversations_test.js @@ -129,12 +129,6 @@ describe('Conversation', () => { assert.equal(convo.getNumber(), ''); }); - it('has an avatar', () => { - const convo = new Whisper.ConversationCollection().add(attributes); - const avatar = convo.getAvatar(); - assert.property(avatar, 'content'); - }); - describe('when set to private', () => { it('correctly validates hex numbers', () => { const regularId = new Whisper.Conversation({ From 8326870b1af719050a4918251f672c1bf85f36c4 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 18 Sep 2020 15:44:17 +1000 Subject: [PATCH 218/274] use senderIdentity for incoming messages on mediumGroups --- ts/receiver/contentMessage.ts | 2 +- ts/receiver/dataMessage.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ts/receiver/contentMessage.ts b/ts/receiver/contentMessage.ts index 77780f73a..7ed9eca8e 100644 --- a/ts/receiver/contentMessage.ts +++ b/ts/receiver/contentMessage.ts @@ -82,7 +82,7 @@ async function decryptForMediumGroup( ); return null; } - + envelope.senderIdentity = sourceAsStr; const plaintext = await decryptWithSenderKey( ciphertext, keyIdx, diff --git a/ts/receiver/dataMessage.ts b/ts/receiver/dataMessage.ts index 907cd8daa..813b8b883 100644 --- a/ts/receiver/dataMessage.ts +++ b/ts/receiver/dataMessage.ts @@ -296,7 +296,7 @@ export async function handleDataMessage( } const message = await processDecrypted(envelope, dataMessage); const ourPubKey = window.textsecure.storage.user.getNumber(); - const senderPubKey = envelope.source; + const senderPubKey = envelope.senderIdentity || envelope.source; const isMe = senderPubKey === ourPubKey; const conversation = window.ConversationController.get(senderPubKey); From 3a876c7322c97bde8df9aaf74e3a3e067c781d8a Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 21 Sep 2020 11:45:10 +1000 Subject: [PATCH 219/274] add notify to PN server on message sent --- js/models/messages.js | 61 +++++++++++++++---- js/modules/loki_app_dot_net_api.js | 2 + .../loki_push_notification_server_api.js | 28 +++++++++ js/views/inbox_view.js | 4 +- preload.js | 2 +- ts/session/sending/MessageQueue.ts | 4 +- ts/session/sending/MessageQueueInterface.ts | 5 +- ts/session/sending/MessageSender.ts | 8 ++- ts/session/snode_api/onions.ts | 9 ++- ts/session/snode_api/serviceNodeAPI.ts | 1 - 10 files changed, 100 insertions(+), 24 deletions(-) create mode 100644 js/modules/loki_push_notification_server_api.js diff --git a/js/models/messages.js b/js/models/messages.js index 4da827afc..1345f895a 100644 --- a/js/models/messages.js +++ b/js/models/messages.js @@ -1232,7 +1232,7 @@ * This function is called by inbox_view.js when a message was successfully sent for one device. * So it might be called several times for the same message */ - async handleMessageSentSuccess(sentMessage) { + async handleMessageSentSuccess(sentMessage, wrappedEnvelope) { let sentTo = this.get('sent_to') || []; const isOurDevice = await window.libsession.Protocols.MultiDeviceProtocol.isOurDevice( @@ -1253,32 +1253,67 @@ // if we did not sync or trigger a sync message for this specific message already const shouldTriggerSyncMessage = !isOurDevice && - !isOpenGroupMessage && !isMediumGroupMessage && !this.get('synced') && !this.get('sentSync'); // A message is synced if we triggered a sync message (sentSync) // and the current message was sent to our device (so a sync message) - const shouldMarkMessageAsSynced = - isOurDevice && !isOpenGroupMessage && this.get('sentSync'); + const shouldMarkMessageAsSynced = isOurDevice && this.get('sentSync'); - // Handle the sync logic here - if (shouldTriggerSyncMessage) { + const isSessionOrClosedMessage = !isOpenGroupMessage; + + if (!isOpenGroupMessage) { const contentDecoded = textsecure.protobuf.Content.decode( sentMessage.plainTextBuffer ); const { dataMessage } = contentDecoded; - if (dataMessage) { - await this.sendSyncMessage(dataMessage); - } - } else if (shouldMarkMessageAsSynced) { - this.set({ synced: true }); - } - if (!isOpenGroupMessage) { const primaryPubKey = await libsession.Protocols.MultiDeviceProtocol.getPrimaryDevice( sentMessage.device ); + + /** + * We should hit the notify endpoint for push notification only if: + * • It's a one-to-one chat or a closed group + * • The message has either text or attachments + */ + const hasBodyOrAttachments = Boolean( + dataMessage && + (dataMessage.body || + (dataMessage.attachments && dataMessage.attachments.length)) + ); + const shouldNotifyPushServer = + hasBodyOrAttachments && + isSessionOrClosedMessage && + sentMessage.ttl === + window.libsession.Constants.TTL_DEFAULT.REGULAR_MESSAGE; + if (shouldNotifyPushServer) { + // notify the push notification server if needed + if (!wrappedEnvelope) { + window.log.warn( + 'Should send PN notify but no wrapped envelope set.' + ); + } else { + if (!window.LokiPushNotificationServer) { + window.LokiPushNotificationServer = new window.LokiPushNotificationServerApi(); + } + + window.LokiPushNotificationServer.notify( + wrappedEnvelope, + primaryPubKey.key + ); + } + } + + // Handle the sync logic here + if (shouldTriggerSyncMessage) { + if (dataMessage) { + await this.sendSyncMessage(dataMessage); + } + } else if (shouldMarkMessageAsSynced) { + this.set({ synced: true }); + } + sentTo = _.union(sentTo, [primaryPubKey.key]); } diff --git a/js/modules/loki_app_dot_net_api.js b/js/modules/loki_app_dot_net_api.js index 4bedce58b..4b3472e26 100644 --- a/js/modules/loki_app_dot_net_api.js +++ b/js/modules/loki_app_dot_net_api.js @@ -31,6 +31,8 @@ const urlPubkeyMap = { 'https://file-dev.lokinet.org': LOKIFOUNDATION_DEVFILESERVER_PUBKEY, 'https://file.getsession.org': LOKIFOUNDATION_FILESERVER_PUBKEY, 'https://file.lokinet.org': LOKIFOUNDATION_FILESERVER_PUBKEY, + 'https://staging.apns.getsession.org': + 'BWQqZYWRl0LlotTcUSRJZPvNi8qyt1YSQH3li4EHQNBJ', }; const HOMESERVER_USER_ANNOTATION_TYPE = 'network.loki.messenger.homeserver'; diff --git a/js/modules/loki_push_notification_server_api.js b/js/modules/loki_push_notification_server_api.js new file mode 100644 index 000000000..f429af81e --- /dev/null +++ b/js/modules/loki_push_notification_server_api.js @@ -0,0 +1,28 @@ +/* global dcodeIO */ + +const LokiAppDotNetAPI = require('./loki_app_dot_net_api'); + +class LokiPushNotificationServerApi { + constructor() { + this.ourKey = + '642a6585919742e5a2d4dc51244964fbcd8bcab2b75612407de58b810740d049'; + this.serverUrl = 'https://staging.apns.getsession.org'; + this._server = new LokiAppDotNetAPI(this.ourKey, this.serverUrl); + + // make sure pubKey & pubKeyHex are set in _server + this.pubKey = this._server.getPubKeyForUrl(); + } + + async notify(plainTextBuffer, sentTo) { + const options = { + method: 'post', + objBody: { + data: dcodeIO.ByteBuffer.wrap(plainTextBuffer).toString('base64'), + send_to: sentTo, + }, + }; + return this._server.serverRequest('notify', options); + } +} + +module.exports = LokiPushNotificationServerApi; diff --git a/js/views/inbox_view.js b/js/views/inbox_view.js index 04464009e..b50de1d99 100644 --- a/js/views/inbox_view.js +++ b/js/views/inbox_view.js @@ -307,14 +307,14 @@ return { msg }; }, - async handleMessageSentSuccess(sentMessage) { + async handleMessageSentSuccess(sentMessage, wrappedEnvelope) { const fetchedData = await this.fetchHandleMessageSentData(sentMessage); if (!fetchedData) { return; } const { msg } = fetchedData; - msg.handleMessageSentSuccess(sentMessage); + msg.handleMessageSentSuccess(sentMessage, wrappedEnvelope); }, async handleMessageSentFailure(sentMessage, error) { diff --git a/preload.js b/preload.js index c22b99888..ff5848175 100644 --- a/preload.js +++ b/preload.js @@ -350,6 +350,7 @@ if (process.env.USE_STUBBED_NETWORK) { window.LokiPublicChatAPI = require('./js/modules/loki_public_chat_api'); window.LokiFileServerAPI = require('./js/modules/loki_file_server_api'); +window.LokiPushNotificationServerApi = require('./js/modules/loki_push_notification_server_api'); window.mnemonic = require('./libloki/modules/mnemonic'); const WorkerInterface = require('./js/modules/util_worker_interface'); @@ -504,7 +505,6 @@ const { } = require('./ts/util/blockedNumberController'); window.BlockedNumberController = BlockedNumberController; - window.deleteAccount = async reason => { try { window.log.info('Deleting everything!'); diff --git a/ts/session/sending/MessageQueue.ts b/ts/session/sending/MessageQueue.ts index d880e91f0..b5e86e41d 100644 --- a/ts/session/sending/MessageQueue.ts +++ b/ts/session/sending/MessageQueue.ts @@ -152,8 +152,8 @@ export class MessageQueue implements MessageQueueInterface { // We put the event handling inside this job to avoid sending duplicate events const job = async () => { try { - await MessageSender.send(message); - this.events.emit('success', message); + const wrappedEnvelope = await MessageSender.send(message); + this.events.emit('success', message, wrappedEnvelope); } catch (e) { this.events.emit('fail', message, e); } finally { diff --git a/ts/session/sending/MessageQueueInterface.ts b/ts/session/sending/MessageQueueInterface.ts index 3fb6df28a..c30592741 100644 --- a/ts/session/sending/MessageQueueInterface.ts +++ b/ts/session/sending/MessageQueueInterface.ts @@ -11,7 +11,10 @@ import { PubKey } from '../types'; type GroupMessageType = OpenGroupMessage | ClosedGroupMessage; export interface MessageQueueInterfaceEvents { - success: (message: RawMessage | OpenGroupMessage) => void; + success: ( + message: RawMessage | OpenGroupMessage, + wrappedEnvelope?: Uint8Array + ) => void; fail: (message: RawMessage | OpenGroupMessage, error: Error) => void; } diff --git a/ts/session/sending/MessageSender.ts b/ts/session/sending/MessageSender.ts index 6d28cbcb9..6341274d7 100644 --- a/ts/session/sending/MessageSender.ts +++ b/ts/session/sending/MessageSender.ts @@ -27,7 +27,7 @@ export function canSendToSnode(): boolean { export async function send( message: RawMessage, attempts: number = 3 -): Promise { +): Promise { if (!canSendToSnode()) { throw new Error('lokiMessageAPI is not initialized.'); } @@ -48,8 +48,10 @@ export async function send( const data = wrapEnvelope(envelope); return pRetry( - async () => - window.lokiMessageAPI.sendMessage(device.key, data, timestamp, ttl), + async () => { + await window.lokiMessageAPI.sendMessage(device.key, data, timestamp, ttl); + return data; + }, { retries: Math.max(attempts - 1, 0), factor: 1, diff --git a/ts/session/snode_api/onions.ts b/ts/session/snode_api/onions.ts index 176f4c23b..a7987e3cc 100644 --- a/ts/session/snode_api/onions.ts +++ b/ts/session/snode_api/onions.ts @@ -170,7 +170,7 @@ const processOnionResponse = async ( return RequestError.OTHER; } - const ciphertext = await response.text(); + let ciphertext = await response.text(); if (!ciphertext) { log.warn( `(${reqIdx}) [path] lokiRpc::processOnionResponse - Target node return empty ciphertext` @@ -186,6 +186,13 @@ const processOnionResponse = async ( let plaintext; let ciphertextBuffer; + + try { + const jsonRes = JSON.parse(ciphertext); + ciphertext = jsonRes.result; + } catch (e) { + // just try to get a json object from what is inside (for PN requests), if it fails, continue () + } try { ciphertextBuffer = dcodeIO.ByteBuffer.wrap( ciphertext, diff --git a/ts/session/snode_api/serviceNodeAPI.ts b/ts/session/snode_api/serviceNodeAPI.ts index 0d1bf96af..6b96520f9 100644 --- a/ts/session/snode_api/serviceNodeAPI.ts +++ b/ts/session/snode_api/serviceNodeAPI.ts @@ -3,7 +3,6 @@ import https from 'https'; import fetch from 'node-fetch'; -import { PubKey } from '../types'; import { snodeRpc } from './lokiRpc'; import { sendOnionRequestLsrpcDest, SnodeResponse } from './onions'; From 9295fe7c5852dd10efe31ca1155c6e47cb5c9b81 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 21 Sep 2020 14:14:12 +1000 Subject: [PATCH 220/274] add opacity change on hovered clickable avatar --- stylesheets/_avatar.scss | 7 +++++++ stylesheets/_session_constants.scss | 4 +++- ts/components/Avatar.tsx | 4 +++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/stylesheets/_avatar.scss b/stylesheets/_avatar.scss index 3f3fd2eda..5cad1f342 100644 --- a/stylesheets/_avatar.scss +++ b/stylesheets/_avatar.scss @@ -123,3 +123,10 @@ bottom: 0px; } } + +.module-avatar-clickable { + transition: $session-transition-duration; + &:hover { + opacity: $session-subtle-factor; + } +} diff --git a/stylesheets/_session_constants.scss b/stylesheets/_session_constants.scss index 11aeab0e6..19f1a3e54 100644 --- a/stylesheets/_session_constants.scss +++ b/stylesheets/_session_constants.scss @@ -153,8 +153,10 @@ $session-font-h4: 16px; color: subtle($color); } +$session-subtle-factor: 0.6; + @function subtle($color) { - @return rgba($color, 0.6); + @return rgba($color, $session-subtle-factor); } // ////////////////////////////////////////////// diff --git a/ts/components/Avatar.tsx b/ts/components/Avatar.tsx index 6fdbbcb0a..f6249fb35 100644 --- a/ts/components/Avatar.tsx +++ b/ts/components/Avatar.tsx @@ -106,13 +106,15 @@ export class Avatar extends React.PureComponent { ) { throw new Error(`Size ${size} is not supported!`); } + const isClickable = !!this.props.onAvatarClick; return (
{ this.onAvatarClickBound(e); From 86b15328c186b5b952474d5f0f667d24c16e02ab Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 21 Sep 2020 15:59:56 +1000 Subject: [PATCH 221/274] drop the prefix for group on the incoming message object --- ts/receiver/dataMessage.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ts/receiver/dataMessage.ts b/ts/receiver/dataMessage.ts index 813b8b883..0818e037e 100644 --- a/ts/receiver/dataMessage.ts +++ b/ts/receiver/dataMessage.ts @@ -644,10 +644,8 @@ export async function handleMessageEvent(event: MessageEvent): Promise { // - group.id if it is a group message let conversationId = id; if (isGroupMessage) { - /* handle one part of the group logic here: - handle requesting info of a new group, - dropping an admin only update from a non admin, ... - */ + // remove the prefix from the source object so this is correct for all other + message.group.id = message.group.id.replace(PubKey.PREFIX_GROUP_TEXTSECURE, ''); conversationId = message.group.id; } From 4505bed61bf89ddae464d462ad3f1437e5cb2db6 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 22 Sep 2020 08:58:21 +1000 Subject: [PATCH 222/274] add migration to drop existing textsecure prefix from group convo ids --- app/sql.js | 57 ++++++++++++++++++++++++++++++++++++++ ts/receiver/dataMessage.ts | 5 +++- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/app/sql.js b/app/sql.js index 225fb7e45..73dbdb5da 100644 --- a/app/sql.js +++ b/app/sql.js @@ -812,6 +812,7 @@ const LOKI_SCHEMA_VERSIONS = [ updateToLokiSchemaVersion6, updateToLokiSchemaVersion7, updateToLokiSchemaVersion8, + updateToLokiSchemaVersion9, ]; async function updateToLokiSchemaVersion1(currentVersion, instance) { @@ -1075,6 +1076,26 @@ async function updateToLokiSchemaVersion8(currentVersion, instance) { console.log('updateToLokiSchemaVersion8: success!'); } +async function updateToLokiSchemaVersion9(currentVersion, instance) { + if (currentVersion >= 9) { + return; + } + console.log('updateToLokiSchemaVersion9: starting...'); + await instance.run('BEGIN TRANSACTION;'); + + await removePrefixFromGroupConversations(instance); + + await instance.run( + `INSERT INTO loki_schema ( + version + ) values ( + 9 + );` + ); + await instance.run('COMMIT TRANSACTION;'); + console.log('updateToLokiSchemaVersion9: success!'); +} + async function updateLokiSchema(instance) { const result = await instance.get( "SELECT name FROM sqlite_master WHERE type = 'table' AND name='loki_schema';" @@ -3039,3 +3060,39 @@ async function removeKnownAttachments(allAttachments) { return Object.keys(lookup); } + +async function removePrefixFromGroupConversations(instance) { + const rows = await instance.all( + `SELECT json FROM conversations WHERE + type = 'group' AND + id LIKE '__textsecure_group__!%';` + ); + + const objs = map(rows, row => jsonToObject(row.json)); + + await Promise.all( + objs.map(async o => { + const oldId = o.id; + const newId = oldId.replace('__textsecure_group__!', ''); + + console.log(`migrating conversation, ${oldId} to ${newId}`); + + const morphedObject = { + ...o, + id: newId, + }; + + await instance.run( + `UPDATE ${CONVERSATIONS_TABLE} SET + id = $newId, + json = $json + WHERE id = $oldId;`, + { + $newId: newId, + $json: objectToJSON(morphedObject), + $oldId: oldId, + } + ); + }) + ); +} diff --git a/ts/receiver/dataMessage.ts b/ts/receiver/dataMessage.ts index 0818e037e..ea8049a71 100644 --- a/ts/receiver/dataMessage.ts +++ b/ts/receiver/dataMessage.ts @@ -645,7 +645,10 @@ export async function handleMessageEvent(event: MessageEvent): Promise { let conversationId = id; if (isGroupMessage) { // remove the prefix from the source object so this is correct for all other - message.group.id = message.group.id.replace(PubKey.PREFIX_GROUP_TEXTSECURE, ''); + message.group.id = message.group.id.replace( + PubKey.PREFIX_GROUP_TEXTSECURE, + '' + ); conversationId = message.group.id; } From 7011fa3efcecc1c14fd21336ff8db12ed9753bca Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 22 Sep 2020 08:58:53 +1000 Subject: [PATCH 223/274] drop the check for ttl in shouldSendNotify --- js/models/messages.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/js/models/messages.js b/js/models/messages.js index 1345f895a..d762d95c3 100644 --- a/js/models/messages.js +++ b/js/models/messages.js @@ -1283,10 +1283,8 @@ (dataMessage.attachments && dataMessage.attachments.length)) ); const shouldNotifyPushServer = - hasBodyOrAttachments && - isSessionOrClosedMessage && - sentMessage.ttl === - window.libsession.Constants.TTL_DEFAULT.REGULAR_MESSAGE; + hasBodyOrAttachments && isSessionOrClosedMessage; + if (shouldNotifyPushServer) { // notify the push notification server if needed if (!wrappedEnvelope) { From e678895d178e9ad58ffe694905b6e3044cc6a693 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 22 Sep 2020 08:59:58 +1000 Subject: [PATCH 224/274] undo enable ssk groups --- preload.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/preload.js b/preload.js index ff5848175..ae826f80b 100644 --- a/preload.js +++ b/preload.js @@ -490,7 +490,7 @@ if (config.environment.includes('test-integration')) { useOnionRequests: false, useFileOnionRequests: false, debugMessageLogs: true, - enableSenderKeys: true, + enableSenderKeys: false, useMultiDevice: false, }; /* eslint-disable global-require, import/no-extraneous-dependencies */ From 5dc668f5915780c14d73017d31a24a8e2d466cba Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 22 Sep 2020 14:09:47 +1000 Subject: [PATCH 225/274] disable microphone for now (waiting refactor branch to be merged) --- background.html | 2 +- js/views/conversation_view.js | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/background.html b/background.html index afc272271..4cbc7da19 100644 --- a/background.html +++ b/background.html @@ -105,7 +105,7 @@
-
+
diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index eb57925da..c48842988 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -725,16 +725,17 @@ }, async toggleMicrophone() { - const allowMicrophone = await window.getMediaPermissions(); - if ( - !allowMicrophone || - this.$('.send-message').val().length > 0 || - this.fileInput.hasFiles() - ) { + // FIXME audric hide microphone for now until refactor branch is merged + // const allowMicrophone = await window.getMediaPermissions(); + // if ( + // !allowMicrophone || + // this.$('.send-message').val().length > 0 || + // this.fileInput.hasFiles() + // ) { this.$('.capture-audio').hide(); - } else { - this.$('.capture-audio').show(); - } + // } else { + // this.$('.capture-audio').show(); + // } }, captureAudio(e) { e.preventDefault(); From c9b847e4644b2ff22e34cd46329fd14992cebf59 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 22 Sep 2020 15:36:39 +1000 Subject: [PATCH 226/274] handle duplicate convos when removing prefix. we drop the convo with the less messages to keep the unique constraint on conversation IDs --- app/sql.js | 59 ++++++++++++++++++++++++++++++++++- js/views/conversation_view.js | 2 +- 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/app/sql.js b/app/sql.js index 73dbdb5da..12a566fe6 100644 --- a/app/sql.js +++ b/app/sql.js @@ -3061,6 +3061,15 @@ async function removeKnownAttachments(allAttachments) { return Object.keys(lookup); } +async function getMessagesCountByConversation(instance, conversationId) { + const row = await instance.get( + 'SELECT count(*) from messages WHERE conversationId = $conversationId;', + { $conversationId: conversationId } + ); + + return row ? row['count(*)'] : 0; +} + async function removePrefixFromGroupConversations(instance) { const rows = await instance.all( `SELECT json FROM conversations WHERE @@ -3070,13 +3079,61 @@ async function removePrefixFromGroupConversations(instance) { const objs = map(rows, row => jsonToObject(row.json)); + const conversationIdRows = await instance.all( + `SELECT id FROM ${CONVERSATIONS_TABLE} ORDER BY id ASC;` + ); + const allOldConversationIds = map(conversationIdRows, row => row.id); + await Promise.all( objs.map(async o => { const oldId = o.id; const newId = oldId.replace('__textsecure_group__!', ''); - console.log(`migrating conversation, ${oldId} to ${newId}`); + if (allOldConversationIds.includes(newId)) { + console.log( + 'Found a duplicate conversation after prefix removing. We need to take care of it' + ); + // We have another conversation with the same future name. + // We decided to keep only the conversation with the higher number of messages + const countMessagesOld = await getMessagesCountByConversation( + instance, + oldId, + { limit: Number.MAX_VALUE } + ); + const countMessagesNew = await getMessagesCountByConversation( + instance, + newId, + { limit: Number.MAX_VALUE } + ); + + console.log( + `countMessagesOld: ${countMessagesOld}, countMessagesNew: ${countMessagesNew}` + ); + + if (countMessagesOld > countMessagesNew) { + console.log( + 'Removing the conversation without the prefix as there are less messages in it' + ); + await instance.run( + `DELETE FROM ${CONVERSATIONS_TABLE} WHERE id = $id;`, + { + $id: newId, + } + ); + } else { + console.log( + 'Removing the conversation with the prefix as there are less messages in it' + ); + await instance.run( + `DELETE FROM ${CONVERSATIONS_TABLE} WHERE id = $id;`, + { + $id: oldId, + } + ); + } + } + const morphedObject = { ...o, id: newId, diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index c48842988..0c109e480 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -732,7 +732,7 @@ // this.$('.send-message').val().length > 0 || // this.fileInput.hasFiles() // ) { - this.$('.capture-audio').hide(); + this.$('.capture-audio').hide(); // } else { // this.$('.capture-audio').show(); // } From 09a93d0648af8ae419d5183fd7c35b6406313150 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 22 Sep 2020 16:01:30 +1000 Subject: [PATCH 227/274] adress reviews --- app/sql.js | 28 +++++++--------------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/app/sql.js b/app/sql.js index 12a566fe6..276746a25 100644 --- a/app/sql.js +++ b/app/sql.js @@ -3111,27 +3111,13 @@ async function removePrefixFromGroupConversations(instance) { `countMessagesOld: ${countMessagesOld}, countMessagesNew: ${countMessagesNew}` ); - if (countMessagesOld > countMessagesNew) { - console.log( - 'Removing the conversation without the prefix as there are less messages in it' - ); - await instance.run( - `DELETE FROM ${CONVERSATIONS_TABLE} WHERE id = $id;`, - { - $id: newId, - } - ); - } else { - console.log( - 'Removing the conversation with the prefix as there are less messages in it' - ); - await instance.run( - `DELETE FROM ${CONVERSATIONS_TABLE} WHERE id = $id;`, - { - $id: oldId, - } - ); - } + const deleteId = countMessagesOld > countMessagesNew ? newId : oldId; + await instance.run( + `DELETE FROM ${CONVERSATIONS_TABLE} WHERE id = $id;`, + { + $id: deleteId, + } + ); } const morphedObject = { From e669324acc8fd554ed05e3ff380c0a0848e47f73 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 22 Sep 2020 16:03:32 +1000 Subject: [PATCH 228/274] lint --- js/views/conversation_view.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index c48842988..0c109e480 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -732,7 +732,7 @@ // this.$('.send-message').val().length > 0 || // this.fileInput.hasFiles() // ) { - this.$('.capture-audio').hide(); + this.$('.capture-audio').hide(); // } else { // this.$('.capture-audio').show(); // } From 32c95762969afe0f358663c145fb0f1f423d0da9 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 22 Sep 2020 16:56:27 +1000 Subject: [PATCH 229/274] max retries is 3 for file server requests --- js/modules/loki_app_dot_net_api.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/js/modules/loki_app_dot_net_api.js b/js/modules/loki_app_dot_net_api.js index 4b3472e26..5e6cc705a 100644 --- a/js/modules/loki_app_dot_net_api.js +++ b/js/modules/loki_app_dot_net_api.js @@ -48,6 +48,8 @@ const snodeHttpsAgent = new https.Agent({ const timeoutDelay = ms => new Promise(resolve => setTimeout(resolve, ms)); +const MAX_SEND_ONION_RETRIES = 3; + const sendViaOnion = async (srvPubKey, url, fetchOptions, options = {}) => { if (!srvPubKey) { log.error( @@ -134,6 +136,12 @@ const sendViaOnion = async (srvPubKey, url, fetchOptions, options = {}) => { `loki_app_dot_net:::sendViaOnion #${options.requestNumber} - Retry #${options.retry} Couldnt handle onion request, retrying`, payloadObj ); + if (options.retry && options.retry >= MAX_SEND_ONION_RETRIES) { + log.error( + `sendViaOnion too many retries: ${options.retry}. Stopping retries.` + ); + return {}; + } return sendViaOnion(srvPubKey, url, fetchOptions, { ...options, retry: options.retry + 1, From 0b6fe65b3ce571bb2552750579572ecbd2a7cb5b Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 22 Sep 2020 16:56:51 +1000 Subject: [PATCH 230/274] move to staging server for apns --- js/modules/loki_app_dot_net_api.js | 7 +++++-- js/modules/loki_push_notification_server_api.js | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/js/modules/loki_app_dot_net_api.js b/js/modules/loki_app_dot_net_api.js index 5e6cc705a..efcd5642a 100644 --- a/js/modules/loki_app_dot_net_api.js +++ b/js/modules/loki_app_dot_net_api.js @@ -26,13 +26,16 @@ const LOKIFOUNDATION_DEVFILESERVER_PUBKEY = 'BSZiMVxOco/b3sYfaeyiMWv/JnqokxGXkHoclEx8TmZ6'; const LOKIFOUNDATION_FILESERVER_PUBKEY = 'BWJQnVm97sQE3Q1InB4Vuo+U/T1hmwHBv0ipkiv8tzEc'; +const LOKIFOUNDATION_APNS_PUBKEY = + 'BWQqZYWRl0LlotTcUSRJZPvNi8qyt1YSQH3li4EHQNBJ'; + const urlPubkeyMap = { 'https://file-dev.getsession.org': LOKIFOUNDATION_DEVFILESERVER_PUBKEY, 'https://file-dev.lokinet.org': LOKIFOUNDATION_DEVFILESERVER_PUBKEY, 'https://file.getsession.org': LOKIFOUNDATION_FILESERVER_PUBKEY, 'https://file.lokinet.org': LOKIFOUNDATION_FILESERVER_PUBKEY, - 'https://staging.apns.getsession.org': - 'BWQqZYWRl0LlotTcUSRJZPvNi8qyt1YSQH3li4EHQNBJ', + 'https://dev.apns.getsession.org': LOKIFOUNDATION_APNS_PUBKEY, + 'https://live.apns.getsession.org': LOKIFOUNDATION_APNS_PUBKEY, }; const HOMESERVER_USER_ANNOTATION_TYPE = 'network.loki.messenger.homeserver'; diff --git a/js/modules/loki_push_notification_server_api.js b/js/modules/loki_push_notification_server_api.js index f429af81e..91531a47b 100644 --- a/js/modules/loki_push_notification_server_api.js +++ b/js/modules/loki_push_notification_server_api.js @@ -6,7 +6,7 @@ class LokiPushNotificationServerApi { constructor() { this.ourKey = '642a6585919742e5a2d4dc51244964fbcd8bcab2b75612407de58b810740d049'; - this.serverUrl = 'https://staging.apns.getsession.org'; + this.serverUrl = 'https://live.apns.getsession.org'; this._server = new LokiAppDotNetAPI(this.ourKey, this.serverUrl); // make sure pubKey & pubKeyHex are set in _server From d12e0500af5a8935245b4621ce16179a46f8a6a3 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 23 Sep 2020 11:43:47 +1000 Subject: [PATCH 231/274] mark node as bad if it returns difficulty 100 --- ts/session/snode_api/serviceNodeAPI.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ts/session/snode_api/serviceNodeAPI.ts b/ts/session/snode_api/serviceNodeAPI.ts index 6b96520f9..ea7d610f3 100644 --- a/ts/session/snode_api/serviceNodeAPI.ts +++ b/ts/session/snode_api/serviceNodeAPI.ts @@ -327,6 +327,15 @@ export async function storeOnNode( return false; } else if (e instanceof textsecure.WrongDifficultyError) { const { newDifficulty } = e; + // difficulty of 100 happens when a snode restarts. We have to exit the loop and markNodeUnreachable() + if (newDifficulty === 100) { + log.warn( + 'loki_message:::storeOnNode - invalid new difficulty:100. Marking node as bad.' + ); + successiveFailures = MAX_ACCEPTABLE_FAILURES; + continue; + } + if (!Number.isNaN(newDifficulty)) { window.storage.put('PoWDifficulty', newDifficulty); } From 90bd30d0acb2931354450844397e1e34bd3a8722 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 23 Sep 2020 11:50:08 +1000 Subject: [PATCH 232/274] bump to v1.3.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 617a1c9a0..f40212456 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "session-messenger-desktop", "productName": "Session", "description": "Private messaging from your desktop", - "version": "1.3.0", + "version": "1.3.1", "license": "GPL-3.0", "author": { "name": "Loki Project", From b792caa5e73efd184aa91f83a4b5e9f6fd6fb8fa Mon Sep 17 00:00:00 2001 From: Ryan Tharp Date: Tue, 22 Sep 2020 19:13:21 -0700 Subject: [PATCH 233/274] fix out dated parameters to findOrCreateChannel for open group invites --- js/background.js | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/js/background.js b/js/background.js index 567e1d83f..b89561c0e 100644 --- a/js/background.js +++ b/js/background.js @@ -991,22 +991,21 @@ return; } - const serverAPI = await window.lokiPublicChatAPI.findOrCreateServer( - sslServerUrl - ); - if (!serverAPI) { - window.log.warn(`Could not connect to ${serverAddress}`); - return; - } - const conversation = await ConversationController.getOrCreateAndWait( conversationId, 'group' ); - - serverAPI.findOrCreateChannel(channelId, conversationId); await conversation.setPublicSource(sslServerUrl, channelId); + const channelAPI = await window.lokiPublicChatAPI.findOrCreateChannel( + sslServerUrl, + channelId, + conversationId + ); + if (!channelAPI) { + window.log.warn(`Could not connect to ${serverAddress}`); + return; + } appView.openConversation(conversationId, {}); } ); From e5db9916a5b840906ca2136688ce434bb0db8319 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 24 Sep 2020 09:27:44 +1000 Subject: [PATCH 234/274] allow closed group updates from non-admin user --- js/views/conversation_view.js | 3 +-- js/views/create_group_dialog_view.js | 9 ++++----- ts/components/session/SessionGroupSettings.tsx | 2 +- ts/receiver/groups.ts | 5 ++--- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index 0c109e480..c2752c2bf 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -270,7 +270,6 @@ }; }; const getGroupSettingsProps = () => { - const ourPK = window.textsecure.storage.user.getNumber(); const members = this.model.get('members') || []; return { @@ -281,7 +280,7 @@ avatarPath: this.model.getAvatarPath(), isGroup: !this.model.isPrivate(), isPublic: this.model.isPublic(), - isAdmin: this.model.get('groupAdmins').includes(ourPK), + isAdmin: true, // allow closed group edits from anyone this.model.get('groupAdmins').includes(ourPK), isRss: this.model.isRss(), memberCount: members.length, amMod: this.model.isModerator( diff --git a/js/views/create_group_dialog_view.js b/js/views/create_group_dialog_view.js index fdc1b688e..6a0f5715b 100644 --- a/js/views/create_group_dialog_view.js +++ b/js/views/create_group_dialog_view.js @@ -21,9 +21,8 @@ this.members = groupConvo.get('members') || []; this.avatarPath = groupConvo.getAvatarPath(); - const ourPK = textsecure.storage.user.getNumber(); - - this.isAdmin = groupConvo.get('groupAdmins').includes(ourPK); + // any member can update a closed group name + this.isAdmin = true; // public chat settings overrides if (this.isPublic) { @@ -79,7 +78,6 @@ Whisper.UpdateGroupMembersDialogView = Whisper.View.extend({ className: 'loki-dialog modal', initialize(groupConvo) { - const ourPK = textsecure.storage.user.getNumber(); this.groupName = groupConvo.get('name'); this.close = this.close.bind(this); this.onSubmit = this.onSubmit.bind(this); @@ -99,7 +97,8 @@ this.existingMembers = []; } else { this.titleText = i18n('updateGroupDialogTitle', this.groupName); - this.isAdmin = groupConvo.get('groupAdmins').includes(ourPK); + // anybody can edit a closed group name or members + this.isAdmin = true; const convos = window.getConversations().models.filter(d => !!d); this.existingMembers = groupConvo.get('members') || []; diff --git a/ts/components/session/SessionGroupSettings.tsx b/ts/components/session/SessionGroupSettings.tsx index 2f182c9ca..e1095c55f 100644 --- a/ts/components/session/SessionGroupSettings.tsx +++ b/ts/components/session/SessionGroupSettings.tsx @@ -245,7 +245,7 @@ class SessionGroupSettings extends React.Component { const showUpdateGroupNameButton = isPublic && !isKickedFromGroup ? amMod && !isBlocked - : isAdmin && !isBlocked; + : isAdmin && !isBlocked && !isKickedFromGroup; const showUpdateGroupMembersButton = !isPublic && !isKickedFromGroup && !isBlocked && isAdmin; diff --git a/ts/receiver/groups.ts b/ts/receiver/groups.ts index 2c74f92a0..df5a70a28 100644 --- a/ts/receiver/groups.ts +++ b/ts/receiver/groups.ts @@ -85,9 +85,8 @@ export async function preprocessGroupMessage( if (newGroup) { conversation.updateGroupAdmins(group.admins); } else { - // be sure to drop a message from a non admin if it tries to change group members - // or change the group name - const fromAdmin = conversation.get('groupAdmins').includes(primarySource); + // group members and names can be changed from any member + const fromAdmin = true; if (!fromAdmin) { // Make sure the message is not removing members / renaming the group From c01cd634e4c924ad3c3b5133ad2ad052e185abfe Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 24 Sep 2020 14:28:13 +1000 Subject: [PATCH 235/274] Generate our own senderkey if it does not exist This case can happen on restore from seed --- ts/receiver/mediumGroups.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/ts/receiver/mediumGroups.ts b/ts/receiver/mediumGroups.ts index 021bdcb31..a48851fd8 100644 --- a/ts/receiver/mediumGroups.ts +++ b/ts/receiver/mediumGroups.ts @@ -32,13 +32,19 @@ async function handleSenderKeyRequest( log.debug('[sender key] sender key request from:', senderIdentity); - const maybeKey = await getChainKey(groupId, ourIdentity); + let maybeKey = await getChainKey(groupId, ourIdentity); if (!maybeKey) { - // Regenerate? This should never happen though - log.error('Could not find own sender key'); - await removeFromCache(envelope); - return; + log.error('Could not find own sender key. Generating new one.'); + maybeKey = await SenderKeyAPI.createSenderKeyForGroup( + groupId, + PubKey.cast(ourIdentity) + ); + if (!maybeKey) { + log.error('Could not find own sender key after regenerate'); + await removeFromCache(envelope); + return; + } } // We reuse the same message type for sender keys From 5961e141c15e67da8840570c594dd44c0d7f6bfe Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 25 Sep 2020 09:10:12 +1000 Subject: [PATCH 236/274] enable senderkeys feature flags (and so medium groups) --- preload.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/preload.js b/preload.js index ae826f80b..ff5848175 100644 --- a/preload.js +++ b/preload.js @@ -490,7 +490,7 @@ if (config.environment.includes('test-integration')) { useOnionRequests: false, useFileOnionRequests: false, debugMessageLogs: true, - enableSenderKeys: false, + enableSenderKeys: true, useMultiDevice: false, }; /* eslint-disable global-require, import/no-extraneous-dependencies */ From c052b1a2ec71ef928b7773f3ab2a974717714745 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 25 Sep 2020 09:22:06 +1000 Subject: [PATCH 237/274] update group size limit to 20 now that those are ssk groups Also removed removed description while creating a medium group as it was removed on mobile --- _locales/de/messages.json | 5 +---- _locales/en/messages.json | 6 +----- _locales/es/messages.json | 5 +---- _locales/fr/messages.json | 5 +---- _locales/id/messages.json | 5 +---- _locales/it/messages.json | 5 +---- _locales/ja/messages.json | 5 +---- _locales/pl/messages.json | 5 +---- _locales/pt_BR/messages.json | 5 +---- _locales/ru/messages.json | 5 +---- _locales/vi/messages.json | 5 +---- js/views/invite_contacts_dialog_view.js | 7 ++----- preload.js | 2 +- ts/components/MainViewController.tsx | 2 +- ts/components/conversation/CreateGroupDialog.tsx | 8 +++----- ts/components/session/SessionClosableOverlay.tsx | 1 - 16 files changed, 18 insertions(+), 58 deletions(-) diff --git a/_locales/de/messages.json b/_locales/de/messages.json index 195f0a389..1a43346b3 100644 --- a/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -1441,9 +1441,6 @@ "displayNameEmpty": { "message": "Bitte wählen Sie einen Anzeigenamen" }, - "newClosedGroupDescription": { - "message": "Geschlossene Gruppen unterstützen bis zu 10 Mitglieder und bieten den gleichen Schutz der Privatsphäre wie Einzelgespräche." - }, "openGroupURL": { "message": "Gruppen-URL öffnen" }, @@ -1463,6 +1460,6 @@ "message": "Bitte wählen Sie mindestens zwei Gruppenmitglieder aus." }, "closedGroupMaxSize": { - "message": "Eine geschlossene Gruppe kann maximal zehn Mitglieder haben." + "message": "Eine geschlossene Gruppe kann maximal zwanzig Mitglieder haben." } } \ No newline at end of file diff --git a/_locales/en/messages.json b/_locales/en/messages.json index d4c769bfc..eae22794f 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -2124,10 +2124,6 @@ "message": "New Closed Group", "androidKey": "activity_create_closed_group_title" }, - "newClosedGroupDescription": { - "message": "Closed groups support up to 10 members and provide the same privacy protections as one-on-one sessions.", - "androidKey": "activity_create_closed_group_explanation" - }, "createClosedGroupNamePrompt": { "message": "Group Name", "androidKey": "GroupCreateActivity_group_name_hint", @@ -2178,7 +2174,7 @@ "androidKey": "activity_create_closed_group_not_enough_group_members_error" }, "closedGroupMaxSize": { - "message": "A closed group cannot have more than 10 members", + "message": "A closed group cannot have more than 20 members", "androidKey": "activity_create_closed_group_too_many_group_members_error" }, "noBlockedContacts": { diff --git a/_locales/es/messages.json b/_locales/es/messages.json index df84afe81..65a7f9e15 100644 --- a/_locales/es/messages.json +++ b/_locales/es/messages.json @@ -1378,9 +1378,6 @@ "newClosedGroup": { "message": "Nuevo grupo cerrado" }, - "newClosedGroupDescription": { - "message": "Los grupos cerrados admiten hasta 10 miembros y brindan las mismas protecciones de privacidad que las sesiones individuales." - }, "createClosedGroupNamePrompt": { "message": "Nombre Del Grupo" }, @@ -1409,6 +1406,6 @@ "message": "Por favor, elige al menos 2 miembros del grupo" }, "closedGroupMaxSize": { - "message": "Un grupo cerrado no puede tener más de 10 miembros" + "message": "Un grupo cerrado no puede tener más de 20 miembros" } } \ No newline at end of file diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index 9a3671a8f..6afa73eb3 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -1378,9 +1378,6 @@ "newClosedGroup": { "message": "Nouveau groupe privé" }, - "newClosedGroupDescription": { - "message": "Les groupes privés prennent en charge jusqu'à 10 membres et offrent le même niveau de confidentialité que les sessions individuelles." - }, "createClosedGroupNamePrompt": { "message": "Nom du groupe" }, @@ -1409,7 +1406,7 @@ "message": "Veuillez sélectionner au moins 2 membres" }, "closedGroupMaxSize": { - "message": "Un groupe privé ne peut pas avoir plus de 10 membres" + "message": "Un groupe privé ne peut pas avoir plus de 20 membres" }, "contextMenuNoSuggestions": { "message": "Pas de suggestions", diff --git a/_locales/id/messages.json b/_locales/id/messages.json index feb840cba..cc6f448be 100644 --- a/_locales/id/messages.json +++ b/_locales/id/messages.json @@ -1372,9 +1372,6 @@ "newClosedGroup": { "message": "Grup tertutup baru" }, - "newClosedGroupDescription": { - "message": "Grup tertutup maksimal berisi 10 anggota dan memiliki perlindungan privasi yang sama dengan Session antara dua pengguna" - }, "createClosedGroupNamePrompt": { "message": "Nama grup" }, @@ -1403,7 +1400,7 @@ "message": "Pilih setidaknya 2 anggota grup" }, "closedGroupMaxSize": { - "message": "Grup tertutup maksimal berisi 10 anggota" + "message": "Grup tertutup maksimal berisi 20 anggota" }, "noBlockedContacts": { "message": "Tidak ada kontak yang diblokir" diff --git a/_locales/it/messages.json b/_locales/it/messages.json index 8dcad0ac6..1f19d5d2c 100644 --- a/_locales/it/messages.json +++ b/_locales/it/messages.json @@ -1378,9 +1378,6 @@ "newClosedGroup": { "message": "Nuovo gruppo chiuso" }, - "newClosedGroupDescription": { - "message": "I gruppi chiusi supportano fino a 10 membri e forniscono le stesse protezioni per la privacy delle sessioni one-to-one." - }, "createClosedGroupNamePrompt": { "message": "Nome Del Gruppo" }, @@ -1409,6 +1406,6 @@ "message": "Scegli almeno 2 membri del gruppo" }, "closedGroupMaxSize": { - "message": "Un gruppo chiuso non può avere più di 10 membri" + "message": "Un gruppo chiuso non può avere più di 20 membri" } } \ No newline at end of file diff --git a/_locales/ja/messages.json b/_locales/ja/messages.json index c7b5def55..e5b9a9225 100644 --- a/_locales/ja/messages.json +++ b/_locales/ja/messages.json @@ -1378,9 +1378,6 @@ "newClosedGroup": { "message": "新しいクローズドグループ" }, - "newClosedGroupDescription": { - "message": "クローズドグループは最大 10 人のメンバーをサポートし、1 対 1 の Session と同じプライバシー保護を提供します。" - }, "createClosedGroupNamePrompt": { "message": "グループ名" }, @@ -1409,7 +1406,7 @@ "message": "グループメンバーを少なくとも 2 人選択してください" }, "closedGroupMaxSize": { - "message": "閉じたグループは 10 人を超えるメンバーを抱えることはできません" + "message": "閉じたグループは 20 人を超えるメンバーを抱えることはできません" }, "noBlockedContacts": { "message": "ブロックしている連絡先はありません" diff --git a/_locales/pl/messages.json b/_locales/pl/messages.json index e86d406f0..f48ccaa4b 100644 --- a/_locales/pl/messages.json +++ b/_locales/pl/messages.json @@ -1378,9 +1378,6 @@ "newClosedGroup": { "message": "Nowa grupa zamknięta" }, - "newClosedGroupDescription": { - "message": "Grupy zamknięte obsługują do 10 członków i zapewniają taką samą ochronę prywatności jak sesje jeden na jednego." - }, "createClosedGroupNamePrompt": { "message": "Nazwa grupy" }, @@ -1406,7 +1403,7 @@ "message": "Wprowadź krótszą nazwę grupy" }, "closedGroupMaxSize": { - "message": "Grupa zamknięta nie może mieć więcej niż 10 członków" + "message": "Grupa zamknięta nie może mieć więcej niż 20 członków" }, "noBlockedContacts": { "message": "Brak zablokowanych kontaktów" diff --git a/_locales/pt_BR/messages.json b/_locales/pt_BR/messages.json index e6e1df9b3..3b2d32270 100644 --- a/_locales/pt_BR/messages.json +++ b/_locales/pt_BR/messages.json @@ -1378,9 +1378,6 @@ "newClosedGroup": { "message": "Novo grupo fechado" }, - "newClosedGroupDescription": { - "message": "Grupos fechados suportam até 10 membros e fornecem as mesmas proteções de privacidade que as sessões individuais." - }, "createClosedGroupNamePrompt": { "message": "Nome Do Grupo" }, @@ -1409,6 +1406,6 @@ "message": "Escolha pelo menos 2 membros do grupo" }, "closedGroupMaxSize": { - "message": "Um grupo fechado não pode ter mais de 10 membros" + "message": "Um grupo fechado não pode ter mais de 20 membros" } } \ No newline at end of file diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index 64252ccd1..a319d95e0 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -1378,9 +1378,6 @@ "newClosedGroup": { "message": "Новая закрытая группа" }, - "newClosedGroupDescription": { - "message": "Закрытые группы поддерживают до 10 участников и обеспечивают те же меры защиты конфиденциальности, что и сессии один-на-один." - }, "createClosedGroupNamePrompt": { "message": "Название Группы" }, @@ -1409,7 +1406,7 @@ "message": "Пожалуйста, выберите как минимум 1 участников группы" }, "closedGroupMaxSize": { - "message": "В закрытой группе не может быть больше 10 участников" + "message": "В закрытой группе не может быть больше 20 участников" }, "contextMenuNoSuggestions": { "message": "No Suggestions", diff --git a/_locales/vi/messages.json b/_locales/vi/messages.json index 1a287b89f..dcd2c9cc2 100644 --- a/_locales/vi/messages.json +++ b/_locales/vi/messages.json @@ -1339,9 +1339,6 @@ "newClosedGroup": { "message": "Nhóm kín mới" }, - "newClosedGroupDescription": { - "message": "Nhóm kín hỗ trợ tối đa 10 thành viên và cung cấp dịch vụ bảo mật giống như các session một-một" - }, "createClosedGroupNamePrompt": { "message": "Tên nhóm" }, @@ -1367,6 +1364,6 @@ "message": "Vui lòng chọn ít nhất 2 thành viên trong nhóm" }, "closedGroupMaxSize": { - "message": "Một nhóm kín không thể có nhiều hơn 10 thành viên" + "message": "Một nhóm kín không thể có nhiều hơn 20 thành viên" } } \ No newline at end of file diff --git a/js/views/invite_contacts_dialog_view.js b/js/views/invite_contacts_dialog_view.js index c21c8924c..a79adc2dc 100644 --- a/js/views/invite_contacts_dialog_view.js +++ b/js/views/invite_contacts_dialog_view.js @@ -80,12 +80,9 @@ // Do not trigger an update if there is too many members if ( newMembers.length + existingMembers.length > - window.CONSTANTS.SMALL_GROUP_SIZE_LIMIT + window.CONSTANTS.MEDIUM_GROUP_SIZE_LIMIT ) { - const msg = window.i18n( - 'closedGroupMaxSize', - window.CONSTANTS.SMALL_GROUP_SIZE_LIMIT - ); + const msg = window.i18n('closedGroupMaxSize'); window.pushToast({ title: msg, diff --git a/preload.js b/preload.js index ff5848175..f0505ce76 100644 --- a/preload.js +++ b/preload.js @@ -86,7 +86,7 @@ window.CONSTANTS = new (function() { this.MAX_CONNECTION_DURATION = 5000; this.MAX_MESSAGE_BODY_LENGTH = 64 * 1024; // Limited due to the proof-of-work requirement - this.SMALL_GROUP_SIZE_LIMIT = 10; + this.MEDIUM_GROUP_SIZE_LIMIT = 20; // Number of seconds to turn on notifications after reconnect/start of app this.NOTIFICATION_ENABLE_TIMEOUT_SECONDS = 10; this.SESSION_ID_LENGTH = 66; diff --git a/ts/components/MainViewController.tsx b/ts/components/MainViewController.tsx index 048a61231..cdc0086e6 100644 --- a/ts/components/MainViewController.tsx +++ b/ts/components/MainViewController.tsx @@ -83,7 +83,7 @@ async function createClosedGroup( }); return; - } else if (groupMembers.length >= window.CONSTANTS.SMALL_GROUP_SIZE_LIMIT) { + } else if (groupMembers.length >= window.CONSTANTS.MEDIUM_GROUP_SIZE_LIMIT) { ToastUtils.push({ title: window.i18n('closedGroupMaxSize'), type: 'error', diff --git a/ts/components/conversation/CreateGroupDialog.tsx b/ts/components/conversation/CreateGroupDialog.tsx index 9ea4baa47..2ed654fe7 100644 --- a/ts/components/conversation/CreateGroupDialog.tsx +++ b/ts/components/conversation/CreateGroupDialog.tsx @@ -8,7 +8,7 @@ import { createLegacyGroup } from '../../session/medium_group'; declare global { interface Window { Lodash: any; - SMALL_GROUP_SIZE_LIMIT: number; + MEDIUM_GROUP_SIZE_LIMIT: number; } } @@ -200,11 +200,9 @@ export class CreateGroupDialog extends React.Component { if ( updatedContacts.filter(d => d.checkmarked).length > - window.CONSTANTS.SMALL_GROUP_SIZE_LIMIT - 1 + window.CONSTANTS.MEDIUM_GROUP_SIZE_LIMIT - 1 ) { - const msg = `${this.props.i18n('closedGroupMaxSize')} ${ - window.CONSTANTS.SMALL_GROUP_SIZE_LIMIT - }`; + const msg = this.props.i18n('closedGroupMaxSize'); this.onShowError(msg); return; diff --git a/ts/components/session/SessionClosableOverlay.tsx b/ts/components/session/SessionClosableOverlay.tsx index 342859376..3c1008f81 100644 --- a/ts/components/session/SessionClosableOverlay.tsx +++ b/ts/components/session/SessionClosableOverlay.tsx @@ -151,7 +151,6 @@ export class SessionClosableOverlay extends React.Component { case 'closed-group': title = window.i18n('newClosedGroup'); buttonText = window.i18n('done'); - descriptionLong = window.i18n('newClosedGroupDescription'); subtitle = window.i18n('createClosedGroupNamePrompt'); placeholder = window.i18n('createClosedGroupPlaceholder'); break; From caa972d390c829415743f4bd20cf8d66a8a5fb2c Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 25 Sep 2020 09:43:11 +1000 Subject: [PATCH 238/274] fix group member list for large count of member --- stylesheets/_session.scss | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index 79e868d7d..10cfb00ba 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -656,6 +656,10 @@ label { } } + .group-member-list__selection { + overflow-y: auto; + } + &__centered { display: flex; flex-direction: column; @@ -1423,15 +1427,8 @@ input { text-align: center; padding: 20px; } - - // Height at which scroll bar appears on the group member list - @media (max-height: 804px) { - &__container { - overflow-y: visible; - max-height: none; - } - } } + .create-group-name-input { display: flex; justify-content: center; From 53a14a0b60babb9b259e668d504b931ae46b9a7b Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 25 Sep 2020 10:53:21 +1000 Subject: [PATCH 239/274] add prefix to ExpirationTimerUpdateMessage for closed group too --- .../content/data/ExpirationTimerUpdateMessage.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ts/session/messages/outgoing/content/data/ExpirationTimerUpdateMessage.ts b/ts/session/messages/outgoing/content/data/ExpirationTimerUpdateMessage.ts index 2da6fc6b3..88eb245f4 100644 --- a/ts/session/messages/outgoing/content/data/ExpirationTimerUpdateMessage.ts +++ b/ts/session/messages/outgoing/content/data/ExpirationTimerUpdateMessage.ts @@ -37,9 +37,13 @@ export class ExpirationTimerUpdateMessage extends DataMessage { if (this.groupId) { const groupMessage = new SignalService.GroupContext(); - groupMessage.id = new Uint8Array( - StringUtils.encode(this.groupId.key, 'utf8') - ); + let groupIdWithPrefix: string = this.groupId.key; + if (!this.groupId.key.startsWith(PubKey.PREFIX_GROUP_TEXTSECURE)) { + groupIdWithPrefix = PubKey.PREFIX_GROUP_TEXTSECURE + this.groupId.key; + } + const encoded = StringUtils.encode(groupIdWithPrefix, 'utf8'); + const id = new Uint8Array(encoded); + groupMessage.id = id; groupMessage.type = SignalService.GroupContext.Type.DELIVER; data.group = groupMessage; From f3a2c5ca64303d8312256346c0fdcaff3e11d91f Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 25 Sep 2020 11:36:21 +1000 Subject: [PATCH 240/274] bump version to 1.4.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f40212456..4626af6d0 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "session-messenger-desktop", "productName": "Session", "description": "Private messaging from your desktop", - "version": "1.3.1", + "version": "1.4.0", "license": "GPL-3.0", "author": { "name": "Loki Project", From 82be1ca60fe0b87f0400c17228f7d5cf5111aca3 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 25 Sep 2020 13:44:34 +1000 Subject: [PATCH 241/274] allow medium group updates from non admin --- ts/receiver/mediumGroups.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ts/receiver/mediumGroups.ts b/ts/receiver/mediumGroups.ts index 021bdcb31..810e6340e 100644 --- a/ts/receiver/mediumGroups.ts +++ b/ts/receiver/mediumGroups.ts @@ -308,7 +308,7 @@ async function handleMediumGroupChange( } // // Check that the sender is admin (make sure it words with multidevice) - const isAdmin = curAdmins.includes(senderIdentity); + const isAdmin = true; if (!isAdmin) { log.warn('Rejected attempt to update a group by non-admin'); @@ -317,7 +317,7 @@ async function handleMediumGroupChange( } // NOTE: right now, we don't expect admins to change - const admins = adminsBinary.map(toHex); + // const admins = adminsBinary.map(toHex); const members = membersBinary.map(toHex); const diff = SenderKeyAPI.calculateGroupDiff(convo, { name, members }); From 4578c635a6f1fd79137797aef640992d294ee8fb Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 25 Sep 2020 14:13:32 +1000 Subject: [PATCH 242/274] render @ mention correctly with long title on ConversationListItem --- stylesheets/_mentions.scss | 5 ++--- ts/components/ConversationListItem.tsx | 30 +++++++++++--------------- 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/stylesheets/_mentions.scss b/stylesheets/_mentions.scss index 04e6d0377..34337564c 100644 --- a/stylesheets/_mentions.scss +++ b/stylesheets/_mentions.scss @@ -100,9 +100,8 @@ padding-inline-start: 3px; padding-inline-end: 3px; - position: absolute; - left: 50%; - margin-inline-start: 30px; + position: static; + margin-inline-start: 5px; top: 2px; font-weight: 300; diff --git a/ts/components/ConversationListItem.tsx b/ts/components/ConversationListItem.tsx index 3bcc26d29..0d2c62451 100644 --- a/ts/components/ConversationListItem.tsx +++ b/ts/components/ConversationListItem.tsx @@ -108,28 +108,21 @@ class ConversationListItem extends React.PureComponent { ); } - public renderUnread() { - const { unreadCount, mentionedUs } = this.props; + public renderHeader() { + const { unreadCount, mentionedUs, i18n, isMe, lastUpdated } = this.props; + const {} = this.props; + let atSymbol = null; + let unreadCountDiv = null; if (unreadCount > 0) { - const atSymbol = mentionedUs ?

@

: null; - - return ( -
-

- {unreadCount} -

- {atSymbol} -
+ atSymbol = mentionedUs ?

@

: null; + unreadCountDiv = ( +

+ {unreadCount} +

); } - return null; - } - - public renderHeader() { - const { unreadCount, i18n, isMe, lastUpdated } = this.props; - return (
{ > {this.renderUser()}
- {this.renderUnread()} + {unreadCountDiv} + {atSymbol} {
Date: Fri, 25 Sep 2020 14:29:32 +1000 Subject: [PATCH 243/274] themify the typing bubble --- js/views/conversation_view.js | 4 ++++ ts/components/conversation/TypingBubble.tsx | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index c2752c2bf..b89a90bf2 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -701,9 +701,13 @@ const { sender } = mostRecent; const contact = ConversationController.getOrCreate(sender, 'private'); + // we need the opposite theme + const color = + window.Events.getThemeSetting() === 'light' ? 'dark' : 'light'; const props = { ...contact.format(), conversationType: this.model.isPrivate() ? 'direct' : 'group', + color, }; if (this.typingBubbleView) { diff --git a/ts/components/conversation/TypingBubble.tsx b/ts/components/conversation/TypingBubble.tsx index 5a683ca2f..7b4756de3 100644 --- a/ts/components/conversation/TypingBubble.tsx +++ b/ts/components/conversation/TypingBubble.tsx @@ -58,7 +58,7 @@ export class TypingBubble extends React.Component { )} >
- +
{this.renderAvatar()}
From 1b6629d818c46f7c23fc990803ba61d5edd76560 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 28 Sep 2020 13:16:35 +1000 Subject: [PATCH 244/274] enable ssk for all ENV by default --- preload.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/preload.js b/preload.js index f0505ce76..86eca4ccc 100644 --- a/preload.js +++ b/preload.js @@ -451,7 +451,7 @@ window.lokiFeatureFlags = { useSnodeProxy: !process.env.USE_STUBBED_NETWORK, useOnionRequests: true, useFileOnionRequests: true, - enableSenderKeys: false, + enableSenderKeys: true, onionRequestHops: 3, debugMessageLogs: process.env.ENABLE_MESSAGE_LOGS, useMultiDevice: false, From d4e9b43f0c2f571ef38e18fd607097f3c61be30f Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 30 Sep 2020 10:13:47 +1000 Subject: [PATCH 245/274] remove QUIT type of mediumgroupupdate --- protos/SignalService.proto | 1 - ts/receiver/mediumGroups.ts | 2 -- ts/session/medium_group/index.ts | 1 - .../data/mediumgroup/MediumGroupQuitMessage.ts | 12 ------------ 4 files changed, 16 deletions(-) delete mode 100644 ts/session/messages/outgoing/content/data/mediumgroup/MediumGroupQuitMessage.ts diff --git a/protos/SignalService.proto b/protos/SignalService.proto index f7b76be2f..8a40c1576 100644 --- a/protos/SignalService.proto +++ b/protos/SignalService.proto @@ -57,7 +57,6 @@ message MediumGroupUpdate { INFO = 1; // groupPublicKey, name, senderKeys, members, admins SENDER_KEY = 2; // groupPublicKey, senderKeys SENDER_KEY_REQUEST = 3; // groupPublicKey - QUIT = 4; // groupPublicKey } message SenderKey { diff --git a/ts/receiver/mediumGroups.ts b/ts/receiver/mediumGroups.ts index 810e6340e..9620e11d6 100644 --- a/ts/receiver/mediumGroups.ts +++ b/ts/receiver/mediumGroups.ts @@ -427,8 +427,6 @@ export async function handleMediumGroupUpdate( await handleNewGroup(envelope, groupUpdate); } else if (type === Type.INFO) { await handleMediumGroupChange(envelope, groupUpdate); - } else if (type === Type.QUIT) { - await handleQuit(envelope, groupUpdate); } else { window.log.error('Unknown group update type: ', type); } diff --git a/ts/session/medium_group/index.ts b/ts/session/medium_group/index.ts index 1ce3d5197..fac27a0a7 100644 --- a/ts/session/medium_group/index.ts +++ b/ts/session/medium_group/index.ts @@ -13,7 +13,6 @@ import { getChainKey } from './ratchet'; import { MultiDeviceProtocol } from '../protocols'; import { BufferType } from '../utils/String'; import { UserUtil } from '../../util'; -import { MediumGroupQuitMessage } from '../messages/outgoing/content/data/mediumgroup/MediumGroupQuitMessage'; import { ClosedGroupChatMessage, ClosedGroupMessage, diff --git a/ts/session/messages/outgoing/content/data/mediumgroup/MediumGroupQuitMessage.ts b/ts/session/messages/outgoing/content/data/mediumgroup/MediumGroupQuitMessage.ts deleted file mode 100644 index 42d6e9f9b..000000000 --- a/ts/session/messages/outgoing/content/data/mediumgroup/MediumGroupQuitMessage.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { SignalService } from '../../../../../../protobuf'; -import { MediumGroupMessage } from '.'; - -export class MediumGroupQuitMessage extends MediumGroupMessage { - protected mediumGroupContext(): SignalService.MediumGroupUpdate { - const mediumGroupContext = super.mediumGroupContext(); - - mediumGroupContext.type = SignalService.MediumGroupUpdate.Type.QUIT; - - return mediumGroupContext; - } -} From 22afe50c05a958851ddd09154378c9eba22b1806 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 30 Sep 2020 10:22:36 +1000 Subject: [PATCH 246/274] make messageQueue handle medium group message in sendToGroup --- js/models/conversations.js | 2 +- ts/receiver/mediumGroups.ts | 2 +- ts/session/sending/MessageQueue.ts | 10 +++++++++- ts/session/sending/MessageQueueInterface.ts | 3 ++- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/js/models/conversations.js b/js/models/conversations.js index b2ec3bf66..be3b0aa6b 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -1403,7 +1403,7 @@ await libsession .getMessageQueue() - .send(destinationPubkey, mediumGroupChatMessage); + .sendToGroup(mediumGroupChatMessage); } else { const closedGroupChatMessage = new libsession.Messages.Outgoing.ClosedGroupChatMessage( { diff --git a/ts/receiver/mediumGroups.ts b/ts/receiver/mediumGroups.ts index 9620e11d6..4dece5006 100644 --- a/ts/receiver/mediumGroups.ts +++ b/ts/receiver/mediumGroups.ts @@ -307,7 +307,7 @@ async function handleMediumGroupChange( return; } - // // Check that the sender is admin (make sure it words with multidevice) + // Check that the sender is admin (make sure it words with multidevice) const isAdmin = true; if (!isAdmin) { diff --git a/ts/session/sending/MessageQueue.ts b/ts/session/sending/MessageQueue.ts index b5e86e41d..4cddd8e73 100644 --- a/ts/session/sending/MessageQueue.ts +++ b/ts/session/sending/MessageQueue.ts @@ -7,6 +7,7 @@ import { ClosedGroupMessage, ContentMessage, ExpirationTimerUpdateMessage, + MediumGroupMessage, OpenGroupMessage, SessionRequestMessage, SyncMessage, @@ -51,7 +52,7 @@ export class MessageQueue implements MessageQueueInterface { } public async sendToGroup( - message: OpenGroupMessage | ContentMessage + message: OpenGroupMessage | ContentMessage | MediumGroupMessage ): Promise { // Open groups if (message instanceof OpenGroupMessage) { @@ -93,11 +94,18 @@ export class MessageQueue implements MessageQueueInterface { groupId = message.groupId; } else if (message instanceof ExpirationTimerUpdateMessage) { groupId = message.groupId; + } else if (message instanceof MediumGroupMessage) { + groupId = message.groupId; } if (!groupId) { throw new Error('Invalid group message passed in sendToGroup.'); } + // if this is a medium group message. We just need to send to the group pubkey + if (message instanceof MediumGroupMessage) { + window.log.warn('sending medium ', message, ' to ', groupId) + return this.send(PubKey.cast(groupId), message); + } // Get devices in group let recipients = await GroupUtils.getGroupMembers(groupId); diff --git a/ts/session/sending/MessageQueueInterface.ts b/ts/session/sending/MessageQueueInterface.ts index c30592741..af44e6e7f 100644 --- a/ts/session/sending/MessageQueueInterface.ts +++ b/ts/session/sending/MessageQueueInterface.ts @@ -1,6 +1,7 @@ import { ClosedGroupMessage, ContentMessage, + MediumGroupMessage, OpenGroupMessage, SyncMessage, } from '../messages/outgoing'; @@ -8,7 +9,7 @@ import { RawMessage } from '../types/RawMessage'; import { TypedEventEmitter } from '../utils'; import { PubKey } from '../types'; -type GroupMessageType = OpenGroupMessage | ClosedGroupMessage; +type GroupMessageType = OpenGroupMessage | ClosedGroupMessage | MediumGroupMessage; export interface MessageQueueInterfaceEvents { success: ( From 06d0683ce5be5285a4e8021861d4a153231bf095 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 30 Sep 2020 10:23:27 +1000 Subject: [PATCH 247/274] WIP --- ts/receiver/mediumGroups.ts | 2 +- ts/session/medium_group/index.ts | 77 +++++++++++++++++++++++--------- 2 files changed, 58 insertions(+), 21 deletions(-) diff --git a/ts/receiver/mediumGroups.ts b/ts/receiver/mediumGroups.ts index 4dece5006..c3312c1df 100644 --- a/ts/receiver/mediumGroups.ts +++ b/ts/receiver/mediumGroups.ts @@ -67,7 +67,7 @@ async function handleSenderKeyRequest( await removeFromCache(envelope); } -async function shareSenderKeys( +export async function shareSenderKeys( groupId: string, recipientsPrimary: Array, senderKey: RatchetState diff --git a/ts/session/medium_group/index.ts b/ts/session/medium_group/index.ts index fac27a0a7..aeb72d767 100644 --- a/ts/session/medium_group/index.ts +++ b/ts/session/medium_group/index.ts @@ -28,6 +28,7 @@ import { ConversationModel } from '../../../js/models/conversations'; import { MediumGroupUpdateMessage } from '../messages/outgoing/content/data/mediumgroup/MediumGroupUpdateMessage'; import uuid from 'uuid'; import { BlockedNumberController } from '../../util/blockedNumberController'; +import { shareSenderKeys } from '../../receiver/mediumGroups'; export { createSenderKeyForGroup, @@ -184,6 +185,7 @@ export async function leaveMediumGroup(groupId: string) { // TODO: need to reset everyone's sender keys window.SwarmPolling.removePubkey(groupId); + // TODO audric: we just left a group, we have to regenerate our senderkey const maybeConvo = await ConversationController.get(groupId); @@ -207,15 +209,23 @@ export async function leaveMediumGroup(groupId: string) { received_at: now, }); - const updateParams = { - timestamp: Date.now(), - identifier: dbMessage.id, - groupId, + // do not include senderkey as everyone needs to generate new one + const groupUpdate: GroupInfo = { + id: convo.get('id'), + name: convo.get('name'), + members: convo.get('members'), + is_medium_group: true, + admins: convo.get('groupAdmins'), + senderKeysContainer: undefined, }; - const message = new MediumGroupQuitMessage(updateParams); + const ourPrimary = await UserUtil.getPrimary(); - await sendToMembers(groupId, message, dbMessage); + await sendGroupUpdateForMedium( + { leavingMembers: [ourPrimary.key] }, + groupUpdate, + dbMessage.id + ); } // Just a container to store two named list of keys @@ -602,13 +612,16 @@ async function sendGroupUpdateForExistingMembers( messageId?: string ) { const { id: groupId, members, name: groupName } = groupUpdate; + const ourPrimary = await UserUtil.getPrimary(); + + const wasAnyUserRemoved = leavingMembers.length > 0; + const isUserLeaving = leavingMembers.includes(ourPrimary.key); const membersBin = members.map( (pkHex: string) => new Uint8Array(fromHex(pkHex)) ); const admins = groupUpdate.admins || []; - const adminsBin = admins.map( (pkHex: string) => new Uint8Array(fromHex(pkHex)) ); @@ -625,23 +638,47 @@ async function sendGroupUpdateForExistingMembers( members: membersBin, groupName, admins: adminsBin, - senderKeys, + senderKeys: senderKeys, }; - const message = new MediumGroupUpdateMessage(params); + if (wasAnyUserRemoved) { + if (isUserLeaving && leavingMembers.length !== 1) { + window.log.warn("Can't remove self and others simultaneously."); + return; + } + // Send the update to the group (don't include new ratchets as everyone should regenerate new ratchets individually) + const paramsWithoutSenderKeys = { + ...params, + senderKeys: [], + }; - remainingMembers.forEach(async member => { - const memberPubKey = new PubKey(member); - await getMessageQueue().sendUsingMultiDevice(memberPubKey, message); - }); + const messageStripped = new MediumGroupUpdateMessage(paramsWithoutSenderKeys); + window.log.warn('Sending to groupUpdateMessage without senderKeys'); + await getMessageQueue().sendToGroup(messageStripped); + + // TODO Delete all ratchets (it's important that this happens * after * sending out the update) + if (isUserLeaving) { + // nothing to do on desktop + } else { + // Send out the user's new ratchet to all members (minus the removed ones) using established channels + const ourPrimaryKey = new Uint8Array(fromHex(ourPrimary.key)) + const ourNewSenderKey = senderKeys.find(s => _.isEqual(s.pubKey, ourPrimaryKey)); + + if (! ourNewSenderKey) { + window.console.warn('We need to share our senderkey with remaining member but our senderKeys was not given.'); + } else { + window.log.warn('Sharing our new senderKey with remainingMembers via message', remainingMembers, ourNewSenderKey); + await shareSenderKeys(groupId, remainingMembers, ourNewSenderKey); + } + + } + } else { + const message = new MediumGroupUpdateMessage(params); + window.log.warn('Sending to groupUpdateMessage with senderKeys to groupAddress', senderKeys); + + await getMessageQueue().sendToGroup(message); + } - // Remove sender keys from the params to send to leaving memebers - params.senderKeys = []; - const strippedMessage = new MediumGroupUpdateMessage(params); - leavingMembers.forEach(async member => { - const memberPubKey = new PubKey(member); - await getMessageQueue().sendUsingMultiDevice(memberPubKey, strippedMessage); - }); } async function sendGroupUpdateForJoiningMembers( From ab8592a7ded5a20380fd05761340951c7094a423 Mon Sep 17 00:00:00 2001 From: D4708 <49516206+D4708@users.noreply.github.com> Date: Wed, 30 Sep 2020 19:30:50 +0300 Subject: [PATCH 248/274] Update messages.json --- _locales/uk/messages.json | 66 +++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/_locales/uk/messages.json b/_locales/uk/messages.json index 132aff657..f66bda30f 100644 --- a/_locales/uk/messages.json +++ b/_locales/uk/messages.json @@ -1,10 +1,10 @@ { "copyErrorAndQuit": { - "message": "Copy error and quit", + "message": "Скопіювати помилку та вийти", "description": "Shown in the top-level error popup, allowing user to copy the error text and close the app" }, "databaseError": { - "message": "Database Error", + "message": "Помилка бази даних", "description": "Shown in a popup if the database cannot start up properly" }, "mainMenuFile": { @@ -32,35 +32,35 @@ "description": "Application menu command to hide the window" }, "appMenuHideOthers": { - "message": "Hide Others", + "message": "Сховати інші", "description": "Application menu command to hide all other windows" }, "appMenuUnhide": { - "message": "Show All", + "message": "Показати всі", "description": "Application menu command to show all application windows" }, "appMenuQuit": { - "message": "Quit Session", + "message": "Завершити сесію", "description": "Application menu command to close the application" }, "editMenuUndo": { - "message": "Undo", + "message": "Назад", "description": "Edit menu command to remove recently-typed text" }, "editMenuRedo": { - "message": "Redo", + "message": "Вперед", "description": "Edit menu command to restore previously undone typed text" }, "editMenuCut": { - "message": "Cut", + "message": "Вирізати", "description": "Edit menu command to remove selected text and add it to clipboard" }, "editMenuCopy": { - "message": "Copy", + "message": "Копіювати", "description": "Edit menu command to add selected text to clipboard" }, "editMenuPaste": { - "message": "Paste", + "message": "Вставити", "description": "Edit menu command to insert text from clipboard at cursor location" }, "editMenuPasteAndMatchStyle": { @@ -72,27 +72,27 @@ "description": "Edit menu command to remove the selected text" }, "editMenuSelectAll": { - "message": "Select All", + "message": "Вибрати все", "description": "Edit menu comand to select all of the text in selected text box" }, "editMenuStartSpeaking": { - "message": "Start speaking", + "message": "Почати розмову", "description": "Edit menu item under 'speech' to start dictation" }, "editMenuStopSpeaking": { - "message": "Stop speaking", + "message": "Закінчити розмову", "description": "Edit menu item under 'speech' to stop dictation" }, "windowMenuClose": { - "message": "Close Window", + "message": "Закрити вікно", "description": "Window menu command to close the current window" }, "windowMenuMinimize": { - "message": "Minimize", + "message": "Згорнути в трей", "description": "Window menu command to minimize the current window" }, "windowMenuZoom": { - "message": "Zoom", + "message": "Збільшити", "description": "Window menu command to make the current window the size of the whole screen" }, "windowMenuBringAllToFront": { @@ -100,23 +100,23 @@ "description": "Window menu command to bring all windows of current applicatinon to front" }, "viewMenuResetZoom": { - "message": "Actual Size", + "message": "Актуальний розмір", "description": "View menu command to go back to the default zoom" }, "viewMenuZoomIn": { - "message": "Zoom In", + "message": "Збільшити", "description": "View menu command to make everything bigger" }, "viewMenuZoomOut": { - "message": "Zoom Out", + "message": "Зменшити", "description": "View menu command to make everything smaller" }, "viewMenuToggleFullScreen": { - "message": "Toggle Full Screen", + "message": "Відкрити на повний екран", "description": "View menu command to enter or leave Full Screen mode" }, "viewMenuToggleDevTools": { - "message": "Toggle Developer Tools", + "message": "Відкрити засоби розробника", "description": "View menu command to show or hide the developer tools" }, "menuSetupWithImport": { @@ -132,7 +132,7 @@ "description": "Message shown on the loading screen before we've loaded any messages" }, "optimizingApplication": { - "message": "Optimizing application...", + "message": "Оптимізація програми...", "description": "Message shown on the loading screen while we are doing application optimizations" }, "migratingToSQLCipher": { @@ -146,11 +146,11 @@ } }, "chooseDirectory": { - "message": "Choose folder", + "message": "Обрати теку", "description": "Button to allow the user to find a folder on disk" }, "loadDataHeader": { - "message": "Load your data", + "message": "Завантаження даних", "description": "Header shown on the first screen in the data import process" }, "loadDataDescription": { @@ -162,11 +162,11 @@ "description": "Title of the popup window used to select data previously exported" }, "importErrorHeader": { - "message": "Something went wrong!", + "message": "Щось пішло не так!", "description": "Header of the error screen after a failed import" }, "importingHeader": { - "message": "Loading contacts and messages", + "message": "Завантаження контактів та повідомлень", "description": "Header of screen shown as data is import" }, "importErrorFirst": { @@ -1084,7 +1084,7 @@ "description": "Name for the conversation with your own phone number" }, "startConversation": { - "message": "Start new conversation…", + "message": "Почати нову розмову…", "description": "Label underneath number a user enters that is not an existing contact" }, "invalidNumberError": { @@ -1112,7 +1112,7 @@ "description": "" }, "leftTheGroup": { - "message": "$name$ left the group", + "message": "$name$ покинув групу", "description": "Shown in the conversation history when a single person leaves the group", "placeholders": { "name": { @@ -1122,7 +1122,7 @@ } }, "multipleLeftTheGroup": { - "message": "$name$ left the group", + "message": "$name$ покинули групу", "description": "Shown in the conversation history when multiple people leave the group", "placeholders": { "name": { @@ -1132,7 +1132,7 @@ } }, "updatedTheGroup": { - "message": "Group updated", + "message": "Групу оновлено", "description": "Shown in the conversation history when someone updates the group" }, "titleIsNow": { @@ -1146,7 +1146,7 @@ } }, "joinedTheGroup": { - "message": "$name$ joined the group", + "message": "$name$ приєднався до групи", "description": "Shown in the conversation history when a single person joins the group", "placeholders": { "name": { @@ -1156,7 +1156,7 @@ } }, "multipleJoinedTheGroup": { - "message": "$names$ joined the group", + "message": "$names$ приєдналися до групи", "description": "Shown in the conversation history when more than one person joins the group", "placeholders": { "names": { @@ -1165,4 +1165,4 @@ } } } -} \ No newline at end of file +} From d08fc268d3b6855ee6503197a8020b6cf42244f2 Mon Sep 17 00:00:00 2001 From: D4708 <49516206+D4708@users.noreply.github.com> Date: Wed, 30 Sep 2020 19:31:48 +0300 Subject: [PATCH 249/274] Update messages.json --- _locales/uk/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_locales/uk/messages.json b/_locales/uk/messages.json index f66bda30f..c55c35da6 100644 --- a/_locales/uk/messages.json +++ b/_locales/uk/messages.json @@ -20,7 +20,7 @@ "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": "В&ікно", + "message": "&Вікно", "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": { From 82bc050ddd2b0da5c0a61a2eb41f674631f85415 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 1 Oct 2020 09:58:10 +1000 Subject: [PATCH 250/274] always create a closed group the type set in the feature flag speaking about enableSenderKeys --- ts/components/session/LeftPaneMessageSection.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ts/components/session/LeftPaneMessageSection.tsx b/ts/components/session/LeftPaneMessageSection.tsx index 08e93a46a..08fd9a2ef 100644 --- a/ts/components/session/LeftPaneMessageSection.tsx +++ b/ts/components/session/LeftPaneMessageSection.tsx @@ -306,9 +306,8 @@ export class LeftPaneMessageSection extends React.Component { }} onButtonClick={async ( groupName: string, - groupMembers: Array, - senderKeys: boolean - ) => this.onCreateClosedGroup(groupName, groupMembers, senderKeys)} + groupMembers: Array + ) => this.onCreateClosedGroup(groupName, groupMembers, window.lokiFeatureFlags.enableSenderKeys)} searchTerm={searchTerm} updateSearch={this.updateSearchBound} showSpinner={loading} From 9dbf1900832a33d425b1582b6a3da3d8b2723bb4 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 1 Oct 2020 14:58:17 +1000 Subject: [PATCH 251/274] fix mismatches protobuf for senderkey type on mediun groups with android --- protos/SignalService.proto | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/protos/SignalService.proto b/protos/SignalService.proto index 8a40c1576..741d5ab8f 100644 --- a/protos/SignalService.proto +++ b/protos/SignalService.proto @@ -55,8 +55,8 @@ message MediumGroupUpdate { enum Type { NEW = 0; // groupPublicKey, name, senderKeys, members, admins, groupPrivateKey INFO = 1; // groupPublicKey, name, senderKeys, members, admins - SENDER_KEY = 2; // groupPublicKey, senderKeys - SENDER_KEY_REQUEST = 3; // groupPublicKey + SENDER_KEY_REQUEST = 2; // groupPublicKey + SENDER_KEY = 3; // groupPublicKey, senderKeys } message SenderKey { From baaca1a29fac3795802eed726bf2af5d034cae8b Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 1 Oct 2020 15:05:25 +1000 Subject: [PATCH 252/274] switch medium or closed group deeper in code --- ts/components/MainViewController.tsx | 3 +-- ts/components/session/LeftPaneMessageSection.tsx | 11 +++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/ts/components/MainViewController.tsx b/ts/components/MainViewController.tsx index cdc0086e6..20dd05901 100644 --- a/ts/components/MainViewController.tsx +++ b/ts/components/MainViewController.tsx @@ -50,7 +50,6 @@ export class MessageView extends React.Component { async function createClosedGroup( groupName: string, groupMembers: Array, - senderKeys: boolean, onSuccess: any ) { // Validate groupName and groupMembers length @@ -95,7 +94,7 @@ async function createClosedGroup( const groupMemberIds = groupMembers.map(m => m.id); - if (senderKeys) { + if (window.lokiFeatureFlags.enableSenderKeys) { await createMediumGroup(groupName, groupMemberIds); } else { await createLegacyGroup(groupName, groupMemberIds); diff --git a/ts/components/session/LeftPaneMessageSection.tsx b/ts/components/session/LeftPaneMessageSection.tsx index 08fd9a2ef..2e3d525e2 100644 --- a/ts/components/session/LeftPaneMessageSection.tsx +++ b/ts/components/session/LeftPaneMessageSection.tsx @@ -307,7 +307,12 @@ export class LeftPaneMessageSection extends React.Component { onButtonClick={async ( groupName: string, groupMembers: Array - ) => this.onCreateClosedGroup(groupName, groupMembers, window.lokiFeatureFlags.enableSenderKeys)} + ) => + this.onCreateClosedGroup( + groupName, + groupMembers + ) + } searchTerm={searchTerm} updateSearch={this.updateSearchBound} showSpinner={loading} @@ -490,13 +495,11 @@ export class LeftPaneMessageSection extends React.Component { private async onCreateClosedGroup( groupName: string, - groupMembers: Array, - senderKeys: boolean + groupMembers: Array ) { await MainViewController.createClosedGroup( groupName, groupMembers, - senderKeys, () => { this.handleToggleOverlay(undefined); } From a80f9a5965e63c6afd5eefed17fc6bae08edaed7 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 1 Oct 2020 15:12:51 +1000 Subject: [PATCH 253/274] fix medium group to match mobile way --- ts/receiver/contentMessage.ts | 42 ++-- ts/receiver/dataMessage.ts | 5 +- ts/receiver/mediumGroups.ts | 10 +- ts/session/medium_group/index.ts | 255 +++++++++----------- ts/session/medium_group/ratchet.ts | 15 +- ts/session/sending/MessageQueue.ts | 7 +- ts/session/sending/MessageQueueInterface.ts | 5 +- ts/session/sending/MessageSender.ts | 1 + ts/session/utils/Messages.ts | 6 +- 9 files changed, 164 insertions(+), 182 deletions(-) diff --git a/ts/receiver/contentMessage.ts b/ts/receiver/contentMessage.ts index 7ed9eca8e..b32505438 100644 --- a/ts/receiver/contentMessage.ts +++ b/ts/receiver/contentMessage.ts @@ -19,6 +19,7 @@ import { BlockedNumberController } from '../util/blockedNumberController'; import { decryptWithSenderKey } from '../session/medium_group/ratchet'; import { StringUtils } from '../session/utils'; import { UserUtil } from '../util'; +import { getMessageQueue } from '../session'; export async function handleContentMessage(envelope: EnvelopePlus) { try { @@ -89,8 +90,7 @@ async function decryptForMediumGroup( groupId, sourceAsStr ); - - return unpad(plaintext); + return plaintext ? unpad(plaintext) : null; } function unpad(paddedData: ArrayBuffer): ArrayBuffer { @@ -288,28 +288,32 @@ async function decrypt( return plaintext; } catch (error) { - if (error && error instanceof textsecure.SenderKeyMissing) { + if ( + error && + (error instanceof textsecure.SenderKeyMissing || + error instanceof DOMException) + ) { const groupId = envelope.source; const { senderIdentity } = error; + if (senderIdentity) { + log.info( + 'Requesting missing key for identity: ', + senderIdentity, + 'groupId: ', + groupId + ); - log.info( - 'Requesting missing key for identity: ', - senderIdentity, - 'groupId: ', - groupId - ); + const params = { + timestamp: Date.now(), + groupId, + }; - const params = { - timestamp: Date.now(), - groupId, - }; + const requestKeysMessage = new MediumGroupRequestKeysMessage(params); + const sender = new PubKey(senderIdentity); + void getMessageQueue().send(sender, requestKeysMessage); - const requestKeysMessage = new MediumGroupRequestKeysMessage(params); - const sender = new PubKey(senderIdentity); - // tslint:disable-next-line no-floating-promises - libsession.getMessageQueue().send(sender, requestKeysMessage); - - return; + return; + } } let errorToThrow = error; diff --git a/ts/receiver/dataMessage.ts b/ts/receiver/dataMessage.ts index ea8049a71..31f3f7cbf 100644 --- a/ts/receiver/dataMessage.ts +++ b/ts/receiver/dataMessage.ts @@ -279,7 +279,10 @@ export async function handleDataMessage( envelope: EnvelopePlus, dataMessage: SignalService.IDataMessage ): Promise { - window.log.info('data message from', getEnvelopeId(envelope)); + window.log.info( + 'data message from', + getEnvelopeId(envelope) + ); if (dataMessage.mediumGroupUpdate) { await handleMediumGroupUpdate(envelope, dataMessage.mediumGroupUpdate); diff --git a/ts/receiver/mediumGroups.ts b/ts/receiver/mediumGroups.ts index c3312c1df..74eaaebc3 100644 --- a/ts/receiver/mediumGroups.ts +++ b/ts/receiver/mediumGroups.ts @@ -243,10 +243,10 @@ function sanityCheckMediumGroupUpdate( const joining = diff.joiningMembers || []; const leaving = diff.leavingMembers || []; - // 1. When there are no member changes, we don't expect any sender keys + // 1. When there are no member changes, we expect all sender keys if (!joining.length && !leaving.length) { - if (groupUpdate.senderKeys.length) { - window.log.error('Unexpected sender keys in group update'); + if (groupUpdate.senderKeys.length !== groupUpdate.members.length) { + window.log.error('Incorrect number of sender keys in group update'); } } @@ -270,13 +270,10 @@ async function handleMediumGroupChange( envelope: EnvelopePlus, groupUpdate: SignalService.MediumGroupUpdate ) { - const senderIdentity = envelope.source; - const { name, groupPublicKey, members: membersBinary, - admins: adminsBinary, senderKeys, } = groupUpdate; const { log } = window; @@ -342,6 +339,7 @@ async function handleMediumGroupChange( convo.set('isKickedFromGroup', true); // Disable typing: convo.updateTextInputState(); + window.SwarmPolling.removePubkey(groupId); } await convo.commit(); diff --git a/ts/session/medium_group/index.ts b/ts/session/medium_group/index.ts index aeb72d767..51324250f 100644 --- a/ts/session/medium_group/index.ts +++ b/ts/session/medium_group/index.ts @@ -208,19 +208,18 @@ export async function leaveMediumGroup(groupId: string) { sent_at: now, received_at: now, }); + const ourPrimary = await UserUtil.getPrimary(); + const members = convo.get('members').filter(m => m !== ourPrimary.key); // do not include senderkey as everyone needs to generate new one const groupUpdate: GroupInfo = { id: convo.get('id'), name: convo.get('name'), - members: convo.get('members'), + members, is_medium_group: true, admins: convo.get('groupAdmins'), - senderKeysContainer: undefined, }; - const ourPrimary = await UserUtil.getPrimary(); - await sendGroupUpdateForMedium( { leavingMembers: [ourPrimary.key] }, groupUpdate, @@ -260,24 +259,23 @@ async function getExistingSenderKeysForGroup( return maybeKeys.filter(d => d !== null).map(d => d as RatchetState); } -// Create all sender keys based on the changes in -// the group's composition -async function getOrCreateSenderKeysForUpdate( +// Get a list of senderKeys we have to send to joining members +// Basically this is the senderkey of all members who joined concatenated with +// the one of members currently in the group. + +// Also, the list of senderkeys for existing member must be empty if there is any leaving members, +// as they each member need to regenerate a new senderkey +async function getOrUpdateSenderKeysForJoiningMembers( groupId: string, members: Array, - changes: MemberChanges -): Promise { - // 1. Create sender keys for every joining member - const joining = changes.joiningMembers || []; - const leaving = changes.leavingMembers || []; + diff?: GroupDiff, + joiningMembersSenderKeys?: Array +): Promise> { + const leavingMembers = diff?.leavingMembers || []; + const joiningMembers = diff?.joiningMembers || []; - let newKeys = await createSenderKeysForMembers(groupId, joining); - - // 2. Get ratchet states for existing members - - const existingMembers = _.difference(members, joining); + const existingMembers = _.difference(members, joiningMembers); // get all devices for members - const allDevices = _.flatten( await Promise.all( existingMembers.map(m => MultiDeviceProtocol.getAllDevices(m)) @@ -285,23 +283,10 @@ async function getOrCreateSenderKeysForUpdate( ); let existingKeys: Array = []; - - if (leaving.length > 0) { - // If we have leaving members, we have to re-generate ratchet - // keys for existing members - const otherKeys = await Promise.all( - allDevices.map(async device => { - return createSenderKeyForGroup(groupId, PubKey.cast(device)); - }) - ); - - newKeys = _.union(newKeys, otherKeys); - } else { - // We can reuse existing keys + if (leavingMembers.length === 0) { existingKeys = await getExistingSenderKeysForGroup(groupId, allDevices); } - - return { existingKeys, newKeys }; + return _.union(joiningMembersSenderKeys, existingKeys); } async function getGroupSecretKey(groupId: string): Promise { @@ -322,6 +307,9 @@ async function getGroupSecretKey(groupId: string): Promise { } async function syncMediumGroup(group: ConversationModel) { + throw new Error( + 'Medium group syncing must be done once multi device is enabled back' + ); const ourPrimary = await UserUtil.getPrimary(); const groupId = group.get('id'); @@ -352,7 +340,6 @@ async function syncMediumGroup(group: ConversationModel) { members: group.get('members'), is_medium_group: true, admins: group.get('groupAdmins'), - senderKeysContainer, secretKey, }; @@ -418,12 +405,7 @@ export async function initiateGroupUpdate( }; if (isMediumGroup) { - // Send sender keys and group secret key - updateObj.senderKeysContainer = await getOrCreateSenderKeysForUpdate( - groupId, - members, - diff - ); + // Send group secret key const secretKey = await getGroupSecretKey(groupId); updateObj.secretKey = secretKey; @@ -531,7 +513,6 @@ interface GroupInfo { blocked?: boolean; admins?: Array; secretKey?: Uint8Array; - senderKeysContainer?: SenderKeysContainer; } interface UpdatableGroupState { @@ -605,15 +586,16 @@ export function calculateGroupDiff( return groupDiff; } -async function sendGroupUpdateForExistingMembers( - leavingMembers: Array, - remainingMembers: Array, +async function sendGroupUpdateForMedium( + diff: MemberChanges, groupUpdate: GroupInfo, messageId?: string ) { const { id: groupId, members, name: groupName } = groupUpdate; const ourPrimary = await UserUtil.getPrimary(); + const leavingMembers = diff.leavingMembers || []; + const joiningMembers = diff.joiningMembers || []; const wasAnyUserRemoved = leavingMembers.length > 0; const isUserLeaving = leavingMembers.includes(ourPrimary.key); @@ -626,10 +608,7 @@ async function sendGroupUpdateForExistingMembers( (pkHex: string) => new Uint8Array(fromHex(pkHex)) ); - // Existing members only receive new sender keys - const senderKeys = groupUpdate.senderKeysContainer - ? groupUpdate.senderKeysContainer.newKeys - : []; + const remainingMembers = _.difference(groupUpdate.members, joiningMembers); const params = { timestamp: Date.now(), @@ -638,7 +617,6 @@ async function sendGroupUpdateForExistingMembers( members: membersBin, groupName, admins: adminsBin, - senderKeys: senderKeys, }; if (wasAnyUserRemoved) { @@ -652,116 +630,101 @@ async function sendGroupUpdateForExistingMembers( senderKeys: [], }; - const messageStripped = new MediumGroupUpdateMessage(paramsWithoutSenderKeys); + const messageStripped = new MediumGroupUpdateMessage( + paramsWithoutSenderKeys + ); window.log.warn('Sending to groupUpdateMessage without senderKeys'); await getMessageQueue().sendToGroup(messageStripped); - // TODO Delete all ratchets (it's important that this happens * after * sending out the update) - if (isUserLeaving) { - // nothing to do on desktop - } else { - // Send out the user's new ratchet to all members (minus the removed ones) using established channels - const ourPrimaryKey = new Uint8Array(fromHex(ourPrimary.key)) - const ourNewSenderKey = senderKeys.find(s => _.isEqual(s.pubKey, ourPrimaryKey)); + getMessageQueue().events.addListener('success', async message => { + if (message.identifier === params.identifier) { + // console.log('Our first message encrypted with old sk is sent.'); + // TODO Delete all ratchets (it's important that this happens * after * sending out the update) + if (isUserLeaving) { + // nothing to do on desktop + } else { + // Send out the user's new ratchet to all members (minus the removed ones) using established channels + const userSenderKey = await createSenderKeyForGroup( + groupId, + ourPrimary + ); + window.log.warn( + 'Sharing our new senderKey with remainingMembers via message', + remainingMembers, + userSenderKey + ); - if (! ourNewSenderKey) { - window.console.warn('We need to share our senderkey with remaining member but our senderKeys was not given.'); - } else { - window.log.warn('Sharing our new senderKey with remainingMembers via message', remainingMembers, ourNewSenderKey); - await shareSenderKeys(groupId, remainingMembers, ourNewSenderKey); + await shareSenderKeys(groupId, remainingMembers, userSenderKey); + } } - - } + }); } else { - const message = new MediumGroupUpdateMessage(params); - window.log.warn('Sending to groupUpdateMessage with senderKeys to groupAddress', senderKeys); + let senderKeys: Array; + if (joiningMembers.length > 0) { + // Generate ratchets for any new members + senderKeys = await createSenderKeysForMembers(groupId, joiningMembers); + } else { + // It's not a member change, maybe an name change. So just reuse all senderkeys + senderKeys = await getOrUpdateSenderKeysForJoiningMembers( + groupId, + members + ); + } + const paramsWithSenderKeys = { + ...params, + senderKeys, + }; + // Send a closed group update message to the existing members with the new members' ratchets (this message is aimed at the group) + const message = new MediumGroupUpdateMessage(paramsWithSenderKeys); + window.log.warn( + 'Sending to groupUpdateMessage with joining members senderKeys to groupAddress', + senderKeys + ); await getMessageQueue().sendToGroup(message); - } -} + // now send a CREATE group message with all senderkeys no matter what to all joining members, using established channels + if (joiningMembers.length) { + const { secretKey } = groupUpdate; -async function sendGroupUpdateForJoiningMembers( - recipients: Array, - groupUpdate: GroupInfo, - messageId?: string -) { - const { id: groupId, name, members } = groupUpdate; + if (!secretKey) { + window.log.error('Group secret key not specified, aborting...'); + return; + } + const allSenderKeys = await getOrUpdateSenderKeysForJoiningMembers( + groupId, + members + ); - const now = Date.now(); + const createParams = { + timestamp: Date.now(), + identifier: messageId || uuid(), + groupSecretKey: secretKey, + groupId, + members: membersBin, + groupName, + admins: adminsBin, + senderKeys: allSenderKeys, + }; - const { secretKey, senderKeysContainer } = groupUpdate; + const mediumGroupCreateMessage = new MediumGroupCreateMessage( + createParams + ); + // console.warn( + // 'sending group create to', + // joiningMembers, + // ' obj: ', + // mediumGroupCreateMessage + // ); - if (!secretKey) { - window.log.error('Group secret key not specified, aborting...'); - return; - } - - let senderKeys: Array = []; - if (!senderKeysContainer) { - window.log.warn('Sender keys for joining members not found'); - } else { - // Joining members should receive all known sender keys - senderKeys = _.union( - senderKeysContainer.existingKeys, - senderKeysContainer.newKeys - ); - } - - const membersBin = members.map( - (pkHex: string) => new Uint8Array(fromHex(pkHex)) - ); - - const admins = groupUpdate.admins || []; - - const adminsBin = admins.map( - (pkHex: string) => new Uint8Array(fromHex(pkHex)) - ); - - const createParams = { - timestamp: now, - groupId, - identifier: messageId || uuid(), - groupSecretKey: secretKey, - members: membersBin, - groupName: name, - admins: adminsBin, - senderKeys, - }; - - const mediumGroupCreateMessage = new MediumGroupCreateMessage(createParams); - - recipients.forEach(async member => { - const memberPubKey = new PubKey(member); - await getMessageQueue().sendUsingMultiDevice( - memberPubKey, - mediumGroupCreateMessage - ); - }); -} - -async function sendGroupUpdateForMedium( - diff: MemberChanges, - groupUpdate: GroupInfo, - messageId?: string -) { - const joining = diff.joiningMembers || []; - const leaving = diff.leavingMembers || []; - - // 1. create group for all joining members (send timeout timer if necessary) - if (joining.length) { - await sendGroupUpdateForJoiningMembers(joining, groupUpdate, messageId); - } - - // 2. send group update to all other members - const others = _.difference(groupUpdate.members, joining); - if (others.length) { - await sendGroupUpdateForExistingMembers( - leaving, - others, - groupUpdate, - messageId - ); + joiningMembers.forEach(async member => { + const memberPubKey = new PubKey(member); + await getMessageQueue().sendUsingMultiDevice( + memberPubKey, + mediumGroupCreateMessage + ); + }); + } } } diff --git a/ts/session/medium_group/ratchet.ts b/ts/session/medium_group/ratchet.ts index 223a16266..e64fd5ffd 100644 --- a/ts/session/medium_group/ratchet.ts +++ b/ts/session/medium_group/ratchet.ts @@ -14,12 +14,15 @@ async function queueJobForNumber(number: string, runJob: any) { const runCurrent = runPrevious.then(runJob, runJob); jobQueue[number] = runCurrent; // tslint:disable-next-line no-floating-promises - runCurrent.then(() => { - if (jobQueue[number] === runCurrent) { - // tslint:disable-next-line no-dynamic-delete - delete jobQueue[number]; - } - }); + runCurrent + .then(() => { + if (jobQueue[number] === runCurrent) { + // tslint:disable-next-line no-dynamic-delete + delete jobQueue[number]; + } + }).catch((e: any) => { + window.log.error('queueJobForNumber() Caught error', e); + }); return runCurrent; } diff --git a/ts/session/sending/MessageQueue.ts b/ts/session/sending/MessageQueue.ts index 4cddd8e73..ca495f63c 100644 --- a/ts/session/sending/MessageQueue.ts +++ b/ts/session/sending/MessageQueue.ts @@ -7,6 +7,7 @@ import { ClosedGroupMessage, ContentMessage, ExpirationTimerUpdateMessage, + MediumGroupChatMessage, MediumGroupMessage, OpenGroupMessage, SessionRequestMessage, @@ -102,8 +103,10 @@ export class MessageQueue implements MessageQueueInterface { throw new Error('Invalid group message passed in sendToGroup.'); } // if this is a medium group message. We just need to send to the group pubkey - if (message instanceof MediumGroupMessage) { - window.log.warn('sending medium ', message, ' to ', groupId) + if ( + message instanceof MediumGroupMessage || + message instanceof MediumGroupChatMessage + ) { return this.send(PubKey.cast(groupId), message); } diff --git a/ts/session/sending/MessageQueueInterface.ts b/ts/session/sending/MessageQueueInterface.ts index af44e6e7f..596b84bea 100644 --- a/ts/session/sending/MessageQueueInterface.ts +++ b/ts/session/sending/MessageQueueInterface.ts @@ -9,7 +9,10 @@ import { RawMessage } from '../types/RawMessage'; import { TypedEventEmitter } from '../utils'; import { PubKey } from '../types'; -type GroupMessageType = OpenGroupMessage | ClosedGroupMessage | MediumGroupMessage; +type GroupMessageType = + | OpenGroupMessage + | ClosedGroupMessage + | MediumGroupMessage; export interface MessageQueueInterfaceEvents { success: ( diff --git a/ts/session/sending/MessageSender.ts b/ts/session/sending/MessageSender.ts index 6341274d7..374fc2d10 100644 --- a/ts/session/sending/MessageSender.ts +++ b/ts/session/sending/MessageSender.ts @@ -45,6 +45,7 @@ export async function send( timestamp, cipherText ); + // console.warn('sending', envelope, ' to ', device.key); const data = wrapEnvelope(envelope); return pRetry( diff --git a/ts/session/utils/Messages.ts b/ts/session/utils/Messages.ts index 5169afdd7..3d84b0c59 100644 --- a/ts/session/utils/Messages.ts +++ b/ts/session/utils/Messages.ts @@ -6,6 +6,7 @@ import { } from '../messages/outgoing'; import { EncryptionType, PubKey } from '../types'; import { SessionProtocol } from '../protocols'; +import { MediumGroupUpdateMessage } from '../messages/outgoing/content/data/mediumgroup/MediumGroupUpdateMessage'; export async function toRawMessage( device: PubKey, @@ -16,7 +17,10 @@ export async function toRawMessage( const plainTextBuffer = message.plainTextBuffer(); let encryption: EncryptionType; - if (message instanceof MediumGroupChatMessage) { + if ( + message instanceof MediumGroupChatMessage || + message instanceof MediumGroupUpdateMessage + ) { encryption = EncryptionType.MediumGroup; } else if (message instanceof SessionRequestMessage) { encryption = EncryptionType.Fallback; From 5d7d66f65a8a7a5f3aa2ee456372f425a392bf44 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 1 Oct 2020 15:13:06 +1000 Subject: [PATCH 254/274] fix bug making session request being sent for medium group create --- ts/receiver/mediumGroups.ts | 2 +- ts/session/medium_group/index.ts | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ts/receiver/mediumGroups.ts b/ts/receiver/mediumGroups.ts index 74eaaebc3..db6dd0d1d 100644 --- a/ts/receiver/mediumGroups.ts +++ b/ts/receiver/mediumGroups.ts @@ -323,7 +323,7 @@ async function handleMediumGroupChange( const primary = await UserUtil.getPrimary(); sanityCheckMediumGroupUpdate(primary, diff, groupUpdate); - + // console.log(`Got group update`, groupUpdate); await saveIncomingRatchetKeys(groupId, senderKeys); // Only add update message if we have something to show diff --git a/ts/session/medium_group/index.ts b/ts/session/medium_group/index.ts index 51324250f..0d899a9fe 100644 --- a/ts/session/medium_group/index.ts +++ b/ts/session/medium_group/index.ts @@ -118,12 +118,14 @@ export async function createMediumGroup( const dbMessage = await addUpdateMessage(convo, groupDiff, 'outgoing'); + // be sure to call this before sending the message. + // the sending pipeline needs to know from GroupUtils when a message is for a medium group + await updateOrCreateGroup(groupDetails); + await sendGroupUpdate(convo, groupDiff, groupDetails, dbMessage.id); // ***** 3. Add update message to the conversation ***** - await updateOrCreateGroup(groupDetails); - convo.updateGroupAdmins(admins); window.owsDesktopApp.appView.openConversation(groupId, {}); From e0e0830d3b5b1f0ffa865cfc69e7fec39a18a765 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 1 Oct 2020 16:13:26 +1000 Subject: [PATCH 255/274] remove all ratchet when needed to get fresh senderKey from members --- app/sql.js | 7 +++++++ js/modules/data.d.ts | 1 + js/modules/data.js | 5 +++++ .../session/LeftPaneMessageSection.tsx | 17 ++++------------- ts/receiver/contentMessage.ts | 3 +-- ts/receiver/dataMessage.ts | 5 +---- ts/receiver/mediumGroups.ts | 17 ++++++++++++++++- ts/session/medium_group/index.ts | 3 ++- ts/session/medium_group/ratchet.ts | 3 ++- 9 files changed, 39 insertions(+), 22 deletions(-) diff --git a/app/sql.js b/app/sql.js index 276746a25..7b5fa4363 100644 --- a/app/sql.js +++ b/app/sql.js @@ -171,6 +171,7 @@ module.exports = { getSenderKeys, createOrUpdateSenderKeys, + removeAllClosedGroupRatchets, }; function generateUUID() { @@ -923,6 +924,12 @@ async function createOrUpdateSenderKeys(data) { ); } +async function removeAllClosedGroupRatchets(groupId) { + await db.run(`DELETE FROM ${SENDER_KEYS_TABLE} WHERE groupId = $groupId;`, { + $groupId: groupId, + }); +} + async function updateToLokiSchemaVersion4(currentVersion, instance) { if (currentVersion >= 4) { return; diff --git a/js/modules/data.d.ts b/js/modules/data.d.ts index 0b344b121..b19fb4c5a 100644 --- a/js/modules/data.d.ts +++ b/js/modules/data.d.ts @@ -412,3 +412,4 @@ export function getMessagesWithFileAttachments( // Sender Keys export function getSenderKeys(groupId: any, senderIdentity: any): Promise; export function createOrUpdateSenderKeys(data: any): Promise; +export function removeAllClosedGroupRatchets(groupId: string): Promise; diff --git a/js/modules/data.js b/js/modules/data.js index 8111770f5..c135bf44c 100644 --- a/js/modules/data.js +++ b/js/modules/data.js @@ -196,6 +196,7 @@ module.exports = { getSenderKeys, createOrUpdateSenderKeys, + removeAllClosedGroupRatchets, }; function init() { @@ -704,6 +705,10 @@ async function createOrUpdateSenderKeys(data) { await channels.createOrUpdateSenderKeys(data); } +async function removeAllClosedGroupRatchets(groupId) { + await channels.removeAllClosedGroupRatchets(groupId); +} + // Sessions async function createOrUpdateSession(data) { diff --git a/ts/components/session/LeftPaneMessageSection.tsx b/ts/components/session/LeftPaneMessageSection.tsx index 2e3d525e2..e426099a1 100644 --- a/ts/components/session/LeftPaneMessageSection.tsx +++ b/ts/components/session/LeftPaneMessageSection.tsx @@ -307,12 +307,7 @@ export class LeftPaneMessageSection extends React.Component { onButtonClick={async ( groupName: string, groupMembers: Array - ) => - this.onCreateClosedGroup( - groupName, - groupMembers - ) - } + ) => this.onCreateClosedGroup(groupName, groupMembers)} searchTerm={searchTerm} updateSearch={this.updateSearchBound} showSpinner={loading} @@ -497,13 +492,9 @@ export class LeftPaneMessageSection extends React.Component { groupName: string, groupMembers: Array ) { - await MainViewController.createClosedGroup( - groupName, - groupMembers, - () => { - this.handleToggleOverlay(undefined); - } - ); + await MainViewController.createClosedGroup(groupName, groupMembers, () => { + this.handleToggleOverlay(undefined); + }); } private handleNewSessionButtonClick() { diff --git a/ts/receiver/contentMessage.ts b/ts/receiver/contentMessage.ts index b32505438..5a6a61ca4 100644 --- a/ts/receiver/contentMessage.ts +++ b/ts/receiver/contentMessage.ts @@ -19,7 +19,6 @@ import { BlockedNumberController } from '../util/blockedNumberController'; import { decryptWithSenderKey } from '../session/medium_group/ratchet'; import { StringUtils } from '../session/utils'; import { UserUtil } from '../util'; -import { getMessageQueue } from '../session'; export async function handleContentMessage(envelope: EnvelopePlus) { try { @@ -310,7 +309,7 @@ async function decrypt( const requestKeysMessage = new MediumGroupRequestKeysMessage(params); const sender = new PubKey(senderIdentity); - void getMessageQueue().send(sender, requestKeysMessage); + void libsession.getMessageQueue().send(sender, requestKeysMessage); return; } diff --git a/ts/receiver/dataMessage.ts b/ts/receiver/dataMessage.ts index 31f3f7cbf..ea8049a71 100644 --- a/ts/receiver/dataMessage.ts +++ b/ts/receiver/dataMessage.ts @@ -279,10 +279,7 @@ export async function handleDataMessage( envelope: EnvelopePlus, dataMessage: SignalService.IDataMessage ): Promise { - window.log.info( - 'data message from', - getEnvelopeId(envelope) - ); + window.log.info('data message from', getEnvelopeId(envelope)); if (dataMessage.mediumGroupUpdate) { await handleMediumGroupUpdate(envelope, dataMessage.mediumGroupUpdate); diff --git a/ts/receiver/mediumGroups.ts b/ts/receiver/mediumGroups.ts index db6dd0d1d..5c1cffd52 100644 --- a/ts/receiver/mediumGroups.ts +++ b/ts/receiver/mediumGroups.ts @@ -13,7 +13,10 @@ import { BufferType } from '../session/utils/String'; import { MultiDeviceProtocol } from '../session/protocols'; import { ConversationModel } from '../../js/models/conversations'; import { UserUtil } from '../util'; -import { RatchetState } from '../session/medium_group/senderKeys'; +import { + createSenderKeyForGroup, + RatchetState, +} from '../session/medium_group/senderKeys'; const toHex = (d: BufferType) => StringUtils.decode(d, 'hex'); const fromHex = (d: string) => StringUtils.encode(d, 'hex'); @@ -344,6 +347,18 @@ async function handleMediumGroupChange( await convo.commit(); + if (diff.leavingMembers && diff.leavingMembers.length > 0) { + // Send out the user's new ratchet to all members (minus the removed ones) using established channels + const userSenderKey = await createSenderKeyForGroup(groupId, primary); + window.log.warn( + 'Sharing our new senderKey with remainingMembers via message', + members, + userSenderKey + ); + + await shareSenderKeys(groupId, members, userSenderKey); + } + await removeFromCache(envelope); } diff --git a/ts/session/medium_group/index.ts b/ts/session/medium_group/index.ts index 0d899a9fe..5a79c84b2 100644 --- a/ts/session/medium_group/index.ts +++ b/ts/session/medium_group/index.ts @@ -641,7 +641,8 @@ async function sendGroupUpdateForMedium( getMessageQueue().events.addListener('success', async message => { if (message.identifier === params.identifier) { // console.log('Our first message encrypted with old sk is sent.'); - // TODO Delete all ratchets (it's important that this happens * after * sending out the update) + // Delete all ratchets (it's important that this happens * after * sending out the update) + await Data.removeAllClosedGroupRatchets(groupId); if (isUserLeaving) { // nothing to do on desktop } else { diff --git a/ts/session/medium_group/ratchet.ts b/ts/session/medium_group/ratchet.ts index e64fd5ffd..4b3c35dbd 100644 --- a/ts/session/medium_group/ratchet.ts +++ b/ts/session/medium_group/ratchet.ts @@ -20,7 +20,8 @@ async function queueJobForNumber(number: string, runJob: any) { // tslint:disable-next-line no-dynamic-delete delete jobQueue[number]; } - }).catch((e: any) => { + }) + .catch((e: any) => { window.log.error('queueJobForNumber() Caught error', e); }); return runCurrent; From a05b6556b0268c17e6207f8ea8b4030f3e2f1338 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 1 Oct 2020 16:16:46 +1000 Subject: [PATCH 256/274] remove unused handleQuit for medium groups --- ts/receiver/mediumGroups.ts | 63 ------------------------------------- 1 file changed, 63 deletions(-) diff --git a/ts/receiver/mediumGroups.ts b/ts/receiver/mediumGroups.ts index 5c1cffd52..28b14dacf 100644 --- a/ts/receiver/mediumGroups.ts +++ b/ts/receiver/mediumGroups.ts @@ -362,69 +362,6 @@ async function handleMediumGroupChange( await removeFromCache(envelope); } -async function handleQuit( - envelope: EnvelopePlus, - groupUpdate: SignalService.MediumGroupUpdate -) { - const quitter = envelope.source; - const groupId = toHex(groupUpdate.groupPublicKey); - - const quitterPrimary = await MultiDeviceProtocol.getPrimaryDevice(quitter); - - const maybeConvo = await window.ConversationController.get(groupId); - - if (!maybeConvo) { - window.log.warn('Received QUIT for a non-existing medium group'); - await removeFromCache(envelope); - return; - } - - const convo = maybeConvo; - - // 1. Remove primary device from members: - - const members = convo.get('members'); - - const membersUpdated = _.without(members, quitterPrimary.key); - - convo.set({ members: membersUpdated }); - - convo.commit(); - - // 2. Show message (device left the group); - - await SenderKeyAPI.addUpdateMessage( - convo, - { leavingMembers: [quitterPrimary.key] }, - 'incoming' - ); - - const ourNumber = (await UserUtil.getCurrentDevicePubKey()) as string; - const primary = await UserUtil.getPrimary(); - - if (quitterPrimary.key === primary.key) { - convo.set('isKickedFromGroup', true); - // Disable typing: - convo.updateTextInputState(); - await convo.commit(); - - await removeFromCache(envelope); - return; - } - - // 3. update your own sender key - const senderKey = await SenderKeyAPI.createSenderKeyForGroup( - groupId, - PubKey.cast(ourNumber) - ); - - // Send keys in the background - // tslint:disable-next-line no-floating-promises - shareSenderKeys(groupId, membersUpdated, senderKey); - - await removeFromCache(envelope); -} - export async function handleMediumGroupUpdate( envelope: EnvelopePlus, groupUpdate: any From cfb9e65f30b38240220766dc4d95329ee0137c5b Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 2 Oct 2020 14:27:46 +1000 Subject: [PATCH 257/274] trigger new ratchet send on message sent success send our new ratchet to all new members when we just sent a message containing no senderKey in it. an set but empty senderKey array should only be sent when a user left or was removed. --- js/models/messages.js | 42 ++++++++++++++++++++++++++- ts/receiver/mediumGroups.ts | 19 +----------- ts/session/index.ts | 3 +- ts/session/medium_group/index.ts | 30 ++----------------- ts/session/medium_group/senderKeys.ts | 19 ++++++++++++ 5 files changed, 65 insertions(+), 48 deletions(-) diff --git a/js/models/messages.js b/js/models/messages.js index d762d95c3..e9997fdcf 100644 --- a/js/models/messages.js +++ b/js/models/messages.js @@ -1238,7 +1238,7 @@ const isOurDevice = await window.libsession.Protocols.MultiDeviceProtocol.isOurDevice( sentMessage.device ); - + // FIXME this is not correct and will cause issues with syncing // At this point the only way to check for medium // group is by comparing the encryption type const isMediumGroupMessage = @@ -1272,6 +1272,46 @@ sentMessage.device ); + if (isMediumGroupMessage) { + // Delete all ratchets (it's important that this happens * after * sending out the update) + const shouldTriggerRatchetReset = + dataMessage && + dataMessage.mediumGroupUpdate && + dataMessage.mediumGroupUpdate.senderKeys && + dataMessage.mediumGroupUpdate.senderKeys.length === 0; + if (shouldTriggerRatchetReset) { + const { groupPublicKey } = dataMessage.mediumGroupUpdate; + const groupPubKeyUint = new Uint8Array( + groupPublicKey.toArrayBuffer() + ); + const groupId = libsession.Utils.StringUtils.decode( + groupPubKeyUint, + 'hex' + ); + await window.Signal.Data.removeAllClosedGroupRatchets(groupId); + // Send out the user's new ratchet to all members (minus the removed ones) using established channels + const ourPrimary = await window.Signal.Util.UserUtil.getPrimary(); + + const userSenderKey = await window.libsession.MediumGroup.createSenderKeyForGroup( + groupId, + ourPrimary + ); + + const currentMembers = this.getConversation().get('members'); + + window.log.warn( + 'Sharing our new senderKey with remainingMembers via established channels with', + currentMembers + ); + + await window.libsession.MediumGroup.shareSenderKeys( + groupId, + currentMembers, + userSenderKey + ); + } + } + /** * We should hit the notify endpoint for push notification only if: * • It's a one-to-one chat or a closed group diff --git a/ts/receiver/mediumGroups.ts b/ts/receiver/mediumGroups.ts index 28b14dacf..ddb3849b8 100644 --- a/ts/receiver/mediumGroups.ts +++ b/ts/receiver/mediumGroups.ts @@ -10,12 +10,12 @@ import * as SenderKeyAPI from '../session/medium_group'; import { getChainKey } from '../session/medium_group/ratchet'; import { StringUtils } from '../session/utils'; import { BufferType } from '../session/utils/String'; -import { MultiDeviceProtocol } from '../session/protocols'; import { ConversationModel } from '../../js/models/conversations'; import { UserUtil } from '../util'; import { createSenderKeyForGroup, RatchetState, + shareSenderKeys, } from '../session/medium_group/senderKeys'; const toHex = (d: BufferType) => StringUtils.decode(d, 'hex'); @@ -70,23 +70,6 @@ async function handleSenderKeyRequest( await removeFromCache(envelope); } -export async function shareSenderKeys( - groupId: string, - recipientsPrimary: Array, - senderKey: RatchetState -) { - const message = new MediumGroupResponseKeysMessage({ - timestamp: Date.now(), - groupId, - senderKey, - }); - - const recipients = recipientsPrimary.map(pk => PubKey.cast(pk)); - await Promise.all( - recipients.map(pk => getMessageQueue().sendUsingMultiDevice(pk, message)) - ); -} - async function handleSenderKey( envelope: EnvelopePlus, groupUpdate: SignalService.MediumGroupUpdate diff --git a/ts/session/index.ts b/ts/session/index.ts index c2a115733..1db6e3736 100644 --- a/ts/session/index.ts +++ b/ts/session/index.ts @@ -4,7 +4,8 @@ import * as Types from './types'; import * as Utils from './utils'; import * as Sending from './sending'; import * as Constants from './constants'; +import * as MediumGroup from './medium_group'; export * from './instance'; -export { Messages, Utils, Protocols, Types, Sending, Constants }; +export { Messages, Utils, Protocols, Types, Sending, Constants, MediumGroup }; diff --git a/ts/session/medium_group/index.ts b/ts/session/medium_group/index.ts index 5a79c84b2..ac00cfc7b 100644 --- a/ts/session/medium_group/index.ts +++ b/ts/session/medium_group/index.ts @@ -8,6 +8,7 @@ import { RatchetState, saveSenderKeys, saveSenderKeysInner, + shareSenderKeys, } from './senderKeys'; import { getChainKey } from './ratchet'; import { MultiDeviceProtocol } from '../protocols'; @@ -20,7 +21,6 @@ import { ExpirationTimerUpdateMessage, MediumGroupCreateMessage, MediumGroupMessage, - Message, } from '../messages/outgoing'; import { MessageModel, MessageModelType } from '../../../js/models/messages'; import { getMessageQueue } from '../../session'; @@ -28,13 +28,13 @@ import { ConversationModel } from '../../../js/models/conversations'; import { MediumGroupUpdateMessage } from '../messages/outgoing/content/data/mediumgroup/MediumGroupUpdateMessage'; import uuid from 'uuid'; import { BlockedNumberController } from '../../util/blockedNumberController'; -import { shareSenderKeys } from '../../receiver/mediumGroups'; export { createSenderKeyForGroup, saveSenderKeys, saveSenderKeysInner, getChainKey, + shareSenderKeys, }; const toHex = (d: BufferType) => StringUtils.decode(d, 'hex'); @@ -610,8 +610,6 @@ async function sendGroupUpdateForMedium( (pkHex: string) => new Uint8Array(fromHex(pkHex)) ); - const remainingMembers = _.difference(groupUpdate.members, joiningMembers); - const params = { timestamp: Date.now(), identifier: messageId || uuid(), @@ -637,30 +635,6 @@ async function sendGroupUpdateForMedium( ); window.log.warn('Sending to groupUpdateMessage without senderKeys'); await getMessageQueue().sendToGroup(messageStripped); - - getMessageQueue().events.addListener('success', async message => { - if (message.identifier === params.identifier) { - // console.log('Our first message encrypted with old sk is sent.'); - // Delete all ratchets (it's important that this happens * after * sending out the update) - await Data.removeAllClosedGroupRatchets(groupId); - if (isUserLeaving) { - // nothing to do on desktop - } else { - // Send out the user's new ratchet to all members (minus the removed ones) using established channels - const userSenderKey = await createSenderKeyForGroup( - groupId, - ourPrimary - ); - window.log.warn( - 'Sharing our new senderKey with remainingMembers via message', - remainingMembers, - userSenderKey - ); - - await shareSenderKeys(groupId, remainingMembers, userSenderKey); - } - } - }); } else { let senderKeys: Array; if (joiningMembers.length > 0) { diff --git a/ts/session/medium_group/senderKeys.ts b/ts/session/medium_group/senderKeys.ts index 5c645e557..b48a2f17b 100644 --- a/ts/session/medium_group/senderKeys.ts +++ b/ts/session/medium_group/senderKeys.ts @@ -1,6 +1,8 @@ import { PubKey } from '../types'; import { StringUtils } from '../utils'; import * as Data from '../../../js/modules/data'; +import { MediumGroupResponseKeysMessage } from '../messages/outgoing'; +import { getMessageQueue } from '..'; const toHex = (buffer: ArrayBuffer) => StringUtils.decode(buffer, 'hex'); const fromHex = (hex: string) => StringUtils.encode(hex, 'hex'); @@ -86,3 +88,20 @@ export async function saveSenderKeys( messageKeys ); } + +export async function shareSenderKeys( + groupId: string, + recipientsPrimary: Array, + senderKey: RatchetState +) { + const message = new MediumGroupResponseKeysMessage({ + timestamp: Date.now(), + groupId, + senderKey, + }); + + const recipients = recipientsPrimary.map(pk => PubKey.cast(pk)); + await Promise.all( + recipients.map(pk => getMessageQueue().sendUsingMultiDevice(pk, message)) + ); +} From 3fa1a8f2b50c0a4ecbe56cc8b0b0aa8b15278fb3 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 2 Oct 2020 15:29:43 +1000 Subject: [PATCH 258/274] mark medium group as not left if we get a message INFO adding us back --- ts/receiver/mediumGroups.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ts/receiver/mediumGroups.ts b/ts/receiver/mediumGroups.ts index ddb3849b8..a0fe3eb75 100644 --- a/ts/receiver/mediumGroups.ts +++ b/ts/receiver/mediumGroups.ts @@ -326,11 +326,18 @@ async function handleMediumGroupChange( // Disable typing: convo.updateTextInputState(); window.SwarmPolling.removePubkey(groupId); + } else { + if (maybeConvo.get('isKickedFromGroup')) { + // Enable typing: + maybeConvo.set('isKickedFromGroup', false); + maybeConvo.set('left', false); + maybeConvo.updateTextInputState(); + } } await convo.commit(); - if (diff.leavingMembers && diff.leavingMembers.length > 0) { + if (diff.leavingMembers && diff.leavingMembers.length > 0 && !areWeKicked) { // Send out the user's new ratchet to all members (minus the removed ones) using established channels const userSenderKey = await createSenderKeyForGroup(groupId, primary); window.log.warn( From 05e682cdc2d795c9fd8cb093610c1125197f5e0c Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 5 Oct 2020 10:53:09 +1100 Subject: [PATCH 259/274] enable back swarm polling when we get added back to a group --- ts/receiver/mediumGroups.ts | 5 +++-- ts/session/snode_api/swarmPolling.ts | 8 ++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/ts/receiver/mediumGroups.ts b/ts/receiver/mediumGroups.ts index a0fe3eb75..7c9582b3a 100644 --- a/ts/receiver/mediumGroups.ts +++ b/ts/receiver/mediumGroups.ts @@ -331,6 +331,8 @@ async function handleMediumGroupChange( // Enable typing: maybeConvo.set('isKickedFromGroup', false); maybeConvo.set('left', false); + // Subscribe to this group id + window.SwarmPolling.addGroupId(new PubKey(groupId)); maybeConvo.updateTextInputState(); } } @@ -342,8 +344,7 @@ async function handleMediumGroupChange( const userSenderKey = await createSenderKeyForGroup(groupId, primary); window.log.warn( 'Sharing our new senderKey with remainingMembers via message', - members, - userSenderKey + members ); await shareSenderKeys(groupId, members, userSenderKey); diff --git a/ts/session/snode_api/swarmPolling.ts b/ts/session/snode_api/swarmPolling.ts index ac2eaacc7..0f3407c27 100644 --- a/ts/session/snode_api/swarmPolling.ts +++ b/ts/session/snode_api/swarmPolling.ts @@ -51,12 +51,16 @@ export class SwarmPolling { } public addGroupId(pubkey: PubKey) { - this.groupPubkeys.push(pubkey); + if (this.groupPubkeys.findIndex(m => m.key === pubkey.key) === -1) { + this.groupPubkeys.push(pubkey); + } } public addPubkey(pk: PubKey | string) { const pubkey = PubKey.cast(pk); - this.pubkeys.push(pubkey); + if (this.pubkeys.findIndex(m => m.key === pubkey.key) === -1) { + this.pubkeys.push(pubkey); + } } public removePubkey(pk: PubKey | string) { From c0497e3df179dedbf25420893ddc3fe98eb52853 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 5 Oct 2020 11:16:13 +1100 Subject: [PATCH 260/274] trigger senderKeyRequest if we get a DOMException on decryptGCM() --- ts/session/medium_group/ratchet.ts | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/ts/session/medium_group/ratchet.ts b/ts/session/medium_group/ratchet.ts index 4b3c35dbd..5808ad4bf 100644 --- a/ts/session/medium_group/ratchet.ts +++ b/ts/session/medium_group/ratchet.ts @@ -2,6 +2,8 @@ import { PubKey } from '../types'; import * as Data from '../../../js/modules/data'; import { saveSenderKeysInner } from './index'; import { StringUtils } from '../utils'; +import { MediumGroupRequestKeysMessage } from '../messages/outgoing'; +import { getMessageQueue } from '..'; const toHex = (buffer: ArrayBuffer) => StringUtils.decode(buffer, 'hex'); const fromHex = (hex: string) => StringUtils.encode(hex, 'hex'); @@ -269,11 +271,24 @@ async function decryptWithSenderKeyInner( return null; } - // TODO: this might fail, handle this - const plaintext = await window.libloki.crypto.DecryptGCM( - messageKey, - ciphertext - ); + try { + const plaintext = await window.libloki.crypto.DecryptGCM( + messageKey, + ciphertext + ); + return plaintext; + } catch (e) { + window.log.error('Got error during DecryptGCM():', e); + if (e instanceof DOMException) { + const params = { + timestamp: Date.now(), + groupId, + }; + // we consider we don't have the correct key for this sender, so request the latest one + const requestKeysMessage = new MediumGroupRequestKeysMessage(params); + const sender = new PubKey(senderIdentity); + await getMessageQueue().send(sender, requestKeysMessage); + } + } - return plaintext; } From 97eaf680859a072fb9c2f7ad77368b5c2653ce04 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 5 Oct 2020 11:29:02 +1100 Subject: [PATCH 261/274] clean getExistingSenderKeysForGroup as we don't need the diff anymore --- ts/session/medium_group/index.ts | 18 +++--------------- ts/session/medium_group/ratchet.ts | 1 - 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/ts/session/medium_group/index.ts b/ts/session/medium_group/index.ts index ac00cfc7b..4949066a4 100644 --- a/ts/session/medium_group/index.ts +++ b/ts/session/medium_group/index.ts @@ -269,26 +269,14 @@ async function getExistingSenderKeysForGroup( // as they each member need to regenerate a new senderkey async function getOrUpdateSenderKeysForJoiningMembers( groupId: string, - members: Array, - diff?: GroupDiff, - joiningMembersSenderKeys?: Array + members: Array ): Promise> { - const leavingMembers = diff?.leavingMembers || []; - const joiningMembers = diff?.joiningMembers || []; - - const existingMembers = _.difference(members, joiningMembers); // get all devices for members const allDevices = _.flatten( - await Promise.all( - existingMembers.map(m => MultiDeviceProtocol.getAllDevices(m)) - ) + await Promise.all(members.map(m => MultiDeviceProtocol.getAllDevices(m))) ); - let existingKeys: Array = []; - if (leavingMembers.length === 0) { - existingKeys = await getExistingSenderKeysForGroup(groupId, allDevices); - } - return _.union(joiningMembersSenderKeys, existingKeys); + return getExistingSenderKeysForGroup(groupId, allDevices); } async function getGroupSecretKey(groupId: string): Promise { diff --git a/ts/session/medium_group/ratchet.ts b/ts/session/medium_group/ratchet.ts index 5808ad4bf..5f9d81db9 100644 --- a/ts/session/medium_group/ratchet.ts +++ b/ts/session/medium_group/ratchet.ts @@ -290,5 +290,4 @@ async function decryptWithSenderKeyInner( await getMessageQueue().send(sender, requestKeysMessage); } } - } From 4215aa1e3bbdd8060f308dadc8679e870b3b7974 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 5 Oct 2020 11:39:00 +1100 Subject: [PATCH 262/274] require admin for editing a closed group, but not a medium one --- js/views/conversation_view.js | 6 +++++- js/views/create_group_dialog_view.js | 5 ++++- ts/receiver/groups.ts | 5 +++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index c2752c2bf..fc0219f9c 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -271,6 +271,10 @@ }; const getGroupSettingsProps = () => { const members = this.model.get('members') || []; + const ourPK = window.textsecure.storage.user.getNumber(); + const isAdmin = this.model.isMediumGroup() + ? true + : this.model.get('groupAdmins').includes(ourPK); return { id: this.model.id, @@ -280,7 +284,7 @@ avatarPath: this.model.getAvatarPath(), isGroup: !this.model.isPrivate(), isPublic: this.model.isPublic(), - isAdmin: true, // allow closed group edits from anyone this.model.get('groupAdmins').includes(ourPK), + isAdmin, isRss: this.model.isRss(), memberCount: members.length, amMod: this.model.isModerator( diff --git a/js/views/create_group_dialog_view.js b/js/views/create_group_dialog_view.js index 6a0f5715b..ddc183d2e 100644 --- a/js/views/create_group_dialog_view.js +++ b/js/views/create_group_dialog_view.js @@ -98,7 +98,10 @@ } else { this.titleText = i18n('updateGroupDialogTitle', this.groupName); // anybody can edit a closed group name or members - this.isAdmin = true; + const ourPK = window.textsecure.storage.user.getNumber(); + this.isAdmin = groupConvo.isMediumGroup() + ? true + : groupConvo.get('groupAdmins').includes(ourPK); const convos = window.getConversations().models.filter(d => !!d); this.existingMembers = groupConvo.get('members') || []; diff --git a/ts/receiver/groups.ts b/ts/receiver/groups.ts index df5a70a28..2c74f92a0 100644 --- a/ts/receiver/groups.ts +++ b/ts/receiver/groups.ts @@ -85,8 +85,9 @@ export async function preprocessGroupMessage( if (newGroup) { conversation.updateGroupAdmins(group.admins); } else { - // group members and names can be changed from any member - const fromAdmin = true; + // be sure to drop a message from a non admin if it tries to change group members + // or change the group name + const fromAdmin = conversation.get('groupAdmins').includes(primarySource); if (!fromAdmin) { // Make sure the message is not removing members / renaming the group From 2f8f79c5d284d36ab99dfce870a7f94bd9764e47 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 5 Oct 2020 12:31:07 +1100 Subject: [PATCH 263/274] make message clearer when we try to reuse a keyIdx in the ratchet --- ts/receiver/contentMessage.ts | 6 +----- ts/session/medium_group/ratchet.ts | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/ts/receiver/contentMessage.ts b/ts/receiver/contentMessage.ts index 5a6a61ca4..bb6fec351 100644 --- a/ts/receiver/contentMessage.ts +++ b/ts/receiver/contentMessage.ts @@ -287,11 +287,7 @@ async function decrypt( return plaintext; } catch (error) { - if ( - error && - (error instanceof textsecure.SenderKeyMissing || - error instanceof DOMException) - ) { + if (error && error instanceof textsecure.SenderKeyMissing) { const groupId = envelope.source; const { senderIdentity } = error; if (senderIdentity) { diff --git a/ts/session/medium_group/ratchet.ts b/ts/session/medium_group/ratchet.ts index 5f9d81db9..2c3180fa7 100644 --- a/ts/session/medium_group/ratchet.ts +++ b/ts/session/medium_group/ratchet.ts @@ -204,6 +204,11 @@ async function advanceRatchet( log.error('[idx] not found key for idx: ', idx); // I probably want a better error handling than this return null; + } else if (idx === ratchet.keyIdx) { + log.error( + `advanceRatchet() called with idx:${idx}, current ratchetIdx:${ratchet.keyIdx}. We already burnt that keyIdx before.` + ); + return null; } const { messageKeys } = ratchet; @@ -278,16 +283,12 @@ async function decryptWithSenderKeyInner( ); return plaintext; } catch (e) { - window.log.error('Got error during DecryptGCM():', e); + window.log.error('Got error during DecryptGCM()', e); if (e instanceof DOMException) { - const params = { - timestamp: Date.now(), - groupId, - }; - // we consider we don't have the correct key for this sender, so request the latest one - const requestKeysMessage = new MediumGroupRequestKeysMessage(params); - const sender = new PubKey(senderIdentity); - await getMessageQueue().send(sender, requestKeysMessage); + window.log.error( + 'Got DOMException during DecryptGCM(). Rethrowing as SenderKeyMissing ' + ); + throw new window.textsecure.SenderKeyMissing(senderIdentity); } } } From 232b1a416a9adb8eb56e4b24f05768bc89513c6d Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Mon, 5 Oct 2020 15:14:06 +1100 Subject: [PATCH 264/274] do not refresh group panel media if length of media did not change --- .../session/SessionGroupSettings.tsx | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/ts/components/session/SessionGroupSettings.tsx b/ts/components/session/SessionGroupSettings.tsx index e1095c55f..d9f674d8c 100644 --- a/ts/components/session/SessionGroupSettings.tsx +++ b/ts/components/session/SessionGroupSettings.tsx @@ -38,7 +38,13 @@ interface Props { onSetDisappearingMessages: (seconds: number) => void; } -class SessionGroupSettings extends React.Component { +interface State { + documents: Array; + media: Array; + onItemClick: any; +} + +class SessionGroupSettings extends React.Component { public constructor(props: Props) { super(props); @@ -67,17 +73,27 @@ class SessionGroupSettings extends React.Component { setTimeout(() => { this.getMediaGalleryProps() .then(({ documents, media, onItemClick }) => { - this.setState({ - documents, - media, - onItemClick, - }); + const { documents: oldDocs, media: oldMedias } = this.state; + if ( + oldDocs.length !== documents.length || + oldMedias.length !== media.length + ) { + this.setState({ + documents, + media, + onItemClick, + }); + } }) .ignore(); }, mediaScanInterval); } - public async getMediaGalleryProps() { + public async getMediaGalleryProps(): Promise<{ + documents: Array; + media: Array; + onItemClick: any; + }> { // We fetch more documents than media as they don’t require to be loaded // into memory right away. Revisit this once we have infinite scrolling: const DEFAULT_MEDIA_FETCH_COUNT = 50; From 16b8fc8620c293e2b491e795f17b70bf50226b72 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 6 Oct 2020 13:56:53 +1100 Subject: [PATCH 265/274] hide shortened pubkey except for public groups --- ts/components/ConversationListItem.tsx | 1 + ts/components/MessageSearchResult.tsx | 2 ++ ts/components/conversation/ContactName.tsx | 22 ++++++++++--------- .../conversation/ConversationHeader.tsx | 2 +- ts/components/conversation/Message.tsx | 2 ++ ts/components/conversation/MessageDetail.tsx | 1 + ts/components/conversation/Quote.tsx | 2 ++ .../conversation/SafetyNumberNotification.tsx | 1 + .../conversation/TimerNotification.tsx | 1 + .../conversation/VerificationNotification.tsx | 1 + .../session/SessionMemberListItem.tsx | 3 --- 11 files changed, 24 insertions(+), 14 deletions(-) diff --git a/ts/components/ConversationListItem.tsx b/ts/components/ConversationListItem.tsx index 0d2c62451..febf5e563 100644 --- a/ts/components/ConversationListItem.tsx +++ b/ts/components/ConversationListItem.tsx @@ -357,6 +357,7 @@ class ConversationListItem extends React.PureComponent { module="module-conversation__user" i18n={window.i18n} boldProfileName={true} + shouldShowPubkey={false} />
); diff --git a/ts/components/MessageSearchResult.tsx b/ts/components/MessageSearchResult.tsx index 0a56b0aff..936aa2211 100644 --- a/ts/components/MessageSearchResult.tsx +++ b/ts/components/MessageSearchResult.tsx @@ -68,6 +68,7 @@ export class MessageSearchResult extends React.PureComponent { profileName={from.profileName} i18n={i18n} module="module-message-search-result__header__name" + shouldShowPubkey={false} /> ); } @@ -86,6 +87,7 @@ export class MessageSearchResult extends React.PureComponent { name={to.name} profileName={to.profileName} i18n={i18n} + shouldShowPubkey={false} />
diff --git a/ts/components/conversation/ContactName.tsx b/ts/components/conversation/ContactName.tsx index 39f69d4c9..0f3ab3414 100644 --- a/ts/components/conversation/ContactName.tsx +++ b/ts/components/conversation/ContactName.tsx @@ -12,6 +12,7 @@ interface Props { module?: string; boldProfileName?: Boolean; compact?: Boolean; + shouldShowPubkey: Boolean; } export class ContactName extends React.Component { @@ -24,19 +25,27 @@ export class ContactName extends React.Component { module, boldProfileName, compact, + shouldShowPubkey, } = this.props; const prefix = module ? module : 'module-contact-name'; const title = name ? name : phoneNumber; - const shouldShowProfile = Boolean(profileName && !name); + const shouldShowProfile = Boolean(profileName || name); const styles = (boldProfileName ? { fontWeight: 'bold', } : {}) as React.CSSProperties; + const textProfile = profileName || name || ''; const profileElement = shouldShowProfile ? ( - + + + ) : null; + + const pubKeyElement = shouldShowPubkey ? ( + + ) : null; @@ -44,14 +53,7 @@ export class ContactName extends React.Component { {profileElement} {shouldShowProfile ? ' ' : null} - - - + {pubKeyElement} ); } diff --git a/ts/components/conversation/ConversationHeader.tsx b/ts/components/conversation/ConversationHeader.tsx index 82151ed7f..c890cec6b 100644 --- a/ts/components/conversation/ConversationHeader.tsx +++ b/ts/components/conversation/ConversationHeader.tsx @@ -181,7 +181,7 @@ class ConversationHeader extends React.Component { let title; if (profileName) { - title = `${profileName} ${window.shortenPubkey(phoneNumber)}`; + title = `${profileName}`; } else { if (name) { title = `${name}`; diff --git a/ts/components/conversation/Message.tsx b/ts/components/conversation/Message.tsx index 73143a2b0..ec2a033fe 100644 --- a/ts/components/conversation/Message.tsx +++ b/ts/components/conversation/Message.tsx @@ -1169,6 +1169,7 @@ export class Message extends React.PureComponent { conversationType, direction, i18n, + isPublic, } = this.props; const title = authorName ? authorName : authorPhoneNumber; @@ -1192,6 +1193,7 @@ export class Message extends React.PureComponent { module="module-message__author" i18n={i18n} boldProfileName={true} + shouldShowPubkey={Boolean(isPublic)} />
); diff --git a/ts/components/conversation/MessageDetail.tsx b/ts/components/conversation/MessageDetail.tsx index 235deb18b..1b432c432 100644 --- a/ts/components/conversation/MessageDetail.tsx +++ b/ts/components/conversation/MessageDetail.tsx @@ -107,6 +107,7 @@ export class MessageDetail extends React.Component { name={contact.name} profileName={contact.profileName} i18n={i18n} + shouldShowPubkey={true} />
{errors.map((error, index) => ( diff --git a/ts/components/conversation/Quote.tsx b/ts/components/conversation/Quote.tsx index 3737817b9..3856064d0 100644 --- a/ts/components/conversation/Quote.tsx +++ b/ts/components/conversation/Quote.tsx @@ -302,6 +302,7 @@ export class Quote extends React.Component { i18n, isFromMe, isIncoming, + isPublic, } = this.props; return ( @@ -320,6 +321,7 @@ export class Quote extends React.Component { profileName={authorProfileName} i18n={i18n} compact={true} + shouldShowPubkey={Boolean(isPublic)} /> )}
diff --git a/ts/components/conversation/SafetyNumberNotification.tsx b/ts/components/conversation/SafetyNumberNotification.tsx index 47e633994..e31a90b09 100644 --- a/ts/components/conversation/SafetyNumberNotification.tsx +++ b/ts/components/conversation/SafetyNumberNotification.tsx @@ -42,6 +42,7 @@ export class SafetyNumberNotification extends React.Component { profileName={contact.profileName} phoneNumber={contact.phoneNumber} module="module-verification-notification__contact" + shouldShowPubkey={true} /> , ]} diff --git a/ts/components/conversation/TimerNotification.tsx b/ts/components/conversation/TimerNotification.tsx index 2d08c4497..a38a8cf23 100644 --- a/ts/components/conversation/TimerNotification.tsx +++ b/ts/components/conversation/TimerNotification.tsx @@ -51,6 +51,7 @@ export class TimerNotification extends React.Component { name={name} module="module-message__author" boldProfileName={true} + shouldShowPubkey={false} />, timespan, ]} diff --git a/ts/components/conversation/VerificationNotification.tsx b/ts/components/conversation/VerificationNotification.tsx index 0d9fca24e..43a67f797 100644 --- a/ts/components/conversation/VerificationNotification.tsx +++ b/ts/components/conversation/VerificationNotification.tsx @@ -53,6 +53,7 @@ export class VerificationNotification extends React.Component { profileName={contact.profileName} phoneNumber={contact.phoneNumber} module="module-verification-notification__contact" + shouldShowPubkey={true} />, ]} i18n={i18n} diff --git a/ts/components/session/SessionMemberListItem.tsx b/ts/components/session/SessionMemberListItem.tsx index 7497800b5..0cd21a1c7 100644 --- a/ts/components/session/SessionMemberListItem.tsx +++ b/ts/components/session/SessionMemberListItem.tsx @@ -49,8 +49,6 @@ export class SessionMemberListItem extends React.Component { const { isSelected } = this.state; const name = this.props.member.authorProfileName; - const pubkey = this.props.member.authorPhoneNumber; - const shortPubkey = window.shortenPubkey(pubkey); return (
{ {this.renderAvatar()} {name} - {shortPubkey}
Date: Tue, 6 Oct 2020 15:45:27 +1100 Subject: [PATCH 266/274] hide pubkey when not needed on conversationHeader and listItem --- stylesheets/_modules.scss | 8 +++++++- ts/components/ConversationListItem.tsx | 7 ++++++- ts/components/conversation/ContactName.tsx | 2 +- ts/components/conversation/ConversationHeader.tsx | 11 +---------- ts/components/session/settings/SessionSettings.tsx | 2 -- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/stylesheets/_modules.scss b/stylesheets/_modules.scss index c595ca77b..c3ac5b341 100644 --- a/stylesheets/_modules.scss +++ b/stylesheets/_modules.scss @@ -1112,7 +1112,7 @@ } .module-conversation-header__title { - margin-inline-start: 6px; + margin: 0px 20px; min-width: 0; font-size: 16px; @@ -1130,6 +1130,12 @@ align-items: center; -webkit-user-select: text; + + .module-contact-name__profile-name { + width: 100%; + overflow: hidden !important; + text-overflow: ellipsis; + } } .module-conversation-header__title__profile-name { diff --git a/ts/components/ConversationListItem.tsx b/ts/components/ConversationListItem.tsx index febf5e563..993ce5792 100644 --- a/ts/components/ConversationListItem.tsx +++ b/ts/components/ConversationListItem.tsx @@ -348,6 +348,11 @@ class ConversationListItem extends React.PureComponent { const displayedPubkey = profileName ? shortenedPubkey : phoneNumber; const displayName = isMe ? i18n('noteToSelf') : profileName; + let shouldShowPubkey = false; + if (!name || name.length === 0) { + shouldShowPubkey = true; + } + return (
{ module="module-conversation__user" i18n={window.i18n} boldProfileName={true} - shouldShowPubkey={false} + shouldShowPubkey={shouldShowPubkey} />
); diff --git a/ts/components/conversation/ContactName.tsx b/ts/components/conversation/ContactName.tsx index 0f3ab3414..02252f909 100644 --- a/ts/components/conversation/ContactName.tsx +++ b/ts/components/conversation/ContactName.tsx @@ -36,7 +36,7 @@ export class ContactName extends React.Component { fontWeight: 'bold', } : {}) as React.CSSProperties; - const textProfile = profileName || name || ''; + const textProfile = profileName || name || i18n('anonymous'); const profileElement = shouldShowProfile ? ( diff --git a/ts/components/conversation/ConversationHeader.tsx b/ts/components/conversation/ConversationHeader.tsx index c890cec6b..ba56d7fcf 100644 --- a/ts/components/conversation/ConversationHeader.tsx +++ b/ts/components/conversation/ConversationHeader.tsx @@ -179,16 +179,7 @@ class ConversationHeader extends React.Component { {text} ); - let title; - if (profileName) { - title = `${profileName}`; - } else { - if (name) { - title = `${name}`; - } else { - title = `User ${window.shortenPubkey(phoneNumber)}`; - } - } + const title = profileName || name || phoneNumber; return (
diff --git a/ts/components/session/settings/SessionSettings.tsx b/ts/components/session/settings/SessionSettings.tsx index 5a3928e89..29193d1ca 100644 --- a/ts/components/session/settings/SessionSettings.tsx +++ b/ts/components/session/settings/SessionSettings.tsx @@ -583,8 +583,6 @@ export class SettingsView extends React.Component { title = window.i18n('anonymous'); } - title = `${title} ${window.shortenPubkey(blockedNumber)}`; - results.push({ id: blockedNumber, title, From fda6228613c8598edded8bf790c46adf203e0046 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Tue, 6 Oct 2020 23:28:10 +0200 Subject: [PATCH 267/274] Add --vs2015 to windows setup instructions --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 437d4e87a..5ea086af5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -40,7 +40,7 @@ Then you need `git`, if you don't have that yet: https://git-scm.com/ https://www.microsoft.com/en-us/download/details.aspx?id=40773 * Install Windows SDK version 8.1: https://developer.microsoft.com/en-us/windows/downloads/sdk-archive 1. Install _Windows Build Tools_: Open the [Command Prompt (`cmd.exe`) as Administrator]() - and run: `npm install --global --production --add-python-to-path windows-build-tools` + and run: `npm install --vs2015 --global --production --add-python-to-path windows-build-tools` ### Linux From 2279f0abc63ead8f2ca2321ec0c1c65e1dc169e3 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 7 Oct 2020 10:24:28 +1100 Subject: [PATCH 268/274] center uneditable profile name --- stylesheets/_modal.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/stylesheets/_modal.scss b/stylesheets/_modal.scss index 6f154ded3..d55046a49 100644 --- a/stylesheets/_modal.scss +++ b/stylesheets/_modal.scss @@ -287,7 +287,6 @@ display: flex; align-items: center; justify-content: center; - margin-inline-start: $session-margin-lg; p { font-size: $session-font-md; From d7e1d014a4ba6ed324d214361da7656afcd77fa7 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 7 Oct 2020 10:51:35 +1100 Subject: [PATCH 269/274] make right panel the correct size when window is tiny --- stylesheets/_session_group_panel.scss | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/stylesheets/_session_group_panel.scss b/stylesheets/_session_group_panel.scss index 21f7a9619..32feb7b95 100644 --- a/stylesheets/_session_group_panel.scss +++ b/stylesheets/_session_group_panel.scss @@ -8,8 +8,8 @@ display: flex; flex-direction: column; height: 100vh; - width: 22vw; - flex-shrink: 0; + width: -webkit-fill-available; + @include themify($themes) { background: themed('leftpaneOverlayBackground'); border-left: themed('sessionBorder'); @@ -142,11 +142,11 @@ .module-media-grid-item__image, .module-media-grid-item { height: calc( - 22vw / 3.5 - ); //.group-settings is 22vw and we want three rows with some space so divide it by 3.5 + 22vw / 4 + ); //.group-settings is 22vw and we want three rows with some space so divide it by 4 width: calc( - 22vw / 3.5 - ); //.group-settings is 22vw and we want three rows with some space so divide it by 3.5 + 22vw / 4 + ); //.group-settings is 22vw and we want three rows with some space so divide it by 4 margin: auto; margin-bottom: 1vh; } From 6e993da510d5963f12def4a9f699f4af14faaafb Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 7 Oct 2020 11:08:36 +1100 Subject: [PATCH 270/274] fix highlight of text selected for light mode --- stylesheets/_session.scss | 4 +++- stylesheets/themes.scss | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index 10cfb00ba..aa5082d35 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -38,7 +38,9 @@ textarea { user-select: text; &::selection { - background: rgba($session-color-green, 0.6); + @include themify($themes) { + background: themed('textHighlight'); + } } } } diff --git a/stylesheets/themes.scss b/stylesheets/themes.scss index 0c9835a55..372bfbce6 100644 --- a/stylesheets/themes.scss +++ b/stylesheets/themes.scss @@ -25,6 +25,7 @@ $themes: ( textColor: $black, textColorSubtle: #a0a0a0, textColorOpposite: $white, + textHighlight: rgba($black, 0.2), // inbox inboxBackground: $white, // buttons @@ -74,6 +75,7 @@ $themes: ( textColor: $white, textColorSubtle: #a0a0a0, textColorOpposite: $black, + textHighlight: rgba($accentDarkTheme, 0.6), // inbox inboxBackground: linear-gradient(180deg, #171717 0%, #121212 100%), // buttons From 1a5a0786a1ecc938d0de0834d4823d584ae35d0f Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 7 Oct 2020 15:22:22 +1100 Subject: [PATCH 271/274] fix new medium group mark as unread then as read on opened --- js/conversation_controller.js | 23 +---------------------- js/models/conversations.js | 6 +++--- js/views/message_list_view.js | 2 +- ts/receiver/mediumGroups.ts | 5 ++++- 4 files changed, 9 insertions(+), 27 deletions(-) diff --git a/js/conversation_controller.js b/js/conversation_controller.js index 4e453e73a..236515892 100644 --- a/js/conversation_controller.js +++ b/js/conversation_controller.js @@ -1,4 +1,4 @@ -/* global _, Whisper, Backbone, storage, textsecure, libsignal, log */ +/* global Whisper, Backbone, textsecure, libsignal, log */ /* eslint-disable more/no-then */ @@ -15,10 +15,6 @@ this.listenTo(conversations, 'reset', () => this.reset([])); this.listenTo(conversations, 'remove', this.remove); - this.on( - 'add remove change:unreadCount', - _.debounce(this.updateUnreadCount.bind(this), 1000) - ); this.startPruning(); }, addActive(model) { @@ -29,23 +25,6 @@ this.remove(model); } }, - updateUnreadCount() { - const newUnreadCount = _.reduce( - this.map(m => m.get('unreadCount')), - (item, memo) => item + memo, - 0 - ); - storage.put('unreadCount', newUnreadCount); - - if (newUnreadCount > 0) { - window.setBadgeCount(newUnreadCount); - window.document.title = `${window.getTitle()} (${newUnreadCount})`; - } else { - window.setBadgeCount(0); - window.document.title = window.getTitle(); - } - window.updateTrayIcon(newUnreadCount); - }, startPruning() { const halfHour = 30 * 60 * 1000; this.interval = setInterval(() => { diff --git a/js/models/conversations.js b/js/models/conversations.js index be3b0aa6b..e958588fc 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -1047,7 +1047,7 @@ ); }, - getUnread() { + async getUnread() { return window.Signal.Data.getUnreadByConversation(this.id, { MessageCollection: Whisper.MessageCollection, }); @@ -1741,6 +1741,7 @@ await window.Signal.Data.updateConversation(this.id, this.attributes, { Conversation: Whisper.Conversation, }); + await this.trigger('change', this); }, async addMessage(messageAttributes) { @@ -1866,7 +1867,6 @@ conversationId, }) ); - let unreadMessages = await this.getUnread(); const oldUnread = unreadMessages.filter( message => message.get('received_at') <= newestUnreadDate @@ -1898,7 +1898,7 @@ unreadMessages = unreadMessages.filter(m => Boolean(m.isIncoming())); const unreadCount = unreadMessages.length - read.length; - this.set({ unreadCount }); + this.set('unreadCount', unreadCount); const mentionRead = (() => { const stillUnread = unreadMessages.filter( diff --git a/js/views/message_list_view.js b/js/views/message_list_view.js index 84a8d58bc..13ac989d5 100644 --- a/js/views/message_list_view.js +++ b/js/views/message_list_view.js @@ -55,7 +55,7 @@ this.triggerLazyScroll(); }, atBottom() { - return this.bottomOffset < 30; + return this.bottomOffset ? this.bottomOffset < 30 : true; }, measureScrollPosition() { if (this.el.scrollHeight === 0) { diff --git a/ts/receiver/mediumGroups.ts b/ts/receiver/mediumGroups.ts index 49f19e0f6..1265a35ba 100644 --- a/ts/receiver/mediumGroups.ts +++ b/ts/receiver/mediumGroups.ts @@ -207,7 +207,10 @@ async function handleNewGroup( // We only set group admins on group creation convo.set('groupAdmins', admins); - + // update the unreadCount for this convo + convo.set({ + unreadCount: Number(convo.get('unreadCount')) + 1, + }); convo.commit(); const secretKeyHex = toHex(groupPrivateKey); From b050a3740d2902f4084600ad2047ad31fec52a08 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 7 Oct 2020 15:25:57 +1100 Subject: [PATCH 272/274] clean all updateConversation calls to convo.commit() --- js/models/conversations.js | 84 +++++-------------- js/modules/debug.js | 6 +- js/modules/loki_app_dot_net_api.js | 9 +- .../session/LeftPaneMessageSection.tsx | 1 - ts/receiver/errors.ts | 9 +- ts/receiver/multidevice.ts | 5 +- ts/state/selectors/conversations.ts | 1 - 7 files changed, 26 insertions(+), 89 deletions(-) diff --git a/js/models/conversations.js b/js/models/conversations.js index e958588fc..1336a0c01 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -641,9 +641,7 @@ this.set({ verified }); // we don't await here because we don't need to wait for this to finish - window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + this.commit(); return; } @@ -706,9 +704,7 @@ } this.set({ verified }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); // Three situations result in a verification notice in the conversation: // 1) The message came from an explicit verification in another client (not @@ -813,16 +809,12 @@ secondaryStatus: newStatus, primaryDevicePubKey, }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); } }, async updateGroupAdmins(groupAdmins) { this.set({ groupAdmins }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); }, isUnverified() { if (this.isPrivate()) { @@ -1307,9 +1299,7 @@ timestamp: now, isArchived: false, }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); // We're offline! if (!textsecure.messaging) { @@ -1494,17 +1484,13 @@ this.set(lastMessageUpdate); if (this.hasChanged()) { - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); } }, async setArchived(isArchived) { this.set({ isArchived }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); }, async updateExpirationTimer( @@ -1541,9 +1527,7 @@ const timestamp = (receivedAt || Date.now()) - 1; this.set({ expireTimer }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); const message = this.messageCollection.add({ // Even though this isn't reflected to the user, we want to place the last seen @@ -1636,9 +1620,7 @@ } if (this.get('sessionResetStatus') !== newStatus) { this.set({ sessionResetStatus: newStatus }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); } }, async onSessionResetInitiated() { @@ -1917,9 +1899,7 @@ this.set({ mentionedUs: false }); } - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); // If a message has errors, we don't want to send anything out about it. // read syncs - let's wait for a client that really understands the message @@ -1978,18 +1958,14 @@ } this.set({ nickname: trimmed }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); await this.updateProfileName(); }, async setLokiProfile(newProfile) { if (!_.isEqual(this.get('profile'), newProfile)) { this.set({ profile: newProfile }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); } // if set to null, it will show a placeholder with color and first letter @@ -2041,9 +2017,7 @@ channelId: newChannelId, active_at: Date.now(), }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); } }, getPublicSource() { @@ -2080,9 +2054,7 @@ } if (this.get('lastPublicMessage') !== newLastMessageId) { this.set({ lastPublicMessage: newLastMessageId }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); } }, isModerator(pubKey) { @@ -2099,9 +2071,7 @@ // TODO: compare array properly if (!_.isEqual(this.get('moderators'), moderators)) { this.set({ moderators }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); } }, @@ -2136,18 +2106,14 @@ const profileName = this.get('profileName'); if (profileName !== name) { this.set({ profileName: name }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); } }, async setGroupName(name) { const profileName = this.get('name'); if (profileName !== name) { this.set({ name }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); } }, async setSubscriberCount(count) { @@ -2166,18 +2132,14 @@ this.set({ name }); } // save - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); } }, async setProfileAvatar(avatar) { const profileAvatar = this.get('profileAvatar'); if (profileAvatar !== avatar) { this.set({ profileAvatar: avatar }); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); } }, async setProfileKey(profileKey) { @@ -2194,9 +2156,7 @@ await this.deriveAccessKeyIfNeeded(); - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); } }, @@ -2426,9 +2386,7 @@ }); } - await window.Signal.Data.updateConversation(this.id, this.attributes, { - Conversation: Whisper.Conversation, - }); + await this.commit(); }, getName() { diff --git a/js/modules/debug.js b/js/modules/debug.js index 5f0e4037c..e763758aa 100644 --- a/js/modules/debug.js +++ b/js/modules/debug.js @@ -50,11 +50,7 @@ exports.createConversation = async ({ unread: numMessages, }); const conversationId = conversation.get('id'); - await Signal.Data.updateConversation( - conversationId, - conversation.attributes, - { Conversation: Whisper.Conversation } - ); + await conversation.commit(); await Promise.all( range(0, numMessages).map(async index => { diff --git a/js/modules/loki_app_dot_net_api.js b/js/modules/loki_app_dot_net_api.js index efcd5642a..ca78976a1 100644 --- a/js/modules/loki_app_dot_net_api.js +++ b/js/modules/loki_app_dot_net_api.js @@ -1619,14 +1619,7 @@ class LokiPublicChannelAPI { if (data.counts && Number.isInteger(data.counts.subscribers)) { this.conversation.setSubscriberCount(data.counts.subscribers); } - - await window.Signal.Data.updateConversation( - this.conversation.id, - this.conversation.attributes, - { - Conversation: Whisper.Conversation, - } - ); + await this.conversation.commit(); } // get moderation actions diff --git a/ts/components/session/LeftPaneMessageSection.tsx b/ts/components/session/LeftPaneMessageSection.tsx index e426099a1..78c1f2724 100644 --- a/ts/components/session/LeftPaneMessageSection.tsx +++ b/ts/components/session/LeftPaneMessageSection.tsx @@ -161,7 +161,6 @@ export class LeftPaneMessageSection extends React.Component { const length = conversations.length; const listKey = 0; - // Note: conversations is not a known prop for List, but it is required to ensure that // it re-renders when our conversation data changes. Otherwise it would just render // on startup and scroll. diff --git a/ts/receiver/errors.ts b/ts/receiver/errors.ts index a41179f85..26e2201b4 100644 --- a/ts/receiver/errors.ts +++ b/ts/receiver/errors.ts @@ -16,9 +16,7 @@ async function onNoSession(ev: any) { if (!convo.get('sessionRestoreSeen')) { convo.set({ sessionRestoreSeen: true }); - await window.Signal.Data.updateConversation(convo.id, convo.attributes, { - Conversation: Whisper.Conversation, - }); + await convo.commit(); await SessionProtocol.sendSessionRequestIfNeeded(new PubKey(pubkey)); } else { @@ -85,10 +83,7 @@ export async function onError(ev: any) { if (ev.confirm) { ev.confirm(); } - - await window.Signal.Data.updateConversation(id, conversation.attributes, { - Conversation: Whisper.Conversation, - }); + await conversation.commit(); } throw error; diff --git a/ts/receiver/multidevice.ts b/ts/receiver/multidevice.ts index 35f30e591..a46de5286 100644 --- a/ts/receiver/multidevice.ts +++ b/ts/receiver/multidevice.ts @@ -409,10 +409,7 @@ async function onContactReceived(details: any) { ); conversation.set(newAttributes); } - - await window.Signal.Data.updateConversation(id, conversation.attributes, { - Conversation: Whisper.Conversation, - }); + await conversation.commit(); const { expireTimer } = details; const isValidExpireTimer = typeof expireTimer === 'number'; if (isValidExpireTimer) { diff --git a/ts/state/selectors/conversations.ts b/ts/state/selectors/conversations.ts index 63b86af9e..c4b772fed 100644 --- a/ts/state/selectors/conversations.ts +++ b/ts/state/selectors/conversations.ts @@ -193,7 +193,6 @@ export const _getLeftPaneLists = ( }; const contacts: Array = filterToPrimary(allContacts); - return { conversations, archivedConversations, From 3f4be17393bdf8ab718bdc1769dd2f51e58437d1 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 7 Oct 2020 15:55:12 +1100 Subject: [PATCH 273/274] do not draw attention for linux env --- main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.js b/main.js index 4bebeafc9..f6f33a645 100644 --- a/main.js +++ b/main.js @@ -987,7 +987,7 @@ ipc.on('draw-attention', () => { if (!mainWindow) { return; } - if (process.platform === 'win32' || process.platform === 'linux') { + if (process.platform === 'win32') { mainWindow.flashFrame(true); } }); From 37dd7b87cc92a13bf5b52665caaa11cc0565efa0 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Wed, 7 Oct 2020 16:09:01 +1100 Subject: [PATCH 274/274] remove right buttons on Message. use right click instead --- js/views/identicon_svg_view.js | 16 ---- stylesheets/_modules.scss | 111 +------------------------ stylesheets/_theme_dark.scss | 21 ----- ts/components/conversation/Message.tsx | 95 --------------------- 4 files changed, 2 insertions(+), 241 deletions(-) diff --git a/js/views/identicon_svg_view.js b/js/views/identicon_svg_view.js index 996a57605..0acf9c83b 100644 --- a/js/views/identicon_svg_view.js +++ b/js/views/identicon_svg_view.js @@ -13,7 +13,6 @@ templateName: 'identicon-svg', initialize(options) { this.render_attributes = options; - this.render_attributes.color = COLORS[this.render_attributes.color]; }, getSVGUrl() { const html = this.render().$el.html(); @@ -40,19 +39,4 @@ }); }, }); - - const COLORS = { - red: '#cc163d', - deep_orange: '#c73800', - brown: '#746c53', - pink: '#a23474', - purple: '#862caf', - indigo: '#5951c8', - blue: '#336ba3', - teal: '#067589', - green: '#3b7845', - light_green: '#1c8260', - blue_grey: '#895d66', - grey: '#6b6b78', - }; })(); diff --git a/stylesheets/_modules.scss b/stylesheets/_modules.scss index c595ca77b..de3f210a0 100644 --- a/stylesheets/_modules.scss +++ b/stylesheets/_modules.scss @@ -76,94 +76,10 @@ margin-inline-start: 32px; } -.module-message__buttons { - position: absolute; - top: 0; - bottom: 0; - display: inline-flex; - flex-direction: row; - align-items: center; - opacity: 0; -} - -.module-message:hover .module-message__buttons { +.module-message:hover { opacity: 1; } -.module-message__buttons--incoming { - left: 100%; -} -.module-message__buttons--outgoing { - right: 100%; -} - -.module-message__buttons__upload { - height: 24px; - width: 24px; - transform: rotate(180deg); - display: inline-block; - cursor: pointer; - @include color-svg('../images/download.svg', $color-light-45); - &:hover { - @include color-svg('../images/download.svg', $color-gray-90); - } -} - -.module-message__buttons__download { - min-height: 24px; - min-width: 24px; - display: inline-block; - cursor: pointer; - @include color-svg('../images/download.svg', $color-light-45); - &:hover { - @include color-svg('../images/download.svg', $color-gray-90); - } -} - -.module-message__buttons__download--incoming { - margin-inline-start: 12px; -} -.module-message__buttons__download--outgoing { - margin-inline-end: 12px; -} - -.module-message__buttons__reply { - min-height: 24px; - min-width: 24px; - display: inline-block; - cursor: pointer; - @include color-svg('../images/reply.svg', $color-light-45); - &:hover { - @include color-svg('../images/reply.svg', $color-gray-90); - } -} - -.module-message__buttons__reply--incoming { - margin-inline-start: 12px; -} -.module-message__buttons__reply--outgoing { - margin-inline-end: 12px; -} - -.module-message__buttons__menu { - height: 24px; - width: 24px; - display: inline-block; - cursor: pointer; - @include color-svg('../images/ellipsis.svg', $color-light-45); - &:hover { - @include color-svg('../images/ellipsis.svg', $color-gray-90); - } -} - -.module-message__buttons__menu--incoming { - margin-inline-start: 12px; -} - -.module_message__buttons__menu--outgoing { - margin-inline-end: 12px; -} - .module-message__error-container { width: 28px; position: relative; @@ -2822,6 +2738,7 @@ border: 1px solid $color-dark-05; opacity: 0; user-select: none; + transition: opacity $session-transition-duration; } .react-contextmenu--visible { @@ -2890,14 +2807,6 @@ // All media query widths have 300px added to account for the left pane // And have been tweaked for smoother transitions -// To hide in small breakpoints -.module-message__buttons__download { - display: none; -} -.module-message__buttons__reply { - display: none; -} - // To limit messages with things forcing them wider, like long attachment names .module-message__container { max-width: 300px; @@ -2926,14 +2835,6 @@ margin-inline-start: auto; } - // To hide in small breakpoints - .module-message__buttons__download { - display: inline-block; - } - .module-message__buttons__reply { - display: inline-block; - } - // To hide in larger breakpoints .module-message__context__download { display: none; @@ -2965,14 +2866,6 @@ margin-inline-start: auto; } - // To hide in small breakpoints - .module-message__buttons__download { - display: inline-block; - } - .module-message__buttons__reply { - display: inline-block; - } - // To hide in larger breakpoints .module-message__context__download { display: none; diff --git a/stylesheets/_theme_dark.scss b/stylesheets/_theme_dark.scss index baef39f70..58b27ee7e 100644 --- a/stylesheets/_theme_dark.scss +++ b/stylesheets/_theme_dark.scss @@ -295,27 +295,6 @@ // Module: Message - .module-message__buttons__download { - @include color-svg('../images/download.svg', $color-light-45); - &:hover { - @include color-svg('../images/download.svg', $color-dark-05); - } - } - - .module-message__buttons__reply { - @include color-svg('../images/reply.svg', $color-light-45); - &:hover { - @include color-svg('../images/reply.svg', $color-dark-05); - } - } - - .module-message__buttons__menu { - @include color-svg('../images/ellipsis.svg', $color-light-45); - &:hover { - @include color-svg('../images/ellipsis.svg', $color-dark-05); - } - } - .module-message__error { @include color-svg('../images/error.svg', $session-color-danger); } diff --git a/ts/components/conversation/Message.tsx b/ts/components/conversation/Message.tsx index 73143a2b0..f6bf8c93e 100644 --- a/ts/components/conversation/Message.tsx +++ b/ts/components/conversation/Message.tsx @@ -769,89 +769,6 @@ export class Message extends React.PureComponent { } } - public renderMenu(isCorrectSide: boolean, triggerId: string) { - const { - attachments, - direction, - disableMenu, - isKickedFromGroup, - onDownload, - onReply, - } = this.props; - - if (!isCorrectSide || disableMenu || isKickedFromGroup) { - return null; - } - - const fileName = - attachments && attachments[0] ? attachments[0].fileName : null; - const isDangerous = isFileDangerous(fileName || ''); - const multipleAttachments = attachments && attachments.length > 1; - const firstAttachment = attachments && attachments[0]; - - const downloadButton = - !multipleAttachments && firstAttachment && !firstAttachment.pending ? ( -
{ - if (onDownload) { - onDownload(isDangerous); - } - e.stopPropagation(); - }} - role="button" - className={classNames( - 'module-message__buttons__download', - `module-message__buttons__download--${direction}` - )} - /> - ) : null; - - const replyButton = ( -
{ - if (onReply) { - onReply(); - } - e.stopPropagation(); - }} - role="button" - className={classNames( - 'module-message__buttons__reply', - `module-message__buttons__download--${direction}` - )} - /> - ); - - const menuButton = ( - -
- - ); - - const first = direction === 'incoming' ? downloadButton : menuButton; - const last = direction === 'incoming' ? menuButton : downloadButton; - - return ( -
- {first} - {replyButton} - {last} -
- ); - } - public renderContextMenu(triggerId: string) { const { attachments, @@ -1058,12 +975,7 @@ export class Message extends React.PureComponent { } = this.props; const { expired, expiring } = this.state; - // This id is what connects our triple-dot click with our associated pop-up menu. - // It needs to be unique. // The Date.now() is a workaround to be sure a single triggerID with this id exists - const triggerId = id - ? String(`message-${id}-${Date.now()}`) - : String(`message-${authorPhoneNumber}-${timestamp}`); const rightClickTriggerId = id ? String(`message-ctx-${id}-${Date.now()}`) : String(`message-ctx-${authorPhoneNumber}-${timestamp}`); @@ -1111,9 +1023,6 @@ export class Message extends React.PureComponent { )} > {this.renderError(isIncoming)} - {isRss || isKickedFromGroup - ? null - : this.renderMenu(!isIncoming, triggerId)}
{ {this.renderMetadata()}
{this.renderError(!isIncoming)} - {isRss || multiSelectMode - ? null - : this.renderMenu(isIncoming, triggerId)} - {enableContextMenu ? this.renderContextMenu(triggerId) : null} {enableContextMenu ? this.renderContextMenu(rightClickTriggerId) : null}